From 272c617877ad91fac2feb9057ef32f6d2923e5ce Mon Sep 17 00:00:00 2001 From: CSE-pebble Date: Thu, 28 Mar 2024 21:36:28 +0900 Subject: [PATCH 01/56] Initial Setting --- .eslintrc.cjs | 18 + .gitignore | 24 + README.md | 30 + index.html | 13 + package.json | 28 + public/vite.svg | 1 + src/App.css | 42 ++ src/App.tsx | 35 + src/assets/react.svg | 1 + src/index.css | 68 ++ src/main.tsx | 10 + src/vite-env.d.ts | 1 + tsconfig.json | 25 + tsconfig.node.json | 11 + vite.config.ts | 7 + yarn.lock | 1669 ++++++++++++++++++++++++++++++++++++++++++ 16 files changed, 1983 insertions(+) create mode 100644 .eslintrc.cjs create mode 100644 .gitignore create mode 100644 README.md create mode 100644 index.html create mode 100644 package.json create mode 100644 public/vite.svg create mode 100644 src/App.css create mode 100644 src/App.tsx create mode 100644 src/assets/react.svg create mode 100644 src/index.css create mode 100644 src/main.tsx create mode 100644 src/vite-env.d.ts create mode 100644 tsconfig.json create mode 100644 tsconfig.node.json create mode 100644 vite.config.ts create mode 100644 yarn.lock diff --git a/.eslintrc.cjs b/.eslintrc.cjs new file mode 100644 index 0000000..d6c9537 --- /dev/null +++ b/.eslintrc.cjs @@ -0,0 +1,18 @@ +module.exports = { + root: true, + env: { browser: true, es2020: true }, + extends: [ + 'eslint:recommended', + 'plugin:@typescript-eslint/recommended', + 'plugin:react-hooks/recommended', + ], + ignorePatterns: ['dist', '.eslintrc.cjs'], + parser: '@typescript-eslint/parser', + plugins: ['react-refresh'], + rules: { + 'react-refresh/only-export-components': [ + 'warn', + { allowConstantExport: true }, + ], + }, +} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/README.md b/README.md new file mode 100644 index 0000000..0d6babe --- /dev/null +++ b/README.md @@ -0,0 +1,30 @@ +# React + TypeScript + Vite + +This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules. + +Currently, two official plugins are available: + +- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/README.md) uses [Babel](https://babeljs.io/) for Fast Refresh +- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh + +## Expanding the ESLint configuration + +If you are developing a production application, we recommend updating the configuration to enable type aware lint rules: + +- Configure the top-level `parserOptions` property like this: + +```js +export default { + // other rules... + parserOptions: { + ecmaVersion: 'latest', + sourceType: 'module', + project: ['./tsconfig.json', './tsconfig.node.json'], + tsconfigRootDir: __dirname, + }, +} +``` + +- Replace `plugin:@typescript-eslint/recommended` to `plugin:@typescript-eslint/recommended-type-checked` or `plugin:@typescript-eslint/strict-type-checked` +- Optionally add `plugin:@typescript-eslint/stylistic-type-checked` +- Install [eslint-plugin-react](https://github.com/jsx-eslint/eslint-plugin-react) and add `plugin:react/recommended` & `plugin:react/jsx-runtime` to the `extends` list diff --git a/index.html b/index.html new file mode 100644 index 0000000..e4b78ea --- /dev/null +++ b/index.html @@ -0,0 +1,13 @@ + + + + + + + Vite + React + TS + + +
+ + + diff --git a/package.json b/package.json new file mode 100644 index 0000000..1b908ea --- /dev/null +++ b/package.json @@ -0,0 +1,28 @@ +{ + "name": "react-messenger-19th", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc && vite build", + "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0", + "preview": "vite preview" + }, + "dependencies": { + "react": "^18.2.0", + "react-dom": "^18.2.0" + }, + "devDependencies": { + "@types/react": "^18.2.66", + "@types/react-dom": "^18.2.22", + "@typescript-eslint/eslint-plugin": "^7.2.0", + "@typescript-eslint/parser": "^7.2.0", + "@vitejs/plugin-react": "^4.2.1", + "eslint": "^8.57.0", + "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-react-refresh": "^0.4.6", + "typescript": "^5.2.2", + "vite": "^5.2.0" + } +} diff --git a/public/vite.svg b/public/vite.svg new file mode 100644 index 0000000..e7b8dfb --- /dev/null +++ b/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/App.css b/src/App.css new file mode 100644 index 0000000..b9d355d --- /dev/null +++ b/src/App.css @@ -0,0 +1,42 @@ +#root { + max-width: 1280px; + margin: 0 auto; + padding: 2rem; + text-align: center; +} + +.logo { + height: 6em; + padding: 1.5em; + will-change: filter; + transition: filter 300ms; +} +.logo:hover { + filter: drop-shadow(0 0 2em #646cffaa); +} +.logo.react:hover { + filter: drop-shadow(0 0 2em #61dafbaa); +} + +@keyframes logo-spin { + from { + transform: rotate(0deg); + } + to { + transform: rotate(360deg); + } +} + +@media (prefers-reduced-motion: no-preference) { + a:nth-of-type(2) .logo { + animation: logo-spin infinite 20s linear; + } +} + +.card { + padding: 2em; +} + +.read-the-docs { + color: #888; +} diff --git a/src/App.tsx b/src/App.tsx new file mode 100644 index 0000000..afe48ac --- /dev/null +++ b/src/App.tsx @@ -0,0 +1,35 @@ +import { useState } from 'react' +import reactLogo from './assets/react.svg' +import viteLogo from '/vite.svg' +import './App.css' + +function App() { + const [count, setCount] = useState(0) + + return ( + <> +
+ + Vite logo + + + React logo + +
+

Vite + React

+
+ +

+ Edit src/App.tsx and save to test HMR +

+
+

+ Click on the Vite and React logos to learn more +

+ + ) +} + +export default App diff --git a/src/assets/react.svg b/src/assets/react.svg new file mode 100644 index 0000000..6c87de9 --- /dev/null +++ b/src/assets/react.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/index.css b/src/index.css new file mode 100644 index 0000000..6119ad9 --- /dev/null +++ b/src/index.css @@ -0,0 +1,68 @@ +:root { + font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; + line-height: 1.5; + font-weight: 400; + + color-scheme: light dark; + color: rgba(255, 255, 255, 0.87); + background-color: #242424; + + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +a { + font-weight: 500; + color: #646cff; + text-decoration: inherit; +} +a:hover { + color: #535bf2; +} + +body { + margin: 0; + display: flex; + place-items: center; + min-width: 320px; + min-height: 100vh; +} + +h1 { + font-size: 3.2em; + line-height: 1.1; +} + +button { + border-radius: 8px; + border: 1px solid transparent; + padding: 0.6em 1.2em; + font-size: 1em; + font-weight: 500; + font-family: inherit; + background-color: #1a1a1a; + cursor: pointer; + transition: border-color 0.25s; +} +button:hover { + border-color: #646cff; +} +button:focus, +button:focus-visible { + outline: 4px auto -webkit-focus-ring-color; +} + +@media (prefers-color-scheme: light) { + :root { + color: #213547; + background-color: #ffffff; + } + a:hover { + color: #747bff; + } + button { + background-color: #f9f9f9; + } +} diff --git a/src/main.tsx b/src/main.tsx new file mode 100644 index 0000000..3d7150d --- /dev/null +++ b/src/main.tsx @@ -0,0 +1,10 @@ +import React from 'react' +import ReactDOM from 'react-dom/client' +import App from './App.tsx' +import './index.css' + +ReactDOM.createRoot(document.getElementById('root')!).render( + + + , +) diff --git a/src/vite-env.d.ts b/src/vite-env.d.ts new file mode 100644 index 0000000..11f02fe --- /dev/null +++ b/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..a7fc6fb --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,25 @@ +{ + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": true, + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx", + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src"], + "references": [{ "path": "./tsconfig.node.json" }] +} diff --git a/tsconfig.node.json b/tsconfig.node.json new file mode 100644 index 0000000..97ede7e --- /dev/null +++ b/tsconfig.node.json @@ -0,0 +1,11 @@ +{ + "compilerOptions": { + "composite": true, + "skipLibCheck": true, + "module": "ESNext", + "moduleResolution": "bundler", + "allowSyntheticDefaultImports": true, + "strict": true + }, + "include": ["vite.config.ts"] +} diff --git a/vite.config.ts b/vite.config.ts new file mode 100644 index 0000000..5a33944 --- /dev/null +++ b/vite.config.ts @@ -0,0 +1,7 @@ +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react' + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [react()], +}) diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000..183291b --- /dev/null +++ b/yarn.lock @@ -0,0 +1,1669 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@aashutoshrathi/word-wrap@^1.2.3": + version "1.2.6" + resolved "https://registry.yarnpkg.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz#bd9154aec9983f77b3a034ecaa015c2e4201f6cf" + integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== + +"@ampproject/remapping@^2.2.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4" + integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== + dependencies: + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.24" + +"@babel/code-frame@^7.23.5", "@babel/code-frame@^7.24.1", "@babel/code-frame@^7.24.2": + version "7.24.2" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.2.tgz#718b4b19841809a58b29b68cde80bc5e1aa6d9ae" + integrity sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ== + dependencies: + "@babel/highlight" "^7.24.2" + picocolors "^1.0.0" + +"@babel/compat-data@^7.23.5": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.24.1.tgz#31c1f66435f2a9c329bb5716a6d6186c516c3742" + integrity sha512-Pc65opHDliVpRHuKfzI+gSA4zcgr65O4cl64fFJIWEEh8JoHIHh0Oez1Eo8Arz8zq/JhgKodQaxEwUPRtZylVA== + +"@babel/core@^7.23.5": + version "7.24.3" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.24.3.tgz#568864247ea10fbd4eff04dda1e05f9e2ea985c3" + integrity sha512-5FcvN1JHw2sHJChotgx8Ek0lyuh4kCKelgMTTqhYJJtloNvUfpAFMeNQUtdlIaktwrSV9LtCdqwk48wL2wBacQ== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.24.2" + "@babel/generator" "^7.24.1" + "@babel/helper-compilation-targets" "^7.23.6" + "@babel/helper-module-transforms" "^7.23.3" + "@babel/helpers" "^7.24.1" + "@babel/parser" "^7.24.1" + "@babel/template" "^7.24.0" + "@babel/traverse" "^7.24.1" + "@babel/types" "^7.24.0" + convert-source-map "^2.0.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.3" + semver "^6.3.1" + +"@babel/generator@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.24.1.tgz#e67e06f68568a4ebf194d1c6014235344f0476d0" + integrity sha512-DfCRfZsBcrPEHUfuBMgbJ1Ut01Y/itOs+hY2nFLgqsqXd52/iSiVq5TITtUasIUgm+IIKdY2/1I7auiQOEeC9A== + dependencies: + "@babel/types" "^7.24.0" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" + jsesc "^2.5.1" + +"@babel/helper-compilation-targets@^7.23.6": + version "7.23.6" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz#4d79069b16cbcf1461289eccfbbd81501ae39991" + integrity sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ== + dependencies: + "@babel/compat-data" "^7.23.5" + "@babel/helper-validator-option" "^7.23.5" + browserslist "^4.22.2" + lru-cache "^5.1.1" + semver "^6.3.1" + +"@babel/helper-environment-visitor@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" + integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== + +"@babel/helper-function-name@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759" + integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw== + dependencies: + "@babel/template" "^7.22.15" + "@babel/types" "^7.23.0" + +"@babel/helper-hoist-variables@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" + integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-module-imports@^7.22.15": + version "7.24.3" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz#6ac476e6d168c7c23ff3ba3cf4f7841d46ac8128" + integrity sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg== + dependencies: + "@babel/types" "^7.24.0" + +"@babel/helper-module-transforms@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz#d7d12c3c5d30af5b3c0fcab2a6d5217773e2d0f1" + integrity sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ== + dependencies: + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-module-imports" "^7.22.15" + "@babel/helper-simple-access" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/helper-validator-identifier" "^7.22.20" + +"@babel/helper-plugin-utils@^7.24.0": + version "7.24.0" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz#945681931a52f15ce879fd5b86ce2dae6d3d7f2a" + integrity sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w== + +"@babel/helper-simple-access@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz#4938357dc7d782b80ed6dbb03a0fba3d22b1d5de" + integrity sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-split-export-declaration@^7.22.6": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c" + integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-string-parser@^7.23.4": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz#f99c36d3593db9540705d0739a1f10b5e20c696e" + integrity sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ== + +"@babel/helper-validator-identifier@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" + integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== + +"@babel/helper-validator-option@^7.23.5": + version "7.23.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz#907a3fbd4523426285365d1206c423c4c5520307" + integrity sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw== + +"@babel/helpers@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.24.1.tgz#183e44714b9eba36c3038e442516587b1e0a1a94" + integrity sha512-BpU09QqEe6ZCHuIHFphEFgvNSrubve1FtyMton26ekZ85gRGi6LrTF7zArARp2YvyFxloeiRmtSCq5sjh1WqIg== + dependencies: + "@babel/template" "^7.24.0" + "@babel/traverse" "^7.24.1" + "@babel/types" "^7.24.0" + +"@babel/highlight@^7.24.2": + version "7.24.2" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.2.tgz#3f539503efc83d3c59080a10e6634306e0370d26" + integrity sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA== + dependencies: + "@babel/helper-validator-identifier" "^7.22.20" + chalk "^2.4.2" + js-tokens "^4.0.0" + picocolors "^1.0.0" + +"@babel/parser@^7.1.0", "@babel/parser@^7.20.7", "@babel/parser@^7.24.0", "@babel/parser@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.1.tgz#1e416d3627393fab1cb5b0f2f1796a100ae9133a" + integrity sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg== + +"@babel/plugin-transform-react-jsx-self@^7.23.3": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.24.1.tgz#a21d866d8167e752c6a7c4555dba8afcdfce6268" + integrity sha512-kDJgnPujTmAZ/9q2CN4m2/lRsUUPDvsG3+tSHWUJIzMGTt5U/b/fwWd3RO3n+5mjLrsBrVa5eKFRVSQbi3dF1w== + dependencies: + "@babel/helper-plugin-utils" "^7.24.0" + +"@babel/plugin-transform-react-jsx-source@^7.23.3": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.24.1.tgz#a2dedb12b09532846721b5df99e52ef8dc3351d0" + integrity sha512-1v202n7aUq4uXAieRTKcwPzNyphlCuqHHDcdSNc+vdhoTEZcFMh+L5yZuCmGaIO7bs1nJUNfHB89TZyoL48xNA== + dependencies: + "@babel/helper-plugin-utils" "^7.24.0" + +"@babel/template@^7.22.15", "@babel/template@^7.24.0": + version "7.24.0" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.24.0.tgz#c6a524aa93a4a05d66aaf31654258fae69d87d50" + integrity sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA== + dependencies: + "@babel/code-frame" "^7.23.5" + "@babel/parser" "^7.24.0" + "@babel/types" "^7.24.0" + +"@babel/traverse@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.24.1.tgz#d65c36ac9dd17282175d1e4a3c49d5b7988f530c" + integrity sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ== + dependencies: + "@babel/code-frame" "^7.24.1" + "@babel/generator" "^7.24.1" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-function-name" "^7.23.0" + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/parser" "^7.24.1" + "@babel/types" "^7.24.0" + debug "^4.3.1" + globals "^11.1.0" + +"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.24.0": + version "7.24.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.0.tgz#3b951f435a92e7333eba05b7566fd297960ea1bf" + integrity sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w== + dependencies: + "@babel/helper-string-parser" "^7.23.4" + "@babel/helper-validator-identifier" "^7.22.20" + to-fast-properties "^2.0.0" + +"@esbuild/aix-ppc64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz#a70f4ac11c6a1dfc18b8bbb13284155d933b9537" + integrity sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g== + +"@esbuild/android-arm64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz#db1c9202a5bc92ea04c7b6840f1bbe09ebf9e6b9" + integrity sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg== + +"@esbuild/android-arm@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.20.2.tgz#3b488c49aee9d491c2c8f98a909b785870d6e995" + integrity sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w== + +"@esbuild/android-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.20.2.tgz#3b1628029e5576249d2b2d766696e50768449f98" + integrity sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg== + +"@esbuild/darwin-arm64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz#6e8517a045ddd86ae30c6608c8475ebc0c4000bb" + integrity sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA== + +"@esbuild/darwin-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz#90ed098e1f9dd8a9381695b207e1cff45540a0d0" + integrity sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA== + +"@esbuild/freebsd-arm64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz#d71502d1ee89a1130327e890364666c760a2a911" + integrity sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw== + +"@esbuild/freebsd-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz#aa5ea58d9c1dd9af688b8b6f63ef0d3d60cea53c" + integrity sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw== + +"@esbuild/linux-arm64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz#055b63725df678379b0f6db9d0fa85463755b2e5" + integrity sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A== + +"@esbuild/linux-arm@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz#76b3b98cb1f87936fbc37f073efabad49dcd889c" + integrity sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg== + +"@esbuild/linux-ia32@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz#c0e5e787c285264e5dfc7a79f04b8b4eefdad7fa" + integrity sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig== + +"@esbuild/linux-loong64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz#a6184e62bd7cdc63e0c0448b83801001653219c5" + integrity sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ== + +"@esbuild/linux-mips64el@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz#d08e39ce86f45ef8fc88549d29c62b8acf5649aa" + integrity sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA== + +"@esbuild/linux-ppc64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz#8d252f0b7756ffd6d1cbde5ea67ff8fd20437f20" + integrity sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg== + +"@esbuild/linux-riscv64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz#19f6dcdb14409dae607f66ca1181dd4e9db81300" + integrity sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg== + +"@esbuild/linux-s390x@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz#3c830c90f1a5d7dd1473d5595ea4ebb920988685" + integrity sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ== + +"@esbuild/linux-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz#86eca35203afc0d9de0694c64ec0ab0a378f6fff" + integrity sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw== + +"@esbuild/netbsd-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz#e771c8eb0e0f6e1877ffd4220036b98aed5915e6" + integrity sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ== + +"@esbuild/openbsd-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz#9a795ae4b4e37e674f0f4d716f3e226dd7c39baf" + integrity sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ== + +"@esbuild/sunos-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz#7df23b61a497b8ac189def6e25a95673caedb03f" + integrity sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w== + +"@esbuild/win32-arm64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz#f1ae5abf9ca052ae11c1bc806fb4c0f519bacf90" + integrity sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ== + +"@esbuild/win32-ia32@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz#241fe62c34d8e8461cd708277813e1d0ba55ce23" + integrity sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ== + +"@esbuild/win32-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz#9c907b21e30a52db959ba4f80bb01a0cc403d5cc" + integrity sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ== + +"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": + version "4.4.0" + resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" + integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== + dependencies: + eslint-visitor-keys "^3.3.0" + +"@eslint-community/regexpp@^4.5.1", "@eslint-community/regexpp@^4.6.1": + version "4.10.0" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.10.0.tgz#548f6de556857c8bb73bbee70c35dc82a2e74d63" + integrity sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA== + +"@eslint/eslintrc@^2.1.4": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz#388a269f0f25c1b6adc317b5a2c55714894c70ad" + integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^9.6.0" + globals "^13.19.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.1.2" + strip-json-comments "^3.1.1" + +"@eslint/js@8.57.0": + version "8.57.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.0.tgz#a5417ae8427873f1dd08b70b3574b453e67b5f7f" + integrity sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g== + +"@humanwhocodes/config-array@^0.11.14": + version "0.11.14" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.14.tgz#d78e481a039f7566ecc9660b4ea7fe6b1fec442b" + integrity sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg== + dependencies: + "@humanwhocodes/object-schema" "^2.0.2" + debug "^4.3.1" + minimatch "^3.0.5" + +"@humanwhocodes/module-importer@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" + integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== + +"@humanwhocodes/object-schema@^2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz#d9fae00a2d5cb40f92cfe64b47ad749fbc38f917" + integrity sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw== + +"@jridgewell/gen-mapping@^0.3.5": + version "0.3.5" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36" + integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg== + dependencies: + "@jridgewell/set-array" "^1.2.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.24" + +"@jridgewell/resolve-uri@^3.1.0": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" + integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== + +"@jridgewell/set-array@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" + integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== + +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": + version "1.4.15" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== + +"@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": + version "0.3.25" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" + integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@rollup/rollup-android-arm-eabi@4.13.1": + version "4.13.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.13.1.tgz#88ba199f996e0000689130ed69e47df8b0dfbc70" + integrity sha512-4C4UERETjXpC4WpBXDbkgNVgHyWfG3B/NKY46e7w5H134UDOFqUJKpsLm0UYmuupW+aJmRgeScrDNfvZ5WV80A== + +"@rollup/rollup-android-arm64@4.13.1": + version "4.13.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.13.1.tgz#c89a55670e1179ed7ba3db06cee0d7da7b3d35ce" + integrity sha512-TrTaFJ9pXgfXEiJKQ3yQRelpQFqgRzVR9it8DbeRzG0RX7mKUy0bqhCFsgevwXLJepQKTnLl95TnPGf9T9AMOA== + +"@rollup/rollup-darwin-arm64@4.13.1": + version "4.13.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.13.1.tgz#52e3496fa66d761833df23a9b4860e517efc7d1d" + integrity sha512-fz7jN6ahTI3cKzDO2otQuybts5cyu0feymg0bjvYCBrZQ8tSgE8pc0sSNEuGvifrQJWiwx9F05BowihmLxeQKw== + +"@rollup/rollup-darwin-x64@4.13.1": + version "4.13.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.13.1.tgz#7678922773a8b53d8b4b3c3cc3e77b65fc71b489" + integrity sha512-WTvdz7SLMlJpektdrnWRUN9C0N2qNHwNbWpNo0a3Tod3gb9leX+yrYdCeB7VV36OtoyiPAivl7/xZ3G1z5h20g== + +"@rollup/rollup-linux-arm-gnueabihf@4.13.1": + version "4.13.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.13.1.tgz#69c3b896e3ee1c3487492323a02c2a3ae0d4b2e7" + integrity sha512-dBHQl+7wZzBYcIF6o4k2XkAfwP2ks1mYW2q/Gzv9n39uDcDiAGDqEyml08OdY0BIct0yLSPkDTqn4i6czpBLLw== + +"@rollup/rollup-linux-arm64-gnu@4.13.1": + version "4.13.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.13.1.tgz#13353f0ab65f4add0241f97f7ccc640b3a2b5cf2" + integrity sha512-bur4JOxvYxfrAmocRJIW0SADs3QdEYK6TQ7dTNz6Z4/lySeu3Z1H/+tl0a4qDYv0bCdBpUYM0sYa/X+9ZqgfSQ== + +"@rollup/rollup-linux-arm64-musl@4.13.1": + version "4.13.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.13.1.tgz#bf64eaa29b2b1e6bc9195f04bb30b2a4ffdc25ae" + integrity sha512-ssp77SjcDIUSoUyj7DU7/5iwM4ZEluY+N8umtCT9nBRs3u045t0KkW02LTyHouHDomnMXaXSZcCSr2bdMK63kA== + +"@rollup/rollup-linux-riscv64-gnu@4.13.1": + version "4.13.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.13.1.tgz#ec05966a4ed1b3338c8842108353ac6d3443dc6a" + integrity sha512-Jv1DkIvwEPAb+v25/Unrnnq9BO3F5cbFPT821n3S5litkz+O5NuXuNhqtPx5KtcwOTtaqkTsO+IVzJOsxd11aQ== + +"@rollup/rollup-linux-s390x-gnu@4.13.1": + version "4.13.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.13.1.tgz#c10a1f1522f0c9191ee45f677bd08763ddfdc039" + integrity sha512-U564BrhEfaNChdATQaEODtquCC7Ez+8Hxz1h5MAdMYj0AqD0GA9rHCpElajb/sQcaFL6NXmHc5O+7FXpWMa73Q== + +"@rollup/rollup-linux-x64-gnu@4.13.1": + version "4.13.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.13.1.tgz#836f948b6efc53f05f57d1d9ba92e90d629b3f22" + integrity sha512-zGRDulLTeDemR8DFYyFIQ8kMP02xpUsX4IBikc7lwL9PrwR3gWmX2NopqiGlI2ZVWMl15qZeUjumTwpv18N7sQ== + +"@rollup/rollup-linux-x64-musl@4.13.1": + version "4.13.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.13.1.tgz#07e0351cc18eeef026f903189d8312833cb6bd1f" + integrity sha512-VTk/MveyPdMFkYJJPCkYBw07KcTkGU2hLEyqYMsU4NjiOfzoaDTW9PWGRsNwiOA3qI0k/JQPjkl/4FCK1smskQ== + +"@rollup/rollup-win32-arm64-msvc@4.13.1": + version "4.13.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.13.1.tgz#6f9359bbec6cb4a2c002642c63e3704b0b5e68b7" + integrity sha512-L+hX8Dtibb02r/OYCsp4sQQIi3ldZkFI0EUkMTDwRfFykXBPptoz/tuuGqEd3bThBSLRWPR6wsixDSgOx/U3Zw== + +"@rollup/rollup-win32-ia32-msvc@4.13.1": + version "4.13.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.13.1.tgz#d6545a29ac9dd8b39a9161b87924f13471eb992e" + integrity sha512-+dI2jVPfM5A8zme8riEoNC7UKk0Lzc7jCj/U89cQIrOjrZTCWZl/+IXUeRT2rEZ5j25lnSA9G9H1Ob9azaF/KQ== + +"@rollup/rollup-win32-x64-msvc@4.13.1": + version "4.13.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.13.1.tgz#d1b221daca9afca1885b91a311c6f4a04b0deeb5" + integrity sha512-YY1Exxo2viZ/O2dMHuwQvimJ0SqvL+OAWQLLY6rvXavgQKjhQUzn7nc1Dd29gjB5Fqi00nrBWctJBOyfVMIVxw== + +"@types/babel__core@^7.20.5": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.5.tgz#3df15f27ba85319caa07ba08d0721889bb39c017" + integrity sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA== + dependencies: + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" + "@types/babel__generator" "*" + "@types/babel__template" "*" + "@types/babel__traverse" "*" + +"@types/babel__generator@*": + version "7.6.8" + resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.8.tgz#f836c61f48b1346e7d2b0d93c6dacc5b9535d3ab" + integrity sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw== + dependencies: + "@babel/types" "^7.0.0" + +"@types/babel__template@*": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.4.tgz#5672513701c1b2199bc6dad636a9d7491586766f" + integrity sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + +"@types/babel__traverse@*": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.5.tgz#7b7502be0aa80cc4ef22978846b983edaafcd4dd" + integrity sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ== + dependencies: + "@babel/types" "^7.20.7" + +"@types/estree@1.0.5": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" + integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== + +"@types/json-schema@^7.0.12": + version "7.0.15" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" + integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== + +"@types/prop-types@*": + version "15.7.12" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.12.tgz#12bb1e2be27293c1406acb6af1c3f3a1481d98c6" + integrity sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q== + +"@types/react-dom@^18.2.22": + version "18.2.22" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.2.22.tgz#d332febf0815403de6da8a97e5fe282cbe609bae" + integrity sha512-fHkBXPeNtfvri6gdsMYyW+dW7RXFo6Ad09nLFK0VQWR7yGLai/Cyvyj696gbwYvBnhGtevUG9cET0pmUbMtoPQ== + dependencies: + "@types/react" "*" + +"@types/react@*", "@types/react@^18.2.66": + version "18.2.73" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.73.tgz#0579548ad122660d99e00499d22e33b81e73ed94" + integrity sha512-XcGdod0Jjv84HOC7N5ziY3x+qL0AfmubvKOZ9hJjJ2yd5EE+KYjWhdOjt387e9HPheHkdggF9atTifMRtyAaRA== + dependencies: + "@types/prop-types" "*" + csstype "^3.0.2" + +"@types/semver@^7.5.0": + version "7.5.8" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.8.tgz#8268a8c57a3e4abd25c165ecd36237db7948a55e" + integrity sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ== + +"@typescript-eslint/eslint-plugin@^7.2.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.4.0.tgz#de61c3083842fc6ac889d2fc83c9a96b55ab8328" + integrity sha512-yHMQ/oFaM7HZdVrVm/M2WHaNPgyuJH4WelkSVEWSSsir34kxW2kDJCxlXRhhGWEsMN0WAW/vLpKfKVcm8k+MPw== + dependencies: + "@eslint-community/regexpp" "^4.5.1" + "@typescript-eslint/scope-manager" "7.4.0" + "@typescript-eslint/type-utils" "7.4.0" + "@typescript-eslint/utils" "7.4.0" + "@typescript-eslint/visitor-keys" "7.4.0" + debug "^4.3.4" + graphemer "^1.4.0" + ignore "^5.2.4" + natural-compare "^1.4.0" + semver "^7.5.4" + ts-api-utils "^1.0.1" + +"@typescript-eslint/parser@^7.2.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-7.4.0.tgz#540f4321de1e52b886c0fa68628af1459954c1f1" + integrity sha512-ZvKHxHLusweEUVwrGRXXUVzFgnWhigo4JurEj0dGF1tbcGh6buL+ejDdjxOQxv6ytcY1uhun1p2sm8iWStlgLQ== + dependencies: + "@typescript-eslint/scope-manager" "7.4.0" + "@typescript-eslint/types" "7.4.0" + "@typescript-eslint/typescript-estree" "7.4.0" + "@typescript-eslint/visitor-keys" "7.4.0" + debug "^4.3.4" + +"@typescript-eslint/scope-manager@7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-7.4.0.tgz#acfc69261f10ece7bf7ece1734f1713392c3655f" + integrity sha512-68VqENG5HK27ypafqLVs8qO+RkNc7TezCduYrx8YJpXq2QGZ30vmNZGJJJC48+MVn4G2dCV8m5ZTVnzRexTVtw== + dependencies: + "@typescript-eslint/types" "7.4.0" + "@typescript-eslint/visitor-keys" "7.4.0" + +"@typescript-eslint/type-utils@7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-7.4.0.tgz#cfcaab21bcca441c57da5d3a1153555e39028cbd" + integrity sha512-247ETeHgr9WTRMqHbbQdzwzhuyaJ8dPTuyuUEMANqzMRB1rj/9qFIuIXK7l0FX9i9FXbHeBQl/4uz6mYuCE7Aw== + dependencies: + "@typescript-eslint/typescript-estree" "7.4.0" + "@typescript-eslint/utils" "7.4.0" + debug "^4.3.4" + ts-api-utils "^1.0.1" + +"@typescript-eslint/types@7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-7.4.0.tgz#ee9dafa75c99eaee49de6dcc9348b45d354419b6" + integrity sha512-mjQopsbffzJskos5B4HmbsadSJQWaRK0UxqQ7GuNA9Ga4bEKeiO6b2DnB6cM6bpc8lemaPseh0H9B/wyg+J7rw== + +"@typescript-eslint/typescript-estree@7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-7.4.0.tgz#12dbcb4624d952f72c10a9f4431284fca24624f4" + integrity sha512-A99j5AYoME/UBQ1ucEbbMEmGkN7SE0BvZFreSnTd1luq7yulcHdyGamZKizU7canpGDWGJ+Q6ZA9SyQobipePg== + dependencies: + "@typescript-eslint/types" "7.4.0" + "@typescript-eslint/visitor-keys" "7.4.0" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + minimatch "9.0.3" + semver "^7.5.4" + ts-api-utils "^1.0.1" + +"@typescript-eslint/utils@7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-7.4.0.tgz#d889a0630cab88bddedaf7c845c64a00576257bd" + integrity sha512-NQt9QLM4Tt8qrlBVY9lkMYzfYtNz8/6qwZg8pI3cMGlPnj6mOpRxxAm7BMJN9K0AiY+1BwJ5lVC650YJqYOuNg== + dependencies: + "@eslint-community/eslint-utils" "^4.4.0" + "@types/json-schema" "^7.0.12" + "@types/semver" "^7.5.0" + "@typescript-eslint/scope-manager" "7.4.0" + "@typescript-eslint/types" "7.4.0" + "@typescript-eslint/typescript-estree" "7.4.0" + semver "^7.5.4" + +"@typescript-eslint/visitor-keys@7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-7.4.0.tgz#0c8ff2c1f8a6fe8d7d1a57ebbd4a638e86a60a94" + integrity sha512-0zkC7YM0iX5Y41homUUeW1CHtZR01K3ybjM1l6QczoMuay0XKtrb93kv95AxUGwdjGr64nNqnOCwmEl616N8CA== + dependencies: + "@typescript-eslint/types" "7.4.0" + eslint-visitor-keys "^3.4.1" + +"@ungap/structured-clone@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" + integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== + +"@vitejs/plugin-react@^4.2.1": + version "4.2.1" + resolved "https://registry.yarnpkg.com/@vitejs/plugin-react/-/plugin-react-4.2.1.tgz#744d8e4fcb120fc3dbaa471dadd3483f5a304bb9" + integrity sha512-oojO9IDc4nCUUi8qIR11KoQm0XFFLIwsRBwHRR4d/88IWghn1y6ckz/bJ8GHDCsYEJee8mDzqtJxh15/cisJNQ== + dependencies: + "@babel/core" "^7.23.5" + "@babel/plugin-transform-react-jsx-self" "^7.23.3" + "@babel/plugin-transform-react-jsx-source" "^7.23.3" + "@types/babel__core" "^7.20.5" + react-refresh "^0.14.0" + +acorn-jsx@^5.3.2: + version "5.3.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + +acorn@^8.9.0: + version "8.11.3" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" + integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== + +ajv@^6.12.4: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + 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" + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + +braces@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +browserslist@^4.22.2: + version "4.23.0" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.0.tgz#8f3acc2bbe73af7213399430890f86c63a5674ab" + integrity sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ== + dependencies: + caniuse-lite "^1.0.30001587" + electron-to-chromium "^1.4.668" + node-releases "^2.0.14" + update-browserslist-db "^1.0.13" + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +caniuse-lite@^1.0.30001587: + version "1.0.30001600" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001600.tgz#93a3ee17a35aa6a9f0c6ef1b2ab49507d1ab9079" + integrity sha512-+2S9/2JFhYmYaDpZvo0lKkfvuKIglrx68MwOBqMGHhQsNkLjB5xtc/TGoEPs+MxjSyN/72qer2g97nzR641mOQ== + +chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^4.0.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +convert-source-map@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" + integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== + +cross-spawn@^7.0.2: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +csstype@^3.0.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" + integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== + +debug@^4.1.0, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +deep-is@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + +electron-to-chromium@^1.4.668: + version "1.4.719" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.719.tgz#22a94ce7a5150511ba88e900836039e159efe22c" + integrity sha512-FbWy2Q2YgdFzkFUW/W5jBjE9dj+804+98E4Pup78JBPnbdb3pv6IneY2JCPKdeKLh3AOKHQeYf+KwLr7mxGh6Q== + +esbuild@^0.20.1: + version "0.20.2" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.20.2.tgz#9d6b2386561766ee6b5a55196c6d766d28c87ea1" + integrity sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g== + optionalDependencies: + "@esbuild/aix-ppc64" "0.20.2" + "@esbuild/android-arm" "0.20.2" + "@esbuild/android-arm64" "0.20.2" + "@esbuild/android-x64" "0.20.2" + "@esbuild/darwin-arm64" "0.20.2" + "@esbuild/darwin-x64" "0.20.2" + "@esbuild/freebsd-arm64" "0.20.2" + "@esbuild/freebsd-x64" "0.20.2" + "@esbuild/linux-arm" "0.20.2" + "@esbuild/linux-arm64" "0.20.2" + "@esbuild/linux-ia32" "0.20.2" + "@esbuild/linux-loong64" "0.20.2" + "@esbuild/linux-mips64el" "0.20.2" + "@esbuild/linux-ppc64" "0.20.2" + "@esbuild/linux-riscv64" "0.20.2" + "@esbuild/linux-s390x" "0.20.2" + "@esbuild/linux-x64" "0.20.2" + "@esbuild/netbsd-x64" "0.20.2" + "@esbuild/openbsd-x64" "0.20.2" + "@esbuild/sunos-x64" "0.20.2" + "@esbuild/win32-arm64" "0.20.2" + "@esbuild/win32-ia32" "0.20.2" + "@esbuild/win32-x64" "0.20.2" + +escalade@^3.1.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27" + integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA== + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +eslint-plugin-react-hooks@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz#4c3e697ad95b77e93f8646aaa1630c1ba607edd3" + integrity sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g== + +eslint-plugin-react-refresh@^0.4.6: + version "0.4.6" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.6.tgz#e8e8accab681861baed00c5c12da70267db0936f" + integrity sha512-NjGXdm7zgcKRkKMua34qVO9doI7VOxZ6ancSvBELJSSoX97jyndXcSoa8XBh69JoB31dNz3EEzlMcizZl7LaMA== + +eslint-scope@^7.2.2: + version "7.2.2" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" + integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + +eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: + version "3.4.3" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" + integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== + +eslint@^8.57.0: + version "8.57.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.0.tgz#c786a6fd0e0b68941aaf624596fb987089195668" + integrity sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@eslint-community/regexpp" "^4.6.1" + "@eslint/eslintrc" "^2.1.4" + "@eslint/js" "8.57.0" + "@humanwhocodes/config-array" "^0.11.14" + "@humanwhocodes/module-importer" "^1.0.1" + "@nodelib/fs.walk" "^1.2.8" + "@ungap/structured-clone" "^1.2.0" + ajv "^6.12.4" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.3.2" + doctrine "^3.0.0" + escape-string-regexp "^4.0.0" + eslint-scope "^7.2.2" + eslint-visitor-keys "^3.4.3" + espree "^9.6.1" + esquery "^1.4.2" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" + find-up "^5.0.0" + glob-parent "^6.0.2" + globals "^13.19.0" + graphemer "^1.4.0" + ignore "^5.2.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + is-path-inside "^3.0.3" + js-yaml "^4.1.0" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash.merge "^4.6.2" + minimatch "^3.1.2" + natural-compare "^1.4.0" + optionator "^0.9.3" + strip-ansi "^6.0.1" + text-table "^0.2.0" + +espree@^9.6.0, espree@^9.6.1: + version "9.6.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" + integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== + dependencies: + acorn "^8.9.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^3.4.1" + +esquery@^1.4.2: + version "1.5.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" + integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^5.1.0, estraverse@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-glob@^3.2.9: + version "3.3.2" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" + integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== + +fastq@^1.6.0: + version "1.17.1" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47" + integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w== + dependencies: + reusify "^1.0.4" + +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== + dependencies: + flat-cache "^3.0.4" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +flat-cache@^3.0.4: + version "3.2.0" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.2.0.tgz#2c0c2d5040c99b1632771a9d105725c0115363ee" + integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw== + dependencies: + flatted "^3.2.9" + keyv "^4.5.3" + rimraf "^3.0.2" + +flatted@^3.2.9: + version "3.3.1" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a" + integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +fsevents@~2.3.2, fsevents@~2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + +gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + +glob-parent@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-parent@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +glob@^7.1.3: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +globals@^13.19.0: + version "13.24.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.24.0.tgz#8432a19d78ce0c1e833949c36adb345400bb1171" + integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ== + dependencies: + type-fest "^0.20.2" + +globby@^11.1.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.2.9" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^3.0.0" + +graphemer@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" + integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +ignore@^5.2.0, ignore@^5.2.4: + version "5.3.1" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef" + integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== + +import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-path-inside@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +json-buffer@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" + integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== + +json5@^2.2.3: + version "2.2.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== + +keyv@^4.5.3: + version "4.5.4" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" + integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== + dependencies: + json-buffer "3.0.1" + +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +loose-envify@^1.1.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +merge2@^1.3.0, merge2@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +micromatch@^4.0.4: + version "4.0.5" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + dependencies: + braces "^3.0.2" + picomatch "^2.3.1" + +minimatch@9.0.3: + version "9.0.3" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" + integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== + dependencies: + brace-expansion "^2.0.1" + +minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +nanoid@^3.3.7: + version "3.3.7" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" + integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== + +node-releases@^2.0.14: + version "2.0.14" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.14.tgz#2ffb053bceb8b2be8495ece1ab6ce600c4461b0b" + integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw== + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +optionator@^0.9.3: + version "0.9.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.3.tgz#007397d44ed1872fdc6ed31360190f81814e2c64" + integrity sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg== + dependencies: + "@aashutoshrathi/word-wrap" "^1.2.3" + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + +picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +postcss@^8.4.36: + version "8.4.38" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.38.tgz#b387d533baf2054288e337066d81c6bee9db9e0e" + integrity sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A== + dependencies: + nanoid "^3.3.7" + picocolors "^1.0.0" + source-map-js "^1.2.0" + +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + +punycode@^2.1.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" + integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +react-dom@^18.2.0: + version "18.2.0" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.2.0.tgz#22aaf38708db2674ed9ada224ca4aa708d821e3d" + integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g== + dependencies: + loose-envify "^1.1.0" + scheduler "^0.23.0" + +react-refresh@^0.14.0: + version "0.14.0" + resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.14.0.tgz#4e02825378a5f227079554d4284889354e5f553e" + integrity sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ== + +react@^18.2.0: + version "18.2.0" + resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5" + integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== + dependencies: + loose-envify "^1.1.0" + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +rollup@^4.13.0: + version "4.13.1" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.13.1.tgz#5bd6d84eafd60280487085b8bf9c91679571005a" + integrity sha512-hFi+fU132IvJ2ZuihN56dwgpltpmLZHZWsx27rMCTZ2sYwrqlgL5sECGy1eeV2lAihD8EzChBVVhsXci0wD4Tg== + dependencies: + "@types/estree" "1.0.5" + optionalDependencies: + "@rollup/rollup-android-arm-eabi" "4.13.1" + "@rollup/rollup-android-arm64" "4.13.1" + "@rollup/rollup-darwin-arm64" "4.13.1" + "@rollup/rollup-darwin-x64" "4.13.1" + "@rollup/rollup-linux-arm-gnueabihf" "4.13.1" + "@rollup/rollup-linux-arm64-gnu" "4.13.1" + "@rollup/rollup-linux-arm64-musl" "4.13.1" + "@rollup/rollup-linux-riscv64-gnu" "4.13.1" + "@rollup/rollup-linux-s390x-gnu" "4.13.1" + "@rollup/rollup-linux-x64-gnu" "4.13.1" + "@rollup/rollup-linux-x64-musl" "4.13.1" + "@rollup/rollup-win32-arm64-msvc" "4.13.1" + "@rollup/rollup-win32-ia32-msvc" "4.13.1" + "@rollup/rollup-win32-x64-msvc" "4.13.1" + fsevents "~2.3.2" + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +scheduler@^0.23.0: + version "0.23.0" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe" + integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw== + dependencies: + loose-envify "^1.1.0" + +semver@^6.3.1: + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + +semver@^7.5.4: + version "7.6.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.0.tgz#1a46a4db4bffcccd97b743b5005c8325f23d4e2d" + integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== + dependencies: + lru-cache "^6.0.0" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +source-map-js@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.0.tgz#16b809c162517b5b8c3e7dcd315a2a5c2612b2af" + integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg== + +strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +ts-api-utils@^1.0.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.3.0.tgz#4b490e27129f1e8e686b45cc4ab63714dc60eea1" + integrity sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ== + +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + +typescript@^5.2.2: + version "5.4.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.4.3.tgz#5c6fedd4c87bee01cd7a528a30145521f8e0feff" + integrity sha512-KrPd3PKaCLr78MalgiwJnA25Nm8HAmdwN3mYUYZgG/wizIo9EainNVQI9/yDavtVFRN2h3k8uf3GLHuhDMgEHg== + +update-browserslist-db@^1.0.13: + version "1.0.13" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz#3c5e4f5c083661bd38ef64b6328c26ed6c8248c4" + integrity sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg== + dependencies: + escalade "^3.1.1" + picocolors "^1.0.0" + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +vite@^5.2.0: + version "5.2.6" + resolved "https://registry.yarnpkg.com/vite/-/vite-5.2.6.tgz#fc2ce309e0b4871e938cb0aca3b96c422c01f222" + integrity sha512-FPtnxFlSIKYjZ2eosBQamz4CbyrTizbZ3hnGJlh/wMtCrlp1Hah6AzBLjGI5I2urTfNnpovpHdrL6YRuBOPnCA== + dependencies: + esbuild "^0.20.1" + postcss "^8.4.36" + rollup "^4.13.0" + optionalDependencies: + fsevents "~2.3.3" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== From 2b3f398b4cd46af7546e6100d1a27743af2ad727 Mon Sep 17 00:00:00 2001 From: CSE-pebble Date: Thu, 28 Mar 2024 23:43:18 +0900 Subject: [PATCH 02/56] =?UTF-8?q?Feat:=20=EC=B4=88=EA=B8=B0=20=ED=99=98?= =?UTF-8?q?=EA=B2=BD=20=EC=84=B8=ED=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 3 +- src/App.css | 38 -------- src/App.tsx | 12 ++- src/GlobalStyle.tsx | 157 ++++++++++++++++++++++++++++++ src/assets/back.svg | 3 + src/assets/emoji.svg | 6 ++ src/assets/send.svg | 4 + src/assets/smallAdd.svg | 4 + src/assets/statusBar.svg | 15 +++ src/assets/userProfile/frog.svg | 9 ++ src/assets/userProfile/mine.svg | 9 ++ src/assets/userProfile/rabbit.svg | 9 ++ src/assets/voice.svg | 3 + src/components/ChattingRoom.tsx | 5 + src/index.css | 13 --- src/index.tsx | 15 ++- src/main.tsx | 15 +-- src/style/colors.tsx | 11 +++ yarn.lock | 94 +++++++++++++++++- 19 files changed, 351 insertions(+), 74 deletions(-) delete mode 100644 src/App.css create mode 100644 src/GlobalStyle.tsx create mode 100644 src/assets/back.svg create mode 100644 src/assets/emoji.svg create mode 100644 src/assets/send.svg create mode 100644 src/assets/smallAdd.svg create mode 100644 src/assets/statusBar.svg create mode 100644 src/assets/userProfile/frog.svg create mode 100644 src/assets/userProfile/mine.svg create mode 100644 src/assets/userProfile/rabbit.svg create mode 100644 src/assets/voice.svg create mode 100644 src/components/ChattingRoom.tsx delete mode 100644 src/index.css create mode 100644 src/style/colors.tsx diff --git a/package.json b/package.json index 1b908ea..835bc5c 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,8 @@ }, "dependencies": { "react": "^18.2.0", - "react-dom": "^18.2.0" + "react-dom": "^18.2.0", + "styled-components": "^6.1.8" }, "devDependencies": { "@types/react": "^18.2.66", diff --git a/src/App.css b/src/App.css deleted file mode 100644 index 74b5e05..0000000 --- a/src/App.css +++ /dev/null @@ -1,38 +0,0 @@ -.App { - text-align: center; -} - -.App-logo { - height: 40vmin; - pointer-events: none; -} - -@media (prefers-reduced-motion: no-preference) { - .App-logo { - animation: App-logo-spin infinite 20s linear; - } -} - -.App-header { - background-color: #282c34; - min-height: 100vh; - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - font-size: calc(10px + 2vmin); - color: white; -} - -.App-link { - color: #61dafb; -} - -@keyframes App-logo-spin { - from { - transform: rotate(0deg); - } - to { - transform: rotate(360deg); - } -} diff --git a/src/App.tsx b/src/App.tsx index bd79c18..0b12f73 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,9 +1,11 @@ +import ChattingRoom from "./components/ChattingRoom"; + function App() { - return ( -
-

19기 프론트엔드 파이팅!!! 디자인과 사이좋게 지내요~~~

-
- ); + return ( + <> + + + ); } export default App; diff --git a/src/GlobalStyle.tsx b/src/GlobalStyle.tsx new file mode 100644 index 0000000..d9889a4 --- /dev/null +++ b/src/GlobalStyle.tsx @@ -0,0 +1,157 @@ +import { createGlobalStyle } from "styled-components"; + +const GlobalStyle = createGlobalStyle` +@font-face { + font-family: 'Pretendard-Regular'; + src: url('https://cdn.jsdelivr.net/gh/Project-Noonnu/noonfonts_2107@1.1/Pretendard-Regular.woff') format('woff'); + font-weight: 400; + font-style: normal; +} + +html, +body, +div, +span, +applet, +object, +iframe, +h1, +h2, +h3, +h4, +h5, +h6, +p, +blockquote, +pre, +a, +abbr, +acronym, +address, +big, +cite, +code, +del, +dfn, +em, +img, +ins, +kbd, +q, +s, +samp, +small, +strike, +strong, +sub, +sup, +tt, +var, +b, +u, +i, +center, +dl, +dt, +dd, +ol, +ul, +li, +fieldset, +form, +label, +legend, +table, +caption, +tbody, +tfoot, +thead, +tr, +th, +td, +article, +aside, +canvas, +details, +embed, +figure, +figcaption, +footer, +header, +hgroup, +menu, +nav, +output, +ruby, +section, +summary, +time, +mark, +audio, +video { + margin: 0; + padding: 0; + border: 0; + font-size: 100%; + vertical-align: baseline; +} +/* HTML5 display-role reset for older browsers */ +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +menu, +nav, +section { + display: block; +} +ol, +ul { + list-style: none; +} +blockquote, +q { + quotes: none; +} +blockquote:before, +blockquote:after, +q:before, +q:after { + content: ""; + content: none; +} +table { + border-collapse: collapse; + border-spacing: 0; +} + +*, +*::before, +*::after { + box-sizing: border-box; + font-family: 'Pretendard-Regular'; +} + +body{ + min-height: 100vh; +} + +button { + border: none; + background: transparent; + cursor: pointer; +} + +input { + border: none; + background-color: transparent; + outline: none; +} + +`; + +export default GlobalStyle; diff --git a/src/assets/back.svg b/src/assets/back.svg new file mode 100644 index 0000000..cc8dfb5 --- /dev/null +++ b/src/assets/back.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/emoji.svg b/src/assets/emoji.svg new file mode 100644 index 0000000..0041cb0 --- /dev/null +++ b/src/assets/emoji.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/assets/send.svg b/src/assets/send.svg new file mode 100644 index 0000000..83c4b77 --- /dev/null +++ b/src/assets/send.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/smallAdd.svg b/src/assets/smallAdd.svg new file mode 100644 index 0000000..c4f93e0 --- /dev/null +++ b/src/assets/smallAdd.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/statusBar.svg b/src/assets/statusBar.svg new file mode 100644 index 0000000..4ba7dc5 --- /dev/null +++ b/src/assets/statusBar.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/src/assets/userProfile/frog.svg b/src/assets/userProfile/frog.svg new file mode 100644 index 0000000..603c344 --- /dev/null +++ b/src/assets/userProfile/frog.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/assets/userProfile/mine.svg b/src/assets/userProfile/mine.svg new file mode 100644 index 0000000..eff9a96 --- /dev/null +++ b/src/assets/userProfile/mine.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/assets/userProfile/rabbit.svg b/src/assets/userProfile/rabbit.svg new file mode 100644 index 0000000..2b7638e --- /dev/null +++ b/src/assets/userProfile/rabbit.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/assets/voice.svg b/src/assets/voice.svg new file mode 100644 index 0000000..2521762 --- /dev/null +++ b/src/assets/voice.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/components/ChattingRoom.tsx b/src/components/ChattingRoom.tsx new file mode 100644 index 0000000..f0c03c7 --- /dev/null +++ b/src/components/ChattingRoom.tsx @@ -0,0 +1,5 @@ +const ChattingRoom = () => { + return
안녕하세용
; +}; + +export default ChattingRoom; diff --git a/src/index.css b/src/index.css deleted file mode 100644 index ec2585e..0000000 --- a/src/index.css +++ /dev/null @@ -1,13 +0,0 @@ -body { - margin: 0; - font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', - 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', - sans-serif; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} - -code { - font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', - monospace; -} diff --git a/src/index.tsx b/src/index.tsx index d10be77..f8a20a7 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -1,13 +1,12 @@ -import React from 'react'; -import ReactDOM from 'react-dom/client'; -import './index.css'; -import App from './App'; +import React from "react"; +import ReactDOM from "react-dom/client"; +import App from "App"; const root = ReactDOM.createRoot( - document.getElementById('root') as HTMLElement + document.getElementById("root") as HTMLElement ); root.render( - - - + + + ); diff --git a/src/main.tsx b/src/main.tsx index 3d7150d..850d573 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -1,10 +1,11 @@ -import React from 'react' -import ReactDOM from 'react-dom/client' -import App from './App.tsx' -import './index.css' +import React from "react"; +import ReactDOM from "react-dom/client"; +import App from "./App.tsx"; +import GlobalStyle from "./GlobalStyle.tsx"; -ReactDOM.createRoot(document.getElementById('root')!).render( +ReactDOM.createRoot(document.getElementById("root")!).render( + - , -) + +); diff --git a/src/style/colors.tsx b/src/style/colors.tsx new file mode 100644 index 0000000..a26fc74 --- /dev/null +++ b/src/style/colors.tsx @@ -0,0 +1,11 @@ +export const colors = { + blurple: "#5865F2", + red: "#ED4245", + + white: "#FFFFFF", + black: "#000000", + gray100: "#F5F5F5", + gray200: "#EBEBEB", + gray300: "#B9B9B9", + gray400: "#9B9B9B", +}; diff --git a/yarn.lock b/yarn.lock index 183291b..86613c3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -214,6 +214,23 @@ "@babel/helper-validator-identifier" "^7.22.20" to-fast-properties "^2.0.0" +"@emotion/is-prop-valid@1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-1.2.1.tgz#23116cf1ed18bfeac910ec6436561ecb1a3885cc" + integrity sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw== + dependencies: + "@emotion/memoize" "^0.8.1" + +"@emotion/memoize@^0.8.1": + version "0.8.1" + resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.8.1.tgz#c1ddb040429c6d21d38cc945fe75c818cfb68e17" + integrity sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA== + +"@emotion/unitless@0.8.0": + version "0.8.0" + resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.8.0.tgz#a4a36e9cbdc6903737cd20d38033241e1b8833db" + integrity sha512-VINS5vEYAscRl2ZUDiT3uMPlrFQupiKgHz5AA4bCH1miKBg4qtwkim1qPmJj/4WG6TreYMY111rEFsjupcOKHw== + "@esbuild/aix-ppc64@0.20.2": version "0.20.2" resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz#a70f4ac11c6a1dfc18b8bbb13284155d933b9537" @@ -571,6 +588,11 @@ resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.8.tgz#8268a8c57a3e4abd25c165ecd36237db7948a55e" integrity sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ== +"@types/stylis@4.2.0": + version "4.2.0" + resolved "https://registry.yarnpkg.com/@types/stylis/-/stylis-4.2.0.tgz#199a3f473f0c3a6f6e4e1b17cdbc967f274bdc6b" + integrity sha512-n4sx2bqL0mW1tvDf/loQ+aMX7GQD3lc3fkCMC55VFNDu/vBOabO+LTIeXKM14xK0ppk5TUGcWRjiSpIlUpghKw== + "@typescript-eslint/eslint-plugin@^7.2.0": version "7.4.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.4.0.tgz#de61c3083842fc6ac889d2fc83c9a96b55ab8328" @@ -764,6 +786,11 @@ callsites@^3.0.0: resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== +camelize@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/camelize/-/camelize-1.0.1.tgz#89b7e16884056331a35d6b5ad064332c91daa6c3" + integrity sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ== + caniuse-lite@^1.0.30001587: version "1.0.30001600" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001600.tgz#93a3ee17a35aa6a9f0c6ef1b2ab49507d1ab9079" @@ -829,6 +856,25 @@ cross-spawn@^7.0.2: shebang-command "^2.0.0" which "^2.0.1" +css-color-keywords@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/css-color-keywords/-/css-color-keywords-1.0.0.tgz#fea2616dc676b2962686b3af8dbdbe180b244e05" + integrity sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg== + +css-to-react-native@3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/css-to-react-native/-/css-to-react-native-3.2.0.tgz#cdd8099f71024e149e4f6fe17a7d46ecd55f1e32" + integrity sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ== + dependencies: + camelize "^1.0.0" + css-color-keywords "^1.0.0" + postcss-value-parser "^4.0.2" + +csstype@3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.2.tgz#1d4bf9d572f11c14031f0436e1c10bc1f571f50b" + integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== + csstype@^3.0.2: version "3.1.3" resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" @@ -1333,7 +1379,7 @@ ms@2.1.2: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== -nanoid@^3.3.7: +nanoid@^3.3.6, nanoid@^3.3.7: version "3.3.7" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== @@ -1418,6 +1464,20 @@ picomatch@^2.3.1: resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== +postcss-value-parser@^4.0.2: + version "4.2.0" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" + integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== + +postcss@8.4.31: + version "8.4.31" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.31.tgz#92b451050a9f914da6755af352bdc0192508656d" + integrity sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ== + dependencies: + nanoid "^3.3.6" + picocolors "^1.0.0" + source-map-js "^1.0.2" + postcss@^8.4.36: version "8.4.38" resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.38.tgz#b387d533baf2054288e337066d81c6bee9db9e0e" @@ -1528,6 +1588,11 @@ semver@^7.5.4: dependencies: lru-cache "^6.0.0" +shallowequal@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8" + integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ== + shebang-command@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" @@ -1545,7 +1610,7 @@ slash@^3.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== -source-map-js@^1.2.0: +source-map-js@^1.0.2, source-map-js@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.0.tgz#16b809c162517b5b8c3e7dcd315a2a5c2612b2af" integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg== @@ -1562,6 +1627,26 @@ strip-json-comments@^3.1.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== +styled-components@^6.1.8: + version "6.1.8" + resolved "https://registry.yarnpkg.com/styled-components/-/styled-components-6.1.8.tgz#c109d36aeea52d8f049e12de2f3be39a6fc86201" + integrity sha512-PQ6Dn+QxlWyEGCKDS71NGsXoVLKfE1c3vApkvDYS5KAK+V8fNWGhbSUEo9Gg2iaID2tjLXegEW3bZDUGpofRWw== + dependencies: + "@emotion/is-prop-valid" "1.2.1" + "@emotion/unitless" "0.8.0" + "@types/stylis" "4.2.0" + css-to-react-native "3.2.0" + csstype "3.1.2" + postcss "8.4.31" + shallowequal "1.1.0" + stylis "4.3.1" + tslib "2.5.0" + +stylis@4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.3.1.tgz#ed8a9ebf9f76fe1e12d462f5cc3c4c980b23a7eb" + integrity sha512-EQepAV+wMsIaGVGX1RECzgrcqRRU/0sYOHkeLsZ3fzHaHXZy4DaOOX0vOlGQdlsjkh3mFHAIlVimpwAs4dslyQ== + supports-color@^5.3.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" @@ -1598,6 +1683,11 @@ ts-api-utils@^1.0.1: resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.3.0.tgz#4b490e27129f1e8e686b45cc4ab63714dc60eea1" integrity sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ== +tslib@2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.0.tgz#42bfed86f5787aeb41d031866c8f402429e0fddf" + integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg== + type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" From 81c1629084843f977a4b159cc9b0c3c2b3c0e778 Mon Sep 17 00:00:00 2001 From: CSE-pebble Date: Fri, 29 Mar 2024 02:09:59 +0900 Subject: [PATCH 03/56] =?UTF-8?q?Style:=20=EC=B1=84=ED=8C=85=EB=A3=B8=20?= =?UTF-8?q?=ED=97=A4=EB=8D=94=20=ED=8D=BC=EB=B8=94=EB=A6=AC=EC=8B=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/img/userProfile/all.svg | 34 ++++++++++ .../img}/userProfile/frog.svg | 0 .../img}/userProfile/mine.svg | 0 .../img}/userProfile/rabbit.svg | 0 src/App.tsx | 8 +-- src/GlobalStyle.tsx | 4 +- src/assets/back.svg | 4 +- src/assets/profileArrow.svg | 3 + src/components/ChattingRoom.tsx | 5 -- src/components/Messenger.tsx | 18 ++++++ src/components/common/StatusBar.tsx | 11 ++++ src/data/user.json | 24 +++++++ src/pages/ChattingRoom/ChattingRoom.tsx | 12 ++++ src/pages/ChattingRoom/Header.tsx | 63 +++++++++++++++++++ src/style/typography.tsx | 7 +++ 15 files changed, 179 insertions(+), 14 deletions(-) create mode 100644 public/img/userProfile/all.svg rename {src/assets => public/img}/userProfile/frog.svg (100%) rename {src/assets => public/img}/userProfile/mine.svg (100%) rename {src/assets => public/img}/userProfile/rabbit.svg (100%) create mode 100644 src/assets/profileArrow.svg delete mode 100644 src/components/ChattingRoom.tsx create mode 100644 src/components/Messenger.tsx create mode 100644 src/components/common/StatusBar.tsx create mode 100644 src/data/user.json create mode 100644 src/pages/ChattingRoom/ChattingRoom.tsx create mode 100644 src/pages/ChattingRoom/Header.tsx create mode 100644 src/style/typography.tsx diff --git a/public/img/userProfile/all.svg b/public/img/userProfile/all.svg new file mode 100644 index 0000000..2f9deb9 --- /dev/null +++ b/public/img/userProfile/all.svg @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/userProfile/frog.svg b/public/img/userProfile/frog.svg similarity index 100% rename from src/assets/userProfile/frog.svg rename to public/img/userProfile/frog.svg diff --git a/src/assets/userProfile/mine.svg b/public/img/userProfile/mine.svg similarity index 100% rename from src/assets/userProfile/mine.svg rename to public/img/userProfile/mine.svg diff --git a/src/assets/userProfile/rabbit.svg b/public/img/userProfile/rabbit.svg similarity index 100% rename from src/assets/userProfile/rabbit.svg rename to public/img/userProfile/rabbit.svg diff --git a/src/App.tsx b/src/App.tsx index 0b12f73..1c47c03 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,11 +1,7 @@ -import ChattingRoom from "./components/ChattingRoom"; +import Messenger from "./components/Messenger"; function App() { - return ( - <> - - - ); + return ; } export default App; diff --git a/src/GlobalStyle.tsx b/src/GlobalStyle.tsx index d9889a4..e1b0f73 100644 --- a/src/GlobalStyle.tsx +++ b/src/GlobalStyle.tsx @@ -137,7 +137,9 @@ table { } body{ - min-height: 100vh; + min-height: 100vh; + //임시 + background-color: black; } button { diff --git a/src/assets/back.svg b/src/assets/back.svg index cc8dfb5..c6832c1 100644 --- a/src/assets/back.svg +++ b/src/assets/back.svg @@ -1,3 +1,3 @@ - - + + diff --git a/src/assets/profileArrow.svg b/src/assets/profileArrow.svg new file mode 100644 index 0000000..b567f63 --- /dev/null +++ b/src/assets/profileArrow.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/components/ChattingRoom.tsx b/src/components/ChattingRoom.tsx deleted file mode 100644 index f0c03c7..0000000 --- a/src/components/ChattingRoom.tsx +++ /dev/null @@ -1,5 +0,0 @@ -const ChattingRoom = () => { - return
안녕하세용
; -}; - -export default ChattingRoom; diff --git a/src/components/Messenger.tsx b/src/components/Messenger.tsx new file mode 100644 index 0000000..071fce6 --- /dev/null +++ b/src/components/Messenger.tsx @@ -0,0 +1,18 @@ +import styled from "styled-components"; +import ChattingRoom from "../pages/ChattingRoom/ChattingRoom"; + +const Messenger = () => { + return ( + + + + ); +}; + +export default Messenger; + +const Wrapper = styled.div` + width: 375px; + height: 812px; + margin: auto auto; // 가운데 정렬 +`; diff --git a/src/components/common/StatusBar.tsx b/src/components/common/StatusBar.tsx new file mode 100644 index 0000000..28e4942 --- /dev/null +++ b/src/components/common/StatusBar.tsx @@ -0,0 +1,11 @@ +import statusBar from "../../assets/statusBar.svg"; + +const StatusBar = () => { + return ( + <> + + + ); +}; + +export default StatusBar; diff --git a/src/data/user.json b/src/data/user.json new file mode 100644 index 0000000..4a5b8ed --- /dev/null +++ b/src/data/user.json @@ -0,0 +1,24 @@ +{ + "users": [ + { + "id": 0, + "name": "맹구", + "profileImg": "mine.svg" + }, + { + "id": 1, + "name": "CEOS 19기", + "profileImg": "all.svg" + }, + { + "id": 2, + "name": "신짱구", + "profileImg": "rabbit.svg" + }, + { + "id": 3, + "name": "김철수", + "profileImg": "frog.svg" + } + ] +} diff --git a/src/pages/ChattingRoom/ChattingRoom.tsx b/src/pages/ChattingRoom/ChattingRoom.tsx new file mode 100644 index 0000000..6daa98e --- /dev/null +++ b/src/pages/ChattingRoom/ChattingRoom.tsx @@ -0,0 +1,12 @@ +// components +import Header from "./Header"; + +const ChattingRoom = () => { + return ( + <> +
+ + ); +}; + +export default ChattingRoom; diff --git a/src/pages/ChattingRoom/Header.tsx b/src/pages/ChattingRoom/Header.tsx new file mode 100644 index 0000000..219978f --- /dev/null +++ b/src/pages/ChattingRoom/Header.tsx @@ -0,0 +1,63 @@ +import styled from "styled-components"; +import StatusBar from "../../components/common/StatusBar"; +import userData from "../../data/user.json"; +// image +import back from "../../assets/back.svg"; +import profileArrow from "../../assets/profileArrow.svg"; + +import { colors } from "../../style/colors"; +import { typography } from "../../style/typography"; + +const Header = () => { + const userIdx = 1; // 임시 + return ( + + + + + + + + {userData.users[userIdx].name} + + + + + + ); +}; + +export default Header; + +const Wrapper = styled.div` + width: 23.4375rem; + height: 8.3rem; + flex-shrink: 0; + border-bottom: 0.5px solid ${colors.gray300}; + background-color: ${colors.gray100}; +`; + +const RoomInfoWrapper = styled.div` + display: grid; + grid-template-columns: repeat(3, 1fr); + align-items: center; +`; + +const RoomInfo = styled.div` + justify-self: center; + display: flex; + flex-direction: column; + justify-content: center; +`; + +const RoomNameWrapper = styled.div` + display: flex; + align-items: center; + justify-content: center; +`; + +const RoomName = styled.span` + ${typography.body3} + padding-right:0.25rem; + padding-top: 0.25rem; +`; diff --git a/src/style/typography.tsx b/src/style/typography.tsx new file mode 100644 index 0000000..ea10c63 --- /dev/null +++ b/src/style/typography.tsx @@ -0,0 +1,7 @@ +export const typography = { + body3: ` + font-size: 0.75rem; + font-style: normal; + font-weight: 400; + line-height: 125%; /* 0.9375rem */`, +}; From a7d31f977d19acef1643e5190c544ad71097c448 Mon Sep 17 00:00:00 2001 From: CSE-pebble Date: Fri, 29 Mar 2024 02:16:53 +0900 Subject: [PATCH 04/56] =?UTF-8?q?Style:=20=EC=A0=84=EC=B2=B4=20=ED=99=94?= =?UTF-8?q?=EB=A9=B4=20=EB=B0=B0=EA=B2=BD=20=EC=83=89=EC=83=81=20=EC=84=A4?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/Messenger.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/Messenger.tsx b/src/components/Messenger.tsx index 071fce6..3db4826 100644 --- a/src/components/Messenger.tsx +++ b/src/components/Messenger.tsx @@ -15,4 +15,5 @@ const Wrapper = styled.div` width: 375px; height: 812px; margin: auto auto; // 가운데 정렬 + background-color: white; `; From 6971842a494a0c6e2e6ccf995462ba2e81884143 Mon Sep 17 00:00:00 2001 From: CSE-pebble Date: Fri, 29 Mar 2024 03:36:31 +0900 Subject: [PATCH 05/56] =?UTF-8?q?Style:=20Input=20=EC=8A=A4=ED=83=80?= =?UTF-8?q?=EC=9D=BC=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/ChattingRoom/ChattingRoom.tsx | 3 +- src/pages/ChattingRoom/Header.tsx | 1 - src/pages/ChattingRoom/Main.tsx | 71 +++++++++++++++++++++++++ src/style/typography.tsx | 8 ++- 4 files changed, 80 insertions(+), 3 deletions(-) create mode 100644 src/pages/ChattingRoom/Main.tsx diff --git a/src/pages/ChattingRoom/ChattingRoom.tsx b/src/pages/ChattingRoom/ChattingRoom.tsx index 6daa98e..df2524f 100644 --- a/src/pages/ChattingRoom/ChattingRoom.tsx +++ b/src/pages/ChattingRoom/ChattingRoom.tsx @@ -1,10 +1,11 @@ -// components import Header from "./Header"; +import Main from "./Main"; const ChattingRoom = () => { return ( <>
+
); }; diff --git a/src/pages/ChattingRoom/Header.tsx b/src/pages/ChattingRoom/Header.tsx index 219978f..3c3c9a0 100644 --- a/src/pages/ChattingRoom/Header.tsx +++ b/src/pages/ChattingRoom/Header.tsx @@ -30,7 +30,6 @@ const Header = () => { export default Header; const Wrapper = styled.div` - width: 23.4375rem; height: 8.3rem; flex-shrink: 0; border-bottom: 0.5px solid ${colors.gray300}; diff --git a/src/pages/ChattingRoom/Main.tsx b/src/pages/ChattingRoom/Main.tsx new file mode 100644 index 0000000..329568e --- /dev/null +++ b/src/pages/ChattingRoom/Main.tsx @@ -0,0 +1,71 @@ +import styled from "styled-components"; + +// image +import smallAdd from "../../assets/smallAdd.svg"; +import emoji from "../../assets/emoji.svg"; +import voice from "../../assets/voice.svg"; + +import { colors } from "../../style/colors"; +import { typography } from "../../style/typography"; + +const Main = () => { + return ( + +
안녕
+ + + + + + + + +
+ ); +}; + +export default Main; + +const Wrapper = styled.div` + height: 42.45rem; + display: flex; + flex-direction: column; +`; + +const InputWrapper = styled.form` + display: flex; + justify-content: center; + gap: 0.75rem; + margin-top: auto; + margin-bottom: 2.125rem; + height: 3rem; + align-items: center; +`; + +const Input = styled.span` + display: flex; + height: 2.25rem; + padding: 0.625rem 0.75rem; + align-items: center; + gap: 0.75rem; + flex-shrink: 0; + border-radius: 5rem; + border: 1px solid ${colors.gray300}; +`; + +const InputText = styled.input` + display: -webkit-box; + width: 14.3125rem; + -webkit-box-orient: vertical; + -webkit-line-clamp: 1; + flex-shrink: 0; + + overflow: hidden; + text-overflow: ellipsis; + ${colors.black} + + ${typography.body2} + &::placeholder { + ${colors.gray300} + } +`; diff --git a/src/style/typography.tsx b/src/style/typography.tsx index ea10c63..6c08c3a 100644 --- a/src/style/typography.tsx +++ b/src/style/typography.tsx @@ -1,7 +1,13 @@ export const typography = { + body2: ` + font-size: 0.9375rem; + font-style: normal; + font-weight: 400; + line-height: 1.26563rem + `, body3: ` font-size: 0.75rem; font-style: normal; font-weight: 400; - line-height: 125%; /* 0.9375rem */`, + line-height: 0.9375rem`, }; From 147d27d15d009ab1ed9de2f12e59648a83bf9b8f Mon Sep 17 00:00:00 2001 From: CSE-pebble Date: Fri, 29 Mar 2024 06:40:49 +0900 Subject: [PATCH 06/56] =?UTF-8?q?Style:=20=EC=B1=84=ED=8C=85=EB=B0=A9=20?= =?UTF-8?q?=EB=B7=B0=20=EC=8A=A4=ED=83=80=EC=9D=BC=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/ChattingRoom/Header.tsx | 6 +- src/pages/ChattingRoom/Main.tsx | 204 +++++++++++++++++++++++++++++- src/style/typography.tsx | 5 + 3 files changed, 207 insertions(+), 8 deletions(-) diff --git a/src/pages/ChattingRoom/Header.tsx b/src/pages/ChattingRoom/Header.tsx index 3c3c9a0..2ec9118 100644 --- a/src/pages/ChattingRoom/Header.tsx +++ b/src/pages/ChattingRoom/Header.tsx @@ -9,7 +9,7 @@ import { colors } from "../../style/colors"; import { typography } from "../../style/typography"; const Header = () => { - const userIdx = 1; // 임시 + const userIdx = 2; // 임시 return ( @@ -56,7 +56,7 @@ const RoomNameWrapper = styled.div` `; const RoomName = styled.span` - ${typography.body3} - padding-right:0.25rem; + ${typography.body3}; + padding-right: 0.25rem; padding-top: 0.25rem; `; diff --git a/src/pages/ChattingRoom/Main.tsx b/src/pages/ChattingRoom/Main.tsx index 329568e..7d4cf62 100644 --- a/src/pages/ChattingRoom/Main.tsx +++ b/src/pages/ChattingRoom/Main.tsx @@ -1,23 +1,146 @@ import styled from "styled-components"; +import { useState } from "react"; // image import smallAdd from "../../assets/smallAdd.svg"; import emoji from "../../assets/emoji.svg"; import voice from "../../assets/voice.svg"; +import send from "../../assets/send.svg"; +// data +import userData from "../../data/user.json"; import { colors } from "../../style/colors"; import { typography } from "../../style/typography"; const Main = () => { + const [value, setValue] = useState(""); + const [isEmpty, setIsEmpty] = useState(true); // input란에 텍스트 입력 여부 + + const data = [ + { + text: "모든 국민은 헌법과 법률이 정한 법관에 의하여 법률에 의한 재판을 받을 권리를 가진다. 국가는 사회보장·사회복지의 증진에 노력할 의무를 진다. 국가는 건전한 소비행위를 계도하고 생산품의 품질향상을 촉구하기 위한 소비자보호운동을 법률이 정하는 바에 의하여 보장한다.", + sender: 2, + timestamp: "3월 21일 (목) 9:38 AM", + }, + { + text: "법률안에 이의가 있을 때에는 대통령은 제1항의 기간내에 이의서를 붙여 국회로 환부하고, 그 재의를 요구할 수 있다. 국회의 폐회중에도 또한 같다. 대법원장의 임기는 6년으로 하며, 중임할 수 없다.", + sender: 0, + timestamp: "3월 21일 (목) 9:38 AM", + }, + { + text: "행정각부의 장은 국무위원 중에서 국무총리의 제청으로 대통령이 임명한다. ", + sender: 2, + timestamp: "3월 22일 (금) 3:18 PM", + }, + ]; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + console.log("전송"); + }; + + const handleChange = (e: React.ChangeEvent) => { + setValue(e.target.value); + e.target.value == "" ? setIsEmpty(true) : setIsEmpty(false); + }; + return ( -
안녕
- + + {" "} + + {data[0].timestamp} + + {data[0].sender !== 0 && ( + + )} + + {data[0].sender !== 0 && ( + {userData.users[data[0].sender].name} + )} + + {data[0].text} + + {data[0].sender == 0 && 읽음} + + + + + {data[1].timestamp} + + {data[1].sender !== 0 && ( + + )} + + {data[1].sender !== 0 && ( + {userData.users[data[1].sender].name} + )} + + {data[1].text} + + {data[1].sender == 0 && 읽음} + + + + + {data[2].timestamp} + + {data[2].sender !== 0 && ( + + )} + + {data[2].sender !== 0 && ( + {userData.users[data[2].sender].name} + )} + + {data[2].text} + + {data[2].sender == 0 && 읽음} + + + + + + - + - + {isEmpty ? ( + + ) : ( + + + + )}
@@ -32,6 +155,67 @@ const Wrapper = styled.div` flex-direction: column; `; +const ChattingWrapper = styled.section` + display: flex; + flex-direction: column; + gap: 0.75rem; + padding: 0.75rem; + overflow-y: auto; + scrollbar-width: none; + -ms-overflow-style: none; + &::-webkit-scrollbar { + display: none; + } +`; + +const ChattingItemWrapper = styled.div` + display: flex; + flex-direction: column; +`; + +const TimeStamp = styled.span` + color: ${colors.gray400}; + ${typography.caption}; + align-self: center; + margin-bottom: 0.75rem; +`; + +const MsgBox = styled.div<{ align: string }>` + display: flex; + align-self: ${(props) => props.align}; +`; +const ProfileImg = styled.img` + margin-right: 0.38rem; + align-self: end; +`; +const Contents = styled.div` + display: flex; + flex-direction: column; + gap: 0.25rem; +`; +const Name = styled.span` + color: ${colors.gray400}; + ${typography.body3} +`; +const MsgText = styled.span<{ + bgColor: string; + txtColor: string; + maxWidth: number; +}>` + max-width: ${(props) => props.maxWidth}rem; + ${typography.body2}; + background-color: ${(props) => props.bgColor}; + border-radius: 1.25rem; + padding: 0.75rem; + color: ${(props) => props.txtColor}; + text-align: start; +`; +const Read = styled.span` + color: ${colors.gray400}; + ${typography.body3}; + align-self: end; +`; + const InputWrapper = styled.form` display: flex; justify-content: center; @@ -45,7 +229,8 @@ const InputWrapper = styled.form` const Input = styled.span` display: flex; height: 2.25rem; - padding: 0.625rem 0.75rem; + padding: 0.625rem 0; + padding-left: 0.75rem; align-items: center; gap: 0.75rem; flex-shrink: 0; @@ -69,3 +254,12 @@ const InputText = styled.input` ${colors.gray300} } `; + +const VoiceImg = styled.img` + padding-right: 0.75rem; +`; +const SendBtn = styled.button` + padding-right: 0.37rem; + display: flex; + align-items: center; +`; diff --git a/src/style/typography.tsx b/src/style/typography.tsx index 6c08c3a..f18e784 100644 --- a/src/style/typography.tsx +++ b/src/style/typography.tsx @@ -10,4 +10,9 @@ export const typography = { font-style: normal; font-weight: 400; line-height: 0.9375rem`, + caption: ` + font-size: 0.625rem; + font-style: normal; + font-weight: 500; + line-height: 0.78125rem`, }; From c20eb8f44d36cec93a6acb017aa3601d83d260b4 Mon Sep 17 00:00:00 2001 From: CSE-pebble Date: Fri, 29 Mar 2024 07:04:07 +0900 Subject: [PATCH 07/56] =?UTF-8?q?Feat:=20=EC=B1=84=ED=8C=85=20=EB=B3=B4?= =?UTF-8?q?=EB=82=B4=EA=B8=B0=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/ChattingRoom/Main.tsx | 150 +++++++++++++++----------------- 1 file changed, 69 insertions(+), 81 deletions(-) diff --git a/src/pages/ChattingRoom/Main.tsx b/src/pages/ChattingRoom/Main.tsx index 7d4cf62..b2d04e8 100644 --- a/src/pages/ChattingRoom/Main.tsx +++ b/src/pages/ChattingRoom/Main.tsx @@ -1,5 +1,5 @@ import styled from "styled-components"; -import { useState } from "react"; +import { useState, useEffect, useRef } from "react"; // image import smallAdd from "../../assets/smallAdd.svg"; @@ -13,9 +13,6 @@ import { colors } from "../../style/colors"; import { typography } from "../../style/typography"; const Main = () => { - const [value, setValue] = useState(""); - const [isEmpty, setIsEmpty] = useState(true); // input란에 텍스트 입력 여부 - const data = [ { text: "모든 국민은 헌법과 법률이 정한 법관에 의하여 법률에 의한 재판을 받을 권리를 가진다. 국가는 사회보장·사회복지의 증진에 노력할 의무를 진다. 국가는 건전한 소비행위를 계도하고 생산품의 품질향상을 촉구하기 위한 소비자보호운동을 법률이 정하는 바에 의하여 보장한다.", @@ -34,9 +31,49 @@ const Main = () => { }, ]; + const [value, setValue] = useState(""); + const [isEmpty, setIsEmpty] = useState(true); // input란에 텍스트 입력 여부 + const [chats, setChats] = useState(data); + + // 스크롤 이동 + const chatWrapperRef = useRef(null); + useEffect(() => { + if (chatWrapperRef.current) { + chatWrapperRef.current.scrollTop = chatWrapperRef.current.scrollHeight; + } + }, [chats]); + + const getDayOfWeek = (date: Date) => { + const daysOfWeek = ["일", "월", "화", "수", "목", "금", "토"]; + return daysOfWeek[date.getDay()]; + }; + + const getDate = () => { + const currentDate = new Date(); + const formattedTimeStamp = `${ + currentDate.getMonth() + 1 + }월 ${currentDate.getDate()}일 (${getDayOfWeek( + currentDate + )}) ${currentDate.getHours()}:${String(currentDate.getMinutes()).padStart( + 2, + "0" + )} ${currentDate.getHours() >= 12 ? "PM" : "AM"}`; + + return formattedTimeStamp; + }; + const handleSubmit = (e: React.FormEvent) => { e.preventDefault(); - console.log("전송"); + if (!isEmpty) { + const newChat = { + text: value, + sender: 0, + timestamp: getDate(), + }; + setChats([...chats, newChat]); + setValue(""); + setIsEmpty(true); + } }; const handleChange = (e: React.ChangeEvent) => { @@ -46,83 +83,34 @@ const Main = () => { return ( - - {" "} - - {data[0].timestamp} - - {data[0].sender !== 0 && ( - - )} - - {data[0].sender !== 0 && ( - {userData.users[data[0].sender].name} - )} - - {data[0].text} - - {data[0].sender == 0 && 읽음} - - - - - {data[1].timestamp} - - {data[1].sender !== 0 && ( - - )} - - {data[1].sender !== 0 && ( - {userData.users[data[1].sender].name} - )} - - {data[1].text} - - {data[1].sender == 0 && 읽음} - - - - - {data[2].timestamp} - - {data[2].sender !== 0 && ( - - )} - - {data[2].sender !== 0 && ( - {userData.users[data[2].sender].name} + + {chats.map((chat, index) => ( + + {chat.timestamp} + + {chat.sender !== 0 && ( + )} - - {data[2].text} - - {data[2].sender == 0 && 읽음} - - - + + {chat.sender !== 0 && ( + {userData.users[chat.sender].name} + )} + + {chat.text} + + {chat.sender === 0 && 읽음} + + + + ))} From 612e487266b218b875fd02e7c1490d5283e47c41 Mon Sep 17 00:00:00 2001 From: CSE-pebble Date: Fri, 29 Mar 2024 07:30:26 +0900 Subject: [PATCH 08/56] =?UTF-8?q?Feat:=20=EC=B1=84=ED=8C=85=20=EB=82=B4?= =?UTF-8?q?=EC=97=AD=20=EB=A1=9C=EC=BB=AC=20=EC=8A=A4=ED=86=A0=EB=A6=AC?= =?UTF-8?q?=EC=A7=80=20=EC=A0=80=EC=9E=A5=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/data/chatting.json | 17 +++++++++++++++++ src/pages/ChattingRoom/Main.tsx | 28 +++++++++------------------- 2 files changed, 26 insertions(+), 19 deletions(-) create mode 100644 src/data/chatting.json diff --git a/src/data/chatting.json b/src/data/chatting.json new file mode 100644 index 0000000..53f9cc3 --- /dev/null +++ b/src/data/chatting.json @@ -0,0 +1,17 @@ +[ + { + "text": "모든 국민은 헌법과 법률이 정한 법관에 의하여 법률에 의한 재판을 받을 권리를 가진다. 국가는 사회보장·사회복지의 증진에 노력할 의무를 진다. 국가는 건전한 소비행위를 계도하고 생산품의 품질향상을 촉구하기 위한 소비자보호운동을 법률이 정하는 바에 의하여 보장한다.", + "sender": 2, + "timestamp": "3월 21일 (목) 9:38 AM" + }, + { + "text": "법률안에 이의가 있을 때에는 대통령은 제1항의 기간내에 이의서를 붙여 국회로 환부하고, 그 재의를 요구할 수 있다. 국회의 폐회중에도 또한 같다. 대법원장의 임기는 6년으로 하며, 중임할 수 없다.", + "sender": 0, + "timestamp": "3월 21일 (목) 9:38 AM" + }, + { + "text": "행정각부의 장은 국무위원 중에서 국무총리의 제청으로 대통령이 임명한다.", + "sender": 2, + "timestamp": "3월 22일 (금) 3:18 PM" + } +] diff --git a/src/pages/ChattingRoom/Main.tsx b/src/pages/ChattingRoom/Main.tsx index b2d04e8..9b9e84d 100644 --- a/src/pages/ChattingRoom/Main.tsx +++ b/src/pages/ChattingRoom/Main.tsx @@ -8,32 +8,22 @@ import voice from "../../assets/voice.svg"; import send from "../../assets/send.svg"; // data import userData from "../../data/user.json"; +import chattingData from "../../data/chatting.json"; import { colors } from "../../style/colors"; import { typography } from "../../style/typography"; const Main = () => { - const data = [ - { - text: "모든 국민은 헌법과 법률이 정한 법관에 의하여 법률에 의한 재판을 받을 권리를 가진다. 국가는 사회보장·사회복지의 증진에 노력할 의무를 진다. 국가는 건전한 소비행위를 계도하고 생산품의 품질향상을 촉구하기 위한 소비자보호운동을 법률이 정하는 바에 의하여 보장한다.", - sender: 2, - timestamp: "3월 21일 (목) 9:38 AM", - }, - { - text: "법률안에 이의가 있을 때에는 대통령은 제1항의 기간내에 이의서를 붙여 국회로 환부하고, 그 재의를 요구할 수 있다. 국회의 폐회중에도 또한 같다. 대법원장의 임기는 6년으로 하며, 중임할 수 없다.", - sender: 0, - timestamp: "3월 21일 (목) 9:38 AM", - }, - { - text: "행정각부의 장은 국무위원 중에서 국무총리의 제청으로 대통령이 임명한다. ", - sender: 2, - timestamp: "3월 22일 (금) 3:18 PM", - }, - ]; - const [value, setValue] = useState(""); const [isEmpty, setIsEmpty] = useState(true); // input란에 텍스트 입력 여부 - const [chats, setChats] = useState(data); + + // 데이터 관리 + const storedChats = localStorage.getItem("chats"); + const initialData = storedChats ? JSON.parse(storedChats) : chattingData; + const [chats, setChats] = useState(initialData); + useEffect(() => { + localStorage.setItem("chats", JSON.stringify(chats)); + }, [chats]); // 스크롤 이동 const chatWrapperRef = useRef(null); From f1aa0e9499f8e6d064b92f6a76f6259fa65d165d Mon Sep 17 00:00:00 2001 From: CSE-pebble Date: Fri, 29 Mar 2024 07:37:42 +0900 Subject: [PATCH 09/56] =?UTF-8?q?Chore:=20=EC=BD=98=EC=86=94=20=EC=97=90?= =?UTF-8?q?=EB=9F=AC=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/ChattingRoom/Main.tsx | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/pages/ChattingRoom/Main.tsx b/src/pages/ChattingRoom/Main.tsx index 9b9e84d..d9dd88f 100644 --- a/src/pages/ChattingRoom/Main.tsx +++ b/src/pages/ChattingRoom/Main.tsx @@ -90,9 +90,9 @@ const Main = () => { {userData.users[chat.sender].name} )} {chat.text} @@ -176,16 +176,16 @@ const Name = styled.span` ${typography.body3} `; const MsgText = styled.span<{ - bgColor: string; - txtColor: string; - maxWidth: number; + bgcolor: string; + txtcolor: string; + maxwidth: number; }>` - max-width: ${(props) => props.maxWidth}rem; + max-width: ${(props) => props.maxwidth}rem; ${typography.body2}; - background-color: ${(props) => props.bgColor}; + background-color: ${(props) => props.bgcolor}; border-radius: 1.25rem; padding: 0.75rem; - color: ${(props) => props.txtColor}; + color: ${(props) => props.txtcolor}; text-align: start; `; const Read = styled.span` From f7e5bd1383b585af157cd56bbf08d2ac3c8198d1 Mon Sep 17 00:00:00 2001 From: CSE-pebble Date: Fri, 29 Mar 2024 15:56:22 +0900 Subject: [PATCH 10/56] =?UTF-8?q?Feat:=20Header(Room=20Profile)=20?= =?UTF-8?q?=ED=86=A0=EA=B8=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/assets/SenderContext.tsx | 29 +++++++++++++++++++++++++ src/pages/ChattingRoom/ChattingRoom.tsx | 5 +++-- src/pages/ChattingRoom/Header.tsx | 23 ++++++++++++++++---- 3 files changed, 51 insertions(+), 6 deletions(-) create mode 100644 src/assets/SenderContext.tsx diff --git a/src/assets/SenderContext.tsx b/src/assets/SenderContext.tsx new file mode 100644 index 0000000..79c111e --- /dev/null +++ b/src/assets/SenderContext.tsx @@ -0,0 +1,29 @@ +import { createContext, useContext, useState, ReactNode } from "react"; + +interface SenderContextType { + sender: number; + setSender: React.Dispatch>; +} + +const SenderContext = createContext(undefined); + +interface SenderProviderProps { + children: ReactNode; +} + +export const SenderProvider: React.FC = ({ children }) => { + const [sender, setSender] = useState(2); + + return ( + + {children} + + ); +}; + +export const useSenderContext = (): SenderContextType => { + const context = useContext(SenderContext); + if (!context) + throw new Error("useSenderContext must be used within a SenderProvider"); + return context; +}; diff --git a/src/pages/ChattingRoom/ChattingRoom.tsx b/src/pages/ChattingRoom/ChattingRoom.tsx index df2524f..bdaaa5e 100644 --- a/src/pages/ChattingRoom/ChattingRoom.tsx +++ b/src/pages/ChattingRoom/ChattingRoom.tsx @@ -1,12 +1,13 @@ import Header from "./Header"; import Main from "./Main"; +import { SenderProvider } from "../../assets/SenderContext"; const ChattingRoom = () => { return ( - <> +
- + ); }; diff --git a/src/pages/ChattingRoom/Header.tsx b/src/pages/ChattingRoom/Header.tsx index 2ec9118..0cdd127 100644 --- a/src/pages/ChattingRoom/Header.tsx +++ b/src/pages/ChattingRoom/Header.tsx @@ -1,6 +1,9 @@ import styled from "styled-components"; import StatusBar from "../../components/common/StatusBar"; +import { useSenderContext } from "../../assets/SenderContext"; + import userData from "../../data/user.json"; + // image import back from "../../assets/back.svg"; import profileArrow from "../../assets/profileArrow.svg"; @@ -9,16 +12,21 @@ import { colors } from "../../style/colors"; import { typography } from "../../style/typography"; const Header = () => { - const userIdx = 2; // 임시 + const { sender, setSender } = useSenderContext(); + const user = userData.users[sender]; + + const toggleSender = () => { + sender === 0 ? setSender(2) : setSender(0); + }; return ( - - + + - {userData.users[userIdx].name} + {user.name} @@ -49,6 +57,13 @@ const RoomInfo = styled.div` justify-content: center; `; +const RoomProfile = styled.img` + height: 3.25rem; + width: auto; + justify-content: center; + align-items: center; +`; + const RoomNameWrapper = styled.div` display: flex; align-items: center; From a0f311a7268de50791caa605241032c0f8fd1fe0 Mon Sep 17 00:00:00 2001 From: CSE-pebble Date: Fri, 29 Mar 2024 16:15:03 +0900 Subject: [PATCH 11/56] =?UTF-8?q?Feat:=20=EB=A9=94=EC=84=B8=EC=A7=80=20?= =?UTF-8?q?=ED=94=84=EB=A1=9C=ED=95=84=20=ED=86=A0=EA=B8=80=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/assets/SenderContext.tsx | 2 +- src/pages/ChattingRoom/Header.tsx | 3 ++- src/pages/ChattingRoom/Main.tsx | 19 ++++++++++--------- 3 files changed, 13 insertions(+), 11 deletions(-) diff --git a/src/assets/SenderContext.tsx b/src/assets/SenderContext.tsx index 79c111e..bf11dd6 100644 --- a/src/assets/SenderContext.tsx +++ b/src/assets/SenderContext.tsx @@ -12,7 +12,7 @@ interface SenderProviderProps { } export const SenderProvider: React.FC = ({ children }) => { - const [sender, setSender] = useState(2); + const [sender, setSender] = useState(0); return ( diff --git a/src/pages/ChattingRoom/Header.tsx b/src/pages/ChattingRoom/Header.tsx index 0cdd127..fdd4a22 100644 --- a/src/pages/ChattingRoom/Header.tsx +++ b/src/pages/ChattingRoom/Header.tsx @@ -3,6 +3,7 @@ import StatusBar from "../../components/common/StatusBar"; import { useSenderContext } from "../../assets/SenderContext"; import userData from "../../data/user.json"; +import chattingData from "../../data/chatting.json"; // image import back from "../../assets/back.svg"; @@ -13,7 +14,7 @@ import { typography } from "../../style/typography"; const Header = () => { const { sender, setSender } = useSenderContext(); - const user = userData.users[sender]; + const user = userData.users[sender === 0 ? 2 : 0]; const toggleSender = () => { sender === 0 ? setSender(2) : setSender(0); diff --git a/src/pages/ChattingRoom/Main.tsx b/src/pages/ChattingRoom/Main.tsx index d9dd88f..361a8b6 100644 --- a/src/pages/ChattingRoom/Main.tsx +++ b/src/pages/ChattingRoom/Main.tsx @@ -8,12 +8,17 @@ import voice from "../../assets/voice.svg"; import send from "../../assets/send.svg"; // data import userData from "../../data/user.json"; +import { useSenderContext } from "../../assets/SenderContext"; + import chattingData from "../../data/chatting.json"; import { colors } from "../../style/colors"; import { typography } from "../../style/typography"; const Main = () => { + const { sender, setSender } = useSenderContext(); + const user = userData.users[sender === 0 ? 2 : 0]; + const [value, setValue] = useState(""); const [isEmpty, setIsEmpty] = useState(true); // input란에 텍스트 입력 여부 @@ -57,7 +62,7 @@ const Main = () => { if (!isEmpty) { const newChat = { text: value, - sender: 0, + sender: sender, timestamp: getDate(), }; setChats([...chats, newChat]); @@ -79,16 +84,10 @@ const Main = () => { {chat.timestamp} {chat.sender !== 0 && ( - + )} - {chat.sender !== 0 && ( - {userData.users[chat.sender].name} - )} + {chat.sender !== 0 && {user.name}} ` const ProfileImg = styled.img` margin-right: 0.38rem; align-self: end; + width: 1.75rem; + height: 1.75rem; `; const Contents = styled.div` display: flex; From 4907b37d554bf70aaeca136bc1a96e7e79d542ee Mon Sep 17 00:00:00 2001 From: CSE-pebble Date: Fri, 29 Mar 2024 18:27:36 +0900 Subject: [PATCH 12/56] =?UTF-8?q?Feat:=20=ED=86=A0=EA=B8=80=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EA=B5=AC=ED=98=84=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/assets/SenderContext.tsx | 43 +++++++++++++++++--- src/data/user.json | 2 +- src/pages/ChattingRoom/Header.tsx | 16 +++++--- src/pages/ChattingRoom/Main.tsx | 66 +++++++++++++++---------------- 4 files changed, 80 insertions(+), 47 deletions(-) diff --git a/src/assets/SenderContext.tsx b/src/assets/SenderContext.tsx index bf11dd6..634b6a0 100644 --- a/src/assets/SenderContext.tsx +++ b/src/assets/SenderContext.tsx @@ -1,8 +1,22 @@ -import { createContext, useContext, useState, ReactNode } from "react"; +import { + createContext, + useContext, + useState, + useEffect, + ReactNode, +} from "react"; + +import chattingData from "../data/chatting.json"; interface SenderContextType { - sender: number; - setSender: React.Dispatch>; + currentUser: number; + setCurrentUser: React.Dispatch>; + chats: Array<{ text: string; sender: number; timestamp: string }>; + setChats: React.Dispatch< + React.SetStateAction< + Array<{ text: string; sender: number; timestamp: string }> + > + >; } const SenderContext = createContext(undefined); @@ -12,10 +26,29 @@ interface SenderProviderProps { } export const SenderProvider: React.FC = ({ children }) => { - const [sender, setSender] = useState(0); + const [currentUser, setCurrentUser] = useState(0); // 상대방이 2가 됨 + const [chats, setChats] = useState< + Array<{ text: string; sender: number; timestamp: string }> + >([]); + + useEffect(() => { + const storedChats = localStorage.getItem("chats"); + const parsedChats = storedChats ? JSON.parse(storedChats) : []; + if (parsedChats.length === 0) { + localStorage.setItem("chats", JSON.stringify(chattingData)); + } else { + setChats(parsedChats); + } + }, []); + + useEffect(() => { + localStorage.setItem("chats", JSON.stringify(chats)); + }, [chats]); return ( - + {children} ); diff --git a/src/data/user.json b/src/data/user.json index 4a5b8ed..9b8a9f6 100644 --- a/src/data/user.json +++ b/src/data/user.json @@ -2,7 +2,7 @@ "users": [ { "id": 0, - "name": "맹구", + "name": "나현", "profileImg": "mine.svg" }, { diff --git a/src/pages/ChattingRoom/Header.tsx b/src/pages/ChattingRoom/Header.tsx index fdd4a22..2fbb013 100644 --- a/src/pages/ChattingRoom/Header.tsx +++ b/src/pages/ChattingRoom/Header.tsx @@ -3,7 +3,6 @@ import StatusBar from "../../components/common/StatusBar"; import { useSenderContext } from "../../assets/SenderContext"; import userData from "../../data/user.json"; -import chattingData from "../../data/chatting.json"; // image import back from "../../assets/back.svg"; @@ -13,21 +12,26 @@ import { colors } from "../../style/colors"; import { typography } from "../../style/typography"; const Header = () => { - const { sender, setSender } = useSenderContext(); - const user = userData.users[sender === 0 ? 2 : 0]; + const { currentUser, setCurrentUser } = useSenderContext(); + const currentOpponent = currentUser === 0 ? 2 : 0; + const currentOpponentData = userData.users[currentOpponent]; const toggleSender = () => { - sender === 0 ? setSender(2) : setSender(0); + const newSender = currentOpponent; + setCurrentUser(newSender); }; + return ( - + - {user.name} + {currentOpponentData.name} diff --git a/src/pages/ChattingRoom/Main.tsx b/src/pages/ChattingRoom/Main.tsx index 361a8b6..a488ad1 100644 --- a/src/pages/ChattingRoom/Main.tsx +++ b/src/pages/ChattingRoom/Main.tsx @@ -1,5 +1,6 @@ import styled from "styled-components"; import { useState, useEffect, useRef } from "react"; +import { useSenderContext } from "../../assets/SenderContext"; // image import smallAdd from "../../assets/smallAdd.svg"; @@ -8,28 +9,18 @@ import voice from "../../assets/voice.svg"; import send from "../../assets/send.svg"; // data import userData from "../../data/user.json"; -import { useSenderContext } from "../../assets/SenderContext"; - -import chattingData from "../../data/chatting.json"; import { colors } from "../../style/colors"; import { typography } from "../../style/typography"; const Main = () => { - const { sender, setSender } = useSenderContext(); - const user = userData.users[sender === 0 ? 2 : 0]; + const { currentUser, setCurrentUser, chats, setChats } = useSenderContext(); + const currentOpponent = currentUser === 0 ? 2 : 0; + const currentOpponentData = userData.users[currentOpponent]; const [value, setValue] = useState(""); const [isEmpty, setIsEmpty] = useState(true); // input란에 텍스트 입력 여부 - // 데이터 관리 - const storedChats = localStorage.getItem("chats"); - const initialData = storedChats ? JSON.parse(storedChats) : chattingData; - const [chats, setChats] = useState(initialData); - useEffect(() => { - localStorage.setItem("chats", JSON.stringify(chats)); - }, [chats]); - // 스크롤 이동 const chatWrapperRef = useRef(null); useEffect(() => { @@ -62,7 +53,7 @@ const Main = () => { if (!isEmpty) { const newChat = { text: value, - sender: sender, + sender: currentUser, timestamp: getDate(), }; setChats([...chats, newChat]); @@ -79,27 +70,32 @@ const Main = () => { return ( - {chats.map((chat, index) => ( - - {chat.timestamp} - - {chat.sender !== 0 && ( - - )} - - {chat.sender !== 0 && {user.name}} - - {chat.text} - - {chat.sender === 0 && 읽음} - - - - ))} + {chats.map((chat, index) => { + const isMine = chat.sender === currentUser; + return ( + + {chat.timestamp} + + {isMine || ( + + )} + + {isMine || {currentOpponentData.name}} + + {chat.text} + + {isMine && 읽음} + + + + ); + })} From 71c3e475de6fe7c960ac1876e4e8b496c35310be Mon Sep 17 00:00:00 2001 From: CSE-pebble Date: Fri, 29 Mar 2024 19:22:01 +0900 Subject: [PATCH 13/56] =?UTF-8?q?Feat:=20=EB=A1=9C=EC=BB=AC=20=EC=8A=A4?= =?UTF-8?q?=ED=86=A0=EB=A6=AC=EC=A7=80=20=EA=B5=AC=ED=98=84=20=EC=99=84?= =?UTF-8?q?=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/assets/SenderContext.tsx | 24 ++++++++++++------------ src/data/user.json | 2 +- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/assets/SenderContext.tsx b/src/assets/SenderContext.tsx index 634b6a0..31c6f74 100644 --- a/src/assets/SenderContext.tsx +++ b/src/assets/SenderContext.tsx @@ -27,21 +27,21 @@ interface SenderProviderProps { export const SenderProvider: React.FC = ({ children }) => { const [currentUser, setCurrentUser] = useState(0); // 상대방이 2가 됨 - const [chats, setChats] = useState< - Array<{ text: string; sender: number; timestamp: string }> - >([]); - useEffect(() => { - const storedChats = localStorage.getItem("chats"); - const parsedChats = storedChats ? JSON.parse(storedChats) : []; - if (parsedChats.length === 0) { - localStorage.setItem("chats", JSON.stringify(chattingData)); - } else { - setChats(parsedChats); - } - }, []); + const storedChatsJSON = localStorage.getItem("chats"); + const initialData: Array<{ + text: string; + sender: number; + timestamp: string; + }> = storedChatsJSON ? JSON.parse(storedChatsJSON) : chattingData; + + const [chats, setChats] = + useState>( + initialData + ); useEffect(() => { + console.log(chats); localStorage.setItem("chats", JSON.stringify(chats)); }, [chats]); diff --git a/src/data/user.json b/src/data/user.json index 9b8a9f6..72f8e1d 100644 --- a/src/data/user.json +++ b/src/data/user.json @@ -12,7 +12,7 @@ }, { "id": 2, - "name": "신짱구", + "name": "지원", "profileImg": "rabbit.svg" }, { From a48b916412c2283ee119d17bd9cb5e7cc64fb928 Mon Sep 17 00:00:00 2001 From: CSE-pebble Date: Fri, 29 Mar 2024 19:24:45 +0900 Subject: [PATCH 14/56] =?UTF-8?q?Chore:=20=EC=B1=84=ED=8C=85=20=EB=8D=B0?= =?UTF-8?q?=EC=9D=B4=ED=84=B0=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/data/chatting.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/data/chatting.json b/src/data/chatting.json index 53f9cc3..ad810e2 100644 --- a/src/data/chatting.json +++ b/src/data/chatting.json @@ -1,16 +1,16 @@ [ { - "text": "모든 국민은 헌법과 법률이 정한 법관에 의하여 법률에 의한 재판을 받을 권리를 가진다. 국가는 사회보장·사회복지의 증진에 노력할 의무를 진다. 국가는 건전한 소비행위를 계도하고 생산품의 품질향상을 촉구하기 위한 소비자보호운동을 법률이 정하는 바에 의하여 보장한다.", + "text": "나현님 안녕하세요!", "sender": 2, "timestamp": "3월 21일 (목) 9:38 AM" }, { - "text": "법률안에 이의가 있을 때에는 대통령은 제1항의 기간내에 이의서를 붙여 국회로 환부하고, 그 재의를 요구할 수 있다. 국회의 폐회중에도 또한 같다. 대법원장의 임기는 6년으로 하며, 중임할 수 없다.", + "text": "지원님 안녕하세요! 디자인 완전 최고최고입니다", "sender": 0, "timestamp": "3월 21일 (목) 9:38 AM" }, { - "text": "행정각부의 장은 국무위원 중에서 국무총리의 제청으로 대통령이 임명한다.", + "text": "헤헷", "sender": 2, "timestamp": "3월 22일 (금) 3:18 PM" } From d5ba38e45fac0528eef63b9861ce0a4f30bfa70d Mon Sep 17 00:00:00 2001 From: CSE-pebble Date: Fri, 29 Mar 2024 19:29:00 +0900 Subject: [PATCH 15/56] =?UTF-8?q?Refactor:=20=ED=83=80=EC=9E=85=20?= =?UTF-8?q?=EC=A7=80=EC=A0=95=ED=95=98=EC=97=AC=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EA=B0=80=EB=8F=85=EC=84=B1=20=ED=96=A5=EC=83=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/assets/SenderContext.tsx | 28 ++++++++++++---------------- 1 file changed, 12 insertions(+), 16 deletions(-) diff --git a/src/assets/SenderContext.tsx b/src/assets/SenderContext.tsx index 31c6f74..0dab03c 100644 --- a/src/assets/SenderContext.tsx +++ b/src/assets/SenderContext.tsx @@ -8,15 +8,17 @@ import { import chattingData from "../data/chatting.json"; +interface Chat { + text: string; + sender: number; + timestamp: string; +} + interface SenderContextType { currentUser: number; setCurrentUser: React.Dispatch>; - chats: Array<{ text: string; sender: number; timestamp: string }>; - setChats: React.Dispatch< - React.SetStateAction< - Array<{ text: string; sender: number; timestamp: string }> - > - >; + chats: Chat[]; + setChats: React.Dispatch>; } const SenderContext = createContext(undefined); @@ -29,19 +31,13 @@ export const SenderProvider: React.FC = ({ children }) => { const [currentUser, setCurrentUser] = useState(0); // 상대방이 2가 됨 const storedChatsJSON = localStorage.getItem("chats"); - const initialData: Array<{ - text: string; - sender: number; - timestamp: string; - }> = storedChatsJSON ? JSON.parse(storedChatsJSON) : chattingData; + const initialData: Chat[] = storedChatsJSON + ? JSON.parse(storedChatsJSON) + : chattingData; - const [chats, setChats] = - useState>( - initialData - ); + const [chats, setChats] = useState(initialData); useEffect(() => { - console.log(chats); localStorage.setItem("chats", JSON.stringify(chats)); }, [chats]); From 3067bbd2a99c5daaddf3a9e39926e3f0b0070dbd Mon Sep 17 00:00:00 2001 From: CSE-pebble Date: Fri, 29 Mar 2024 19:41:01 +0900 Subject: [PATCH 16/56] =?UTF-8?q?Chore:=20=ED=8C=8C=EB=B9=84=EC=BD=98=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80,=20=EC=93=B8=EB=8D=B0=EC=97=86=EB=8A=94=20?= =?UTF-8?q?=ED=8C=8C=EC=9D=BC=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- index.html | 5 +++-- public/favicon.ico | Bin 3870 -> 0 bytes public/index.html | 43 ----------------------------------------- public/logo192.png | Bin 5347 -> 0 bytes public/logo512.png | Bin 9664 -> 0 bytes public/manifest.json | 25 ------------------------ public/robots.txt | 3 --- public/vite.svg | 1 - src/assets/favicon.png | Bin 0 -> 107123 bytes 9 files changed, 3 insertions(+), 74 deletions(-) delete mode 100644 public/favicon.ico delete mode 100644 public/index.html delete mode 100644 public/logo192.png delete mode 100644 public/logo512.png delete mode 100644 public/manifest.json delete mode 100644 public/robots.txt delete mode 100644 public/vite.svg create mode 100644 src/assets/favicon.png diff --git a/index.html b/index.html index e4b78ea..f33d595 100644 --- a/index.html +++ b/index.html @@ -1,10 +1,11 @@ - + - Vite + React + TS + Discord +
diff --git a/public/favicon.ico b/public/favicon.ico deleted file mode 100644 index a11777cc471a4344702741ab1c8a588998b1311a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3870 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 baj7?x%VD!5Cxk2YbYLNVeiXvvpMCWYo=by@ diff --git a/public/index.html b/public/index.html deleted file mode 100644 index aa069f2..0000000 --- a/public/index.html +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - - - - - - - - React App - - - -
- - - diff --git a/public/logo192.png b/public/logo192.png deleted file mode 100644 index fc44b0a3796c0e0a64c3d858ca038bd4570465d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5347 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 b{|{}U^kRn2wo}j7|0ATu<;8xA7zX}7|B6mN diff --git a/public/manifest.json b/public/manifest.json deleted file mode 100644 index 080d6c7..0000000 --- a/public/manifest.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "short_name": "React App", - "name": "Create React App Sample", - "icons": [ - { - "src": "favicon.ico", - "sizes": "64x64 32x32 24x24 16x16", - "type": "image/x-icon" - }, - { - "src": "logo192.png", - "type": "image/png", - "sizes": "192x192" - }, - { - "src": "logo512.png", - "type": "image/png", - "sizes": "512x512" - } - ], - "start_url": ".", - "display": "standalone", - "theme_color": "#000000", - "background_color": "#ffffff" -} diff --git a/public/robots.txt b/public/robots.txt deleted file mode 100644 index e9e57dc..0000000 --- a/public/robots.txt +++ /dev/null @@ -1,3 +0,0 @@ -# https://www.robotstxt.org/robotstxt.html -User-agent: * -Disallow: diff --git a/public/vite.svg b/public/vite.svg deleted file mode 100644 index e7b8dfb..0000000 --- a/public/vite.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/assets/favicon.png b/src/assets/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..70ef041d4511678270a70eeb03abf246deae7952 GIT binary patch literal 107123 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 literal 0 HcmV?d00001 From 73ac4bd60e94adcc0b7f3e60543a1257bc38e731 Mon Sep 17 00:00:00 2001 From: CSE-pebble Date: Fri, 29 Mar 2024 20:01:17 +0900 Subject: [PATCH 17/56] =?UTF-8?q?Style:=20=EC=A0=84=EC=86=A1=20=EB=B2=84?= =?UTF-8?q?=ED=8A=BC=EC=9C=BC=EB=A1=9C=20=EB=B3=80=EA=B2=BD=EC=8B=9C=20?= =?UTF-8?q?=EC=9C=84=EC=B9=98=20=EA=B3=A0=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/ChattingRoom/Main.tsx | 38 +++++++++++++++++++++------------ 1 file changed, 24 insertions(+), 14 deletions(-) diff --git a/src/pages/ChattingRoom/Main.tsx b/src/pages/ChattingRoom/Main.tsx index a488ad1..f78b8ab 100644 --- a/src/pages/ChattingRoom/Main.tsx +++ b/src/pages/ChattingRoom/Main.tsx @@ -106,14 +106,16 @@ const Main = () => { value={value} onChange={handleChange} > - - {isEmpty ? ( - - ) : ( - - - - )} + + + {isEmpty ? ( + + ) : ( + + + + )} +
@@ -204,11 +206,9 @@ const InputWrapper = styled.form` const Input = styled.span` display: flex; height: 2.25rem; - padding: 0.625rem 0; - padding-left: 0.75rem; + width: 18.875rem; + padding: 0.625rem 0.75rem; align-items: center; - gap: 0.75rem; - flex-shrink: 0; border-radius: 5rem; border: 1px solid ${colors.gray300}; `; @@ -228,13 +228,23 @@ const InputText = styled.input` &::placeholder { ${colors.gray300} } + + padding-right: 0.5rem; +`; + +const IconsWrapper = styled.div` + display: flex; + align-items: center; `; +const Emoji = styled.img` + width: 1.25rem; + height: 1.25rem; +`; const VoiceImg = styled.img` - padding-right: 0.75rem; + padding-left: 0.75rem; `; const SendBtn = styled.button` - padding-right: 0.37rem; display: flex; align-items: center; `; From 8e1f50fcb237d10fb2e875eeedb142ac5e8d3d0c Mon Sep 17 00:00:00 2001 From: CSE-pebble Date: Fri, 29 Mar 2024 20:06:04 +0900 Subject: [PATCH 18/56] =?UTF-8?q?Fix:=20=EC=97=90=EB=9F=AC=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.tsx | 2 +- src/pages/ChattingRoom/Main.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/index.tsx b/src/index.tsx index f8a20a7..153cce0 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -1,6 +1,6 @@ import React from "react"; import ReactDOM from "react-dom/client"; -import App from "App"; +import App from "./App"; const root = ReactDOM.createRoot( document.getElementById("root") as HTMLElement diff --git a/src/pages/ChattingRoom/Main.tsx b/src/pages/ChattingRoom/Main.tsx index f78b8ab..b8810a1 100644 --- a/src/pages/ChattingRoom/Main.tsx +++ b/src/pages/ChattingRoom/Main.tsx @@ -14,7 +14,7 @@ import { colors } from "../../style/colors"; import { typography } from "../../style/typography"; const Main = () => { - const { currentUser, setCurrentUser, chats, setChats } = useSenderContext(); + const { currentUser, chats, setChats } = useSenderContext(); const currentOpponent = currentUser === 0 ? 2 : 0; const currentOpponentData = userData.users[currentOpponent]; From 8938abb342ec27b9c8583bddc32d221401154157 Mon Sep 17 00:00:00 2001 From: CSE-pebble Date: Fri, 29 Mar 2024 20:18:10 +0900 Subject: [PATCH 19/56] =?UTF-8?q?Chore:=20Vercel=20=EB=B0=B0=ED=8F=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dist/.gitignore | 1 + dist/assets/favicon-BFX-J4e-.png | Bin 0 -> 107123 bytes dist/assets/index-BV3uSGbt.js | 334 +++++++++++++++++++++++++++++ dist/assets/statusBar--lJy_-lC.svg | 15 ++ dist/img/userProfile/all.svg | 34 +++ dist/img/userProfile/frog.svg | 9 + dist/img/userProfile/mine.svg | 9 + dist/img/userProfile/rabbit.svg | 9 + dist/index.html | 14 ++ 9 files changed, 425 insertions(+) create mode 100644 dist/.gitignore create mode 100644 dist/assets/favicon-BFX-J4e-.png create mode 100644 dist/assets/index-BV3uSGbt.js create mode 100644 dist/assets/statusBar--lJy_-lC.svg create mode 100644 dist/img/userProfile/all.svg create mode 100644 dist/img/userProfile/frog.svg create mode 100644 dist/img/userProfile/mine.svg create mode 100644 dist/img/userProfile/rabbit.svg create mode 100644 dist/index.html diff --git a/dist/.gitignore b/dist/.gitignore new file mode 100644 index 0000000..e985853 --- /dev/null +++ b/dist/.gitignore @@ -0,0 +1 @@ +.vercel diff --git a/dist/assets/favicon-BFX-J4e-.png b/dist/assets/favicon-BFX-J4e-.png new file mode 100644 index 0000000000000000000000000000000000000000..70ef041d4511678270a70eeb03abf246deae7952 GIT binary patch literal 107123 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 literal 0 HcmV?d00001 diff --git a/dist/assets/index-BV3uSGbt.js b/dist/assets/index-BV3uSGbt.js new file mode 100644 index 0000000..c277bff --- /dev/null +++ b/dist/assets/index-BV3uSGbt.js @@ -0,0 +1,334 @@ +(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const l of document.querySelectorAll('link[rel="modulepreload"]'))r(l);new MutationObserver(l=>{for(const o of l)if(o.type==="childList")for(const i of o.addedNodes)i.tagName==="LINK"&&i.rel==="modulepreload"&&r(i)}).observe(document,{childList:!0,subtree:!0});function n(l){const o={};return l.integrity&&(o.integrity=l.integrity),l.referrerPolicy&&(o.referrerPolicy=l.referrerPolicy),l.crossOrigin==="use-credentials"?o.credentials="include":l.crossOrigin==="anonymous"?o.credentials="omit":o.credentials="same-origin",o}function r(l){if(l.ep)return;l.ep=!0;const o=n(l);fetch(l.href,o)}})();function cd(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var ka={exports:{}},Zl={},Ca={exports:{}},I={};/** + * @license React + * react.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var Ir=Symbol.for("react.element"),fd=Symbol.for("react.portal"),dd=Symbol.for("react.fragment"),pd=Symbol.for("react.strict_mode"),hd=Symbol.for("react.profiler"),md=Symbol.for("react.provider"),gd=Symbol.for("react.context"),vd=Symbol.for("react.forward_ref"),yd=Symbol.for("react.suspense"),wd=Symbol.for("react.memo"),Sd=Symbol.for("react.lazy"),es=Symbol.iterator;function kd(e){return e===null||typeof e!="object"?null:(e=es&&e[es]||e["@@iterator"],typeof e=="function"?e:null)}var xa={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},Ea=Object.assign,_a={};function Fn(e,t,n){this.props=e,this.context=t,this.refs=_a,this.updater=n||xa}Fn.prototype.isReactComponent={};Fn.prototype.setState=function(e,t){if(typeof e!="object"&&typeof e!="function"&&e!=null)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,e,t,"setState")};Fn.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")};function Pa(){}Pa.prototype=Fn.prototype;function bi(e,t,n){this.props=e,this.context=t,this.refs=_a,this.updater=n||xa}var eu=bi.prototype=new Pa;eu.constructor=bi;Ea(eu,Fn.prototype);eu.isPureReactComponent=!0;var ts=Array.isArray,Na=Object.prototype.hasOwnProperty,tu={current:null},za={key:!0,ref:!0,__self:!0,__source:!0};function $a(e,t,n){var r,l={},o=null,i=null;if(t!=null)for(r in t.ref!==void 0&&(i=t.ref),t.key!==void 0&&(o=""+t.key),t)Na.call(t,r)&&!za.hasOwnProperty(r)&&(l[r]=t[r]);var u=arguments.length-2;if(u===1)l.children=n;else if(1>>1,F=E[M];if(0>>1;Ml(pt,$))xel(tt,pt)?(E[M]=tt,E[xe]=$,M=xe):(E[M]=pt,E[Ae]=$,M=Ae);else if(xel(tt,$))E[M]=tt,E[xe]=$,M=xe;else break e}}return N}function l(E,N){var $=E.sortIndex-N.sortIndex;return $!==0?$:E.id-N.id}if(typeof performance=="object"&&typeof performance.now=="function"){var o=performance;e.unstable_now=function(){return o.now()}}else{var i=Date,u=i.now();e.unstable_now=function(){return i.now()-u}}var s=[],a=[],m=1,h=null,p=3,y=!1,v=!1,w=!1,z=typeof setTimeout=="function"?setTimeout:null,f=typeof clearTimeout=="function"?clearTimeout:null,c=typeof setImmediate<"u"?setImmediate:null;typeof navigator<"u"&&navigator.scheduling!==void 0&&navigator.scheduling.isInputPending!==void 0&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function d(E){for(var N=n(a);N!==null;){if(N.callback===null)r(a);else if(N.startTime<=E)r(a),N.sortIndex=N.expirationTime,t(s,N);else break;N=n(a)}}function g(E){if(w=!1,d(E),!v)if(n(s)!==null)v=!0,Wn(x);else{var N=n(a);N!==null&&At(g,N.startTime-E)}}function x(E,N){v=!1,w&&(w=!1,f(P),P=-1),y=!0;var $=p;try{for(d(N),h=n(s);h!==null&&(!(h.expirationTime>N)||E&&!Ce());){var M=h.callback;if(typeof M=="function"){h.callback=null,p=h.priorityLevel;var F=M(h.expirationTime<=N);N=e.unstable_now(),typeof F=="function"?h.callback=F:h===n(s)&&r(s),d(N)}else r(s);h=n(s)}if(h!==null)var Bt=!0;else{var Ae=n(a);Ae!==null&&At(g,Ae.startTime-N),Bt=!1}return Bt}finally{h=null,p=$,y=!1}}var C=!1,S=null,P=-1,A=5,R=-1;function Ce(){return!(e.unstable_now()-RE||125M?(E.sortIndex=$,t(a,E),n(s)===null&&E===n(a)&&(w?(f(P),P=-1):w=!0,At(g,$-M))):(E.sortIndex=F,t(s,E),v||y||(v=!0,Wn(x))),E},e.unstable_shouldYield=Ce,e.unstable_wrapCallback=function(E){var N=p;return function(){var $=p;p=N;try{return E.apply(this,arguments)}finally{p=$}}}})(Ia);Ra.exports=Ia;var Rd=Ra.exports;/** + * @license React + * react-dom.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var Oa=ve,ze=Rd;function k(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),qo=Object.prototype.hasOwnProperty,Id=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,rs={},ls={};function Od(e){return qo.call(ls,e)?!0:qo.call(rs,e)?!1:Id.test(e)?ls[e]=!0:(rs[e]=!0,!1)}function jd(e,t,n,r){if(n!==null&&n.type===0)return!1;switch(typeof t){case"function":case"symbol":return!0;case"boolean":return r?!1:n!==null?!n.acceptsBooleans:(e=e.toLowerCase().slice(0,5),e!=="data-"&&e!=="aria-");default:return!1}}function Dd(e,t,n,r){if(t===null||typeof t>"u"||jd(e,t,n,r))return!0;if(r)return!1;if(n!==null)switch(n.type){case 3:return!t;case 4:return t===!1;case 5:return isNaN(t);case 6:return isNaN(t)||1>t}return!1}function me(e,t,n,r,l,o,i){this.acceptsBooleans=t===2||t===3||t===4,this.attributeName=r,this.attributeNamespace=l,this.mustUseProperty=n,this.propertyName=e,this.type=t,this.sanitizeURL=o,this.removeEmptyString=i}var ie={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(e){ie[e]=new me(e,0,!1,e,null,!1,!1)});[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(e){var t=e[0];ie[t]=new me(t,1,!1,e[1],null,!1,!1)});["contentEditable","draggable","spellCheck","value"].forEach(function(e){ie[e]=new me(e,2,!1,e.toLowerCase(),null,!1,!1)});["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(e){ie[e]=new me(e,2,!1,e,null,!1,!1)});"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(e){ie[e]=new me(e,3,!1,e.toLowerCase(),null,!1,!1)});["checked","multiple","muted","selected"].forEach(function(e){ie[e]=new me(e,3,!0,e,null,!1,!1)});["capture","download"].forEach(function(e){ie[e]=new me(e,4,!1,e,null,!1,!1)});["cols","rows","size","span"].forEach(function(e){ie[e]=new me(e,6,!1,e,null,!1,!1)});["rowSpan","start"].forEach(function(e){ie[e]=new me(e,5,!1,e.toLowerCase(),null,!1,!1)});var ru=/[\-:]([a-z])/g;function lu(e){return e[1].toUpperCase()}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(e){var t=e.replace(ru,lu);ie[t]=new me(t,1,!1,e,null,!1,!1)});"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(e){var t=e.replace(ru,lu);ie[t]=new me(t,1,!1,e,"http://www.w3.org/1999/xlink",!1,!1)});["xml:base","xml:lang","xml:space"].forEach(function(e){var t=e.replace(ru,lu);ie[t]=new me(t,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1,!1)});["tabIndex","crossOrigin"].forEach(function(e){ie[e]=new me(e,1,!1,e.toLowerCase(),null,!1,!1)});ie.xlinkHref=new me("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1);["src","href","action","formAction"].forEach(function(e){ie[e]=new me(e,1,!1,e.toLowerCase(),null,!0,!0)});function ou(e,t,n,r){var l=ie.hasOwnProperty(t)?ie[t]:null;(l!==null?l.type!==0:r||!(2u||l[i]!==o[u]){var s=` +`+l[i].replace(" at new "," at ");return e.displayName&&s.includes("")&&(s=s.replace("",e.displayName)),s}while(1<=i&&0<=u);break}}}finally{xo=!1,Error.prepareStackTrace=n}return(e=e?e.displayName||e.name:"")?bn(e):""}function Md(e){switch(e.tag){case 5:return bn(e.type);case 16:return bn("Lazy");case 13:return bn("Suspense");case 19:return bn("SuspenseList");case 0:case 2:case 15:return e=Eo(e.type,!1),e;case 11:return e=Eo(e.type.render,!1),e;case 1:return e=Eo(e.type,!0),e;default:return""}}function ni(e){if(e==null)return null;if(typeof e=="function")return e.displayName||e.name||null;if(typeof e=="string")return e;switch(e){case sn:return"Fragment";case un:return"Portal";case bo:return"Profiler";case iu:return"StrictMode";case ei:return"Suspense";case ti:return"SuspenseList"}if(typeof e=="object")switch(e.$$typeof){case Ma:return(e.displayName||"Context")+".Consumer";case Da:return(e._context.displayName||"Context")+".Provider";case uu:var t=e.render;return e=e.displayName,e||(e=t.displayName||t.name||"",e=e!==""?"ForwardRef("+e+")":"ForwardRef"),e;case su:return t=e.displayName||null,t!==null?t:ni(e.type)||"Memo";case vt:t=e._payload,e=e._init;try{return ni(e(t))}catch{}}return null}function Fd(e){var t=e.type;switch(e.tag){case 24:return"Cache";case 9:return(t.displayName||"Context")+".Consumer";case 10:return(t._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return e=t.render,e=e.displayName||e.name||"",t.displayName||(e!==""?"ForwardRef("+e+")":"ForwardRef");case 7:return"Fragment";case 5:return t;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return ni(t);case 8:return t===iu?"StrictMode":"Mode";case 22:return"Offscreen";case 12:return"Profiler";case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if(typeof t=="function")return t.displayName||t.name||null;if(typeof t=="string")return t}return null}function Rt(e){switch(typeof e){case"boolean":case"number":case"string":case"undefined":return e;case"object":return e;default:return""}}function Aa(e){var t=e.type;return(e=e.nodeName)&&e.toLowerCase()==="input"&&(t==="checkbox"||t==="radio")}function Ad(e){var t=Aa(e)?"checked":"value",n=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),r=""+e[t];if(!e.hasOwnProperty(t)&&typeof n<"u"&&typeof n.get=="function"&&typeof n.set=="function"){var l=n.get,o=n.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return l.call(this)},set:function(i){r=""+i,o.call(this,i)}}),Object.defineProperty(e,t,{enumerable:n.enumerable}),{getValue:function(){return r},setValue:function(i){r=""+i},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}function Wr(e){e._valueTracker||(e._valueTracker=Ad(e))}function Ba(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var n=t.getValue(),r="";return e&&(r=Aa(e)?e.checked?"true":"false":e.value),e=r,e!==n?(t.setValue(e),!0):!1}function xl(e){if(e=e||(typeof document<"u"?document:void 0),typeof e>"u")return null;try{return e.activeElement||e.body}catch{return e.body}}function ri(e,t){var n=t.checked;return G({},t,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:n??e._wrapperState.initialChecked})}function is(e,t){var n=t.defaultValue==null?"":t.defaultValue,r=t.checked!=null?t.checked:t.defaultChecked;n=Rt(t.value!=null?t.value:n),e._wrapperState={initialChecked:r,initialValue:n,controlled:t.type==="checkbox"||t.type==="radio"?t.checked!=null:t.value!=null}}function Ua(e,t){t=t.checked,t!=null&&ou(e,"checked",t,!1)}function li(e,t){Ua(e,t);var n=Rt(t.value),r=t.type;if(n!=null)r==="number"?(n===0&&e.value===""||e.value!=n)&&(e.value=""+n):e.value!==""+n&&(e.value=""+n);else if(r==="submit"||r==="reset"){e.removeAttribute("value");return}t.hasOwnProperty("value")?oi(e,t.type,n):t.hasOwnProperty("defaultValue")&&oi(e,t.type,Rt(t.defaultValue)),t.checked==null&&t.defaultChecked!=null&&(e.defaultChecked=!!t.defaultChecked)}function us(e,t,n){if(t.hasOwnProperty("value")||t.hasOwnProperty("defaultValue")){var r=t.type;if(!(r!=="submit"&&r!=="reset"||t.value!==void 0&&t.value!==null))return;t=""+e._wrapperState.initialValue,n||t===e.value||(e.value=t),e.defaultValue=t}n=e.name,n!==""&&(e.name=""),e.defaultChecked=!!e._wrapperState.initialChecked,n!==""&&(e.name=n)}function oi(e,t,n){(t!=="number"||xl(e.ownerDocument)!==e)&&(n==null?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+n&&(e.defaultValue=""+n))}var er=Array.isArray;function Sn(e,t,n,r){if(e=e.options,t){t={};for(var l=0;l"+t.valueOf().toString()+"",t=Hr.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;t.firstChild;)e.appendChild(t.firstChild)}});function mr(e,t){if(t){var n=e.firstChild;if(n&&n===e.lastChild&&n.nodeType===3){n.nodeValue=t;return}}e.textContent=t}var lr={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},Bd=["Webkit","ms","Moz","O"];Object.keys(lr).forEach(function(e){Bd.forEach(function(t){t=t+e.charAt(0).toUpperCase()+e.substring(1),lr[t]=lr[e]})});function Qa(e,t,n){return t==null||typeof t=="boolean"||t===""?"":n||typeof t!="number"||t===0||lr.hasOwnProperty(e)&&lr[e]?(""+t).trim():t+"px"}function Ka(e,t){e=e.style;for(var n in t)if(t.hasOwnProperty(n)){var r=n.indexOf("--")===0,l=Qa(n,t[n],r);n==="float"&&(n="cssFloat"),r?e.setProperty(n,l):e[n]=l}}var Ud=G({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function si(e,t){if(t){if(Ud[e]&&(t.children!=null||t.dangerouslySetInnerHTML!=null))throw Error(k(137,e));if(t.dangerouslySetInnerHTML!=null){if(t.children!=null)throw Error(k(60));if(typeof t.dangerouslySetInnerHTML!="object"||!("__html"in t.dangerouslySetInnerHTML))throw Error(k(61))}if(t.style!=null&&typeof t.style!="object")throw Error(k(62))}}function ai(e,t){if(e.indexOf("-")===-1)return typeof t.is=="string";switch(e){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var ci=null;function au(e){return e=e.target||e.srcElement||window,e.correspondingUseElement&&(e=e.correspondingUseElement),e.nodeType===3?e.parentNode:e}var fi=null,kn=null,Cn=null;function cs(e){if(e=Dr(e)){if(typeof fi!="function")throw Error(k(280));var t=e.stateNode;t&&(t=to(t),fi(e.stateNode,e.type,t))}}function Ya(e){kn?Cn?Cn.push(e):Cn=[e]:kn=e}function Ga(){if(kn){var e=kn,t=Cn;if(Cn=kn=null,cs(e),t)for(e=0;e>>=0,e===0?32:31-(qd(e)/bd|0)|0}var Qr=64,Kr=4194304;function tr(e){switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return e&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return e&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return e}}function Nl(e,t){var n=e.pendingLanes;if(n===0)return 0;var r=0,l=e.suspendedLanes,o=e.pingedLanes,i=n&268435455;if(i!==0){var u=i&~l;u!==0?r=tr(u):(o&=i,o!==0&&(r=tr(o)))}else i=n&~l,i!==0?r=tr(i):o!==0&&(r=tr(o));if(r===0)return 0;if(t!==0&&t!==r&&!(t&l)&&(l=r&-r,o=t&-t,l>=o||l===16&&(o&4194240)!==0))return t;if(r&4&&(r|=n&16),t=e.entangledLanes,t!==0)for(e=e.entanglements,t&=r;0n;n++)t.push(e);return t}function Or(e,t,n){e.pendingLanes|=t,t!==536870912&&(e.suspendedLanes=0,e.pingedLanes=0),e=e.eventTimes,t=31-He(t),e[t]=n}function rp(e,t){var n=e.pendingLanes&~t;e.pendingLanes=t,e.suspendedLanes=0,e.pingedLanes=0,e.expiredLanes&=t,e.mutableReadLanes&=t,e.entangledLanes&=t,t=e.entanglements;var r=e.eventTimes;for(e=e.expirationTimes;0=ir),ws=" ",Ss=!1;function hc(e,t){switch(e){case"keyup":return Lp.indexOf(t.keyCode)!==-1;case"keydown":return t.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function mc(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:null}var an=!1;function Ip(e,t){switch(e){case"compositionend":return mc(t);case"keypress":return t.which!==32?null:(Ss=!0,ws);case"textInput":return e=t.data,e===ws&&Ss?null:e;default:return null}}function Op(e,t){if(an)return e==="compositionend"||!vu&&hc(e,t)?(e=dc(),al=hu=kt=null,an=!1,e):null;switch(e){case"paste":return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:n,offset:t-e};e=r}e:{for(;n;){if(n.nextSibling){n=n.nextSibling;break e}n=n.parentNode}n=void 0}n=Es(n)}}function wc(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?wc(e,t.parentNode):"contains"in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function Sc(){for(var e=window,t=xl();t instanceof e.HTMLIFrameElement;){try{var n=typeof t.contentWindow.location.href=="string"}catch{n=!1}if(n)e=t.contentWindow;else break;t=xl(e.document)}return t}function yu(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t==="input"&&(e.type==="text"||e.type==="search"||e.type==="tel"||e.type==="url"||e.type==="password")||t==="textarea"||e.contentEditable==="true")}function Wp(e){var t=Sc(),n=e.focusedElem,r=e.selectionRange;if(t!==n&&n&&n.ownerDocument&&wc(n.ownerDocument.documentElement,n)){if(r!==null&&yu(n)){if(t=r.start,e=r.end,e===void 0&&(e=t),"selectionStart"in n)n.selectionStart=t,n.selectionEnd=Math.min(e,n.value.length);else if(e=(t=n.ownerDocument||document)&&t.defaultView||window,e.getSelection){e=e.getSelection();var l=n.textContent.length,o=Math.min(r.start,l);r=r.end===void 0?o:Math.min(r.end,l),!e.extend&&o>r&&(l=r,r=o,o=l),l=_s(n,o);var i=_s(n,r);l&&i&&(e.rangeCount!==1||e.anchorNode!==l.node||e.anchorOffset!==l.offset||e.focusNode!==i.node||e.focusOffset!==i.offset)&&(t=t.createRange(),t.setStart(l.node,l.offset),e.removeAllRanges(),o>r?(e.addRange(t),e.extend(i.node,i.offset)):(t.setEnd(i.node,i.offset),e.addRange(t)))}}for(t=[],e=n;e=e.parentNode;)e.nodeType===1&&t.push({element:e,left:e.scrollLeft,top:e.scrollTop});for(typeof n.focus=="function"&&n.focus(),n=0;n=document.documentMode,cn=null,vi=null,sr=null,yi=!1;function Ps(e,t,n){var r=n.window===n?n.document:n.nodeType===9?n:n.ownerDocument;yi||cn==null||cn!==xl(r)||(r=cn,"selectionStart"in r&&yu(r)?r={start:r.selectionStart,end:r.selectionEnd}:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection(),r={anchorNode:r.anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset}),sr&&kr(sr,r)||(sr=r,r=Tl(vi,"onSelect"),0pn||(e.current=Ei[pn],Ei[pn]=null,pn--)}function B(e,t){pn++,Ei[pn]=e.current,e.current=t}var It={},fe=jt(It),we=jt(!1),Jt=It;function Nn(e,t){var n=e.type.contextTypes;if(!n)return It;var r=e.stateNode;if(r&&r.__reactInternalMemoizedUnmaskedChildContext===t)return r.__reactInternalMemoizedMaskedChildContext;var l={},o;for(o in n)l[o]=t[o];return r&&(e=e.stateNode,e.__reactInternalMemoizedUnmaskedChildContext=t,e.__reactInternalMemoizedMaskedChildContext=l),l}function Se(e){return e=e.childContextTypes,e!=null}function Rl(){W(we),W(fe)}function Is(e,t,n){if(fe.current!==It)throw Error(k(168));B(fe,t),B(we,n)}function $c(e,t,n){var r=e.stateNode;if(t=t.childContextTypes,typeof r.getChildContext!="function")return n;r=r.getChildContext();for(var l in r)if(!(l in t))throw Error(k(108,Fd(e)||"Unknown",l));return G({},n,r)}function Il(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||It,Jt=fe.current,B(fe,e),B(we,we.current),!0}function Os(e,t,n){var r=e.stateNode;if(!r)throw Error(k(169));n?(e=$c(e,t,Jt),r.__reactInternalMemoizedMergedChildContext=e,W(we),W(fe),B(fe,e)):W(we),B(we,n)}var lt=null,no=!1,Fo=!1;function Tc(e){lt===null?lt=[e]:lt.push(e)}function t0(e){no=!0,Tc(e)}function Dt(){if(!Fo&<!==null){Fo=!0;var e=0,t=D;try{var n=lt;for(D=1;e>=i,l-=i,ot=1<<32-He(t)+l|n<P?(A=S,S=null):A=S.sibling;var R=p(f,S,d[P],g);if(R===null){S===null&&(S=A);break}e&&S&&R.alternate===null&&t(f,S),c=o(R,c,P),C===null?x=R:C.sibling=R,C=R,S=A}if(P===d.length)return n(f,S),Q&&Vt(f,P),x;if(S===null){for(;PP?(A=S,S=null):A=S.sibling;var Ce=p(f,S,R.value,g);if(Ce===null){S===null&&(S=A);break}e&&S&&Ce.alternate===null&&t(f,S),c=o(Ce,c,P),C===null?x=Ce:C.sibling=Ce,C=Ce,S=A}if(R.done)return n(f,S),Q&&Vt(f,P),x;if(S===null){for(;!R.done;P++,R=d.next())R=h(f,R.value,g),R!==null&&(c=o(R,c,P),C===null?x=R:C.sibling=R,C=R);return Q&&Vt(f,P),x}for(S=r(f,S);!R.done;P++,R=d.next())R=y(S,f,P,R.value,g),R!==null&&(e&&R.alternate!==null&&S.delete(R.key===null?P:R.key),c=o(R,c,P),C===null?x=R:C.sibling=R,C=R);return e&&S.forEach(function(Mt){return t(f,Mt)}),Q&&Vt(f,P),x}function z(f,c,d,g){if(typeof d=="object"&&d!==null&&d.type===sn&&d.key===null&&(d=d.props.children),typeof d=="object"&&d!==null){switch(d.$$typeof){case Vr:e:{for(var x=d.key,C=c;C!==null;){if(C.key===x){if(x=d.type,x===sn){if(C.tag===7){n(f,C.sibling),c=l(C,d.props.children),c.return=f,f=c;break e}}else if(C.elementType===x||typeof x=="object"&&x!==null&&x.$$typeof===vt&&Us(x)===C.type){n(f,C.sibling),c=l(C,d.props),c.ref=Zn(f,C,d),c.return=f,f=c;break e}n(f,C);break}else t(f,C);C=C.sibling}d.type===sn?(c=Xt(d.props.children,f.mode,g,d.key),c.return=f,f=c):(g=vl(d.type,d.key,d.props,null,f.mode,g),g.ref=Zn(f,c,d),g.return=f,f=g)}return i(f);case un:e:{for(C=d.key;c!==null;){if(c.key===C)if(c.tag===4&&c.stateNode.containerInfo===d.containerInfo&&c.stateNode.implementation===d.implementation){n(f,c.sibling),c=l(c,d.children||[]),c.return=f,f=c;break e}else{n(f,c);break}else t(f,c);c=c.sibling}c=Ko(d,f.mode,g),c.return=f,f=c}return i(f);case vt:return C=d._init,z(f,c,C(d._payload),g)}if(er(d))return v(f,c,d,g);if(Qn(d))return w(f,c,d,g);br(f,d)}return typeof d=="string"&&d!==""||typeof d=="number"?(d=""+d,c!==null&&c.tag===6?(n(f,c.sibling),c=l(c,d),c.return=f,f=c):(n(f,c),c=Qo(d,f.mode,g),c.return=f,f=c),i(f)):n(f,c)}return z}var $n=Fc(!0),Ac=Fc(!1),Mr={},et=jt(Mr),_r=jt(Mr),Pr=jt(Mr);function Kt(e){if(e===Mr)throw Error(k(174));return e}function Nu(e,t){switch(B(Pr,t),B(_r,e),B(et,Mr),e=t.nodeType,e){case 9:case 11:t=(t=t.documentElement)?t.namespaceURI:ui(null,"");break;default:e=e===8?t.parentNode:t,t=e.namespaceURI||null,e=e.tagName,t=ui(t,e)}W(et),B(et,t)}function Tn(){W(et),W(_r),W(Pr)}function Bc(e){Kt(Pr.current);var t=Kt(et.current),n=ui(t,e.type);t!==n&&(B(_r,e),B(et,n))}function zu(e){_r.current===e&&(W(et),W(_r))}var K=jt(0);function Al(e){for(var t=e;t!==null;){if(t.tag===13){var n=t.memoizedState;if(n!==null&&(n=n.dehydrated,n===null||n.data==="$?"||n.data==="$!"))return t}else if(t.tag===19&&t.memoizedProps.revealOrder!==void 0){if(t.flags&128)return t}else if(t.child!==null){t.child.return=t,t=t.child;continue}if(t===e)break;for(;t.sibling===null;){if(t.return===null||t.return===e)return null;t=t.return}t.sibling.return=t.return,t=t.sibling}return null}var Ao=[];function $u(){for(var e=0;en?n:4,e(!0);var r=Bo.transition;Bo.transition={};try{e(!1),t()}finally{D=n,Bo.transition=r}}function nf(){return Me().memoizedState}function o0(e,t,n){var r=$t(e);if(n={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null},rf(e))lf(t,n);else if(n=Oc(e,t,n,r),n!==null){var l=pe();Qe(n,e,r,l),of(n,t,r)}}function i0(e,t,n){var r=$t(e),l={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null};if(rf(e))lf(t,l);else{var o=e.alternate;if(e.lanes===0&&(o===null||o.lanes===0)&&(o=t.lastRenderedReducer,o!==null))try{var i=t.lastRenderedState,u=o(i,n);if(l.hasEagerState=!0,l.eagerState=u,Ye(u,i)){var s=t.interleaved;s===null?(l.next=l,_u(t)):(l.next=s.next,s.next=l),t.interleaved=l;return}}catch{}finally{}n=Oc(e,t,l,r),n!==null&&(l=pe(),Qe(n,e,r,l),of(n,t,r))}}function rf(e){var t=e.alternate;return e===Y||t!==null&&t===Y}function lf(e,t){ar=Bl=!0;var n=e.pending;n===null?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function of(e,t,n){if(n&4194240){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,fu(e,n)}}var Ul={readContext:De,useCallback:ue,useContext:ue,useEffect:ue,useImperativeHandle:ue,useInsertionEffect:ue,useLayoutEffect:ue,useMemo:ue,useReducer:ue,useRef:ue,useState:ue,useDebugValue:ue,useDeferredValue:ue,useTransition:ue,useMutableSource:ue,useSyncExternalStore:ue,useId:ue,unstable_isNewReconciler:!1},u0={readContext:De,useCallback:function(e,t){return Xe().memoizedState=[e,t===void 0?null:t],e},useContext:De,useEffect:Ws,useImperativeHandle:function(e,t,n){return n=n!=null?n.concat([e]):null,pl(4194308,4,Jc.bind(null,t,e),n)},useLayoutEffect:function(e,t){return pl(4194308,4,e,t)},useInsertionEffect:function(e,t){return pl(4,2,e,t)},useMemo:function(e,t){var n=Xe();return t=t===void 0?null:t,e=e(),n.memoizedState=[e,t],e},useReducer:function(e,t,n){var r=Xe();return t=n!==void 0?n(t):t,r.memoizedState=r.baseState=t,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:t},r.queue=e,e=e.dispatch=o0.bind(null,Y,e),[r.memoizedState,e]},useRef:function(e){var t=Xe();return e={current:e},t.memoizedState=e},useState:Vs,useDebugValue:Ou,useDeferredValue:function(e){return Xe().memoizedState=e},useTransition:function(){var e=Vs(!1),t=e[0];return e=l0.bind(null,e[1]),Xe().memoizedState=e,[t,e]},useMutableSource:function(){},useSyncExternalStore:function(e,t,n){var r=Y,l=Xe();if(Q){if(n===void 0)throw Error(k(407));n=n()}else{if(n=t(),re===null)throw Error(k(349));bt&30||Wc(r,t,n)}l.memoizedState=n;var o={value:n,getSnapshot:t};return l.queue=o,Ws(Qc.bind(null,r,o,e),[e]),r.flags|=2048,$r(9,Hc.bind(null,r,o,n,t),void 0,null),n},useId:function(){var e=Xe(),t=re.identifierPrefix;if(Q){var n=it,r=ot;n=(r&~(1<<32-He(r)-1)).toString(32)+n,t=":"+t+"R"+n,n=Nr++,0<\/script>",e=e.removeChild(e.firstChild)):typeof r.is=="string"?e=i.createElement(n,{is:r.is}):(e=i.createElement(n),n==="select"&&(i=e,r.multiple?i.multiple=!0:r.size&&(i.size=r.size))):e=i.createElementNS(e,n),e[Je]=t,e[Er]=r,mf(e,t,!1,!1),t.stateNode=e;e:{switch(i=ai(n,r),n){case"dialog":U("cancel",e),U("close",e),l=r;break;case"iframe":case"object":case"embed":U("load",e),l=r;break;case"video":case"audio":for(l=0;lRn&&(t.flags|=128,r=!0,Jn(o,!1),t.lanes=4194304)}else{if(!r)if(e=Al(i),e!==null){if(t.flags|=128,r=!0,n=e.updateQueue,n!==null&&(t.updateQueue=n,t.flags|=4),Jn(o,!0),o.tail===null&&o.tailMode==="hidden"&&!i.alternate&&!Q)return se(t),null}else 2*Z()-o.renderingStartTime>Rn&&n!==1073741824&&(t.flags|=128,r=!0,Jn(o,!1),t.lanes=4194304);o.isBackwards?(i.sibling=t.child,t.child=i):(n=o.last,n!==null?n.sibling=i:t.child=i,o.last=i)}return o.tail!==null?(t=o.tail,o.rendering=t,o.tail=t.sibling,o.renderingStartTime=Z(),t.sibling=null,n=K.current,B(K,r?n&1|2:n&1),t):(se(t),null);case 22:case 23:return Bu(),r=t.memoizedState!==null,e!==null&&e.memoizedState!==null!==r&&(t.flags|=8192),r&&t.mode&1?_e&1073741824&&(se(t),t.subtreeFlags&6&&(t.flags|=8192)):se(t),null;case 24:return null;case 25:return null}throw Error(k(156,t.tag))}function m0(e,t){switch(Su(t),t.tag){case 1:return Se(t.type)&&Rl(),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return Tn(),W(we),W(fe),$u(),e=t.flags,e&65536&&!(e&128)?(t.flags=e&-65537|128,t):null;case 5:return zu(t),null;case 13:if(W(K),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(k(340));zn()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return W(K),null;case 4:return Tn(),null;case 10:return Eu(t.type._context),null;case 22:case 23:return Bu(),null;case 24:return null;default:return null}}var tl=!1,ae=!1,g0=typeof WeakSet=="function"?WeakSet:Set,_=null;function vn(e,t){var n=e.ref;if(n!==null)if(typeof n=="function")try{n(null)}catch(r){X(e,t,r)}else n.current=null}function Di(e,t,n){try{n()}catch(r){X(e,t,r)}}var qs=!1;function v0(e,t){if(wi=zl,e=Sc(),yu(e)){if("selectionStart"in e)var n={start:e.selectionStart,end:e.selectionEnd};else e:{n=(n=e.ownerDocument)&&n.defaultView||window;var r=n.getSelection&&n.getSelection();if(r&&r.rangeCount!==0){n=r.anchorNode;var l=r.anchorOffset,o=r.focusNode;r=r.focusOffset;try{n.nodeType,o.nodeType}catch{n=null;break e}var i=0,u=-1,s=-1,a=0,m=0,h=e,p=null;t:for(;;){for(var y;h!==n||l!==0&&h.nodeType!==3||(u=i+l),h!==o||r!==0&&h.nodeType!==3||(s=i+r),h.nodeType===3&&(i+=h.nodeValue.length),(y=h.firstChild)!==null;)p=h,h=y;for(;;){if(h===e)break t;if(p===n&&++a===l&&(u=i),p===o&&++m===r&&(s=i),(y=h.nextSibling)!==null)break;h=p,p=h.parentNode}h=y}n=u===-1||s===-1?null:{start:u,end:s}}else n=null}n=n||{start:0,end:0}}else n=null;for(Si={focusedElem:e,selectionRange:n},zl=!1,_=t;_!==null;)if(t=_,e=t.child,(t.subtreeFlags&1028)!==0&&e!==null)e.return=t,_=e;else for(;_!==null;){t=_;try{var v=t.alternate;if(t.flags&1024)switch(t.tag){case 0:case 11:case 15:break;case 1:if(v!==null){var w=v.memoizedProps,z=v.memoizedState,f=t.stateNode,c=f.getSnapshotBeforeUpdate(t.elementType===t.type?w:Ue(t.type,w),z);f.__reactInternalSnapshotBeforeUpdate=c}break;case 3:var d=t.stateNode.containerInfo;d.nodeType===1?d.textContent="":d.nodeType===9&&d.documentElement&&d.removeChild(d.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(k(163))}}catch(g){X(t,t.return,g)}if(e=t.sibling,e!==null){e.return=t.return,_=e;break}_=t.return}return v=qs,qs=!1,v}function cr(e,t,n){var r=t.updateQueue;if(r=r!==null?r.lastEffect:null,r!==null){var l=r=r.next;do{if((l.tag&e)===e){var o=l.destroy;l.destroy=void 0,o!==void 0&&Di(t,n,o)}l=l.next}while(l!==r)}}function oo(e,t){if(t=t.updateQueue,t=t!==null?t.lastEffect:null,t!==null){var n=t=t.next;do{if((n.tag&e)===e){var r=n.create;n.destroy=r()}n=n.next}while(n!==t)}}function Mi(e){var t=e.ref;if(t!==null){var n=e.stateNode;switch(e.tag){case 5:e=n;break;default:e=n}typeof t=="function"?t(e):t.current=e}}function yf(e){var t=e.alternate;t!==null&&(e.alternate=null,yf(t)),e.child=null,e.deletions=null,e.sibling=null,e.tag===5&&(t=e.stateNode,t!==null&&(delete t[Je],delete t[Er],delete t[xi],delete t[bp],delete t[e0])),e.stateNode=null,e.return=null,e.dependencies=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.stateNode=null,e.updateQueue=null}function wf(e){return e.tag===5||e.tag===3||e.tag===4}function bs(e){e:for(;;){for(;e.sibling===null;){if(e.return===null||wf(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.flags&2||e.child===null||e.tag===4)continue e;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function Fi(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?n.nodeType===8?n.parentNode.insertBefore(e,t):n.insertBefore(e,t):(n.nodeType===8?(t=n.parentNode,t.insertBefore(e,n)):(t=n,t.appendChild(e)),n=n._reactRootContainer,n!=null||t.onclick!==null||(t.onclick=Ll));else if(r!==4&&(e=e.child,e!==null))for(Fi(e,t,n),e=e.sibling;e!==null;)Fi(e,t,n),e=e.sibling}function Ai(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?n.insertBefore(e,t):n.appendChild(e);else if(r!==4&&(e=e.child,e!==null))for(Ai(e,t,n),e=e.sibling;e!==null;)Ai(e,t,n),e=e.sibling}var le=null,Ve=!1;function mt(e,t,n){for(n=n.child;n!==null;)Sf(e,t,n),n=n.sibling}function Sf(e,t,n){if(be&&typeof be.onCommitFiberUnmount=="function")try{be.onCommitFiberUnmount(Jl,n)}catch{}switch(n.tag){case 5:ae||vn(n,t);case 6:var r=le,l=Ve;le=null,mt(e,t,n),le=r,Ve=l,le!==null&&(Ve?(e=le,n=n.stateNode,e.nodeType===8?e.parentNode.removeChild(n):e.removeChild(n)):le.removeChild(n.stateNode));break;case 18:le!==null&&(Ve?(e=le,n=n.stateNode,e.nodeType===8?Mo(e.parentNode,n):e.nodeType===1&&Mo(e,n),wr(e)):Mo(le,n.stateNode));break;case 4:r=le,l=Ve,le=n.stateNode.containerInfo,Ve=!0,mt(e,t,n),le=r,Ve=l;break;case 0:case 11:case 14:case 15:if(!ae&&(r=n.updateQueue,r!==null&&(r=r.lastEffect,r!==null))){l=r=r.next;do{var o=l,i=o.destroy;o=o.tag,i!==void 0&&(o&2||o&4)&&Di(n,t,i),l=l.next}while(l!==r)}mt(e,t,n);break;case 1:if(!ae&&(vn(n,t),r=n.stateNode,typeof r.componentWillUnmount=="function"))try{r.props=n.memoizedProps,r.state=n.memoizedState,r.componentWillUnmount()}catch(u){X(n,t,u)}mt(e,t,n);break;case 21:mt(e,t,n);break;case 22:n.mode&1?(ae=(r=ae)||n.memoizedState!==null,mt(e,t,n),ae=r):mt(e,t,n);break;default:mt(e,t,n)}}function ea(e){var t=e.updateQueue;if(t!==null){e.updateQueue=null;var n=e.stateNode;n===null&&(n=e.stateNode=new g0),t.forEach(function(r){var l=P0.bind(null,e,r);n.has(r)||(n.add(r),r.then(l,l))})}}function Be(e,t){var n=t.deletions;if(n!==null)for(var r=0;rl&&(l=i),r&=~o}if(r=l,r=Z()-r,r=(120>r?120:480>r?480:1080>r?1080:1920>r?1920:3e3>r?3e3:4320>r?4320:1960*w0(r/1960))-r,10e?16:e,Ct===null)var r=!1;else{if(e=Ct,Ct=null,Hl=0,O&6)throw Error(k(331));var l=O;for(O|=4,_=e.current;_!==null;){var o=_,i=o.child;if(_.flags&16){var u=o.deletions;if(u!==null){for(var s=0;sZ()-Fu?Gt(e,0):Mu|=n),ke(e,t)}function zf(e,t){t===0&&(e.mode&1?(t=Kr,Kr<<=1,!(Kr&130023424)&&(Kr=4194304)):t=1);var n=pe();e=ct(e,t),e!==null&&(Or(e,t,n),ke(e,n))}function _0(e){var t=e.memoizedState,n=0;t!==null&&(n=t.retryLane),zf(e,n)}function P0(e,t){var n=0;switch(e.tag){case 13:var r=e.stateNode,l=e.memoizedState;l!==null&&(n=l.retryLane);break;case 19:r=e.stateNode;break;default:throw Error(k(314))}r!==null&&r.delete(t),zf(e,n)}var $f;$f=function(e,t,n){if(e!==null)if(e.memoizedProps!==t.pendingProps||we.current)ye=!0;else{if(!(e.lanes&n)&&!(t.flags&128))return ye=!1,p0(e,t,n);ye=!!(e.flags&131072)}else ye=!1,Q&&t.flags&1048576&&Lc(t,jl,t.index);switch(t.lanes=0,t.tag){case 2:var r=t.type;hl(e,t),e=t.pendingProps;var l=Nn(t,fe.current);En(t,n),l=Lu(null,t,r,e,l,n);var o=Ru();return t.flags|=1,typeof l=="object"&&l!==null&&typeof l.render=="function"&&l.$$typeof===void 0?(t.tag=1,t.memoizedState=null,t.updateQueue=null,Se(r)?(o=!0,Il(t)):o=!1,t.memoizedState=l.state!==null&&l.state!==void 0?l.state:null,Pu(t),l.updater=ro,t.stateNode=l,l._reactInternals=t,$i(t,r,e,n),t=Ri(null,t,r,!0,o,n)):(t.tag=0,Q&&o&&wu(t),de(null,t,l,n),t=t.child),t;case 16:r=t.elementType;e:{switch(hl(e,t),e=t.pendingProps,l=r._init,r=l(r._payload),t.type=r,l=t.tag=z0(r),e=Ue(r,e),l){case 0:t=Li(null,t,r,e,n);break e;case 1:t=Xs(null,t,r,e,n);break e;case 11:t=Ys(null,t,r,e,n);break e;case 14:t=Gs(null,t,r,Ue(r.type,e),n);break e}throw Error(k(306,r,""))}return t;case 0:return r=t.type,l=t.pendingProps,l=t.elementType===r?l:Ue(r,l),Li(e,t,r,l,n);case 1:return r=t.type,l=t.pendingProps,l=t.elementType===r?l:Ue(r,l),Xs(e,t,r,l,n);case 3:e:{if(df(t),e===null)throw Error(k(387));r=t.pendingProps,o=t.memoizedState,l=o.element,jc(e,t),Fl(t,r,null,n);var i=t.memoizedState;if(r=i.element,o.isDehydrated)if(o={element:r,isDehydrated:!1,cache:i.cache,pendingSuspenseBoundaries:i.pendingSuspenseBoundaries,transitions:i.transitions},t.updateQueue.baseState=o,t.memoizedState=o,t.flags&256){l=Ln(Error(k(423)),t),t=Zs(e,t,r,n,l);break e}else if(r!==l){l=Ln(Error(k(424)),t),t=Zs(e,t,r,n,l);break e}else for(Pe=Pt(t.stateNode.containerInfo.firstChild),Ne=t,Q=!0,We=null,n=Ac(t,null,r,n),t.child=n;n;)n.flags=n.flags&-3|4096,n=n.sibling;else{if(zn(),r===l){t=ft(e,t,n);break e}de(e,t,r,n)}t=t.child}return t;case 5:return Bc(t),e===null&&Pi(t),r=t.type,l=t.pendingProps,o=e!==null?e.memoizedProps:null,i=l.children,ki(r,l)?i=null:o!==null&&ki(r,o)&&(t.flags|=32),ff(e,t),de(e,t,i,n),t.child;case 6:return e===null&&Pi(t),null;case 13:return pf(e,t,n);case 4:return Nu(t,t.stateNode.containerInfo),r=t.pendingProps,e===null?t.child=$n(t,null,r,n):de(e,t,r,n),t.child;case 11:return r=t.type,l=t.pendingProps,l=t.elementType===r?l:Ue(r,l),Ys(e,t,r,l,n);case 7:return de(e,t,t.pendingProps,n),t.child;case 8:return de(e,t,t.pendingProps.children,n),t.child;case 12:return de(e,t,t.pendingProps.children,n),t.child;case 10:e:{if(r=t.type._context,l=t.pendingProps,o=t.memoizedProps,i=l.value,B(Dl,r._currentValue),r._currentValue=i,o!==null)if(Ye(o.value,i)){if(o.children===l.children&&!we.current){t=ft(e,t,n);break e}}else for(o=t.child,o!==null&&(o.return=t);o!==null;){var u=o.dependencies;if(u!==null){i=o.child;for(var s=u.firstContext;s!==null;){if(s.context===r){if(o.tag===1){s=ut(-1,n&-n),s.tag=2;var a=o.updateQueue;if(a!==null){a=a.shared;var m=a.pending;m===null?s.next=s:(s.next=m.next,m.next=s),a.pending=s}}o.lanes|=n,s=o.alternate,s!==null&&(s.lanes|=n),Ni(o.return,n,t),u.lanes|=n;break}s=s.next}}else if(o.tag===10)i=o.type===t.type?null:o.child;else if(o.tag===18){if(i=o.return,i===null)throw Error(k(341));i.lanes|=n,u=i.alternate,u!==null&&(u.lanes|=n),Ni(i,n,t),i=o.sibling}else i=o.child;if(i!==null)i.return=o;else for(i=o;i!==null;){if(i===t){i=null;break}if(o=i.sibling,o!==null){o.return=i.return,i=o;break}i=i.return}o=i}de(e,t,l.children,n),t=t.child}return t;case 9:return l=t.type,r=t.pendingProps.children,En(t,n),l=De(l),r=r(l),t.flags|=1,de(e,t,r,n),t.child;case 14:return r=t.type,l=Ue(r,t.pendingProps),l=Ue(r.type,l),Gs(e,t,r,l,n);case 15:return af(e,t,t.type,t.pendingProps,n);case 17:return r=t.type,l=t.pendingProps,l=t.elementType===r?l:Ue(r,l),hl(e,t),t.tag=1,Se(r)?(e=!0,Il(t)):e=!1,En(t,n),Mc(t,r,l),$i(t,r,l,n),Ri(null,t,r,!0,e,n);case 19:return hf(e,t,n);case 22:return cf(e,t,n)}throw Error(k(156,t.tag))};function Tf(e,t){return tc(e,t)}function N0(e,t,n,r){this.tag=e,this.key=n,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=t,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=r,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function Ie(e,t,n,r){return new N0(e,t,n,r)}function Vu(e){return e=e.prototype,!(!e||!e.isReactComponent)}function z0(e){if(typeof e=="function")return Vu(e)?1:0;if(e!=null){if(e=e.$$typeof,e===uu)return 11;if(e===su)return 14}return 2}function Tt(e,t){var n=e.alternate;return n===null?(n=Ie(e.tag,t,e.key,e.mode),n.elementType=e.elementType,n.type=e.type,n.stateNode=e.stateNode,n.alternate=e,e.alternate=n):(n.pendingProps=t,n.type=e.type,n.flags=0,n.subtreeFlags=0,n.deletions=null),n.flags=e.flags&14680064,n.childLanes=e.childLanes,n.lanes=e.lanes,n.child=e.child,n.memoizedProps=e.memoizedProps,n.memoizedState=e.memoizedState,n.updateQueue=e.updateQueue,t=e.dependencies,n.dependencies=t===null?null:{lanes:t.lanes,firstContext:t.firstContext},n.sibling=e.sibling,n.index=e.index,n.ref=e.ref,n}function vl(e,t,n,r,l,o){var i=2;if(r=e,typeof e=="function")Vu(e)&&(i=1);else if(typeof e=="string")i=5;else e:switch(e){case sn:return Xt(n.children,l,o,t);case iu:i=8,l|=8;break;case bo:return e=Ie(12,n,t,l|2),e.elementType=bo,e.lanes=o,e;case ei:return e=Ie(13,n,t,l),e.elementType=ei,e.lanes=o,e;case ti:return e=Ie(19,n,t,l),e.elementType=ti,e.lanes=o,e;case Fa:return uo(n,l,o,t);default:if(typeof e=="object"&&e!==null)switch(e.$$typeof){case Da:i=10;break e;case Ma:i=9;break e;case uu:i=11;break e;case su:i=14;break e;case vt:i=16,r=null;break e}throw Error(k(130,e==null?e:typeof e,""))}return t=Ie(i,n,t,l),t.elementType=e,t.type=r,t.lanes=o,t}function Xt(e,t,n,r){return e=Ie(7,e,r,t),e.lanes=n,e}function uo(e,t,n,r){return e=Ie(22,e,r,t),e.elementType=Fa,e.lanes=n,e.stateNode={isHidden:!1},e}function Qo(e,t,n){return e=Ie(6,e,null,t),e.lanes=n,e}function Ko(e,t,n){return t=Ie(4,e.children!==null?e.children:[],e.key,t),t.lanes=n,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}function $0(e,t,n,r,l){this.tag=t,this.containerInfo=e,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=Po(0),this.expirationTimes=Po(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=Po(0),this.identifierPrefix=r,this.onRecoverableError=l,this.mutableSourceEagerHydrationData=null}function Wu(e,t,n,r,l,o,i,u,s){return e=new $0(e,t,n,u,s),t===1?(t=1,o===!0&&(t|=8)):t=0,o=Ie(3,null,null,t),e.current=o,o.stateNode=e,o.memoizedState={element:r,isDehydrated:n,cache:null,transitions:null,pendingSuspenseBoundaries:null},Pu(o),e}function T0(e,t,n){var r=3"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(Of)}catch(e){console.error(e)}}Of(),La.exports=$e;var j0=La.exports,sa=j0;Jo.createRoot=sa.createRoot,Jo.hydrateRoot=sa.hydrateRoot;var ce=function(){return ce=Object.assign||function(t){for(var n,r=1,l=arguments.length;r0?ne(Un,--Fe):0,On--,J===10&&(On=1,ho--),J}function Ke(){return J=Fe2||Qi(J)>3?"":" "}function Q0(e,t){for(;--t&&Ke()&&!(J<48||J>102||J>57&&J<65||J>70&&J<97););return go(e,wl()+(t<6&&Zt()==32&&Ke()==32))}function Ki(e){for(;Ke();)switch(J){case e:return Fe;case 34:case 39:e!==34&&e!==39&&Ki(J);break;case 40:e===41&&Ki(e);break;case 92:Ke();break}return Fe}function K0(e,t){for(;Ke()&&e+J!==57;)if(e+J===84&&Zt()===47)break;return"/*"+go(t,Fe-1)+"*"+Gu(e===47?e:Ke())}function Y0(e){for(;!Qi(Zt());)Ke();return go(e,Fe)}function G0(e){return W0(Sl("",null,null,null,[""],e=V0(e),0,[0],e))}function Sl(e,t,n,r,l,o,i,u,s){for(var a=0,m=0,h=i,p=0,y=0,v=0,w=1,z=1,f=1,c=0,d="",g=l,x=o,C=r,S=d;z;)switch(v=c,c=Ke()){case 40:if(v!=108&&ne(S,h-1)==58){yl(S+=L(Yo(c),"&","&\f"),"&\f",Mf(a?u[a-1]:0))!=-1&&(f=-1);break}case 34:case 39:case 91:S+=Yo(c);break;case 9:case 10:case 13:case 32:S+=H0(v);break;case 92:S+=Q0(wl()-1,7);continue;case 47:switch(Zt()){case 42:case 47:rr(X0(K0(Ke(),wl()),t,n,s),s);break;default:S+="/"}break;case 123*w:u[a++]=Ze(S)*f;case 125*w:case 59:case 0:switch(c){case 0:case 125:z=0;case 59+m:f==-1&&(S=L(S,/\f/g,"")),y>0&&Ze(S)-h&&rr(y>32?fa(S+";",r,n,h-1,s):fa(L(S," ","")+";",r,n,h-2,s),s);break;case 59:S+=";";default:if(rr(C=ca(S,t,n,a,m,l,u,d,g=[],x=[],h,o),o),c===123)if(m===0)Sl(S,t,C,C,g,o,h,u,x);else switch(p===99&&ne(S,3)===110?100:p){case 100:case 108:case 109:case 115:Sl(e,C,C,r&&rr(ca(e,C,C,0,0,l,u,d,l,g=[],h,x),x),l,x,h,u,r?g:x);break;default:Sl(S,C,C,C,[""],x,0,u,x)}}a=m=y=0,w=f=1,d=S="",h=i;break;case 58:h=1+Ze(S),y=v;default:if(w<1){if(c==123)--w;else if(c==125&&w++==0&&U0()==125)continue}switch(S+=Gu(c),c*w){case 38:f=m>0?1:(S+="\f",-1);break;case 44:u[a++]=(Ze(S)-1)*f,f=1;break;case 64:Zt()===45&&(S+=Yo(Ke())),p=Zt(),m=h=Ze(d=S+=Y0(wl())),c++;break;case 45:v===45&&Ze(S)==2&&(w=0)}}return o}function ca(e,t,n,r,l,o,i,u,s,a,m,h){for(var p=l-1,y=l===0?o:[""],v=Af(y),w=0,z=0,f=0;w0?y[c]+" "+d:L(d,/&\f/g,y[c])))&&(s[f++]=g);return mo(e,t,n,l===0?po:u,s,a,m,h)}function X0(e,t,n,r){return mo(e,t,n,jf,Gu(B0()),In(e,2,-2),0,r)}function fa(e,t,n,r,l){return mo(e,t,n,Yu,In(e,0,r),In(e,r+1,-1),r,l)}function Uf(e,t,n){switch(F0(e,t)){case 5103:return j+"print-"+e+e;case 5737:case 4201:case 3177:case 3433:case 1641:case 4457:case 2921:case 5572:case 6356:case 5844:case 3191:case 6645:case 3005:case 6391:case 5879:case 5623:case 6135:case 4599:case 4855:case 4215:case 6389:case 5109:case 5365:case 5621:case 3829:return j+e+e;case 4789:return pr+e+e;case 5349:case 4246:case 4810:case 6968:case 2756:return j+e+pr+e+V+e+e;case 5936:switch(ne(e,t+11)){case 114:return j+e+V+L(e,/[svh]\w+-[tblr]{2}/,"tb")+e;case 108:return j+e+V+L(e,/[svh]\w+-[tblr]{2}/,"tb-rl")+e;case 45:return j+e+V+L(e,/[svh]\w+-[tblr]{2}/,"lr")+e}case 6828:case 4268:case 2903:return j+e+V+e+e;case 6165:return j+e+V+"flex-"+e+e;case 5187:return j+e+L(e,/(\w+).+(:[^]+)/,j+"box-$1$2"+V+"flex-$1$2")+e;case 5443:return j+e+V+"flex-item-"+L(e,/flex-|-self/g,"")+(rt(e,/flex-|baseline/)?"":V+"grid-row-"+L(e,/flex-|-self/g,""))+e;case 4675:return j+e+V+"flex-line-pack"+L(e,/align-content|flex-|-self/g,"")+e;case 5548:return j+e+V+L(e,"shrink","negative")+e;case 5292:return j+e+V+L(e,"basis","preferred-size")+e;case 6060:return j+"box-"+L(e,"-grow","")+j+e+V+L(e,"grow","positive")+e;case 4554:return j+L(e,/([^-])(transform)/g,"$1"+j+"$2")+e;case 6187:return L(L(L(e,/(zoom-|grab)/,j+"$1"),/(image-set)/,j+"$1"),e,"")+e;case 5495:case 3959:return L(e,/(image-set\([^]*)/,j+"$1$`$1");case 4968:return L(L(e,/(.+:)(flex-)?(.*)/,j+"box-pack:$3"+V+"flex-pack:$3"),/s.+-b[^;]+/,"justify")+j+e+e;case 4200:if(!rt(e,/flex-|baseline/))return V+"grid-column-align"+In(e,t)+e;break;case 2592:case 3360:return V+L(e,"template-","")+e;case 4384:case 3616:return n&&n.some(function(r,l){return t=l,rt(r.props,/grid-\w+-end/)})?~yl(e+(n=n[t].value),"span",0)?e:V+L(e,"-start","")+e+V+"grid-row-span:"+(~yl(n,"span",0)?rt(n,/\d+/):+rt(n,/\d+/)-+rt(e,/\d+/))+";":V+L(e,"-start","")+e;case 4896:case 4128:return n&&n.some(function(r){return rt(r.props,/grid-\w+-start/)})?e:V+L(L(e,"-end","-span"),"span ","")+e;case 4095:case 3583:case 4068:case 2532:return L(e,/(.+)-inline(.+)/,j+"$1$2")+e;case 8116:case 7059:case 5753:case 5535:case 5445:case 5701:case 4933:case 4677:case 5533:case 5789:case 5021:case 4765:if(Ze(e)-1-t>6)switch(ne(e,t+1)){case 109:if(ne(e,t+4)!==45)break;case 102:return L(e,/(.+:)(.+)-([^]+)/,"$1"+j+"$2-$3$1"+pr+(ne(e,t+3)==108?"$3":"$2-$3"))+e;case 115:return~yl(e,"stretch",0)?Uf(L(e,"stretch","fill-available"),t,n)+e:e}break;case 5152:case 5920:return L(e,/(.+?):(\d+)(\s*\/\s*(span)?\s*(\d+))?(.*)/,function(r,l,o,i,u,s,a){return V+l+":"+o+a+(i?V+l+"-span:"+(u?s:+s-+o)+a:"")+e});case 4949:if(ne(e,t+6)===121)return L(e,":",":"+j)+e;break;case 6444:switch(ne(e,ne(e,14)===45?18:11)){case 120:return L(e,/(.+:)([^;\s!]+)(;|(\s+)?!.+)?/,"$1"+j+(ne(e,14)===45?"inline-":"")+"box$3$1"+j+"$2$3$1"+V+"$2box$3")+e;case 100:return L(e,":",":"+V)+e}break;case 5719:case 2647:case 2135:case 3927:case 2391:return L(e,"scroll-","scroll-snap-")+e}return e}function Yl(e,t){for(var n="",r=0;r-1&&!e.return)switch(e.type){case Yu:e.return=Uf(e.value,e.length,n);return;case Df:return Yl([gt(e,{value:L(e.value,"@","@"+j)})],r);case po:if(e.length)return A0(n=e.props,function(l){switch(rt(l,r=/(::plac\w+|:read-\w+)/)){case":read-only":case":read-write":on(gt(e,{props:[L(l,/:(read-\w+)/,":"+pr+"$1")]})),on(gt(e,{props:[l]})),Hi(e,{props:aa(n,r)});break;case"::placeholder":on(gt(e,{props:[L(l,/:(plac\w+)/,":"+j+"input-$1")]})),on(gt(e,{props:[L(l,/:(plac\w+)/,":"+pr+"$1")]})),on(gt(e,{props:[L(l,/:(plac\w+)/,V+"input-$1")]})),on(gt(e,{props:[l]})),Hi(e,{props:aa(n,r)});break}return""})}}var e1={animationIterationCount:1,borderImageOutset:1,borderImageSlice:1,borderImageWidth:1,boxFlex:1,boxFlexGroup:1,boxOrdinalGroup:1,columnCount:1,columns:1,flex:1,flexGrow:1,flexPositive:1,flexShrink:1,flexNegative:1,flexOrder:1,gridRow:1,gridRowEnd:1,gridRowSpan:1,gridRowStart:1,gridColumn:1,gridColumnEnd:1,gridColumnSpan:1,gridColumnStart:1,msGridRow:1,msGridRowSpan:1,msGridColumn:1,msGridColumnSpan:1,fontWeight:1,lineHeight:1,opacity:1,order:1,orphans:1,tabSize:1,widows:1,zIndex:1,zoom:1,WebkitLineClamp:1,fillOpacity:1,floodOpacity:1,stopOpacity:1,strokeDasharray:1,strokeDashoffset:1,strokeMiterlimit:1,strokeOpacity:1,strokeWidth:1},Ee={},jn=typeof process<"u"&&Ee!==void 0&&(Ee.REACT_APP_SC_ATTR||Ee.SC_ATTR)||"data-styled",Vf="active",Wf="data-styled-version",vo="6.1.8",Xu=`/*!sc*/ +`,Zu=typeof window<"u"&&"HTMLElement"in window,t1=!!(typeof SC_DISABLE_SPEEDY=="boolean"?SC_DISABLE_SPEEDY:typeof process<"u"&&Ee!==void 0&&Ee.REACT_APP_SC_DISABLE_SPEEDY!==void 0&&Ee.REACT_APP_SC_DISABLE_SPEEDY!==""?Ee.REACT_APP_SC_DISABLE_SPEEDY!=="false"&&Ee.REACT_APP_SC_DISABLE_SPEEDY:typeof process<"u"&&Ee!==void 0&&Ee.SC_DISABLE_SPEEDY!==void 0&&Ee.SC_DISABLE_SPEEDY!==""&&Ee.SC_DISABLE_SPEEDY!=="false"&&Ee.SC_DISABLE_SPEEDY),n1={},yo=Object.freeze([]),Dn=Object.freeze({});function Hf(e,t,n){return n===void 0&&(n=Dn),e.theme!==n.theme&&e.theme||t||n.theme}var Qf=new Set(["a","abbr","address","area","article","aside","audio","b","base","bdi","bdo","big","blockquote","body","br","button","canvas","caption","cite","code","col","colgroup","data","datalist","dd","del","details","dfn","dialog","div","dl","dt","em","embed","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","header","hgroup","hr","html","i","iframe","img","input","ins","kbd","keygen","label","legend","li","link","main","map","mark","menu","menuitem","meta","meter","nav","noscript","object","ol","optgroup","option","output","p","param","picture","pre","progress","q","rp","rt","ruby","s","samp","script","section","select","small","source","span","strong","style","sub","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","tr","track","u","ul","use","var","video","wbr","circle","clipPath","defs","ellipse","foreignObject","g","image","line","linearGradient","marker","mask","path","pattern","polygon","polyline","radialGradient","rect","stop","svg","text","tspan"]),r1=/[!"#$%&'()*+,./:;<=>?@[\\\]^`{|}~-]+/g,l1=/(^-|-$)/g;function da(e){return e.replace(r1,"-").replace(l1,"")}var o1=/(a)(d)/gi,ll=52,pa=function(e){return String.fromCharCode(e+(e>25?39:97))};function Yi(e){var t,n="";for(t=Math.abs(e);t>ll;t=t/ll|0)n=pa(t%ll)+n;return(pa(t%ll)+n).replace(o1,"$1-$2")}var Go,Kf=5381,wn=function(e,t){for(var n=t.length;n;)e=33*e^t.charCodeAt(--n);return e},Yf=function(e){return wn(Kf,e)};function Gf(e){return Yi(Yf(e)>>>0)}function i1(e){return e.displayName||e.name||"Component"}function Xo(e){return typeof e=="string"&&!0}var Xf=typeof Symbol=="function"&&Symbol.for,Zf=Xf?Symbol.for("react.memo"):60115,u1=Xf?Symbol.for("react.forward_ref"):60112,s1={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},a1={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},Jf={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},c1=((Go={})[u1]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},Go[Zf]=Jf,Go);function ha(e){return("type"in(t=e)&&t.type.$$typeof)===Zf?Jf:"$$typeof"in e?c1[e.$$typeof]:s1;var t}var f1=Object.defineProperty,d1=Object.getOwnPropertyNames,ma=Object.getOwnPropertySymbols,p1=Object.getOwnPropertyDescriptor,h1=Object.getPrototypeOf,ga=Object.prototype;function qf(e,t,n){if(typeof t!="string"){if(ga){var r=h1(t);r&&r!==ga&&qf(e,r,n)}var l=d1(t);ma&&(l=l.concat(ma(t)));for(var o=ha(e),i=ha(t),u=0;u0?" Args: ".concat(t.join(", ")):""))}var m1=function(){function e(t){this.groupSizes=new Uint32Array(512),this.length=512,this.tag=t}return e.prototype.indexOfGroup=function(t){for(var n=0,r=0;r=this.groupSizes.length){for(var r=this.groupSizes,l=r.length,o=l;t>=o;)if((o<<=1)<0)throw Fr(16,"".concat(t));this.groupSizes=new Uint32Array(o),this.groupSizes.set(r),this.length=o;for(var i=l;i=this.length||this.groupSizes[t]===0)return n;for(var r=this.groupSizes[t],l=this.indexOfGroup(t),o=l+r,i=l;i=0){var r=document.createTextNode(n);return this.element.insertBefore(r,this.nodes[t]||null),this.length++,!0}return!1},e.prototype.deleteRule=function(t){this.element.removeChild(this.nodes[t]),this.length--},e.prototype.getRule=function(t){return t0&&(z+="".concat(f,","))}),s+="".concat(v).concat(w,'{content:"').concat(z,'"}').concat(Xu)},m=0;m0?".".concat(t):p},m=s.slice();m.push(function(p){p.type===po&&p.value.includes("&")&&(p.props[0]=p.props[0].replace(P1,n).replace(r,a))}),i.prefix&&m.push(b0),m.push(Z0);var h=function(p,y,v,w){y===void 0&&(y=""),v===void 0&&(v=""),w===void 0&&(w="&"),t=w,n=y,r=new RegExp("\\".concat(n,"\\b"),"g");var z=p.replace(N1,""),f=G0(v||y?"".concat(v," ").concat(y," { ").concat(z," }"):z);i.namespace&&(f=ed(f,i.namespace));var c=[];return Yl(f,J0(m.concat(q0(function(d){return c.push(d)})))),c};return h.hash=s.length?s.reduce(function(p,y){return y.name||Fr(15),wn(p,y.name)},Kf).toString():"",h}var $1=new Xl,Zi=z1(),td=qe.createContext({shouldForwardProp:void 0,styleSheet:$1,stylis:Zi});td.Consumer;qe.createContext(void 0);function Ji(){return ve.useContext(td)}var T1=function(){function e(t,n){var r=this;this.inject=function(l,o){o===void 0&&(o=Zi);var i=r.name+o.hash;l.hasNameForId(r.id,i)||l.insertRules(r.id,i,o(r.rules,i,"@keyframes"))},this.name=t,this.id="sc-keyframes-".concat(t),this.rules=n,qu(this,function(){throw Fr(12,String(r.name))})}return e.prototype.getName=function(t){return t===void 0&&(t=Zi),this.name+t.hash},e}(),L1=function(e){return e>="A"&&e<="Z"};function ya(e){for(var t="",n=0;n>>0);if(!n.hasNameForId(this.componentId,i)){var u=r(o,".".concat(i),void 0,this.componentId);n.insertRules(this.componentId,i,u)}l=Yt(l,i),this.staticRulesId=i}else{for(var s=wn(this.baseHash,r.hash),a="",m=0;m>>0);n.hasNameForId(this.componentId,y)||n.insertRules(this.componentId,y,r(a,".".concat(y),void 0,this.componentId)),l=Yt(l,y)}}return l},e}(),bu=qe.createContext(void 0);bu.Consumer;var Zo={};function O1(e,t,n){var r=Ju(e),l=e,o=!Xo(e),i=t.attrs,u=i===void 0?yo:i,s=t.componentId,a=s===void 0?function(g,x){var C=typeof g!="string"?"sc":da(g);Zo[C]=(Zo[C]||0)+1;var S="".concat(C,"-").concat(Gf(vo+C+Zo[C]));return x?"".concat(x,"-").concat(S):S}(t.displayName,t.parentComponentId):s,m=t.displayName,h=m===void 0?function(g){return Xo(g)?"styled.".concat(g):"Styled(".concat(i1(g),")")}(e):m,p=t.displayName&&t.componentId?"".concat(da(t.displayName),"-").concat(t.componentId):t.componentId||a,y=r&&l.attrs?l.attrs.concat(u).filter(Boolean):u,v=t.shouldForwardProp;if(r&&l.shouldForwardProp){var w=l.shouldForwardProp;if(t.shouldForwardProp){var z=t.shouldForwardProp;v=function(g,x){return w(g,x)&&z(g,x)}}else v=w}var f=new I1(n,p,r?l.componentStyle:void 0);function c(g,x){return function(C,S,P){var A=C.attrs,R=C.componentStyle,Ce=C.defaultProps,Mt=C.foldedComponentIds,Ft=C.styledComponentId,Ar=C.target,wo=qe.useContext(bu),Wn=Ji(),At=C.shouldForwardProp||Wn.shouldForwardProp,E=Hf(S,wo,Ce)||Dn,N=function(pt,xe,tt){for(var Hn,Ut=ce(ce({},xe),{className:void 0,theme:tt}),So=0;So2&&Xl.registerId(this.componentId+t),this.removeStyles(t,r),this.createStyles(t,n,r,l)},e}();function D1(e){for(var t=[],n=1;nT.jsx(T.Fragment,{children:T.jsx("img",{src:M1})}),A1=[{text:"나현님 안녕하세요!",sender:2,timestamp:"3월 21일 (목) 9:38 AM"},{text:"지원님 안녕하세요! 디자인 완전 최고최고입니다",sender:0,timestamp:"3월 21일 (목) 9:38 AM"},{text:"헤헷",sender:2,timestamp:"3월 22일 (금) 3:18 PM"}],ud=ve.createContext(void 0),B1=({children:e})=>{const[t,n]=ve.useState(0),r=localStorage.getItem("chats"),l=r?JSON.parse(r):A1,[o,i]=ve.useState(l);return ve.useEffect(()=>{localStorage.setItem("chats",JSON.stringify(o))},[o]),T.jsx(ud.Provider,{value:{currentUser:t,setCurrentUser:n,chats:o,setChats:i},children:e})},sd=()=>{const e=ve.useContext(ud);if(!e)throw new Error("useSenderContext must be used within a SenderProvider");return e},U1=[{id:0,name:"나현",profileImg:"mine.svg"},{id:1,name:"CEOS 19기",profileImg:"all.svg"},{id:2,name:"지원",profileImg:"rabbit.svg"},{id:3,name:"김철수",profileImg:"frog.svg"}],ad={users:U1},V1="data:image/svg+xml,%3csvg%20width='40'%20height='40'%20viewBox='0%200%2040%2040'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20d='M23.5977%2030.3906C23.8672%2030.6484%2024.1953%2030.7891%2024.5703%2030.7891C25.3555%2030.7891%2025.9648%2030.1797%2025.9648%2029.4062C25.9648%2029.0195%2025.8125%2028.668%2025.543%2028.3984L17.3398%2020.3828L25.543%2012.3906C25.8125%2012.1211%2025.9648%2011.7578%2025.9648%2011.3828C25.9648%2010.6094%2025.3555%2010%2024.5703%2010C24.1953%2010%2023.8672%2010.1406%2023.6094%2010.3984L14.4922%2019.3047C14.1641%2019.6094%2014%2019.9844%2014%2020.3945C14%2020.8047%2014.1641%2021.1562%2014.4805%2021.4727L23.5977%2030.3906Z'%20fill='%235865F2'/%3e%3c/svg%3e",W1="data:image/svg+xml,%3csvg%20width='4'%20height='16'%20viewBox='0%200%204%2016'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20d='M0.791381%205.13416C0.701274%205.04735%200.591577%205%200.46621%205C0.203722%205%201.17184e-07%205.20519%209.44169e-08%205.46561C8.30333e-08%205.59583%200.0509306%205.71421%200.141038%205.80496L2.88345%208.50395L0.141038%2011.195C0.0509301%2011.2858%20-4.25093e-07%2011.4081%20-4.36132e-07%2011.5344C-4.58899e-07%2011.7948%200.203722%2012%200.466209%2012C0.591577%2012%200.701273%2011.9526%200.787463%2011.8658L3.83546%208.86697C3.94515%208.76437%204%208.63811%204%208.5C4%208.36189%203.94515%208.24352%203.83937%208.13698L0.791381%205.13416Z'%20fill='%239B9B9B'/%3e%3c/svg%3e",Oe={blurple:"#5865F2",red:"#ED4245",white:"#FFFFFF",black:"#000000",gray100:"#F5F5F5",gray200:"#EBEBEB",gray300:"#B9B9B9",gray400:"#9B9B9B"},Vn={body2:` + font-size: 0.9375rem; + font-style: normal; + font-weight: 400; + line-height: 1.26563rem + `,body3:` + font-size: 0.75rem; + font-style: normal; + font-weight: 400; + line-height: 0.9375rem`,caption:` + font-size: 0.625rem; + font-style: normal; + font-weight: 500; + line-height: 0.78125rem`},H1=()=>{const{currentUser:e,setCurrentUser:t}=sd(),n=e===0?2:0,r=ad.users[n],l=()=>{t(n)};return T.jsxs(Q1,{children:[T.jsx(F1,{}),T.jsxs(K1,{children:[T.jsx("img",{src:V1}),T.jsxs(Y1,{onClick:l,children:[T.jsx(G1,{src:`img/userProfile/${r.profileImg}`}),T.jsxs(X1,{children:[T.jsx(Z1,{children:r.name}),T.jsx("img",{src:W1})]})]})]})]})},Q1=H.div` + height: 8.3rem; + flex-shrink: 0; + border-bottom: 0.5px solid ${Oe.gray300}; + background-color: ${Oe.gray100}; +`,K1=H.div` + display: grid; + grid-template-columns: repeat(3, 1fr); + align-items: center; +`,Y1=H.div` + justify-self: center; + display: flex; + flex-direction: column; + justify-content: center; +`,G1=H.img` + height: 3.25rem; + width: auto; + justify-content: center; + align-items: center; +`,X1=H.div` + display: flex; + align-items: center; + justify-content: center; +`,Z1=H.span` + ${Vn.body3}; + padding-right: 0.25rem; + padding-top: 0.25rem; +`,J1="data:image/svg+xml,%3csvg%20width='34'%20height='34'%20viewBox='0%200%2034%2034'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3ccircle%20cx='17'%20cy='17'%20r='17'%20fill='%23EBEBEB'/%3e%3cpath%20d='M10.5547%2017.3594C10.5547%2016.9766%2010.875%2016.6562%2011.25%2016.6562H16.3047V11.6094C16.3047%2011.2344%2016.6172%2010.9141%2017%2010.9141C17.3828%2010.9141%2017.7031%2011.2344%2017.7031%2011.6094V16.6562H22.75C23.125%2016.6562%2023.4453%2016.9766%2023.4453%2017.3594C23.4453%2017.7422%2023.125%2018.0547%2022.75%2018.0547H17.7031V23.1094C17.7031%2023.4844%2017.3828%2023.8047%2017%2023.8047C16.6172%2023.8047%2016.3047%2023.4844%2016.3047%2023.1094V18.0547H11.25C10.875%2018.0547%2010.5547%2017.7422%2010.5547%2017.3594Z'%20fill='%23B9B9B9'/%3e%3c/svg%3e",q1="data:image/svg+xml,%3csvg%20width='20'%20height='20'%20viewBox='0%200%2020%2020'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20d='M10%2020C15.5228%2020%2020%2015.5228%2020%2010C20%204.47715%2015.5228%200%2010%200C4.47715%200%200%204.47715%200%2010C0%2015.5228%204.47715%2020%2010%2020Z'%20fill='%23EBEBEB'/%3e%3cpath%20d='M6.62661%2011.8267C8.45328%2013.8534%2011.5466%2013.8534%2013.3733%2011.8267C13.6266%2011.5334%2014.1199%2011.84%2013.9599%2012.1867C12.9866%2014.56%209.73328%2015.36%207.62661%2014C6.91995%2013.56%206.34661%2012.9334%206.03995%2012.1867C5.95995%2012.0134%206.05328%2011.8%206.22661%2011.7334C6.37328%2011.6667%206.53328%2011.72%206.62661%2011.8267Z'%20fill='%23B9B9B9'/%3e%3cpath%20d='M12.6666%209.33329C13.403%209.33329%2013.9999%208.73634%2013.9999%207.99996C13.9999%207.26358%2013.403%206.66663%2012.6666%206.66663C11.9302%206.66663%2011.3333%207.26358%2011.3333%207.99996C11.3333%208.73634%2011.9302%209.33329%2012.6666%209.33329Z'%20fill='%23B9B9B9'/%3e%3cpath%20d='M7.33333%209.33329C8.06971%209.33329%208.66667%208.73634%208.66667%207.99996C8.66667%207.26358%208.06971%206.66663%207.33333%206.66663C6.59695%206.66663%206%207.26358%206%207.99996C6%208.73634%206.59695%209.33329%207.33333%209.33329Z'%20fill='%23B9B9B9'/%3e%3c/svg%3e",b1="data:image/svg+xml,%3csvg%20width='12'%20height='18'%20viewBox='0%200%2012%2018'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20d='M6%2011.4062C4.4375%2011.4062%203.39062%2010.2422%203.39062%208.57812V3.35156C3.39062%201.67969%204.4375%200.523438%206%200.523438C7.55469%200.523438%208.60156%201.67969%208.60156%203.35156V8.57812C8.60156%2010.2422%207.55469%2011.4062%206%2011.4062ZM0.40625%208.70312V7.11719C0.40625%206.78906%200.664062%206.53125%200.992188%206.53125C1.32812%206.53125%201.58594%206.78906%201.58594%207.11719V8.65625C1.58594%2011.3203%203.32031%2013.0859%206%2013.0859C8.67188%2013.0859%2010.4062%2011.3203%2010.4062%208.65625V7.11719C10.4062%206.78906%2010.6719%206.53125%2011%206.53125C11.3281%206.53125%2011.5859%206.78906%2011.5859%207.11719V8.70312C11.5859%2011.7656%209.57031%2013.9141%206.58594%2014.1641V15.9844H9.48438C9.8125%2015.9844%2010.0781%2016.25%2010.0781%2016.5781C10.0781%2016.9062%209.8125%2017.1641%209.48438%2017.1641H2.50781C2.17969%2017.1641%201.91406%2016.9062%201.91406%2016.5781C1.91406%2016.25%202.17969%2015.9844%202.50781%2015.9844H5.40625V14.1641C2.42969%2013.9141%200.40625%2011.7656%200.40625%208.70312Z'%20fill='%239B9B9B'/%3e%3c/svg%3e",eh="data:image/svg+xml,%3csvg%20width='28'%20height='28'%20viewBox='0%200%2028%2028'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3crect%20width='28'%20height='28'%20rx='14'%20fill='%235865F2'/%3e%3cpath%20d='M13.9962%2021C14.5607%2021%2014.9498%2020.6252%2014.9498%2020.0667V11.358L14.8811%209.76325L16.6891%2011.7328L18.4132%2013.379C18.5887%2013.5407%2018.8175%2013.6509%2019.0922%2013.6509C19.6109%2013.6509%2020%2013.2835%2020%2012.769C20%2012.5265%2019.9008%2012.2987%2019.7025%2012.1076L14.7057%207.28661C14.5226%207.10289%2014.2556%207%2013.9962%207C13.7368%207%2013.4774%207.10289%2013.2943%207.28661L8.29752%2012.1076C8.09917%2012.2987%208%2012.5265%208%2012.769C8%2013.2835%208.38907%2013.6509%208.90782%2013.6509C9.18245%2013.6509%209.41132%2013.5407%209.58678%2013.379L11.3032%2011.7328L13.1113%209.76325L13.0502%2011.358V20.0667C13.0502%2020.6252%2013.4317%2021%2013.9962%2021Z'%20fill='white'/%3e%3c/svg%3e",th=()=>{const{currentUser:e,chats:t,setChats:n}=sd(),r=e===0?2:0,l=ad.users[r],[o,i]=ve.useState(""),[u,s]=ve.useState(!0),a=ve.useRef(null);ve.useEffect(()=>{a.current&&(a.current.scrollTop=a.current.scrollHeight)},[t]);const m=v=>["일","월","화","수","목","금","토"][v.getDay()],h=()=>{const v=new Date;return`${v.getMonth()+1}월 ${v.getDate()}일 (${m(v)}) ${v.getHours()}:${String(v.getMinutes()).padStart(2,"0")} ${v.getHours()>=12?"PM":"AM"}`},p=v=>{if(v.preventDefault(),!u){const w={text:o,sender:e,timestamp:h()};n([...t,w]),i(""),s(!0)}},y=v=>{i(v.target.value),v.target.value==""?s(!0):s(!1)};return T.jsxs(nh,{children:[T.jsx(rh,{ref:a,children:t.map((v,w)=>{const z=v.sender===e;return T.jsxs(lh,{children:[T.jsx(oh,{children:v.timestamp}),T.jsxs(ih,{align:z?"end":"start",children:[z||T.jsx(uh,{src:`img/userProfile/${l.profileImg}`}),T.jsxs(sh,{children:[z||T.jsx(ah,{children:l.name}),T.jsx(ch,{maxwidth:z?12:17.125,bgcolor:z?Oe.blurple:Oe.gray200,txtcolor:z?Oe.white:Oe.black,children:v.text}),z&&T.jsx(fh,{children:"읽음"})]})]})]},w)})}),T.jsxs(dh,{onSubmit:p,children:[T.jsx("img",{src:J1}),T.jsxs(ph,{children:[T.jsx(hh,{placeholder:"메시지",value:o,onChange:y}),T.jsxs(mh,{children:[T.jsx(gh,{src:q1}),u?T.jsx(vh,{src:b1}):T.jsx(yh,{type:"submit",children:T.jsx("img",{src:eh})})]})]})]})]})},nh=H.div` + height: 42.45rem; + display: flex; + flex-direction: column; +`,rh=H.section` + display: flex; + flex-direction: column; + gap: 0.75rem; + padding: 0.75rem; + overflow-y: auto; + scrollbar-width: none; + -ms-overflow-style: none; + &::-webkit-scrollbar { + display: none; + } +`,lh=H.div` + display: flex; + flex-direction: column; +`,oh=H.span` + color: ${Oe.gray400}; + ${Vn.caption}; + align-self: center; + margin-bottom: 0.75rem; +`,ih=H.div` + display: flex; + align-self: ${e=>e.align}; +`,uh=H.img` + margin-right: 0.38rem; + align-self: end; + width: 1.75rem; + height: 1.75rem; +`,sh=H.div` + display: flex; + flex-direction: column; + gap: 0.25rem; +`,ah=H.span` + color: ${Oe.gray400}; + ${Vn.body3} +`,ch=H.span` + max-width: ${e=>e.maxwidth}rem; + ${Vn.body2}; + background-color: ${e=>e.bgcolor}; + border-radius: 1.25rem; + padding: 0.75rem; + color: ${e=>e.txtcolor}; + text-align: start; +`,fh=H.span` + color: ${Oe.gray400}; + ${Vn.body3}; + align-self: end; +`,dh=H.form` + display: flex; + justify-content: center; + gap: 0.75rem; + margin-top: auto; + margin-bottom: 2.125rem; + height: 3rem; + align-items: center; +`,ph=H.span` + display: flex; + height: 2.25rem; + width: 18.875rem; + padding: 0.625rem 0.75rem; + align-items: center; + border-radius: 5rem; + border: 1px solid ${Oe.gray300}; +`,hh=H.input` + display: -webkit-box; + width: 14.3125rem; + -webkit-box-orient: vertical; + -webkit-line-clamp: 1; + flex-shrink: 0; + + overflow: hidden; + text-overflow: ellipsis; + ${Oe.black} + + ${Vn.body2} + &::placeholder { + ${Oe.gray300} + } + + padding-right: 0.5rem; +`,mh=H.div` + display: flex; + align-items: center; +`,gh=H.img` + width: 1.25rem; + height: 1.25rem; +`,vh=H.img` + padding-left: 0.75rem; +`,yh=H.button` + display: flex; + align-items: center; +`,wh=()=>T.jsxs(B1,{children:[T.jsx(H1,{}),T.jsx(th,{})]}),Sh=()=>T.jsx(kh,{children:T.jsx(wh,{})}),kh=H.div` + width: 375px; + height: 812px; + margin: auto auto; // 가운데 정렬 + background-color: white; +`;function Ch(){return T.jsx(Sh,{})}const xh=D1` +@font-face { + font-family: 'Pretendard-Regular'; + src: url('https://cdn.jsdelivr.net/gh/Project-Noonnu/noonfonts_2107@1.1/Pretendard-Regular.woff') format('woff'); + font-weight: 400; + font-style: normal; +} + +html, +body, +div, +span, +applet, +object, +iframe, +h1, +h2, +h3, +h4, +h5, +h6, +p, +blockquote, +pre, +a, +abbr, +acronym, +address, +big, +cite, +code, +del, +dfn, +em, +img, +ins, +kbd, +q, +s, +samp, +small, +strike, +strong, +sub, +sup, +tt, +var, +b, +u, +i, +center, +dl, +dt, +dd, +ol, +ul, +li, +fieldset, +form, +label, +legend, +table, +caption, +tbody, +tfoot, +thead, +tr, +th, +td, +article, +aside, +canvas, +details, +embed, +figure, +figcaption, +footer, +header, +hgroup, +menu, +nav, +output, +ruby, +section, +summary, +time, +mark, +audio, +video { + margin: 0; + padding: 0; + border: 0; + font-size: 100%; + vertical-align: baseline; +} +/* HTML5 display-role reset for older browsers */ +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +menu, +nav, +section { + display: block; +} +ol, +ul { + list-style: none; +} +blockquote, +q { + quotes: none; +} +blockquote:before, +blockquote:after, +q:before, +q:after { + content: ""; + content: none; +} +table { + border-collapse: collapse; + border-spacing: 0; +} + +*, +*::before, +*::after { + box-sizing: border-box; + font-family: 'Pretendard-Regular'; +} + +body{ + min-height: 100vh; + //임시 + background-color: black; +} + +button { + border: none; + background: transparent; + cursor: pointer; +} + +input { + border: none; + background-color: transparent; + outline: none; +} + +`;Jo.createRoot(document.getElementById("root")).render(T.jsxs(qe.StrictMode,{children:[T.jsx(xh,{}),T.jsx(Ch,{})]})); diff --git a/dist/assets/statusBar--lJy_-lC.svg b/dist/assets/statusBar--lJy_-lC.svg new file mode 100644 index 0000000..4ba7dc5 --- /dev/null +++ b/dist/assets/statusBar--lJy_-lC.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/dist/img/userProfile/all.svg b/dist/img/userProfile/all.svg new file mode 100644 index 0000000..2f9deb9 --- /dev/null +++ b/dist/img/userProfile/all.svg @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dist/img/userProfile/frog.svg b/dist/img/userProfile/frog.svg new file mode 100644 index 0000000..603c344 --- /dev/null +++ b/dist/img/userProfile/frog.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/dist/img/userProfile/mine.svg b/dist/img/userProfile/mine.svg new file mode 100644 index 0000000..eff9a96 --- /dev/null +++ b/dist/img/userProfile/mine.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/dist/img/userProfile/rabbit.svg b/dist/img/userProfile/rabbit.svg new file mode 100644 index 0000000..2b7638e --- /dev/null +++ b/dist/img/userProfile/rabbit.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/dist/index.html b/dist/index.html new file mode 100644 index 0000000..db031da --- /dev/null +++ b/dist/index.html @@ -0,0 +1,14 @@ + + + + + + + Discord + + + + +
+ + From 33ae36e506c880a2d21421c8f42a054968e087c7 Mon Sep 17 00:00:00 2001 From: CSE-pebble Date: Fri, 29 Mar 2024 21:27:55 +0900 Subject: [PATCH 20/56] Update README.md --- README.md | 113 ++++++++++++++++++++++++++++++++---------------------- 1 file changed, 68 insertions(+), 45 deletions(-) diff --git a/README.md b/README.md index 82b92ad..bb7bbf5 100644 --- a/README.md +++ b/README.md @@ -1,66 +1,89 @@ -# 서론 +# 3주차 미션: React-Messenger -안녕하세요 🙌🏻 19기 프론트 운영진 배성준입니다. 이번 미션에서는 드디어 투두리스트에서 벗어나 새로운 프로젝트인 **messenger** 만들기를 진행합니다. +## 🐻 배포 링크 -이번주는 특별히 **디자이너와의 협업**으로 진행되는 미션입니다. 디자이너분께서 열심히 리디자인 한 메신저 프로젝트를 여러분들께서 구현해주시면 됩니다. +https://discord-react-typescript.vercel.app/ -동시에, 이번주부터는 새로 **TypeScript**를 적용해보려고 합니다. +## 👩‍💻 구현 기능 -프로젝트의 규모가 커지게 될 수록, 컴포넌트가 가지는 props의 종류 또한 다양해지게 됩니다. 무지성 코딩을 하다보면 가끔 이 props의 구성과 이름, 어떤 타입이 들어가야 하는지 헷갈리기 마련이죠. 보통 그럴 때 다시 컴포넌트 정의 부분으로 돌아가 props의 구성을 보고 오곤 합니다. +- user, message 더미데이터를 json 파일에 저장하고 관리 +- 메세지 전송 기능 +- 메세지 전송 시 현재 시간 표시 기능 +- 채팅방 프로필 클릭 시 유저 변경 기능 -하지만 이럴 때, typescript를 적용한다면 컴포넌트의 구성과 그 이름, 심지어 타입까지 한번에 자동완성으로 편리하게 관리할 수 있고, 생산성이 증대되겠죠. +## 🥳 후기 -또한, **React Hooks**에 조금 더 익숙해지는 것을 목표로 합니다. 여러 Hook들이 있지만 그 중에서도 `useState`, `useEffect`, `useRef`를 중점적으로 사용해 보는 미션인데요, React를 사용하면서 굉장히 자주 쓰이는 Hook들이기 때문에 이 부분을 집중적으로 공부해 보아요! +디자인분과 협력하면서 피그마 디자인을 보고 적용하는 방법을 익힐 수 있어 너무 좋았습니다! 디자인분이 열심히 디자인 해주신 것을 최대한 잘 반영해보고 싶어서 꼼꼼히 하다보니 뷰 만드는데도 시간이 꽤 걸렸습니다. -그럼 이번 미션도 파이팅입니다!!🎉 +타입스크립트, 상태관리를 처음 다뤄봐서 과제하는데 애를 많이 먹었습니다. 확장성을 고려하여 깔끔하고 유지보수하기 좋은 코드를 작성하고 싶었으나 기능 구현에 급급하다 보니 컴포넌트 분리도 적절히 못한 것 같고, 코드가 지저분해서 아쉬움이 많이 남습니다.🥲 -# 미션 +`Recoil`, `Redux`를 이용해보기 전에 이번 과제에서는 `ContextAPI`를 이용하여 상태관리를 해주었습니다. `Recoil`, `Redux`를 쓰면 신세계를 경험할 수 있다고(!) 하셔서 다음 과제가 기대가 되네요. 그 전까지 틈틈이 공부하고 코드 리팩토링도 하고 싶습니다. -## Key Questions +## 💡 새롭게 배운 점 -- JavaScript를 사용할때에 비해 TypeScript를 사용할 때의 장점은 무엇인가요? -- 디자이너로부터 전달받은 피그마 링크 혹은, 피그마 캡처본 -- 컴포넌트를 분리한 기준은 무엇인가요? -- 디자인 시스템을 적용하면서 느낀 점은 무엇인가요? -- 디자이너와 소통하며 느낀점은 무엇인가요? +- 피그마에서 주어진 Color System, Typography를 한꺼번에 관리하는 방법을 알게 되었습니다. ([내 코드](https://github.com/CSE-pebble/react-messenger-19th/tree/CSE-pebble/src/style)) +- `ContextAPI`를 사용해보면서 상태관리의 필요성을 직접적으로 느낄 수 있었습니다. -## 미션 목표 +## 🔥 어려웠던 부분 / 의문점 -- TypeScript를 사용해봅시다. -- useState로 컴포넌트의 상태를 관리합니다. -- useEffect와 useRef의 사용법을 이해합니다. -- styled-components를 통한 CSS-in-JS 및 CSS Preprocessor의 사용법에 익숙해집니다. +- 또 컴포넌트 분리...! 이번 과제에서는 저번 과제보다 더 컴포넌트 분리를 하지 못한 것 같습니다. +- 상태관리: 현재 채팅을 보내는 유저인 `currentUser`와, 채팅 데이터를 담고 있는 state인 `chats`을 전역으로 상태관리를 해주었습니다. `ContextAPI`를 이용하는 것 자체로도 시간이 많이 소요됐고, `chats`의 경우 데이터를 담고 있는 상태이기 때문에 데이터의 양이 방대해질 경우 이것을 전역으로 관리해도 괜찮을까 하는 의문이 들었습니다. +- 타입스크립트 타입 지정: 이벤트 함수 리턴 값 등 복잡한 리턴 값들을 일일이 작성해줘야 해서 귀찮았습니다... 하지만 자바스크립트로 작성해서 나중에 생기는 오류 고치는 것보단 낫겠지! 하는 마음으로 열심히 써주었습니다. +- message 데이터 `json` 파일: 우선은 `localStorage`에 저장된 값이 아무것도 없을 경우 `json` 파일에 저장된 데이터들을 불러오고, 저장된 값이 있을 경우 해당 값을 `localStorage`에서 불러오도록 구현했는데, 이렇게 구현하는게 맞는지 궁금합니다! -## 기한 +## ✨ 더 구현해보고 싶은 기능 -2024년 3월 29일 금요일 +- 절대 경로 설정: 파일을 import 할 때 상대경로로 하면 `../../` 등 경로가 너무 길어지는 경우가 있어서 다른 분들처럼 절대경로로 설정해보고 싶습니다. 이번엔 시도하다가 실패.. +- 이미지 경로 한꺼번에 관리하기: [제 코드에서 색상을 한꺼번에 관리해준 것](https://github.com/CSE-pebble/react-messenger-19th/blob/CSE-pebble/src/style/colors.tsx)처럼 각종 아이콘 등 수많은 이미지를 한꺼번에 관리해보고 싶습니다. +- 상단바 시간 현재 시간으로 설정: 지금은 상단바 이미지를 통째로 가져와서 넣어줘서 고정된 시간으로 나와있지만, 이후에는 현재 시간을 세팅하는 기능을 구현하고 싶습니다. +- 채팅 입력 시 줄바꿈 기능: shift+enter를 누르면 채팅창 줄바꿈이 되는 기능 +- 채팅 입력 시 시간: 지금은 모든 메세지마다 시간이 뜨도록 구현했는데, 이후에는 분이 바뀔 때만 or 1시간 단위로만 시간이 뜨게 구현해보고 싶습니다. +- 이번 과제 추가 기능이었던 메세지 더블클릭하면 하트가 생기는 기능 -## 필수 구현 기능 +## ❓ Key Questions -- 피그마를 보고 [결과화면](https://3th-fb-messenger.netlify.app)과 같이 구현합니다. -- 디자인 시스템을 구축합니다. -- 채팅방 상단의 프로필을 클릭하면 사용자를 변경할 수 있습니다. -- 메세지를 보내면 채팅방 하단으로 스크롤을 이동시킵니다. -- 메세지에 유저 정보(프로필 사진, 이름)를 표시합니다. -- user와 message 데이터를 json 파일에 저장합니다. -- UI는 **반응형을 제외**하고 피그마파일을 따라서 진행합니다. +### 1. JavaScript를 사용할때에 비해 TypeScript를 사용할 때의 장점은 무엇인가요? -### 추가 구현 기능 +1. 정적 타입 지정 -- 더블 클릭 하면 감정표현을 추가합니다. -- 그 외 추가하고 싶은 기능이 있다면 마음껏 추가해 주세요! + 타입스크립트의 핵심 기능 중 하나로, 변수, 함수 매개변수, 객체 속성 등에 명시적인 타입을 지정할 수 있다. 이를 통해 컴파일 타임에 오류를 잡아낼 수 있어 런타임 오류의 가능성을 줄인다. -참고로 이번 과제는 다음주까지 이어지는 과제이므로 **확장성**을 충분히 고려해 주세요. 참고로 **4주차 과제에서는 유저 및 기능 추가와 Routing을** 진행합니다. 이를 위해 [recoil](https://recoiljs.org/ko/)이나 [redux](https://ko.redux.js.org/introduction/getting-started/)를 이용한 상태관리를 미리 해보시는 것을 추천합니다!! 모두 공식문서 많이 읽어보시고 자신만의 상태관리 조합도 찾아보면 재밌을 거에요 XD + - 컴파일 타임 vs 런타임 + - 컴파일 타임: 소스 코드가 컴파일러에 의해 기계어나 바이트코드 등 실행 가능한 형태로 변환되는 과정과 시간 → 컴파일 오류는 해결되지 않으면 아예 프로그램이 실행되지 않음 + - 런타임: 프로그램이 사용자 또는 다른 시스템에 의해 실행되고 있는 상태와 그 시간 → 프로그램 실행 중에 발견됨 -## 링크 및 참고자료 +2. 타입 추론 -- [React docs - Hook](https://ko.reactjs.org/docs/hooks-intro.html) -- [React의 Hooks 완벽 정복하기](https://velog.io/@velopert/react-hooks#1-usestate) -- [useEffect 완벽 가이드](https://overreacted.io/ko/a-complete-guide-to-useeffect/) -- [코딩 컨벤션](https://ui.toast.com/fe-guide/ko_CODING-CONVENTION) -- [타입스크립트 핸드북](https://joshua1988.github.io/ts/intro.html) -- [리액트 프로젝트에서 타입스크립트 사용하기 (시리즈)](https://velog.io/@velopert/series/react-with-typescript) -- [디자인 시스템 구축기](https://yozm.wishket.com/magazine/detail/1830/) -- [[영상] : 컴포넌트에 대한 이해](https://www.youtube.com/watch?v=21eiJc90ggo) -- [Styled Component로 디자인 시스템 구축하기](https://zaat.dev/blog/building-a-design-system-in-react-with-styled-components/) -- [ts 절대경로 설정하기](https://tesseractjh.tistory.com/232) + 타입스크립트는 변수나 함수의 반환 값에 대해 타입을 자동으로 추론한다. 명시적으로 타입을 지정하지 않아도 타입스크립트가 적절한 타입을 추론해내며, 이는 코드의 간결함을 유지하면서도 타입의 안전성을 제공한다. + +3. 인터페이스와 클래스 + + 타입스크립트에서 클래스와 인터페이스를 함께 사용하면, 클래스가 인터페이스를 구현하도록 강제할 수 있어 객체의 구조와 행동을 더 명확하게 정의할 수 있다. 인터페이스로는 객체의 구조 역시 정의할 수 있는데, 이를 통해 객체가 특정 속성이나 메소드를 갖고 있음을 보장할 수 있어 코드의 일관성과 가독성이 향상된다. + +4. 제네릭 + + 타입스크립트의 제네릭을 사용하면 컴포넌트와 함수가 다양한 타입에 대해 작동할 수 있게 만들면서도 타입 안전성을 유지할 수 있다. + +### 2. 디자이너로부터 전달받은 피그마 링크 혹은, 피그마 캡처본 + +[🔗 피그마 링크](https://www.figma.com/file/jOcAfCCjt1ltxlZKCkW9eu/Study_2?type=design&node-id=0-1&mode=design&t=j24y5RZeIXQ0drnM-0) + +![figma design](https://file.notion.so/f/f/9a4f0dad-d16a-4399-a588-f2547ae8aa9a/f15a5988-21d9-4149-a18b-44f757deff84/%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7_2024-03-22_%EC%98%A4%EC%A0%84_2.44.06.png?id=b7affc77-0b87-4f31-9392-f68d7432e80b&table=block&spaceId=9a4f0dad-d16a-4399-a588-f2547ae8aa9a&expirationTimestamp=1711807200000&signature=aTnd9amg2yLBNaV6W3NTe0-TP8BaIu0aNQmh09i3YHY&downloadName=%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7+2024-03-22+%EC%98%A4%EC%A0%84+2.44.06.png) + +### 3. 컴포넌트를 분리한 기준은 무엇인가요? + +전체적인 디자인, 기능을 보면서 재사용되는 부분을 컴포넌트로 분리하였습니다. + +이후 페이지 라우팅에 대한 확장성을 고려하여 페이지별 폴더를 만들어주었습니다. + +### 4. 디자인 시스템을 적용하면서 느낀 점은 무엇인가요? + +제가 따로 뷰를 고민할 필요 없이 피그마에 나온 디자인을 보고 바로 개발을 시작하니 굉장히 편리했습니다. 특히 폰트, 색상, 글자 스타일 등이 미리 정해져있으니 초기 세팅만 해놓으면 언제든 불러서 사용하면 된다는 것이 가장 좋았습니다. + +다만 디자인을 받은 만큼 그 디자인을 최대한 잘 반영해야 한다고 생각해서, 섬세하고 꼼꼼하게 작업했던 것 같습니다. + +### 5. 디자이너와 소통하며 느낀점은 무엇인가요? + +혼자 하는 과제가 아니기 때문에, 제가 할 수 있는 것과 없는 것에 대한 판단을 정확히 하고 그 부분에 대해 디자이너 분과 소통하는 것이 정말 중요하다고 느꼈습니다. + +그리고 책임이 커진 만큼 더 열심히 과제를 구현하려고 했고, 그것이 좋은 결과물을 낼 수 있었던 것 같습니다. 협업의 중요성을 깨달을 수 있었습니다. From 58325ea11bd519c4d40ac887cae8e8b499d238a0 Mon Sep 17 00:00:00 2001 From: CSE-pebble Date: Fri, 3 May 2024 03:21:39 +0900 Subject: [PATCH 21/56] =?UTF-8?q?Modify:=20=EC=83=81=EB=8B=A8=EB=B0=94=20?= =?UTF-8?q?=ED=98=84=EC=9E=AC=20=EC=8B=9C=EA=B0=84=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/assets/battery.svg | 5 +++ src/assets/celluar.svg | 3 ++ src/assets/statusBar.svg | 15 -------- src/assets/wifi.svg | 3 ++ src/components/common/StatusBar.tsx | 56 ++++++++++++++++++++++++++--- 5 files changed, 63 insertions(+), 19 deletions(-) create mode 100644 src/assets/battery.svg create mode 100644 src/assets/celluar.svg delete mode 100644 src/assets/statusBar.svg create mode 100644 src/assets/wifi.svg diff --git a/src/assets/battery.svg b/src/assets/battery.svg new file mode 100644 index 0000000..61e76d8 --- /dev/null +++ b/src/assets/battery.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/celluar.svg b/src/assets/celluar.svg new file mode 100644 index 0000000..b196380 --- /dev/null +++ b/src/assets/celluar.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/statusBar.svg b/src/assets/statusBar.svg deleted file mode 100644 index 4ba7dc5..0000000 --- a/src/assets/statusBar.svg +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/src/assets/wifi.svg b/src/assets/wifi.svg new file mode 100644 index 0000000..0a29dd9 --- /dev/null +++ b/src/assets/wifi.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/components/common/StatusBar.tsx b/src/components/common/StatusBar.tsx index 28e4942..f9b96c3 100644 --- a/src/components/common/StatusBar.tsx +++ b/src/components/common/StatusBar.tsx @@ -1,11 +1,59 @@ -import statusBar from "../../assets/statusBar.svg"; +import celluar from "../../assets/celluar.svg"; +import wifi from "../../assets/wifi.svg"; +import battery from "../../assets/battery.svg"; + +import styled from "styled-components"; +import { useEffect, useState } from "react"; const StatusBar = () => { + const [currentTime, setCurrentTime] = useState(getCurrentTime()); + + useEffect(() => { + const intervalId = setInterval(() => { + setCurrentTime(getCurrentTime()); + }, 1000); + return () => clearInterval(intervalId); + }, []); + + function getCurrentTime() { + const now = new Date(); + const hours = now.getHours().toString(); + const minutes = now.getMinutes().toString().padStart(2, "0"); + return `${hours}:${minutes}`; + } + return ( - <> - - + + + + celluar icon + wifi icon + battery icon + + ); }; +const Wrapper = styled.div` + display: flex; + align-items: center; + padding: 0.8rem 0.98rem 0.75rem 1.8rem; + justify-content: space-between; +`; + +const Time = styled.span` + text-align: center; + font-size: 0.875rem; + font-style: normal; + font-weight: 600; + line-height: normal; + letter-spacing: -0.0175rem; + font-family: "SF Pro Text"; +`; + +const Icon = styled.div` + display: flex; + gap: 0.25rem; +`; + export default StatusBar; From 1787a801edad0d7e775eeb4e2adb2f9e86ef36be Mon Sep 17 00:00:00 2001 From: CSE-pebble Date: Fri, 3 May 2024 03:34:11 +0900 Subject: [PATCH 22/56] =?UTF-8?q?Style:=20=EB=94=94=EC=9E=90=EC=9D=B8=20QA?= =?UTF-8?q?=20=EB=B0=98=EC=98=81=20-=20=EC=B1=84=ED=8C=85=EB=B0=A9?= =?UTF-8?q?=EB=AA=85=EA=B3=BC=20=EB=8D=94=EB=B3=B4=EA=B8=B0=20=EB=B2=84?= =?UTF-8?q?=ED=8A=BC=20=EC=A4=91=EC=95=99=20=EC=A0=95=EB=A0=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/ChattingRoom/Header.tsx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/pages/ChattingRoom/Header.tsx b/src/pages/ChattingRoom/Header.tsx index 2fbb013..b45d655 100644 --- a/src/pages/ChattingRoom/Header.tsx +++ b/src/pages/ChattingRoom/Header.tsx @@ -70,13 +70,14 @@ const RoomProfile = styled.img` `; const RoomNameWrapper = styled.div` - display: flex; + display: grid; align-items: center; justify-content: center; + grid-template-columns: auto 0; + padding-top: 0.25rem; `; const RoomName = styled.span` ${typography.body3}; padding-right: 0.25rem; - padding-top: 0.25rem; `; From bcd2993cdac82ba2d7c44eb921e3131a993ff09c Mon Sep 17 00:00:00 2001 From: CSE-pebble Date: Fri, 3 May 2024 03:44:05 +0900 Subject: [PATCH 23/56] =?UTF-8?q?Chore:=20=EB=A6=AC=EB=8D=95=EC=8A=A4=20?= =?UTF-8?q?=ED=99=98=EA=B2=BD=20=EC=84=B8=ED=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 3 +++ src/index.tsx | 6 +++++- src/store/index.tsx | 7 +++++++ yarn.lock | 48 +++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 63 insertions(+), 1 deletion(-) create mode 100644 src/store/index.tsx diff --git a/package.json b/package.json index 835bc5c..4321779 100644 --- a/package.json +++ b/package.json @@ -10,8 +10,11 @@ "preview": "vite preview" }, "dependencies": { + "@reduxjs/toolkit": "^2.2.3", "react": "^18.2.0", "react-dom": "^18.2.0", + "react-redux": "^9.1.2", + "redux": "^5.0.1", "styled-components": "^6.1.8" }, "devDependencies": { diff --git a/src/index.tsx b/src/index.tsx index 153cce0..8875c80 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -1,12 +1,16 @@ import React from "react"; import ReactDOM from "react-dom/client"; import App from "./App"; +import { Provider } from "react-redux"; +import store from "./store/index"; const root = ReactDOM.createRoot( document.getElementById("root") as HTMLElement ); root.render( - + + + ); diff --git a/src/store/index.tsx b/src/store/index.tsx new file mode 100644 index 0000000..933f0db --- /dev/null +++ b/src/store/index.tsx @@ -0,0 +1,7 @@ +import { configureStore } from "@reduxjs/toolkit"; + +const store = configureStore({ + reducer: {}, +}); + +export default store; diff --git a/yarn.lock b/yarn.lock index 86613c3..a36c95b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -450,6 +450,16 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" +"@reduxjs/toolkit@^2.2.3": + version "2.2.3" + resolved "https://registry.yarnpkg.com/@reduxjs/toolkit/-/toolkit-2.2.3.tgz#5ce71cbf162f98c5dafb49bd3f1e11c5486ab9c4" + integrity sha512-76dll9EnJXg4EVcI5YNxZA/9hSAmZsFqzMmNRHvIlzw2WS/twfcVX3ysYrWGJMClwEmChQFC4yRq74tn6fdzRA== + dependencies: + immer "^10.0.3" + redux "^5.0.1" + redux-thunk "^3.1.0" + reselect "^5.0.1" + "@rollup/rollup-android-arm-eabi@4.13.1": version "4.13.1" resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.13.1.tgz#88ba199f996e0000689130ed69e47df8b0dfbc70" @@ -593,6 +603,11 @@ resolved "https://registry.yarnpkg.com/@types/stylis/-/stylis-4.2.0.tgz#199a3f473f0c3a6f6e4e1b17cdbc967f274bdc6b" integrity sha512-n4sx2bqL0mW1tvDf/loQ+aMX7GQD3lc3fkCMC55VFNDu/vBOabO+LTIeXKM14xK0ppk5TUGcWRjiSpIlUpghKw== +"@types/use-sync-external-store@^0.0.3": + version "0.0.3" + resolved "https://registry.yarnpkg.com/@types/use-sync-external-store/-/use-sync-external-store-0.0.3.tgz#b6725d5f4af24ace33b36fafd295136e75509f43" + integrity sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA== + "@typescript-eslint/eslint-plugin@^7.2.0": version "7.4.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.4.0.tgz#de61c3083842fc6ac889d2fc83c9a96b55ab8328" @@ -1209,6 +1224,11 @@ ignore@^5.2.0, ignore@^5.2.4: resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef" integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== +immer@^10.0.3: + version "10.1.1" + resolved "https://registry.yarnpkg.com/immer/-/immer-10.1.1.tgz#206f344ea372d8ea176891545ee53ccc062db7bc" + integrity sha512-s2MPrmjovJcoMaHtx6K11Ra7oD05NT97w1IC5zpMkT6Atjr7H8LjaDd81iIxUYpMKSRRNMJE703M1Fhr/TctHw== + import-fresh@^3.2.1: version "3.3.0" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" @@ -1510,6 +1530,14 @@ react-dom@^18.2.0: loose-envify "^1.1.0" scheduler "^0.23.0" +react-redux@^9.1.2: + version "9.1.2" + resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-9.1.2.tgz#deba38c64c3403e9abd0c3fbeab69ffd9d8a7e4b" + integrity sha512-0OA4dhM1W48l3uzmv6B7TXPCGmokUU4p1M44DGN2/D9a1FjVPukVjER1PcPX97jIg6aUeLq1XJo1IpfbgULn0w== + dependencies: + "@types/use-sync-external-store" "^0.0.3" + use-sync-external-store "^1.0.0" + react-refresh@^0.14.0: version "0.14.0" resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.14.0.tgz#4e02825378a5f227079554d4284889354e5f553e" @@ -1522,6 +1550,21 @@ react@^18.2.0: dependencies: loose-envify "^1.1.0" +redux-thunk@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/redux-thunk/-/redux-thunk-3.1.0.tgz#94aa6e04977c30e14e892eae84978c1af6058ff3" + integrity sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw== + +redux@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/redux/-/redux-5.0.1.tgz#97fa26881ce5746500125585d5642c77b6e9447b" + integrity sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w== + +reselect@^5.0.1: + version "5.1.0" + resolved "https://registry.yarnpkg.com/reselect/-/reselect-5.1.0.tgz#c479139ab9dd91be4d9c764a7f3868210ef8cd21" + integrity sha512-aw7jcGLDpSgNDyWBQLv2cedml85qd95/iszJjN988zX1t7AVRJi19d9kto5+W7oCfQ94gyo40dVbT6g2k4/kXg== + resolve-from@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" @@ -1720,6 +1763,11 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" +use-sync-external-store@^1.0.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.2.2.tgz#c3b6390f3a30eba13200d2302dcdf1e7b57b2ef9" + integrity sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw== + vite@^5.2.0: version "5.2.6" resolved "https://registry.yarnpkg.com/vite/-/vite-5.2.6.tgz#fc2ce309e0b4871e938cb0aca3b96c422c01f222" From 3ca06632eaa29f80039a8c33477f4b691b5f9683 Mon Sep 17 00:00:00 2001 From: CSE-pebble Date: Fri, 3 May 2024 04:40:38 +0900 Subject: [PATCH 24/56] =?UTF-8?q?Chore:=20=EC=B1=84=ED=8C=85=20=EB=8D=B0?= =?UTF-8?q?=EC=9D=B4=ED=84=B0,=20=EC=9C=A0=EC=A0=80=20=EB=8D=B0=EC=9D=B4?= =?UTF-8?q?=ED=84=B0=20=EC=97=85=EB=8D=B0=EC=9D=B4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/img/userProfile/all.svg | 34 ---------- public/img/userProfile/food.svg | 9 +++ src/data/chatting.json | 108 +++++++++++++++++++++++++++++--- src/data/user.json | 11 +++- 4 files changed, 116 insertions(+), 46 deletions(-) delete mode 100644 public/img/userProfile/all.svg create mode 100644 public/img/userProfile/food.svg diff --git a/public/img/userProfile/all.svg b/public/img/userProfile/all.svg deleted file mode 100644 index 2f9deb9..0000000 --- a/public/img/userProfile/all.svg +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/public/img/userProfile/food.svg b/public/img/userProfile/food.svg new file mode 100644 index 0000000..5b1bda9 --- /dev/null +++ b/public/img/userProfile/food.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/data/chatting.json b/src/data/chatting.json index ad810e2..ce84345 100644 --- a/src/data/chatting.json +++ b/src/data/chatting.json @@ -1,17 +1,107 @@ [ { - "text": "나현님 안녕하세요!", - "sender": 2, - "timestamp": "3월 21일 (목) 9:38 AM" + "opponent": 1, + "chats": [ + { + "text": "짱구야 노올자~", + "sender": 0, + "timestamp": "5월 3일 (금) 9:21 AM" + }, + { + "text": "유치원 갔니?", + "sender": 0, + "timestamp": "5월 3일 (금) 12:45 PM" + }, + { + "text": "부리부리부리!", + "sender": 1, + "timestamp": "5월 3일 (금) 3:09 PM" + } + ] }, { - "text": "지원님 안녕하세요! 디자인 완전 최고최고입니다", - "sender": 0, - "timestamp": "3월 21일 (목) 9:38 AM" + "opponent": 2, + "chats": [ + { + "text": "나현님 안녕하세요!", + "sender": 0, + "timestamp": "3월 21일 (목) 9:38 AM" + }, + { + "text": "지원님 안녕하세요! 디자인 완전 최고최고입니다", + "sender": 2, + "timestamp": "3월 21일 (목) 9:38 AM" + }, + { + "text": "헤헷", + "sender": 0, + "timestamp": "3월 22일 (금) 3:18 PM" + } + ] }, { - "text": "헤헷", - "sender": 2, - "timestamp": "3월 22일 (금) 3:18 PM" + "opponent": 3, + "chats": [ + { + "text": "뭐해?", + "sender": 3, + "timestamp": "4월 28일 (일) 10:01 PM" + }, + { + "text": "연락하지마", + "sender": 0, + "timestamp": "4월 29일 (월) 11:19 AM" + }, + { + "text": "바쁘구나", + "sender": 3, + "timestamp": "4월 29일 (월) 11:30 AM" + }, + { + "text": "미안! 카톡 안 할게~!", + "sender": 3, + "timestamp": "4월 29일 (월) 11:31 AM" + }, + { + "text": "자니?", + "sender": 3, + "timestamp": "4월 30일 (화) 1:04 AM" + }, + { + "text": "자는구나", + "sender": 3, + "timestamp": "4월 30일 (화) 1:56 AM" + }, + { + "text": "잘자", + "sender": 3, + "timestamp": "4월 30일 (화) 2:24 AM" + } + ] + }, + { + "opponent": 4, + "chats": [ + { + "text": "나 이제 너랑 친구 그만할래 못하겠어", + "sender": 4, + "timestamp": "4월 1일 (월) 10:01 AM" + }, + { + "text": "답장 안해? 너랑 절교하고 싶다고", + "sender": 4, + "timestamp": "4월 1일 (월) 8:13 PM" + }, + { + "text": "그래", + "sender": 0, + "timestamp": "4월 2일 (화) 11:48 PM" + }, + { + "text": "만우절 장난이었어.......너 진심이야?", + "sender": 4, + "timestamp": "4월 2일 (화) 11:49 PM" + } + ] } ] diff --git a/src/data/user.json b/src/data/user.json index 72f8e1d..74eef12 100644 --- a/src/data/user.json +++ b/src/data/user.json @@ -2,23 +2,28 @@ "users": [ { "id": 0, - "name": "나현", + "name": "지원", "profileImg": "mine.svg" }, { "id": 1, - "name": "CEOS 19기", + "name": "신짱구", "profileImg": "all.svg" }, { "id": 2, - "name": "지원", + "name": "나현", "profileImg": "rabbit.svg" }, { "id": 3, "name": "김철수", "profileImg": "frog.svg" + }, + { + "id": 4, + "name": "이훈이", + "profileImg": "food.svg" } ] } From 7fddad15ab81d8c7213208d3cd915e1bfdb08773 Mon Sep 17 00:00:00 2001 From: CSE-pebble Date: Fri, 3 May 2024 05:11:24 +0900 Subject: [PATCH 25/56] =?UTF-8?q?Chore:=20=EC=9C=A0=EC=A0=80=20=EC=9D=B4?= =?UTF-8?q?=EB=AF=B8=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 --- public/img/userProfile/mike.svg | 9 +++++++++ src/data/user.json | 2 +- 2 files changed, 10 insertions(+), 1 deletion(-) create mode 100644 public/img/userProfile/mike.svg diff --git a/public/img/userProfile/mike.svg b/public/img/userProfile/mike.svg new file mode 100644 index 0000000..d5fc45e --- /dev/null +++ b/public/img/userProfile/mike.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/data/user.json b/src/data/user.json index 74eef12..837f4bb 100644 --- a/src/data/user.json +++ b/src/data/user.json @@ -8,7 +8,7 @@ { "id": 1, "name": "신짱구", - "profileImg": "all.svg" + "profileImg": "mike.svg" }, { "id": 2, From 922c372f7726c777e23007ef6e68dc62ee233483 Mon Sep 17 00:00:00 2001 From: CSE-pebble Date: Fri, 3 May 2024 05:17:07 +0900 Subject: [PATCH 26/56] =?UTF-8?q?Feat:=20Redux=20=EC=83=81=ED=83=9C=20"?= =?UTF-8?q?=EC=83=81=EB=8C=80=EB=B0=A9"=EC=97=90=20=EB=94=B0=EB=A5=B8=20?= =?UTF-8?q?=EC=B1=84=ED=8C=85=EB=B0=A9=20=ED=94=84=EB=A1=9C=ED=95=84=20?= =?UTF-8?q?=EC=84=A4=EC=A0=95=20=EA=B8=B0=EB=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/index.tsx | 16 ---------------- src/main.tsx | 8 ++++++-- src/pages/ChattingRoom/Header.tsx | 18 +++++++++--------- src/store/index.tsx | 23 +++++++++++++++++++++-- 4 files changed, 36 insertions(+), 29 deletions(-) delete mode 100644 src/index.tsx diff --git a/src/index.tsx b/src/index.tsx deleted file mode 100644 index 8875c80..0000000 --- a/src/index.tsx +++ /dev/null @@ -1,16 +0,0 @@ -import React from "react"; -import ReactDOM from "react-dom/client"; -import App from "./App"; -import { Provider } from "react-redux"; -import store from "./store/index"; - -const root = ReactDOM.createRoot( - document.getElementById("root") as HTMLElement -); -root.render( - - - - - -); diff --git a/src/main.tsx b/src/main.tsx index 850d573..6ee7ae3 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -2,10 +2,14 @@ import React from "react"; import ReactDOM from "react-dom/client"; import App from "./App.tsx"; import GlobalStyle from "./GlobalStyle.tsx"; +import { Provider } from "react-redux"; +import store from "./store"; ReactDOM.createRoot(document.getElementById("root")!).render( - - + + + + ); diff --git a/src/pages/ChattingRoom/Header.tsx b/src/pages/ChattingRoom/Header.tsx index b45d655..adc3721 100644 --- a/src/pages/ChattingRoom/Header.tsx +++ b/src/pages/ChattingRoom/Header.tsx @@ -1,6 +1,7 @@ import styled from "styled-components"; +import { useSelector } from "react-redux"; import StatusBar from "../../components/common/StatusBar"; -import { useSenderContext } from "../../assets/SenderContext"; +import { RootState } from "../../store"; import userData from "../../data/user.json"; @@ -12,21 +13,20 @@ import { colors } from "../../style/colors"; import { typography } from "../../style/typography"; const Header = () => { - const { currentUser, setCurrentUser } = useSenderContext(); - const currentOpponent = currentUser === 0 ? 2 : 0; - const currentOpponentData = userData.users[currentOpponent]; + const opponent = useSelector((state: RootState) => state.opponent.opponent); + const currentOpponentData = userData.users[opponent]; - const toggleSender = () => { - const newSender = currentOpponent; - setCurrentUser(newSender); - }; + // const toggleSender = () => { + // const newSender = currentOpponent; + // setCurrentUser(newSender); + // }; return ( - + {}}> diff --git a/src/store/index.tsx b/src/store/index.tsx index 933f0db..b8a8f5a 100644 --- a/src/store/index.tsx +++ b/src/store/index.tsx @@ -1,7 +1,26 @@ -import { configureStore } from "@reduxjs/toolkit"; +import { createSlice, configureStore } from "@reduxjs/toolkit"; + +interface OpponentState { + opponent: number; +} + +const initialOpponent: OpponentState = { opponent: 2 }; + +const opponentSlice = createSlice({ + name: "opponent", + initialState: initialOpponent, + reducers: { + setOpponent(state, action) { + state.opponent = action.payload; + }, + }, +}); const store = configureStore({ - reducer: {}, + reducer: { opponent: opponentSlice.reducer }, }); +export const opponentActions = opponentSlice.actions; export default store; + +export type RootState = ReturnType; From a49cf3997a574ad2c420cf94bbd1ad2129fc057a Mon Sep 17 00:00:00 2001 From: CSE-pebble Date: Fri, 3 May 2024 05:31:35 +0900 Subject: [PATCH 27/56] =?UTF-8?q?Feat:=20Redux=20=EC=83=81=ED=83=9C=20"?= =?UTF-8?q?=EC=83=81=EB=8C=80=EB=B0=A9"=EC=97=90=20=EB=94=B0=EB=A5=B8=20?= =?UTF-8?q?=EC=B1=84=ED=8C=85=20=EB=8D=B0=EC=9D=B4=ED=84=B0=20=EB=B6=88?= =?UTF-8?q?=EB=9F=AC=EC=98=A4=EA=B8=B0=20=EA=B8=B0=EB=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/ChattingRoom/Header.tsx | 2 +- src/pages/ChattingRoom/Main.tsx | 52 +++++++++++++++++++++---------- 2 files changed, 36 insertions(+), 18 deletions(-) diff --git a/src/pages/ChattingRoom/Header.tsx b/src/pages/ChattingRoom/Header.tsx index adc3721..0ea23d7 100644 --- a/src/pages/ChattingRoom/Header.tsx +++ b/src/pages/ChattingRoom/Header.tsx @@ -1,7 +1,7 @@ import styled from "styled-components"; import { useSelector } from "react-redux"; -import StatusBar from "../../components/common/StatusBar"; import { RootState } from "../../store"; +import StatusBar from "../../components/common/StatusBar"; import userData from "../../data/user.json"; diff --git a/src/pages/ChattingRoom/Main.tsx b/src/pages/ChattingRoom/Main.tsx index b8810a1..7967a36 100644 --- a/src/pages/ChattingRoom/Main.tsx +++ b/src/pages/ChattingRoom/Main.tsx @@ -1,6 +1,8 @@ import styled from "styled-components"; import { useState, useEffect, useRef } from "react"; import { useSenderContext } from "../../assets/SenderContext"; +import { useSelector } from "react-redux"; +import { RootState } from "../../store"; // image import smallAdd from "../../assets/smallAdd.svg"; @@ -9,14 +11,30 @@ import voice from "../../assets/voice.svg"; import send from "../../assets/send.svg"; // data import userData from "../../data/user.json"; +import chattingData from "../../data/chatting.json"; import { colors } from "../../style/colors"; import { typography } from "../../style/typography"; const Main = () => { - const { currentUser, chats, setChats } = useSenderContext(); - const currentOpponent = currentUser === 0 ? 2 : 0; - const currentOpponentData = userData.users[currentOpponent]; + const findChats = (opponent) => { + const chats = []; + for (const item of chattingData) { + if (item.opponent === opponent) { + chats.push(...item.chats); + } + } + return chats; + }; + const opponent = useSelector((state: RootState) => state.opponent.opponent); + const chats = findChats(opponent); + const currentOpponentData = userData.users[opponent]; + + //임시 + const currentUser = 0; + + //const { currentUser, chats, setChats } = useSenderContext(); + //const currentOpponent = currentUser === 0 ? 2 : 0; const [value, setValue] = useState(""); const [isEmpty, setIsEmpty] = useState(true); // input란에 텍스트 입력 여부 @@ -48,19 +66,19 @@ const Main = () => { return formattedTimeStamp; }; - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - if (!isEmpty) { - const newChat = { - text: value, - sender: currentUser, - timestamp: getDate(), - }; - setChats([...chats, newChat]); - setValue(""); - setIsEmpty(true); - } - }; + // const handleSubmit = (e: React.FormEvent) => { + // e.preventDefault(); + // if (!isEmpty) { + // const newChat = { + // text: value, + // sender: currentUser, + // timestamp: getDate(), + // }; + // setChats([...chats, newChat]); + // setValue(""); + // setIsEmpty(true); + // } + // }; const handleChange = (e: React.ChangeEvent) => { setValue(e.target.value); @@ -98,7 +116,7 @@ const Main = () => { })} - + {}}> Date: Fri, 3 May 2024 07:12:42 +0900 Subject: [PATCH 28/56] =?UTF-8?q?Feat:=20Redux=20=EC=83=81=ED=83=9C=20"?= =?UTF-8?q?=ED=98=84=EC=9E=AC=20=EC=83=81=EB=8C=80=EB=B0=A9"=EC=97=90?= =?UTF-8?q?=EB=94=B0=EB=A5=B8=20=EC=B1=84=ED=8C=85=EB=B0=A9=20=ED=94=84?= =?UTF-8?q?=EB=A1=9C=ED=95=84=20=ED=86=A0=EA=B8=80=20=EA=B8=B0=EB=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/ChattingRoom/ChattingRoom.tsx | 37 ++++++++++++++++++++++--- src/pages/ChattingRoom/Header.tsx | 32 +++++++++++++-------- src/pages/ChattingRoom/Main.tsx | 2 +- src/store/index.tsx | 20 +++++++++++-- 4 files changed, 72 insertions(+), 19 deletions(-) diff --git a/src/pages/ChattingRoom/ChattingRoom.tsx b/src/pages/ChattingRoom/ChattingRoom.tsx index bdaaa5e..d235819 100644 --- a/src/pages/ChattingRoom/ChattingRoom.tsx +++ b/src/pages/ChattingRoom/ChattingRoom.tsx @@ -1,13 +1,42 @@ +import { useState, useEffect } from "react"; +import { useSelector } from "react-redux"; +import { RootState } from "../../store"; + import Header from "./Header"; import Main from "./Main"; -import { SenderProvider } from "../../assets/SenderContext"; + +import chattingData from "../../data/chatting.json"; const ChattingRoom = () => { + const findChats = (opponent: number) => { + const chats = []; + for (const item of chattingData) { + if (item.opponent === opponent) { + chats.push(...item.chats); + } + } + console.log(chats); + return chats; + }; + + const opponent = useSelector((state: RootState) => state.opponent.opponent); + + const storedChatsJSON = localStorage.getItem(opponent.toString()); + const initialData = storedChatsJSON + ? JSON.parse(storedChatsJSON) + : findChats(opponent); + + const [chats, setChats] = useState(initialData); + + useEffect(() => { + localStorage.setItem(opponent.toString(), JSON.stringify(chats)); + }, [chats, opponent]); + return ( - -
+ <> +
- + ); }; diff --git a/src/pages/ChattingRoom/Header.tsx b/src/pages/ChattingRoom/Header.tsx index 0ea23d7..da31d6d 100644 --- a/src/pages/ChattingRoom/Header.tsx +++ b/src/pages/ChattingRoom/Header.tsx @@ -1,6 +1,7 @@ import styled from "styled-components"; -import { useSelector } from "react-redux"; +import { useSelector, useDispatch } from "react-redux"; import { RootState } from "../../store"; +import { currOpponentActions } from "../../store"; import StatusBar from "../../components/common/StatusBar"; import userData from "../../data/user.json"; @@ -12,26 +13,33 @@ import profileArrow from "../../assets/profileArrow.svg"; import { colors } from "../../style/colors"; import { typography } from "../../style/typography"; -const Header = () => { +const Header = ({ chats, setChats }) => { + const dispatch = useDispatch(); const opponent = useSelector((state: RootState) => state.opponent.opponent); - const currentOpponentData = userData.users[opponent]; + const currOpponent = useSelector( + (state: RootState) => state.currOpponent.currOpponent + ); + const currOpponentData = userData.users[currOpponent]; - // const toggleSender = () => { - // const newSender = currentOpponent; - // setCurrentUser(newSender); - // }; + const toggleCurrOpponent = () => { + const index = currOpponent === 0 ? opponent : 0; + dispatch(currOpponentActions.setCurrOpponent(index)); + const updatedChats = [...chats]; + updatedChats.forEach((chat) => { + chat.sender = chat.sender === 0 ? opponent : 0; + }); + setChats(updatedChats); + }; return ( - {}}> - + + - {currentOpponentData.name} + {currOpponentData.name} diff --git a/src/pages/ChattingRoom/Main.tsx b/src/pages/ChattingRoom/Main.tsx index 7967a36..6113f46 100644 --- a/src/pages/ChattingRoom/Main.tsx +++ b/src/pages/ChattingRoom/Main.tsx @@ -17,7 +17,7 @@ import { colors } from "../../style/colors"; import { typography } from "../../style/typography"; const Main = () => { - const findChats = (opponent) => { + const findChats = (opponent: number) => { const chats = []; for (const item of chattingData) { if (item.opponent === opponent) { diff --git a/src/store/index.tsx b/src/store/index.tsx index b8a8f5a..fa48fc2 100644 --- a/src/store/index.tsx +++ b/src/store/index.tsx @@ -4,8 +4,8 @@ interface OpponentState { opponent: number; } +// 누구와의 채팅방인지 -> 한번 채팅방 선택하면 고정 const initialOpponent: OpponentState = { opponent: 2 }; - const opponentSlice = createSlice({ name: "opponent", initialState: initialOpponent, @@ -16,11 +16,27 @@ const opponentSlice = createSlice({ }, }); +// 채팅방 내에서 토글로 인해 상대방이 변함 +const initialCurrOpponent = { currOpponent: initialOpponent.opponent }; +const currOpponentSlice = createSlice({ + name: "currOpponent", + initialState: initialCurrOpponent, + reducers: { + setCurrOpponent(state, action) { + state.currOpponent = action.payload; + }, + }, +}); + const store = configureStore({ - reducer: { opponent: opponentSlice.reducer }, + reducer: { + opponent: opponentSlice.reducer, + currOpponent: currOpponentSlice.reducer, + }, }); export const opponentActions = opponentSlice.actions; +export const currOpponentActions = currOpponentSlice.actions; export default store; export type RootState = ReturnType; From 2af88259284ec78e01e1d3b26e900a3f730e0c87 Mon Sep 17 00:00:00 2001 From: CSE-pebble Date: Fri, 3 May 2024 07:42:08 +0900 Subject: [PATCH 29/56] =?UTF-8?q?Feat:=20Redux=20=EC=83=81=ED=83=9C=20"?= =?UTF-8?q?=ED=98=84=EC=9E=AC=20=EC=83=81=EB=8C=80=EB=B0=A9"=EC=97=90=20?= =?UTF-8?q?=EB=94=B0=EB=A5=B8=20=EC=B1=84=ED=8C=85=20=EB=8D=B0=EC=9D=B4?= =?UTF-8?q?=ED=84=B0=20=ED=86=A0=EA=B8=80=20=EA=B8=B0=EB=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/ChattingRoom/ChattingRoom.tsx | 2 +- src/pages/ChattingRoom/Header.tsx | 5 ---- src/pages/ChattingRoom/Main.tsx | 31 +++++++------------------ 3 files changed, 9 insertions(+), 29 deletions(-) diff --git a/src/pages/ChattingRoom/ChattingRoom.tsx b/src/pages/ChattingRoom/ChattingRoom.tsx index d235819..d95a2e5 100644 --- a/src/pages/ChattingRoom/ChattingRoom.tsx +++ b/src/pages/ChattingRoom/ChattingRoom.tsx @@ -35,7 +35,7 @@ const ChattingRoom = () => { return ( <>
-
+
); }; diff --git a/src/pages/ChattingRoom/Header.tsx b/src/pages/ChattingRoom/Header.tsx index da31d6d..ebca5df 100644 --- a/src/pages/ChattingRoom/Header.tsx +++ b/src/pages/ChattingRoom/Header.tsx @@ -24,11 +24,6 @@ const Header = ({ chats, setChats }) => { const toggleCurrOpponent = () => { const index = currOpponent === 0 ? opponent : 0; dispatch(currOpponentActions.setCurrOpponent(index)); - const updatedChats = [...chats]; - updatedChats.forEach((chat) => { - chat.sender = chat.sender === 0 ? opponent : 0; - }); - setChats(updatedChats); }; return ( diff --git a/src/pages/ChattingRoom/Main.tsx b/src/pages/ChattingRoom/Main.tsx index 6113f46..6adf272 100644 --- a/src/pages/ChattingRoom/Main.tsx +++ b/src/pages/ChattingRoom/Main.tsx @@ -11,30 +11,15 @@ import voice from "../../assets/voice.svg"; import send from "../../assets/send.svg"; // data import userData from "../../data/user.json"; -import chattingData from "../../data/chatting.json"; import { colors } from "../../style/colors"; import { typography } from "../../style/typography"; -const Main = () => { - const findChats = (opponent: number) => { - const chats = []; - for (const item of chattingData) { - if (item.opponent === opponent) { - chats.push(...item.chats); - } - } - return chats; - }; - const opponent = useSelector((state: RootState) => state.opponent.opponent); - const chats = findChats(opponent); - const currentOpponentData = userData.users[opponent]; - - //임시 - const currentUser = 0; - - //const { currentUser, chats, setChats } = useSenderContext(); - //const currentOpponent = currentUser === 0 ? 2 : 0; +const Main = ({ chats, setChats }) => { + const currOpponent = useSelector( + (state: RootState) => state.currOpponent.currOpponent + ); + const currOpponentData = userData.users[currOpponent]; const [value, setValue] = useState(""); const [isEmpty, setIsEmpty] = useState(true); // input란에 텍스트 입력 여부 @@ -89,18 +74,18 @@ const Main = () => { {chats.map((chat, index) => { - const isMine = chat.sender === currentUser; + const isMine = chat.sender !== currOpponent; return ( {chat.timestamp} {isMine || ( )} - {isMine || {currentOpponentData.name}} + {isMine || {currOpponentData.name}} Date: Fri, 3 May 2024 07:44:29 +0900 Subject: [PATCH 30/56] =?UTF-8?q?Chore:=20=EC=BD=94=EB=93=9C=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/ChattingRoom/ChattingRoom.tsx | 2 +- src/pages/ChattingRoom/Header.tsx | 2 +- src/pages/ChattingRoom/Main.tsx | 1 - 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/pages/ChattingRoom/ChattingRoom.tsx b/src/pages/ChattingRoom/ChattingRoom.tsx index d95a2e5..e343459 100644 --- a/src/pages/ChattingRoom/ChattingRoom.tsx +++ b/src/pages/ChattingRoom/ChattingRoom.tsx @@ -34,7 +34,7 @@ const ChattingRoom = () => { return ( <> -
+
); diff --git a/src/pages/ChattingRoom/Header.tsx b/src/pages/ChattingRoom/Header.tsx index ebca5df..b72a4f3 100644 --- a/src/pages/ChattingRoom/Header.tsx +++ b/src/pages/ChattingRoom/Header.tsx @@ -13,7 +13,7 @@ import profileArrow from "../../assets/profileArrow.svg"; import { colors } from "../../style/colors"; import { typography } from "../../style/typography"; -const Header = ({ chats, setChats }) => { +const Header = () => { const dispatch = useDispatch(); const opponent = useSelector((state: RootState) => state.opponent.opponent); const currOpponent = useSelector( diff --git a/src/pages/ChattingRoom/Main.tsx b/src/pages/ChattingRoom/Main.tsx index 6adf272..b5b5c9f 100644 --- a/src/pages/ChattingRoom/Main.tsx +++ b/src/pages/ChattingRoom/Main.tsx @@ -1,6 +1,5 @@ import styled from "styled-components"; import { useState, useEffect, useRef } from "react"; -import { useSenderContext } from "../../assets/SenderContext"; import { useSelector } from "react-redux"; import { RootState } from "../../store"; From e3348d1bf39440506c77f39c3df70dc264afaaa2 Mon Sep 17 00:00:00 2001 From: CSE-pebble Date: Fri, 3 May 2024 07:45:30 +0900 Subject: [PATCH 31/56] =?UTF-8?q?Chore:=20=EC=95=88=20=EC=93=B0=EB=8A=94?= =?UTF-8?q?=20=EC=BD=94=EB=93=9C=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/assets/SenderContext.tsx | 58 ------------------------------------ 1 file changed, 58 deletions(-) delete mode 100644 src/assets/SenderContext.tsx diff --git a/src/assets/SenderContext.tsx b/src/assets/SenderContext.tsx deleted file mode 100644 index 0dab03c..0000000 --- a/src/assets/SenderContext.tsx +++ /dev/null @@ -1,58 +0,0 @@ -import { - createContext, - useContext, - useState, - useEffect, - ReactNode, -} from "react"; - -import chattingData from "../data/chatting.json"; - -interface Chat { - text: string; - sender: number; - timestamp: string; -} - -interface SenderContextType { - currentUser: number; - setCurrentUser: React.Dispatch>; - chats: Chat[]; - setChats: React.Dispatch>; -} - -const SenderContext = createContext(undefined); - -interface SenderProviderProps { - children: ReactNode; -} - -export const SenderProvider: React.FC = ({ children }) => { - const [currentUser, setCurrentUser] = useState(0); // 상대방이 2가 됨 - - const storedChatsJSON = localStorage.getItem("chats"); - const initialData: Chat[] = storedChatsJSON - ? JSON.parse(storedChatsJSON) - : chattingData; - - const [chats, setChats] = useState(initialData); - - useEffect(() => { - localStorage.setItem("chats", JSON.stringify(chats)); - }, [chats]); - - return ( - - {children} - - ); -}; - -export const useSenderContext = (): SenderContextType => { - const context = useContext(SenderContext); - if (!context) - throw new Error("useSenderContext must be used within a SenderProvider"); - return context; -}; From 1e5b8c448649351664854bd97a9f2e8301b75247 Mon Sep 17 00:00:00 2001 From: CSE-pebble Date: Fri, 3 May 2024 07:54:36 +0900 Subject: [PATCH 32/56] =?UTF-8?q?Feat:=20=EC=B1=84=ED=8C=85=20=EC=9E=85?= =?UTF-8?q?=EB=A0=A5=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/ChattingRoom/Main.tsx | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/src/pages/ChattingRoom/Main.tsx b/src/pages/ChattingRoom/Main.tsx index b5b5c9f..877f2c9 100644 --- a/src/pages/ChattingRoom/Main.tsx +++ b/src/pages/ChattingRoom/Main.tsx @@ -15,6 +15,7 @@ import { colors } from "../../style/colors"; import { typography } from "../../style/typography"; const Main = ({ chats, setChats }) => { + const opponent = useSelector((state: RootState) => state.opponent.opponent); const currOpponent = useSelector( (state: RootState) => state.currOpponent.currOpponent ); @@ -50,19 +51,19 @@ const Main = ({ chats, setChats }) => { return formattedTimeStamp; }; - // const handleSubmit = (e: React.FormEvent) => { - // e.preventDefault(); - // if (!isEmpty) { - // const newChat = { - // text: value, - // sender: currentUser, - // timestamp: getDate(), - // }; - // setChats([...chats, newChat]); - // setValue(""); - // setIsEmpty(true); - // } - // }; + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + if (!isEmpty) { + const newChat = { + text: value, + sender: currOpponent === 0 ? opponent : 0, + timestamp: getDate(), + }; + setChats([...chats, newChat]); + setValue(""); + setIsEmpty(true); + } + }; const handleChange = (e: React.ChangeEvent) => { setValue(e.target.value); @@ -100,7 +101,7 @@ const Main = ({ chats, setChats }) => { })} - {}}> + Date: Fri, 3 May 2024 08:12:19 +0900 Subject: [PATCH 33/56] =?UTF-8?q?Chore:=20=EB=9D=BC=EC=9A=B0=ED=8C=85=20?= =?UTF-8?q?=EC=B4=88=EA=B8=B0=20=ED=99=98=EA=B2=BD=20=EC=84=B8=ED=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 1 + src/App.tsx | 8 ++++++-- src/core/router.tsx | 14 ++++++++++++++ yarn.lock | 20 ++++++++++++++++++++ 4 files changed, 41 insertions(+), 2 deletions(-) create mode 100644 src/core/router.tsx diff --git a/package.json b/package.json index 4321779..d93cbbc 100644 --- a/package.json +++ b/package.json @@ -14,6 +14,7 @@ "react": "^18.2.0", "react-dom": "^18.2.0", "react-redux": "^9.1.2", + "react-router-dom": "^6.23.0", "redux": "^5.0.1", "styled-components": "^6.1.8" }, diff --git a/src/App.tsx b/src/App.tsx index 1c47c03..ff06979 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,7 +1,11 @@ -import Messenger from "./components/Messenger"; +import Router from "./core/router"; function App() { - return ; + return ( + <> + + + ); } export default App; diff --git a/src/core/router.tsx b/src/core/router.tsx new file mode 100644 index 0000000..4853676 --- /dev/null +++ b/src/core/router.tsx @@ -0,0 +1,14 @@ +import { BrowserRouter, Route, Routes } from "react-router-dom"; +import Messenger from "../components/Messenger"; + +function Router() { + return ( + + + } /> + + + ); +} + +export default Router; diff --git a/yarn.lock b/yarn.lock index a36c95b..3b4034f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -460,6 +460,11 @@ redux-thunk "^3.1.0" reselect "^5.0.1" +"@remix-run/router@1.16.0": + version "1.16.0" + resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.16.0.tgz#0e10181e5fec1434eb071a9bc4bdaac843f16dcc" + integrity sha512-Quz1KOffeEf/zwkCBM3kBtH4ZoZ+pT3xIXBG4PPW/XFtDP7EGhtTiC2+gpL9GnR7+Qdet5Oa6cYSvwKYg6kN9Q== + "@rollup/rollup-android-arm-eabi@4.13.1": version "4.13.1" resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.13.1.tgz#88ba199f996e0000689130ed69e47df8b0dfbc70" @@ -1543,6 +1548,21 @@ react-refresh@^0.14.0: resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.14.0.tgz#4e02825378a5f227079554d4284889354e5f553e" integrity sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ== +react-router-dom@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-6.23.0.tgz#8b80ad92ad28f4dc38972e92d84b4c208150545a" + integrity sha512-Q9YaSYvubwgbal2c9DJKfx6hTNoBp3iJDsl+Duva/DwxoJH+OTXkxGpql4iUK2sla/8z4RpjAm6EWx1qUDuopQ== + dependencies: + "@remix-run/router" "1.16.0" + react-router "6.23.0" + +react-router@6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/react-router/-/react-router-6.23.0.tgz#2f2d7492c66a6bdf760be4c6bdf9e1d672fa154b" + integrity sha512-wPMZ8S2TuPadH0sF5irFGjkNLIcRvOSaEe7v+JER8508dyJumm6XZB1u5kztlX0RVq6AzRVndzqcUh6sFIauzA== + dependencies: + "@remix-run/router" "1.16.0" + react@^18.2.0: version "18.2.0" resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5" From 05c957ea610fc8361a80e4e79c903805c290ee1e Mon Sep 17 00:00:00 2001 From: CSE-pebble Date: Fri, 3 May 2024 08:17:44 +0900 Subject: [PATCH 34/56] =?UTF-8?q?Chore:=20=ED=8C=8C=EC=9D=BC=20=EA=B5=AC?= =?UTF-8?q?=EC=A1=B0=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/GlobalStyle.tsx | 5 +++-- src/components/Messenger.tsx | 19 ------------------- src/core/router.tsx | 4 ++-- src/pages/ChattingRoom/ChattingRoom.tsx | 9 +++++++-- 4 files changed, 12 insertions(+), 25 deletions(-) delete mode 100644 src/components/Messenger.tsx diff --git a/src/GlobalStyle.tsx b/src/GlobalStyle.tsx index e1b0f73..d07d9ac 100644 --- a/src/GlobalStyle.tsx +++ b/src/GlobalStyle.tsx @@ -137,8 +137,9 @@ table { } body{ - min-height: 100vh; - //임시 + width: 375px; + height: 812px; + margin: auto auto; // 가운데 정렬 background-color: black; } diff --git a/src/components/Messenger.tsx b/src/components/Messenger.tsx deleted file mode 100644 index 3db4826..0000000 --- a/src/components/Messenger.tsx +++ /dev/null @@ -1,19 +0,0 @@ -import styled from "styled-components"; -import ChattingRoom from "../pages/ChattingRoom/ChattingRoom"; - -const Messenger = () => { - return ( - - - - ); -}; - -export default Messenger; - -const Wrapper = styled.div` - width: 375px; - height: 812px; - margin: auto auto; // 가운데 정렬 - background-color: white; -`; diff --git a/src/core/router.tsx b/src/core/router.tsx index 4853676..ae81ae0 100644 --- a/src/core/router.tsx +++ b/src/core/router.tsx @@ -1,11 +1,11 @@ import { BrowserRouter, Route, Routes } from "react-router-dom"; -import Messenger from "../components/Messenger"; +import ChattingRoom from "../pages/ChattingRoom/ChattingRoom"; function Router() { return ( - } /> + } /> ); diff --git a/src/pages/ChattingRoom/ChattingRoom.tsx b/src/pages/ChattingRoom/ChattingRoom.tsx index e343459..c9d8c50 100644 --- a/src/pages/ChattingRoom/ChattingRoom.tsx +++ b/src/pages/ChattingRoom/ChattingRoom.tsx @@ -1,6 +1,7 @@ import { useState, useEffect } from "react"; import { useSelector } from "react-redux"; import { RootState } from "../../store"; +import styled from "styled-components"; import Header from "./Header"; import Main from "./Main"; @@ -33,11 +34,15 @@ const ChattingRoom = () => { }, [chats, opponent]); return ( - <> +
- + ); }; export default ChattingRoom; + +const Wrapper = styled.div` + background-color: white; +`; From e74808f894e422730422527368299d8e77ade20c Mon Sep 17 00:00:00 2001 From: CSE-pebble Date: Fri, 3 May 2024 14:10:17 +0900 Subject: [PATCH 35/56] =?UTF-8?q?Feat:=20=ED=8E=98=EC=9D=B4=EC=A7=80=20?= =?UTF-8?q?=EA=B3=B5=ED=86=B5=20=EC=BB=B4=ED=8F=AC=EB=84=8C=ED=8A=B8=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/GlobalStyle.tsx | 4 +- src/assets/editProfile.svg | 3 + src/assets/footer/chatting_selected.svg | 3 + src/assets/footer/chatting_unSelected.svg | 3 + src/assets/footer/friend_selected.svg | 3 + src/assets/footer/friend_unSelected.svg | 3 + src/assets/footer/you_selected.svg | 9 +++ src/assets/footer/you_unSelected.svg | 10 +++ src/assets/searchBar.svg | 5 ++ src/components/common/Footer.tsx | 88 +++++++++++++++++++++++ src/components/common/PageHeader.tsx | 32 +++++++++ src/components/common/SearchBar.tsx | 17 +++++ src/components/common/Template.tsx | 16 +++++ src/core/router.tsx | 4 +- src/pages/ChattingList/ChattingList.tsx | 17 +++++ src/pages/ChattingList/Header.tsx | 14 ++++ src/pages/ChattingList/Main.tsx | 7 ++ src/pages/ChattingRoom/ChattingRoom.tsx | 9 +-- src/style/typography.tsx | 7 ++ 19 files changed, 244 insertions(+), 10 deletions(-) create mode 100644 src/assets/editProfile.svg create mode 100644 src/assets/footer/chatting_selected.svg create mode 100644 src/assets/footer/chatting_unSelected.svg create mode 100644 src/assets/footer/friend_selected.svg create mode 100644 src/assets/footer/friend_unSelected.svg create mode 100644 src/assets/footer/you_selected.svg create mode 100644 src/assets/footer/you_unSelected.svg create mode 100644 src/assets/searchBar.svg create mode 100644 src/components/common/Footer.tsx create mode 100644 src/components/common/PageHeader.tsx create mode 100644 src/components/common/SearchBar.tsx create mode 100644 src/components/common/Template.tsx create mode 100644 src/pages/ChattingList/ChattingList.tsx create mode 100644 src/pages/ChattingList/Header.tsx create mode 100644 src/pages/ChattingList/Main.tsx diff --git a/src/GlobalStyle.tsx b/src/GlobalStyle.tsx index d07d9ac..d3d7749 100644 --- a/src/GlobalStyle.tsx +++ b/src/GlobalStyle.tsx @@ -137,9 +137,7 @@ table { } body{ - width: 375px; - height: 812px; - margin: auto auto; // 가운데 정렬 + min-height: 100vh; background-color: black; } diff --git a/src/assets/editProfile.svg b/src/assets/editProfile.svg new file mode 100644 index 0000000..10bd3c4 --- /dev/null +++ b/src/assets/editProfile.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/footer/chatting_selected.svg b/src/assets/footer/chatting_selected.svg new file mode 100644 index 0000000..526b895 --- /dev/null +++ b/src/assets/footer/chatting_selected.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/footer/chatting_unSelected.svg b/src/assets/footer/chatting_unSelected.svg new file mode 100644 index 0000000..627c361 --- /dev/null +++ b/src/assets/footer/chatting_unSelected.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/footer/friend_selected.svg b/src/assets/footer/friend_selected.svg new file mode 100644 index 0000000..de8d290 --- /dev/null +++ b/src/assets/footer/friend_selected.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/footer/friend_unSelected.svg b/src/assets/footer/friend_unSelected.svg new file mode 100644 index 0000000..988fae5 --- /dev/null +++ b/src/assets/footer/friend_unSelected.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/footer/you_selected.svg b/src/assets/footer/you_selected.svg new file mode 100644 index 0000000..560cf7d --- /dev/null +++ b/src/assets/footer/you_selected.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/assets/footer/you_unSelected.svg b/src/assets/footer/you_unSelected.svg new file mode 100644 index 0000000..79e2396 --- /dev/null +++ b/src/assets/footer/you_unSelected.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/assets/searchBar.svg b/src/assets/searchBar.svg new file mode 100644 index 0000000..dc2dab8 --- /dev/null +++ b/src/assets/searchBar.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/components/common/Footer.tsx b/src/components/common/Footer.tsx new file mode 100644 index 0000000..a43572b --- /dev/null +++ b/src/components/common/Footer.tsx @@ -0,0 +1,88 @@ +import styled from "styled-components"; +import { useState } from "react"; +import { useNavigate } from "react-router-dom"; +import { colors } from "../../style/colors"; + +import friend_selected from "../../assets/footer/friend_selected.svg"; +import friend_unSelected from "../../assets/footer/friend_unSelected.svg"; +import chatting_unSelected from "../../assets/footer/chatting_unSelected.svg"; +import chatting_selected from "../../assets/footer/chatting_selected.svg"; +import you_selected from "../../assets/footer/you_selected.svg"; +import you_unSelected from "../../assets/footer/you_unSelected.svg"; + +const buttonData = [ + { + id: "friends", + text: "친구", + selectedIcon: friend_selected, + unselectedIcon: friend_unSelected, + }, + { + id: "chats", + text: "채팅", + selectedIcon: chatting_selected, + unselectedIcon: chatting_unSelected, + }, + { + id: "profile", + text: "YOU", + selectedIcon: you_selected, + unselectedIcon: you_unSelected, + }, +]; + +const Footer = () => { + const navigate = useNavigate(); + const [activeButton, setActiveButton] = useState("friends"); + + const handleButtonClick = (id) => { + setActiveButton(id); + navigate(`/${id}`); + }; + + return ( + + {buttonData.map(({ id, text, selectedIcon, unselectedIcon }) => ( + handleButtonClick(id)} + isactive={activeButton === id} + > + + {text} + + ))} + + ); +}; + +export default Footer; + +const Wrapper = styled.div` + display: flex; + width: 23.4375rem; + height: 5rem; + padding: 0.5rem 1.125rem 2rem 1.125rem; + justify-content: center; + align-items: center; + gap: 6rem; + border-top: 0.5px solid ${colors.gray300}; + background: ${colors.gray100}; +`; + +const ButtonWrapper = styled.div` + display: flex; + flex-direction: column; + gap: 0.25rem; + align-items: center; + cursor: pointer; +`; + +const Category = styled.span<{ isactive: boolean }>` + color: ${(props) => (props.isactive ? colors.black : colors.gray300)}; + font-family: Pretendard; + font-size: 0.625rem; + font-style: normal; + font-weight: 400; + line-height: normal; +`; diff --git a/src/components/common/PageHeader.tsx b/src/components/common/PageHeader.tsx new file mode 100644 index 0000000..2c97218 --- /dev/null +++ b/src/components/common/PageHeader.tsx @@ -0,0 +1,32 @@ +import styled from "styled-components"; +import { typography } from "../../style/typography"; +import editprofile from "../../assets/editProfile.svg"; +import SearchBar from "./SearchBar"; + +const PageHeader = ({ title, search, icon }) => { + return ( + + + {title} + {icon && 프로필 편집} + + {search && } + + ); +}; + +export default PageHeader; + +const Wrapper = styled.div` + margin: 0 1rem 0.94rem 1rem; +`; + +const TopWrapper = styled.div` + display: flex; + align-items: center; + justify-content: space-between; +`; + +const Title = styled.h1` + ${typography.title1} +`; diff --git a/src/components/common/SearchBar.tsx b/src/components/common/SearchBar.tsx new file mode 100644 index 0000000..890a0aa --- /dev/null +++ b/src/components/common/SearchBar.tsx @@ -0,0 +1,17 @@ +import styled from "styled-components"; +import searchBar from "../../assets/searchBar.svg"; + +const SearchBar = () => { + return ( + // TODO: 현재는 임의로 이미지로 넣음.. 이후 실제 검색 기능 개발 예정 + + + + ); +}; + +export default SearchBar; + +const Wrapper = styled.div` + margin-top: 0.5rem; +`; diff --git a/src/components/common/Template.tsx b/src/components/common/Template.tsx new file mode 100644 index 0000000..8c39d94 --- /dev/null +++ b/src/components/common/Template.tsx @@ -0,0 +1,16 @@ +import styled from "styled-components"; + +const Template = ({ children }) => { + return {children}; +}; + +export default Template; + +const Wrapper = styled.div` + width: 375px; + height: 812px; + margin: auto auto; // 가운데 정렬 + background-color: white; + display: flex; + flex-direction: column; +`; diff --git a/src/core/router.tsx b/src/core/router.tsx index ae81ae0..e3d891c 100644 --- a/src/core/router.tsx +++ b/src/core/router.tsx @@ -1,11 +1,13 @@ import { BrowserRouter, Route, Routes } from "react-router-dom"; +import ChattingList from "../pages/ChattingList/ChattingList"; import ChattingRoom from "../pages/ChattingRoom/ChattingRoom"; function Router() { return ( - } /> + } /> + } /> ); diff --git a/src/pages/ChattingList/ChattingList.tsx b/src/pages/ChattingList/ChattingList.tsx new file mode 100644 index 0000000..eb98c26 --- /dev/null +++ b/src/pages/ChattingList/ChattingList.tsx @@ -0,0 +1,17 @@ +import styled from "styled-components"; +import Template from "../../components/common/Template"; +import Footer from "../../components/common/Footer"; +import Main from "./Main"; +import Header from "./Header"; + +const ChattingList = () => { + return ( + + ); +}; + +export default ChattingList; diff --git a/src/pages/ChattingList/Header.tsx b/src/pages/ChattingList/Header.tsx new file mode 100644 index 0000000..344628d --- /dev/null +++ b/src/pages/ChattingList/Header.tsx @@ -0,0 +1,14 @@ +import styled from "styled-components"; +import StatusBar from "../../components/common/StatusBar"; +import PageHeader from "../../components/common/PageHeader"; + +const Header = () => { + return ( + <> + + + + ); +}; + +export default Header; diff --git a/src/pages/ChattingList/Main.tsx b/src/pages/ChattingList/Main.tsx new file mode 100644 index 0000000..8329536 --- /dev/null +++ b/src/pages/ChattingList/Main.tsx @@ -0,0 +1,7 @@ +import React from "react"; + +const Main = () => { + return
; +}; + +export default Main; diff --git a/src/pages/ChattingRoom/ChattingRoom.tsx b/src/pages/ChattingRoom/ChattingRoom.tsx index c9d8c50..ab4e7a2 100644 --- a/src/pages/ChattingRoom/ChattingRoom.tsx +++ b/src/pages/ChattingRoom/ChattingRoom.tsx @@ -7,6 +7,7 @@ import Header from "./Header"; import Main from "./Main"; import chattingData from "../../data/chatting.json"; +import Template from "../../components/common/Template"; const ChattingRoom = () => { const findChats = (opponent: number) => { @@ -34,15 +35,11 @@ const ChattingRoom = () => { }, [chats, opponent]); return ( - + ); }; export default ChattingRoom; - -const Wrapper = styled.div` - background-color: white; -`; diff --git a/src/style/typography.tsx b/src/style/typography.tsx index f18e784..f325578 100644 --- a/src/style/typography.tsx +++ b/src/style/typography.tsx @@ -1,4 +1,11 @@ export const typography = { + title1: ` + font-size: 1.75rem; + font-style: normal; + font-weight: 700; + line-height: 2.5625rem; + letter-spacing: 0.02338rem; + `, body2: ` font-size: 0.9375rem; font-style: normal; From bfb5e27694a511ed76306e3ff772c1e4e1b80986 Mon Sep 17 00:00:00 2001 From: CSE-pebble Date: Fri, 3 May 2024 16:38:21 +0900 Subject: [PATCH 36/56] =?UTF-8?q?Feat:=20=EC=B1=84=ED=8C=85=20=EB=AA=A9?= =?UTF-8?q?=EB=A1=9D=20=EB=8D=B0=EC=9D=B4=ED=84=B0=20=EB=B6=88=EB=9F=AC?= =?UTF-8?q?=EC=98=A4=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/assets/arrow.svg | 3 + src/components/common/Footer.tsx | 1 + src/pages/ChattingList/ChattingItem.tsx | 84 +++++++++++++++++++++++++ src/pages/ChattingList/Main.tsx | 18 +++++- src/pages/ChattingRoom/ChattingRoom.tsx | 32 +--------- src/pages/ChattingRoom/Main.tsx | 26 +++++++- src/style/typography.tsx | 6 ++ 7 files changed, 136 insertions(+), 34 deletions(-) create mode 100644 src/assets/arrow.svg create mode 100644 src/pages/ChattingList/ChattingItem.tsx diff --git a/src/assets/arrow.svg b/src/assets/arrow.svg new file mode 100644 index 0000000..90d73ed --- /dev/null +++ b/src/assets/arrow.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/components/common/Footer.tsx b/src/components/common/Footer.tsx index a43572b..b7780d5 100644 --- a/src/components/common/Footer.tsx +++ b/src/components/common/Footer.tsx @@ -68,6 +68,7 @@ const Wrapper = styled.div` gap: 6rem; border-top: 0.5px solid ${colors.gray300}; background: ${colors.gray100}; + margin-top: auto; `; const ButtonWrapper = styled.div` diff --git a/src/pages/ChattingList/ChattingItem.tsx b/src/pages/ChattingList/ChattingItem.tsx new file mode 100644 index 0000000..ea38018 --- /dev/null +++ b/src/pages/ChattingList/ChattingItem.tsx @@ -0,0 +1,84 @@ +import styled from "styled-components"; +import userData from "../../data/user.json"; +import { typography } from "../../style/typography"; +import { colors } from "../../style/colors"; +import arrow from "../../assets/arrow.svg"; + +const ChattingItem = ({ id, chatArray }) => { + console.log(chatArray); + return ( + + + + + {userData.users[id].name} + + + + + + {chatArray[chatArray.length - 1].text} + + + ); +}; + +export default ChattingItem; + +const Wrapper = styled.div` + width: 23.4375rem; + height: 5.3125rem; + display: grid; + grid-template-columns: 2.8125rem auto; + gap: 0.75rem; + padding: 0.62rem 0.75rem 0.75rem 1.25rem; + align-items: center; + border-bottom: 0.5px solid ${colors.gray300}; +`; + +const Profile = styled.img` + width: 2.8125rem; + height: 2.8125rem; +`; + +const ContentWrapper = styled.div` + display: flex; + flex-direction: column; + gap: 0.25rem; +`; + +const RoomInfoWrapper = styled.div` + display: flex; + justify-content: space-between; +`; + +const RoomInfoLeft = styled.div` + ${typography.title2} +`; + +const RoomInfoRight = styled.div` + display: flex; + align-items: center; + gap: 0.31rem; +`; + +const Time = styled.span` + ${typography.body2}; + color: ${colors.gray400}; +`; + +const Icon = styled.img` + width: 1rem; + height: 1rem; +`; + +const Chat = styled.span` + ${typography.body2}; + color: ${colors.gray300}; + max-width: 17.875rem; + max-height: 2.4375rem; + overflow: hidden; + text-overflow: ellipsis; +`; diff --git a/src/pages/ChattingList/Main.tsx b/src/pages/ChattingList/Main.tsx index 8329536..cfff51c 100644 --- a/src/pages/ChattingList/Main.tsx +++ b/src/pages/ChattingList/Main.tsx @@ -1,7 +1,21 @@ -import React from "react"; +import styled from "styled-components"; +import ChattingItem from "./ChattingItem"; const Main = () => { - return
; + const keys = Object.keys(localStorage); + + return ( + + {keys.map((key) => { + const chatArray = JSON.parse(localStorage.getItem(key)); + return ; + })} + + ); }; export default Main; + +const Wrapper = styled.div` + margin-top: 0.25rem; +`; diff --git a/src/pages/ChattingRoom/ChattingRoom.tsx b/src/pages/ChattingRoom/ChattingRoom.tsx index ab4e7a2..24bc4f9 100644 --- a/src/pages/ChattingRoom/ChattingRoom.tsx +++ b/src/pages/ChattingRoom/ChattingRoom.tsx @@ -1,43 +1,13 @@ -import { useState, useEffect } from "react"; -import { useSelector } from "react-redux"; -import { RootState } from "../../store"; -import styled from "styled-components"; - import Header from "./Header"; import Main from "./Main"; -import chattingData from "../../data/chatting.json"; import Template from "../../components/common/Template"; const ChattingRoom = () => { - const findChats = (opponent: number) => { - const chats = []; - for (const item of chattingData) { - if (item.opponent === opponent) { - chats.push(...item.chats); - } - } - console.log(chats); - return chats; - }; - - const opponent = useSelector((state: RootState) => state.opponent.opponent); - - const storedChatsJSON = localStorage.getItem(opponent.toString()); - const initialData = storedChatsJSON - ? JSON.parse(storedChatsJSON) - : findChats(opponent); - - const [chats, setChats] = useState(initialData); - - useEffect(() => { - localStorage.setItem(opponent.toString(), JSON.stringify(chats)); - }, [chats, opponent]); - return ( ); }; diff --git a/src/pages/ChattingRoom/Main.tsx b/src/pages/ChattingRoom/Main.tsx index 877f2c9..b53f574 100644 --- a/src/pages/ChattingRoom/Main.tsx +++ b/src/pages/ChattingRoom/Main.tsx @@ -10,12 +10,36 @@ import voice from "../../assets/voice.svg"; import send from "../../assets/send.svg"; // data import userData from "../../data/user.json"; +import chattingData from "../../data/chatting.json"; import { colors } from "../../style/colors"; import { typography } from "../../style/typography"; -const Main = ({ chats, setChats }) => { +const Main = () => { + const findChats = (opponent: number) => { + const chats = []; + for (const item of chattingData) { + if (item.opponent === opponent) { + chats.push(...item.chats); + } + } + console.log(chats); + return chats; + }; + const opponent = useSelector((state: RootState) => state.opponent.opponent); + + const storedChatsJSON = localStorage.getItem(opponent.toString()); + const initialData = storedChatsJSON + ? JSON.parse(storedChatsJSON) + : findChats(opponent); + + const [chats, setChats] = useState(initialData); + + useEffect(() => { + localStorage.setItem(opponent.toString(), JSON.stringify(chats)); + }, [chats, opponent]); + const currOpponent = useSelector( (state: RootState) => state.currOpponent.currOpponent ); diff --git a/src/style/typography.tsx b/src/style/typography.tsx index f325578..954d343 100644 --- a/src/style/typography.tsx +++ b/src/style/typography.tsx @@ -6,6 +6,12 @@ export const typography = { line-height: 2.5625rem; letter-spacing: 0.02338rem; `, + title2: ` + font-size: 1.0625rem; + font-style: normal; + font-weight: 600; + line-height: normal; + `, body2: ` font-size: 0.9375rem; font-style: normal; From ef8cdeb5e12b48f240c723d4b714e9c71d5a3437 Mon Sep 17 00:00:00 2001 From: CSE-pebble Date: Fri, 3 May 2024 18:38:42 +0900 Subject: [PATCH 37/56] =?UTF-8?q?Feat:=20=EC=B1=84=ED=8C=85=20=EB=8D=B0?= =?UTF-8?q?=EC=9D=B4=ED=84=B0=20Redux=20=EC=A0=84=EC=97=AD=20=EC=83=81?= =?UTF-8?q?=ED=83=9C=EB=A1=9C=20=EA=B4=80=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/ChattingRoom/Main.tsx | 34 +++++-------------------- src/store/index.tsx | 45 ++++++++++++++++++++++++++++++++- 2 files changed, 51 insertions(+), 28 deletions(-) diff --git a/src/pages/ChattingRoom/Main.tsx b/src/pages/ChattingRoom/Main.tsx index b53f574..6165a0c 100644 --- a/src/pages/ChattingRoom/Main.tsx +++ b/src/pages/ChattingRoom/Main.tsx @@ -1,7 +1,8 @@ import styled from "styled-components"; import { useState, useEffect, useRef } from "react"; -import { useSelector } from "react-redux"; +import { useSelector, useDispatch } from "react-redux"; import { RootState } from "../../store"; +import { chatsActions } from "../../store"; // image import smallAdd from "../../assets/smallAdd.svg"; @@ -10,40 +11,19 @@ import voice from "../../assets/voice.svg"; import send from "../../assets/send.svg"; // data import userData from "../../data/user.json"; -import chattingData from "../../data/chatting.json"; import { colors } from "../../style/colors"; import { typography } from "../../style/typography"; const Main = () => { - const findChats = (opponent: number) => { - const chats = []; - for (const item of chattingData) { - if (item.opponent === opponent) { - chats.push(...item.chats); - } - } - console.log(chats); - return chats; - }; - + const dispatch = useDispatch(); + const chats = useSelector((state: RootState) => state.chats); const opponent = useSelector((state: RootState) => state.opponent.opponent); - - const storedChatsJSON = localStorage.getItem(opponent.toString()); - const initialData = storedChatsJSON - ? JSON.parse(storedChatsJSON) - : findChats(opponent); - - const [chats, setChats] = useState(initialData); - - useEffect(() => { - localStorage.setItem(opponent.toString(), JSON.stringify(chats)); - }, [chats, opponent]); - const currOpponent = useSelector( (state: RootState) => state.currOpponent.currOpponent ); const currOpponentData = userData.users[currOpponent]; + const currChat = chats[opponent - 1].chats; const [value, setValue] = useState(""); const [isEmpty, setIsEmpty] = useState(true); // input란에 텍스트 입력 여부 @@ -83,7 +63,7 @@ const Main = () => { sender: currOpponent === 0 ? opponent : 0, timestamp: getDate(), }; - setChats([...chats, newChat]); + dispatch(chatsActions.addChat({ newChat, opponent })); setValue(""); setIsEmpty(true); } @@ -97,7 +77,7 @@ const Main = () => { return ( - {chats.map((chat, index) => { + {currChat.map((chat, index) => { const isMine = chat.sender !== currOpponent; return ( diff --git a/src/store/index.tsx b/src/store/index.tsx index fa48fc2..73b866a 100644 --- a/src/store/index.tsx +++ b/src/store/index.tsx @@ -1,11 +1,12 @@ import { createSlice, configureStore } from "@reduxjs/toolkit"; +import chattingData from "../data/chatting.json"; interface OpponentState { opponent: number; } // 누구와의 채팅방인지 -> 한번 채팅방 선택하면 고정 -const initialOpponent: OpponentState = { opponent: 2 }; +const initialOpponent: OpponentState = { opponent: 4 }; const opponentSlice = createSlice({ name: "opponent", initialState: initialOpponent, @@ -28,15 +29,57 @@ const currOpponentSlice = createSlice({ }, }); +// 채팅데이터 +const isLocalStorageKeyExist = (key: string) => { + return localStorage.getItem(key) !== null; +}; + +const setInitialChatsData = () => { + const initialChats = []; + for (const chat of chattingData) { + const key = chat.opponent.toString(); + if (!isLocalStorageKeyExist(key)) { + // 존재하지 않으면 + const chats = chat.chats; + localStorage.setItem(key, JSON.stringify(chats)); + } + initialChats.push({ + opponent: key, + chats: JSON.parse(localStorage.getItem(key) || "[]"), // localStorage에서 가져와 파싱 + }); + } + return initialChats; // initialChats 배열 반환 +}; + +const chatsSlice = createSlice({ + name: "chats", + initialState: setInitialChatsData(), + reducers: { + addChat(state, action) { + state[action.payload.opponent - 1].chats = [ + ...state[action.payload.opponent - 1].chats, + action.payload.newChat, + ]; + localStorage.setItem( + action.payload.opponent.toString(), + JSON.stringify(state[action.payload.opponent - 1].chats) + ); + }, + }, +}); + const store = configureStore({ reducer: { opponent: opponentSlice.reducer, currOpponent: currOpponentSlice.reducer, + chats: chatsSlice.reducer, }, }); export const opponentActions = opponentSlice.actions; export const currOpponentActions = currOpponentSlice.actions; +export const chatsActions = chatsSlice.actions; + export default store; export type RootState = ReturnType; From e0609e807662a343ea0956c0afa9da362efe0915 Mon Sep 17 00:00:00 2001 From: CSE-pebble Date: Fri, 3 May 2024 20:13:52 +0900 Subject: [PATCH 38/56] =?UTF-8?q?[Ing]=20=EC=B1=84=ED=8C=85=EB=AA=A9?= =?UTF-8?q?=EB=A1=9D=20->=20=EC=B1=84=ED=8C=85=EB=B0=A9=20=EB=8D=B0?= =?UTF-8?q?=EC=9D=B4=ED=84=B0=20=EC=A0=84=EB=8B=AC=EC=9D=B4=20=EC=9D=B4?= =?UTF-8?q?=EC=83=81=ED=95=98=EB=8B=A4..?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/ChattingList/ChattingItem.tsx | 16 +++++++++++++--- src/pages/ChattingList/ChattingList.tsx | 1 - src/pages/ChattingRoom/Header.tsx | 1 + src/pages/ChattingRoom/Main.tsx | 4 +++- src/store/index.tsx | 4 ++-- 5 files changed, 19 insertions(+), 7 deletions(-) diff --git a/src/pages/ChattingList/ChattingItem.tsx b/src/pages/ChattingList/ChattingItem.tsx index ea38018..6384360 100644 --- a/src/pages/ChattingList/ChattingItem.tsx +++ b/src/pages/ChattingList/ChattingItem.tsx @@ -3,11 +3,20 @@ import userData from "../../data/user.json"; import { typography } from "../../style/typography"; import { colors } from "../../style/colors"; import arrow from "../../assets/arrow.svg"; +import { opponentActions, currOpponentActions } from "../../store"; +import { useDispatch, useSelector } from "react-redux"; +import { useNavigate } from "react-router-dom"; const ChattingItem = ({ id, chatArray }) => { - console.log(chatArray); + const dispatch = useDispatch(); + const navigate = useNavigate(); + const opponent = useSelector((state) => state.opponent.opponent); + const currOpponent = useSelector((state) => state.currOpponent.currOpponent); + + const handleChattingItemClick = () => {}; + return ( - + @@ -27,7 +36,7 @@ const ChattingItem = ({ id, chatArray }) => { export default ChattingItem; -const Wrapper = styled.div` +const Wrapper = styled.button` width: 23.4375rem; height: 5.3125rem; display: grid; @@ -81,4 +90,5 @@ const Chat = styled.span` max-height: 2.4375rem; overflow: hidden; text-overflow: ellipsis; + align-self: start; `; diff --git a/src/pages/ChattingList/ChattingList.tsx b/src/pages/ChattingList/ChattingList.tsx index eb98c26..5e40c7b 100644 --- a/src/pages/ChattingList/ChattingList.tsx +++ b/src/pages/ChattingList/ChattingList.tsx @@ -1,4 +1,3 @@ -import styled from "styled-components"; import Template from "../../components/common/Template"; import Footer from "../../components/common/Footer"; import Main from "./Main"; diff --git a/src/pages/ChattingRoom/Header.tsx b/src/pages/ChattingRoom/Header.tsx index b72a4f3..9c14aa1 100644 --- a/src/pages/ChattingRoom/Header.tsx +++ b/src/pages/ChattingRoom/Header.tsx @@ -26,6 +26,7 @@ const Header = () => { dispatch(currOpponentActions.setCurrOpponent(index)); }; + console.log(`${opponent}, ${currOpponent}`); return ( diff --git a/src/pages/ChattingRoom/Main.tsx b/src/pages/ChattingRoom/Main.tsx index 6165a0c..318b24b 100644 --- a/src/pages/ChattingRoom/Main.tsx +++ b/src/pages/ChattingRoom/Main.tsx @@ -1,7 +1,7 @@ import styled from "styled-components"; import { useState, useEffect, useRef } from "react"; import { useSelector, useDispatch } from "react-redux"; -import { RootState } from "../../store"; +import { RootState, currOpponentActions, opponentActions } from "../../store"; import { chatsActions } from "../../store"; // image @@ -28,6 +28,8 @@ const Main = () => { const [value, setValue] = useState(""); const [isEmpty, setIsEmpty] = useState(true); // input란에 텍스트 입력 여부 + console.log(`chattingRoom 컴포넌트 가져온 후 ${opponent}, ${currOpponent}`); + // 스크롤 이동 const chatWrapperRef = useRef(null); useEffect(() => { diff --git a/src/store/index.tsx b/src/store/index.tsx index 73b866a..ca54513 100644 --- a/src/store/index.tsx +++ b/src/store/index.tsx @@ -6,7 +6,7 @@ interface OpponentState { } // 누구와의 채팅방인지 -> 한번 채팅방 선택하면 고정 -const initialOpponent: OpponentState = { opponent: 4 }; +const initialOpponent: OpponentState = { opponent: 2 }; const opponentSlice = createSlice({ name: "opponent", initialState: initialOpponent, @@ -18,7 +18,7 @@ const opponentSlice = createSlice({ }); // 채팅방 내에서 토글로 인해 상대방이 변함 -const initialCurrOpponent = { currOpponent: initialOpponent.opponent }; +const initialCurrOpponent = { currOpponent: 2 }; const currOpponentSlice = createSlice({ name: "currOpponent", initialState: initialCurrOpponent, From 3ac52295d08edfb913daea0a2ee7625ef6733da1 Mon Sep 17 00:00:00 2001 From: CSE-pebble Date: Fri, 3 May 2024 20:44:01 +0900 Subject: [PATCH 39/56] =?UTF-8?q?Feat:=20=EC=B9=9C=EA=B5=AC<->=EC=B1=84?= =?UTF-8?q?=ED=8C=85=20=EB=9D=BC=EC=9A=B0=ED=8C=85=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/assets/friendsProfile.svg | 23 ++++++++++++++ src/assets/temp/table1.svg | 19 ++++++++++++ src/assets/temp/table2.svg | 17 +++++++++++ src/assets/temp/table3.svg | 19 ++++++++++++ src/assets/temp/table4.svg | 19 ++++++++++++ src/components/common/Footer.tsx | 26 +++++++++++----- src/core/router.tsx | 2 ++ src/pages/FriendsList/FriendsList.tsx | 16 ++++++++++ src/pages/FriendsList/Header.tsx | 13 ++++++++ src/pages/FriendsList/Main.tsx | 44 +++++++++++++++++++++++++++ 10 files changed, 191 insertions(+), 7 deletions(-) create mode 100644 src/assets/friendsProfile.svg create mode 100644 src/assets/temp/table1.svg create mode 100644 src/assets/temp/table2.svg create mode 100644 src/assets/temp/table3.svg create mode 100644 src/assets/temp/table4.svg create mode 100644 src/pages/FriendsList/FriendsList.tsx create mode 100644 src/pages/FriendsList/Header.tsx create mode 100644 src/pages/FriendsList/Main.tsx diff --git a/src/assets/friendsProfile.svg b/src/assets/friendsProfile.svg new file mode 100644 index 0000000..414d75f --- /dev/null +++ b/src/assets/friendsProfile.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/temp/table1.svg b/src/assets/temp/table1.svg new file mode 100644 index 0000000..ebd704b --- /dev/null +++ b/src/assets/temp/table1.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/temp/table2.svg b/src/assets/temp/table2.svg new file mode 100644 index 0000000..f6e3aeb --- /dev/null +++ b/src/assets/temp/table2.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/src/assets/temp/table3.svg b/src/assets/temp/table3.svg new file mode 100644 index 0000000..8ac7708 --- /dev/null +++ b/src/assets/temp/table3.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/temp/table4.svg b/src/assets/temp/table4.svg new file mode 100644 index 0000000..4c29ab2 --- /dev/null +++ b/src/assets/temp/table4.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/src/components/common/Footer.tsx b/src/components/common/Footer.tsx index b7780d5..ee11d8e 100644 --- a/src/components/common/Footer.tsx +++ b/src/components/common/Footer.tsx @@ -1,6 +1,6 @@ import styled from "styled-components"; -import { useState } from "react"; -import { useNavigate } from "react-router-dom"; +import { useState, useEffect } from "react"; +import { useLocation, useNavigate } from "react-router-dom"; import { colors } from "../../style/colors"; import friend_selected from "../../assets/footer/friend_selected.svg"; @@ -12,7 +12,7 @@ import you_unSelected from "../../assets/footer/you_unSelected.svg"; const buttonData = [ { - id: "friends", + id: "", text: "친구", selectedIcon: friend_selected, unselectedIcon: friend_unSelected, @@ -33,11 +33,20 @@ const buttonData = [ const Footer = () => { const navigate = useNavigate(); - const [activeButton, setActiveButton] = useState("friends"); + const location = useLocation(); + const [activeButton, setActiveButton] = useState(""); + + useEffect(() => { + // 현재 URL에서 path 부분만 추출하여 activeButton을 설정 + const path = location.pathname.substring(1); + setActiveButton(path); + }, [location.pathname]); const handleButtonClick = (id) => { - setActiveButton(id); - navigate(`/${id}`); + if (activeButton !== id) { + setActiveButton(id); + navigate(`/${id}`); + } }; return ( @@ -71,12 +80,15 @@ const Wrapper = styled.div` margin-top: auto; `; -const ButtonWrapper = styled.div` +const ButtonWrapper = styled.div<{ isactive: boolean }>` display: flex; flex-direction: column; gap: 0.25rem; align-items: center; cursor: pointer; + + // 선택된 상태일 때 스타일 적용 + color: ${(props) => (props.isactive ? colors.black : colors.gray300)}; `; const Category = styled.span<{ isactive: boolean }>` diff --git a/src/core/router.tsx b/src/core/router.tsx index e3d891c..7808de6 100644 --- a/src/core/router.tsx +++ b/src/core/router.tsx @@ -1,11 +1,13 @@ import { BrowserRouter, Route, Routes } from "react-router-dom"; import ChattingList from "../pages/ChattingList/ChattingList"; import ChattingRoom from "../pages/ChattingRoom/ChattingRoom"; +import FriendsList from "../pages/FriendsList/FriendsList"; function Router() { return ( + } /> } /> } /> diff --git a/src/pages/FriendsList/FriendsList.tsx b/src/pages/FriendsList/FriendsList.tsx new file mode 100644 index 0000000..c2f8a7a --- /dev/null +++ b/src/pages/FriendsList/FriendsList.tsx @@ -0,0 +1,16 @@ +import Footer from "../../components/common/Footer"; +import Template from "../../components/common/Template"; +import Header from "./Header"; +import Main from "./Main"; + +const FriendsList = () => { + return ( + + ); +}; + +export default FriendsList; diff --git a/src/pages/FriendsList/Header.tsx b/src/pages/FriendsList/Header.tsx new file mode 100644 index 0000000..ba7ea8a --- /dev/null +++ b/src/pages/FriendsList/Header.tsx @@ -0,0 +1,13 @@ +import StatusBar from "../../components/common/StatusBar"; +import PageHeader from "../../components/common/PageHeader"; + +const Header = () => { + return ( + <> + + + + ); +}; + +export default Header; diff --git a/src/pages/FriendsList/Main.tsx b/src/pages/FriendsList/Main.tsx new file mode 100644 index 0000000..39fde76 --- /dev/null +++ b/src/pages/FriendsList/Main.tsx @@ -0,0 +1,44 @@ +import styled from "styled-components"; +import friendsProfile from "../../assets/friendsProfile.svg"; +import table1 from "../../assets/temp/table1.svg"; +import table2 from "../../assets/temp/table2.svg"; +import table3 from "../../assets/temp/table3.svg"; +import table4 from "../../assets/temp/table4.svg"; + +const Main = () => { + return ( + + + + + + + + + + ); +}; + +export default Main; + +const Wrapper = styled.div` + display: flex; + flex-direction: column; + padding: 0 1rem; + overflow-y: auto; + scrollbar-width: none; + -ms-overflow-style: none; + &::-webkit-scrollbar { + display: none; + } +`; + +const FriendsProfile = styled.img` + margin-bottom: 1.5rem; +`; + +const ServerWrapper = styled.div` + display: flex; + flex-direction: column; + gap: 1rem; +`; From b57597332daf26fcc574af5032e65aea7490d362 Mon Sep 17 00:00:00 2001 From: CSE-pebble Date: Fri, 3 May 2024 23:01:56 +0900 Subject: [PATCH 40/56] =?UTF-8?q?Feat:=20=ED=94=84=EB=A1=9C=ED=95=84=20?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=A7=80=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/assets/behance.svg | 13 +++++ src/assets/github.svg | 10 ++++ src/assets/instagram.svg | 17 ++++++ src/assets/xmark.svg | 4 ++ src/core/router.tsx | 2 + src/data/user.json | 3 +- src/pages/MyProfile/Header.tsx | 74 ++++++++++++++++++++++++ src/pages/MyProfile/LinkItem.tsx | 43 ++++++++++++++ src/pages/MyProfile/Main.tsx | 96 +++++++++++++++++++++++++++++++ src/pages/MyProfile/MyProfile.tsx | 16 ++++++ 10 files changed, 277 insertions(+), 1 deletion(-) create mode 100644 src/assets/behance.svg create mode 100644 src/assets/github.svg create mode 100644 src/assets/instagram.svg create mode 100644 src/assets/xmark.svg create mode 100644 src/pages/MyProfile/Header.tsx create mode 100644 src/pages/MyProfile/LinkItem.tsx create mode 100644 src/pages/MyProfile/Main.tsx create mode 100644 src/pages/MyProfile/MyProfile.tsx diff --git a/src/assets/behance.svg b/src/assets/behance.svg new file mode 100644 index 0000000..9f97184 --- /dev/null +++ b/src/assets/behance.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/assets/github.svg b/src/assets/github.svg new file mode 100644 index 0000000..ed2748f --- /dev/null +++ b/src/assets/github.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/assets/instagram.svg b/src/assets/instagram.svg new file mode 100644 index 0000000..6a70ad6 --- /dev/null +++ b/src/assets/instagram.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/src/assets/xmark.svg b/src/assets/xmark.svg new file mode 100644 index 0000000..2eacd43 --- /dev/null +++ b/src/assets/xmark.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/core/router.tsx b/src/core/router.tsx index 7808de6..4893e0c 100644 --- a/src/core/router.tsx +++ b/src/core/router.tsx @@ -2,6 +2,7 @@ import { BrowserRouter, Route, Routes } from "react-router-dom"; import ChattingList from "../pages/ChattingList/ChattingList"; import ChattingRoom from "../pages/ChattingRoom/ChattingRoom"; import FriendsList from "../pages/FriendsList/FriendsList"; +import MyProfile from "../pages/MyProfile/MyProfile"; function Router() { return ( @@ -10,6 +11,7 @@ function Router() { } /> } /> } /> + } /> ); diff --git a/src/data/user.json b/src/data/user.json index 837f4bb..4948fa0 100644 --- a/src/data/user.json +++ b/src/data/user.json @@ -3,7 +3,8 @@ { "id": 0, "name": "지원", - "profileImg": "mine.svg" + "profileImg": "mine.svg", + "loginId": "jioni" }, { "id": 1, diff --git a/src/pages/MyProfile/Header.tsx b/src/pages/MyProfile/Header.tsx new file mode 100644 index 0000000..78134f1 --- /dev/null +++ b/src/pages/MyProfile/Header.tsx @@ -0,0 +1,74 @@ +import PageHeader from "../../components/common/PageHeader"; +import StatusBar from "../../components/common/StatusBar"; +import editProfile from "../../assets/editProfile.svg"; +import styled from "styled-components"; +import { typography } from "../../style/typography"; +import { colors } from "../../style/colors"; + +import userData from "../../data/user.json"; + +const Header = () => { + const me = userData.users[0]; + return ( + + + + + + + + + {me.name} + {me.loginId} + + + + ); +}; + +export default Header; + +const Wrapper = styled.div` + height: 23.5rem; + flex-shrink: 0; + background: url("data:image/svg+xml;utf8,") + no-repeat; +`; + +const ProfileWrapper = styled.div` + display: flex; + flex-direction: column; + align-items: center; +`; + +const BackCircle = styled.div` + position: relative; + margin-top: 5rem; + background-color: white; + width: 12.3rem; + height: 12.3rem; + border-radius: 50%; +`; + +const CircleImage = styled.img` + position: absolute; + width: 11.25rem; + height: 11.25rem; + flex-shrink: 0; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); +`; + +const NameWrapper = styled.div` + display: flex; + flex-direction: column; + align-items: center; +`; +const Nickname = styled.span` + ${typography.title1} +`; +const LoginId = styled.span` + ${typography.body2}; + color: ${colors.gray400}; +`; diff --git a/src/pages/MyProfile/LinkItem.tsx b/src/pages/MyProfile/LinkItem.tsx new file mode 100644 index 0000000..b6e2865 --- /dev/null +++ b/src/pages/MyProfile/LinkItem.tsx @@ -0,0 +1,43 @@ +import styled from "styled-components"; +import { colors } from "../../style/colors"; + +const LinkItem = ({ icon, userId, link }) => { + const handleClick = () => { + window.location.href = link; + }; + return ( + + + {userId} + 바로 가기 + + ); +}; + +export default LinkItem; + +const Wrapper = styled.div` + display: grid; + grid-template-columns: auto auto 1fr; + padding: 0.75rem 2rem 0.75rem 0rem; + align-items: center; + gap: 0.81rem; + justify-content: start; + width: 23.4375rem; +`; + +const UserId = styled.span` + color: ${colors.gray300}; + font-family: "Spoqa Han Sans Neo"; +`; + +const LinkBtn = styled.button` + display: flex; + padding: 0.25rem 0.4375rem; + align-items: center; + color: ${colors.gray300}; + border-radius: 1.25rem; + background: ${colors.gray200}; + width: 4rem; + margin-left: auto; +`; diff --git a/src/pages/MyProfile/Main.tsx b/src/pages/MyProfile/Main.tsx new file mode 100644 index 0000000..0e6faf7 --- /dev/null +++ b/src/pages/MyProfile/Main.tsx @@ -0,0 +1,96 @@ +import styled from "styled-components"; +import { colors } from "../../style/colors"; +import { typography } from "../../style/typography"; +import xmark from "../../assets/xmark.svg"; +import LinkItem from "./LinkItem"; +import instagram from "../../assets/instagram.svg"; +import github from "../../assets/github.svg"; +import behance from "../../assets/behance.svg"; + +const linkData = [ + { + id: "instagram", + icon: instagram, + userId: "@iam_mang9", + link: "https://www.instagram.com/daisy.won/", + }, + { + id: "github", + icon: github, + userId: "mang9@gmail.com", + link: "https://github.com/jiwon010330", + }, + { + id: "behance", + icon: behance, + userId: "mang9@gmail.com", + link: "https://www.behance.net", + }, +]; + +const Main = () => { + return ( + + +
+ 안녕하세요! + 삭제까지 22시간 +
+ +
+ + Links + + {linkData.map((el) => ( + + ))} + + +
+ ); +}; + +export default Main; + +const Wrapper = styled.div` + display: flex; + flex-direction: column; + align-items: center; + gap: 1.25rem; +`; + +const IntroWrapper = styled.div` + margin-top: 5.56rem; + display: flex; + width: 22rem; + padding: 0.75rem; + justify-content: space-between; + align-items: flex-start; + background-color: ${colors.gray100}; + border-radius: 0.75rem; +`; + +const Message = styled.h3` + ${typography.body2} +`; +const TimeLeft = styled.span` + ${typography.caption}; + color: ${colors.gray300}; +`; + +const LinkWrapper = styled.div` + display: flex; + flex-direction: column; + align-self: flex-start; + padding: 0 1rem; +`; + +const Title = styled.h3` + padding: 0.75rem 0; + ${typography.title2} +`; + +const LinkBox = styled.div` + display: flex; + flex-direction: column; +`; diff --git a/src/pages/MyProfile/MyProfile.tsx b/src/pages/MyProfile/MyProfile.tsx new file mode 100644 index 0000000..9f83380 --- /dev/null +++ b/src/pages/MyProfile/MyProfile.tsx @@ -0,0 +1,16 @@ +import Footer from "../../components/common/Footer"; +import Template from "../../components/common/Template"; +import Header from "./Header"; +import Main from "./Main"; + +const MyProfile = () => { + return ( + + ); +}; + +export default MyProfile; From 1bd02f8ebf0b99898a9e1557c3cb469f5217f613 Mon Sep 17 00:00:00 2001 From: CSE-pebble Date: Fri, 3 May 2024 23:03:05 +0900 Subject: [PATCH 41/56] =?UTF-8?q?Feat:=20=ED=94=84=EB=A1=9C=ED=95=84=20?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=A7=80=20Y=EC=B6=95=20Overflow=20=EC=8A=A4?= =?UTF-8?q?=ED=81=AC=EB=A1=A4=EB=B0=94=20=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/MyProfile/Main.tsx | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/pages/MyProfile/Main.tsx b/src/pages/MyProfile/Main.tsx index 0e6faf7..c0cc9ed 100644 --- a/src/pages/MyProfile/Main.tsx +++ b/src/pages/MyProfile/Main.tsx @@ -57,6 +57,12 @@ const Wrapper = styled.div` flex-direction: column; align-items: center; gap: 1.25rem; + overflow-y: auto; + scrollbar-width: none; + -ms-overflow-style: none; + &::-webkit-scrollbar { + display: none; + } `; const IntroWrapper = styled.div` From fecff6100a40542750936cde61aa1dda6421e2f6 Mon Sep 17 00:00:00 2001 From: CSE-pebble Date: Fri, 3 May 2024 23:23:42 +0900 Subject: [PATCH 42/56] =?UTF-8?q?Feat:=20=EC=B1=84=ED=8C=85=EB=B0=A9=20?= =?UTF-8?q?=EB=92=A4=EB=A1=9C=20=EA=B0=80=EA=B8=B0=20=EA=B8=B0=EB=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/ChattingList/ChattingItem.tsx | 11 +++++++---- src/pages/ChattingRoom/ChattingRoom.tsx | 1 - src/pages/ChattingRoom/Header.tsx | 15 ++++++++++++++- src/pages/ChattingRoom/Main.tsx | 3 ++- 4 files changed, 23 insertions(+), 7 deletions(-) diff --git a/src/pages/ChattingList/ChattingItem.tsx b/src/pages/ChattingList/ChattingItem.tsx index 6384360..6c63aea 100644 --- a/src/pages/ChattingList/ChattingItem.tsx +++ b/src/pages/ChattingList/ChattingItem.tsx @@ -4,16 +4,19 @@ import { typography } from "../../style/typography"; import { colors } from "../../style/colors"; import arrow from "../../assets/arrow.svg"; import { opponentActions, currOpponentActions } from "../../store"; -import { useDispatch, useSelector } from "react-redux"; +import { useDispatch } from "react-redux"; import { useNavigate } from "react-router-dom"; +// 여기선 opponent를 id로 업데이트 해주고 currOpponent도 id로 업데이트 해주면됨 const ChattingItem = ({ id, chatArray }) => { const dispatch = useDispatch(); const navigate = useNavigate(); - const opponent = useSelector((state) => state.opponent.opponent); - const currOpponent = useSelector((state) => state.currOpponent.currOpponent); - const handleChattingItemClick = () => {}; + const handleChattingItemClick = () => { + dispatch(opponentActions.setOpponent(id)); + dispatch(currOpponentActions.setCurrOpponent(id)); + navigate("/room"); + }; return ( diff --git a/src/pages/ChattingRoom/ChattingRoom.tsx b/src/pages/ChattingRoom/ChattingRoom.tsx index 24bc4f9..ba4926a 100644 --- a/src/pages/ChattingRoom/ChattingRoom.tsx +++ b/src/pages/ChattingRoom/ChattingRoom.tsx @@ -1,6 +1,5 @@ import Header from "./Header"; import Main from "./Main"; - import Template from "../../components/common/Template"; const ChattingRoom = () => { diff --git a/src/pages/ChattingRoom/Header.tsx b/src/pages/ChattingRoom/Header.tsx index 9c14aa1..049fd12 100644 --- a/src/pages/ChattingRoom/Header.tsx +++ b/src/pages/ChattingRoom/Header.tsx @@ -10,10 +10,12 @@ import userData from "../../data/user.json"; import back from "../../assets/back.svg"; import profileArrow from "../../assets/profileArrow.svg"; +import { useNavigate } from "react-router-dom"; import { colors } from "../../style/colors"; import { typography } from "../../style/typography"; const Header = () => { + const navigate = useNavigate(); const dispatch = useDispatch(); const opponent = useSelector((state: RootState) => state.opponent.opponent); const currOpponent = useSelector( @@ -26,12 +28,18 @@ const Header = () => { dispatch(currOpponentActions.setCurrOpponent(index)); }; + const goPageBack = () => { + navigate(-1); + }; + console.log(`${opponent}, ${currOpponent}`); return ( - + + + @@ -59,6 +67,11 @@ const RoomInfoWrapper = styled.div` align-items: center; `; +const BackButton = styled.button` + display: flex; + cursor: pointer; +`; + const RoomInfo = styled.div` justify-self: center; display: flex; diff --git a/src/pages/ChattingRoom/Main.tsx b/src/pages/ChattingRoom/Main.tsx index 318b24b..653b3b0 100644 --- a/src/pages/ChattingRoom/Main.tsx +++ b/src/pages/ChattingRoom/Main.tsx @@ -1,7 +1,7 @@ import styled from "styled-components"; import { useState, useEffect, useRef } from "react"; import { useSelector, useDispatch } from "react-redux"; -import { RootState, currOpponentActions, opponentActions } from "../../store"; +import { RootState } from "../../store"; import { chatsActions } from "../../store"; // image @@ -24,6 +24,7 @@ const Main = () => { ); const currOpponentData = userData.users[currOpponent]; const currChat = chats[opponent - 1].chats; + console.log(currChat); const [value, setValue] = useState(""); const [isEmpty, setIsEmpty] = useState(true); // input란에 텍스트 입력 여부 From b49dd4ea79bd2a56048e34247b8698b1924ccbc0 Mon Sep 17 00:00:00 2001 From: CSE-pebble Date: Fri, 3 May 2024 23:35:52 +0900 Subject: [PATCH 43/56] =?UTF-8?q?=EC=95=84=20=EC=A7=84=EC=A7=9C=20?= =?UTF-8?q?=EB=AA=A8=EB=A5=B4=EA=B2=A0=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/ChattingRoom/Main.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/pages/ChattingRoom/Main.tsx b/src/pages/ChattingRoom/Main.tsx index 653b3b0..66af3ac 100644 --- a/src/pages/ChattingRoom/Main.tsx +++ b/src/pages/ChattingRoom/Main.tsx @@ -82,6 +82,7 @@ const Main = () => { {currChat.map((chat, index) => { const isMine = chat.sender !== currOpponent; + console.log(isMine); return ( {chat.timestamp} From 6f0ccaa4935f16c07ff134f594967cf89f49b562 Mon Sep 17 00:00:00 2001 From: CSE-pebble Date: Sat, 4 May 2024 03:01:57 +0900 Subject: [PATCH 44/56] =?UTF-8?q?Fix:=20=EB=93=9C=EB=94=94=EC=96=B4=20?= =?UTF-8?q?=EC=97=90=EB=9F=AC=EB=A5=BC=20=EA=B3=A0=EC=B3=A4=EB=8B=A4.=20?= =?UTF-8?q?=EC=B1=84=ED=8C=85=EB=B0=A9=20=ED=86=A0=EA=B8=80=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=EA=B9=8C=EC=A7=80=20=EC=99=84=EB=A3=8C!=20-=20localSt?= =?UTF-8?q?orage=EC=9D=98=20key=EB=8A=94=20string=EC=9D=B4=EA=B3=A0,=20?= =?UTF-8?q?=EC=9D=B4=EA=B2=83=EC=9D=84=20id=EB=9D=BC=EB=8A=94=20props?= =?UTF-8?q?=EC=97=90=20=EC=88=AB=EC=9E=90=EC=B2=98=EB=9F=BC=20=EC=A0=84?= =?UTF-8?q?=EB=8B=AC=ED=95=B4=EC=A4=98=EC=84=9C=20=EC=83=9D=EA=B8=B4=20?= =?UTF-8?q?=EB=AC=B8=EC=A0=9C=EC=98=80=EB=8B=A4..=20id=EB=8A=94=20"1"?= =?UTF-8?q?=EC=B2=98=EB=9F=BC=20=EB=AC=B8=EC=9E=90=EB=A1=9C=20=EC=A0=84?= =?UTF-8?q?=EB=8B=AC=EB=90=98=EA=B3=A0=20=EC=9E=88=EC=97=88=EB=8A=94?= =?UTF-8?q?=EB=8D=B0=20=EB=82=98=EB=8A=94=20=EC=88=AB=EC=9E=90=EB=A1=9C=20?= =?UTF-8?q?=EC=A0=84=EB=8B=AC=EB=90=98=EB=8A=94=EC=A7=80=20=EC=95=8C?= =?UTF-8?q?=EA=B3=A0=20=EC=9E=88=EC=97=88=EB=8B=A4..=20=EC=9C=BC=EC=95=85?= =?UTF-8?q?=20=EC=BD=98=EC=86=94=20=EC=B0=8D=EC=96=B4=EB=B4=90=EB=8F=84=20?= =?UTF-8?q?=EB=AA=A8=EB=A5=B4=EA=B2=A0=EB=8D=94=EB=9D=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 72 ++----------------------- src/components/common/Footer.tsx | 7 ++- src/components/common/PageHeader.tsx | 8 ++- src/components/common/Template.tsx | 7 ++- src/pages/ChattingList/ChattingItem.tsx | 23 ++++++-- src/pages/ChattingList/Header.tsx | 1 - src/pages/ChattingList/Main.tsx | 8 ++- src/pages/ChattingRoom/Header.tsx | 1 - src/pages/ChattingRoom/Main.tsx | 4 -- 9 files changed, 45 insertions(+), 86 deletions(-) diff --git a/README.md b/README.md index bb7bbf5..8bf082c 100644 --- a/README.md +++ b/README.md @@ -6,84 +6,18 @@ https://discord-react-typescript.vercel.app/ ## 👩‍💻 구현 기능 -- user, message 더미데이터를 json 파일에 저장하고 관리 -- 메세지 전송 기능 -- 메세지 전송 시 현재 시간 표시 기능 -- 채팅방 프로필 클릭 시 유저 변경 기능 - ## 🥳 후기 -디자인분과 협력하면서 피그마 디자인을 보고 적용하는 방법을 익힐 수 있어 너무 좋았습니다! 디자인분이 열심히 디자인 해주신 것을 최대한 잘 반영해보고 싶어서 꼼꼼히 하다보니 뷰 만드는데도 시간이 꽤 걸렸습니다. - -타입스크립트, 상태관리를 처음 다뤄봐서 과제하는데 애를 많이 먹었습니다. 확장성을 고려하여 깔끔하고 유지보수하기 좋은 코드를 작성하고 싶었으나 기능 구현에 급급하다 보니 컴포넌트 분리도 적절히 못한 것 같고, 코드가 지저분해서 아쉬움이 많이 남습니다.🥲 - -`Recoil`, `Redux`를 이용해보기 전에 이번 과제에서는 `ContextAPI`를 이용하여 상태관리를 해주었습니다. `Recoil`, `Redux`를 쓰면 신세계를 경험할 수 있다고(!) 하셔서 다음 과제가 기대가 되네요. 그 전까지 틈틈이 공부하고 코드 리팩토링도 하고 싶습니다. - ## 💡 새롭게 배운 점 -- 피그마에서 주어진 Color System, Typography를 한꺼번에 관리하는 방법을 알게 되었습니다. ([내 코드](https://github.com/CSE-pebble/react-messenger-19th/tree/CSE-pebble/src/style)) -- `ContextAPI`를 사용해보면서 상태관리의 필요성을 직접적으로 느낄 수 있었습니다. - ## 🔥 어려웠던 부분 / 의문점 -- 또 컴포넌트 분리...! 이번 과제에서는 저번 과제보다 더 컴포넌트 분리를 하지 못한 것 같습니다. -- 상태관리: 현재 채팅을 보내는 유저인 `currentUser`와, 채팅 데이터를 담고 있는 state인 `chats`을 전역으로 상태관리를 해주었습니다. `ContextAPI`를 이용하는 것 자체로도 시간이 많이 소요됐고, `chats`의 경우 데이터를 담고 있는 상태이기 때문에 데이터의 양이 방대해질 경우 이것을 전역으로 관리해도 괜찮을까 하는 의문이 들었습니다. -- 타입스크립트 타입 지정: 이벤트 함수 리턴 값 등 복잡한 리턴 값들을 일일이 작성해줘야 해서 귀찮았습니다... 하지만 자바스크립트로 작성해서 나중에 생기는 오류 고치는 것보단 낫겠지! 하는 마음으로 열심히 써주었습니다. -- message 데이터 `json` 파일: 우선은 `localStorage`에 저장된 값이 아무것도 없을 경우 `json` 파일에 저장된 데이터들을 불러오고, 저장된 값이 있을 경우 해당 값을 `localStorage`에서 불러오도록 구현했는데, 이렇게 구현하는게 맞는지 궁금합니다! - ## ✨ 더 구현해보고 싶은 기능 -- 절대 경로 설정: 파일을 import 할 때 상대경로로 하면 `../../` 등 경로가 너무 길어지는 경우가 있어서 다른 분들처럼 절대경로로 설정해보고 싶습니다. 이번엔 시도하다가 실패.. -- 이미지 경로 한꺼번에 관리하기: [제 코드에서 색상을 한꺼번에 관리해준 것](https://github.com/CSE-pebble/react-messenger-19th/blob/CSE-pebble/src/style/colors.tsx)처럼 각종 아이콘 등 수많은 이미지를 한꺼번에 관리해보고 싶습니다. -- 상단바 시간 현재 시간으로 설정: 지금은 상단바 이미지를 통째로 가져와서 넣어줘서 고정된 시간으로 나와있지만, 이후에는 현재 시간을 세팅하는 기능을 구현하고 싶습니다. -- 채팅 입력 시 줄바꿈 기능: shift+enter를 누르면 채팅창 줄바꿈이 되는 기능 -- 채팅 입력 시 시간: 지금은 모든 메세지마다 시간이 뜨도록 구현했는데, 이후에는 분이 바뀔 때만 or 1시간 단위로만 시간이 뜨게 구현해보고 싶습니다. -- 이번 과제 추가 기능이었던 메세지 더블클릭하면 하트가 생기는 기능 - ## ❓ Key Questions -### 1. JavaScript를 사용할때에 비해 TypeScript를 사용할 때의 장점은 무엇인가요? - -1. 정적 타입 지정 - - 타입스크립트의 핵심 기능 중 하나로, 변수, 함수 매개변수, 객체 속성 등에 명시적인 타입을 지정할 수 있다. 이를 통해 컴파일 타임에 오류를 잡아낼 수 있어 런타임 오류의 가능성을 줄인다. - - - 컴파일 타임 vs 런타임 - - 컴파일 타임: 소스 코드가 컴파일러에 의해 기계어나 바이트코드 등 실행 가능한 형태로 변환되는 과정과 시간 → 컴파일 오류는 해결되지 않으면 아예 프로그램이 실행되지 않음 - - 런타임: 프로그램이 사용자 또는 다른 시스템에 의해 실행되고 있는 상태와 그 시간 → 프로그램 실행 중에 발견됨 - -2. 타입 추론 - - 타입스크립트는 변수나 함수의 반환 값에 대해 타입을 자동으로 추론한다. 명시적으로 타입을 지정하지 않아도 타입스크립트가 적절한 타입을 추론해내며, 이는 코드의 간결함을 유지하면서도 타입의 안전성을 제공한다. - -3. 인터페이스와 클래스 - - 타입스크립트에서 클래스와 인터페이스를 함께 사용하면, 클래스가 인터페이스를 구현하도록 강제할 수 있어 객체의 구조와 행동을 더 명확하게 정의할 수 있다. 인터페이스로는 객체의 구조 역시 정의할 수 있는데, 이를 통해 객체가 특정 속성이나 메소드를 갖고 있음을 보장할 수 있어 코드의 일관성과 가독성이 향상된다. - -4. 제네릭 - - 타입스크립트의 제네릭을 사용하면 컴포넌트와 함수가 다양한 타입에 대해 작동할 수 있게 만들면서도 타입 안전성을 유지할 수 있다. - -### 2. 디자이너로부터 전달받은 피그마 링크 혹은, 피그마 캡처본 - -[🔗 피그마 링크](https://www.figma.com/file/jOcAfCCjt1ltxlZKCkW9eu/Study_2?type=design&node-id=0-1&mode=design&t=j24y5RZeIXQ0drnM-0) - -![figma design](https://file.notion.so/f/f/9a4f0dad-d16a-4399-a588-f2547ae8aa9a/f15a5988-21d9-4149-a18b-44f757deff84/%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7_2024-03-22_%EC%98%A4%EC%A0%84_2.44.06.png?id=b7affc77-0b87-4f31-9392-f68d7432e80b&table=block&spaceId=9a4f0dad-d16a-4399-a588-f2547ae8aa9a&expirationTimestamp=1711807200000&signature=aTnd9amg2yLBNaV6W3NTe0-TP8BaIu0aNQmh09i3YHY&downloadName=%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7+2024-03-22+%EC%98%A4%EC%A0%84+2.44.06.png) - -### 3. 컴포넌트를 분리한 기준은 무엇인가요? - -전체적인 디자인, 기능을 보면서 재사용되는 부분을 컴포넌트로 분리하였습니다. - -이후 페이지 라우팅에 대한 확장성을 고려하여 페이지별 폴더를 만들어주었습니다. - -### 4. 디자인 시스템을 적용하면서 느낀 점은 무엇인가요? - -제가 따로 뷰를 고민할 필요 없이 피그마에 나온 디자인을 보고 바로 개발을 시작하니 굉장히 편리했습니다. 특히 폰트, 색상, 글자 스타일 등이 미리 정해져있으니 초기 세팅만 해놓으면 언제든 불러서 사용하면 된다는 것이 가장 좋았습니다. - -다만 디자인을 받은 만큼 그 디자인을 최대한 잘 반영해야 한다고 생각해서, 섬세하고 꼼꼼하게 작업했던 것 같습니다. - -### 5. 디자이너와 소통하며 느낀점은 무엇인가요? +### 1. Routing이란? -혼자 하는 과제가 아니기 때문에, 제가 할 수 있는 것과 없는 것에 대한 판단을 정확히 하고 그 부분에 대해 디자이너 분과 소통하는 것이 정말 중요하다고 느꼈습니다. +### 2. SPA란? -그리고 책임이 커진 만큼 더 열심히 과제를 구현하려고 했고, 그것이 좋은 결과물을 낼 수 있었던 것 같습니다. 협업의 중요성을 깨달을 수 있었습니다. +### 3. 상태관리란? diff --git a/src/components/common/Footer.tsx b/src/components/common/Footer.tsx index ee11d8e..ef39cd0 100644 --- a/src/components/common/Footer.tsx +++ b/src/components/common/Footer.tsx @@ -42,7 +42,7 @@ const Footer = () => { setActiveButton(path); }, [location.pathname]); - const handleButtonClick = (id) => { + const handleButtonClick = (id: string) => { if (activeButton !== id) { setActiveButton(id); navigate(`/${id}`); @@ -57,7 +57,10 @@ const Footer = () => { onClick={() => handleButtonClick(id)} isactive={activeButton === id} > - + {text} {text} ))} diff --git a/src/components/common/PageHeader.tsx b/src/components/common/PageHeader.tsx index 2c97218..2c7d67f 100644 --- a/src/components/common/PageHeader.tsx +++ b/src/components/common/PageHeader.tsx @@ -3,7 +3,13 @@ import { typography } from "../../style/typography"; import editprofile from "../../assets/editProfile.svg"; import SearchBar from "./SearchBar"; -const PageHeader = ({ title, search, icon }) => { +interface PageHeaderProps { + title: string; + search?: boolean; + icon?: string | null; +} + +const PageHeader = ({ title, search, icon }: PageHeaderProps) => { return ( diff --git a/src/components/common/Template.tsx b/src/components/common/Template.tsx index 8c39d94..e314bf7 100644 --- a/src/components/common/Template.tsx +++ b/src/components/common/Template.tsx @@ -1,6 +1,11 @@ import styled from "styled-components"; +import { ReactNode } from "react"; -const Template = ({ children }) => { +interface TemplateProps { + children: ReactNode; +} + +const Template = ({ children }: TemplateProps) => { return {children}; }; diff --git a/src/pages/ChattingList/ChattingItem.tsx b/src/pages/ChattingList/ChattingItem.tsx index 6c63aea..98a9e24 100644 --- a/src/pages/ChattingList/ChattingItem.tsx +++ b/src/pages/ChattingList/ChattingItem.tsx @@ -8,24 +8,37 @@ import { useDispatch } from "react-redux"; import { useNavigate } from "react-router-dom"; // 여기선 opponent를 id로 업데이트 해주고 currOpponent도 id로 업데이트 해주면됨 -const ChattingItem = ({ id, chatArray }) => { +interface ChatArrayItem { + text: string; + sender: number; + timestamp: string; +} + +interface ChattingItemProps { + id: string; + chatArray: ChatArrayItem[]; +} + +const ChattingItem = ({ id, chatArray }: ChattingItemProps) => { const dispatch = useDispatch(); const navigate = useNavigate(); + const idNum = parseInt(id); + const handleChattingItemClick = () => { - dispatch(opponentActions.setOpponent(id)); - dispatch(currOpponentActions.setCurrOpponent(id)); + dispatch(opponentActions.setOpponent(idNum)); + dispatch(currOpponentActions.setCurrOpponent(idNum)); navigate("/room"); }; return ( - {userData.users[id].name} + {userData.users[idNum].name} diff --git a/src/pages/ChattingList/Header.tsx b/src/pages/ChattingList/Header.tsx index 344628d..a3ce841 100644 --- a/src/pages/ChattingList/Header.tsx +++ b/src/pages/ChattingList/Header.tsx @@ -1,4 +1,3 @@ -import styled from "styled-components"; import StatusBar from "../../components/common/StatusBar"; import PageHeader from "../../components/common/PageHeader"; diff --git a/src/pages/ChattingList/Main.tsx b/src/pages/ChattingList/Main.tsx index cfff51c..6671134 100644 --- a/src/pages/ChattingList/Main.tsx +++ b/src/pages/ChattingList/Main.tsx @@ -7,8 +7,12 @@ const Main = () => { return ( {keys.map((key) => { - const chatArray = JSON.parse(localStorage.getItem(key)); - return ; + if (typeof key === "string" && key !== "") { + const chatArray = JSON.parse(localStorage.getItem(key)!); + return ; + } else { + return null; + } })} ); diff --git a/src/pages/ChattingRoom/Header.tsx b/src/pages/ChattingRoom/Header.tsx index 049fd12..454e0b3 100644 --- a/src/pages/ChattingRoom/Header.tsx +++ b/src/pages/ChattingRoom/Header.tsx @@ -32,7 +32,6 @@ const Header = () => { navigate(-1); }; - console.log(`${opponent}, ${currOpponent}`); return ( diff --git a/src/pages/ChattingRoom/Main.tsx b/src/pages/ChattingRoom/Main.tsx index 66af3ac..6165a0c 100644 --- a/src/pages/ChattingRoom/Main.tsx +++ b/src/pages/ChattingRoom/Main.tsx @@ -24,13 +24,10 @@ const Main = () => { ); const currOpponentData = userData.users[currOpponent]; const currChat = chats[opponent - 1].chats; - console.log(currChat); const [value, setValue] = useState(""); const [isEmpty, setIsEmpty] = useState(true); // input란에 텍스트 입력 여부 - console.log(`chattingRoom 컴포넌트 가져온 후 ${opponent}, ${currOpponent}`); - // 스크롤 이동 const chatWrapperRef = useRef(null); useEffect(() => { @@ -82,7 +79,6 @@ const Main = () => { {currChat.map((chat, index) => { const isMine = chat.sender !== currOpponent; - console.log(isMine); return ( {chat.timestamp} From 3f9e318acfa44a7cf264baa33643d7967a890571 Mon Sep 17 00:00:00 2001 From: CSE-pebble Date: Sat, 4 May 2024 03:15:09 +0900 Subject: [PATCH 45/56] =?UTF-8?q?Fix:=20=ED=83=80=EC=9E=85=EC=8A=A4?= =?UTF-8?q?=ED=81=AC=EB=A6=BD=ED=8A=B8=20=ED=83=80=EC=9E=85=EC=A7=80?= =?UTF-8?q?=EC=A0=95=20=EC=97=90=EB=9F=AC=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/ChattingRoom/Main.tsx | 8 +++++++- src/pages/MyProfile/LinkItem.tsx | 8 +++++++- src/pages/MyProfile/Main.tsx | 7 ++++++- 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/src/pages/ChattingRoom/Main.tsx b/src/pages/ChattingRoom/Main.tsx index 6165a0c..4b74d11 100644 --- a/src/pages/ChattingRoom/Main.tsx +++ b/src/pages/ChattingRoom/Main.tsx @@ -15,6 +15,12 @@ import userData from "../../data/user.json"; import { colors } from "../../style/colors"; import { typography } from "../../style/typography"; +interface Chat { + text: string; + sender: number; + timestamp: string; +} + const Main = () => { const dispatch = useDispatch(); const chats = useSelector((state: RootState) => state.chats); @@ -77,7 +83,7 @@ const Main = () => { return ( - {currChat.map((chat, index) => { + {currChat.map((chat: Chat, index: number) => { const isMine = chat.sender !== currOpponent; return ( diff --git a/src/pages/MyProfile/LinkItem.tsx b/src/pages/MyProfile/LinkItem.tsx index b6e2865..bf8ed76 100644 --- a/src/pages/MyProfile/LinkItem.tsx +++ b/src/pages/MyProfile/LinkItem.tsx @@ -1,7 +1,13 @@ import styled from "styled-components"; import { colors } from "../../style/colors"; -const LinkItem = ({ icon, userId, link }) => { +interface LinkItemProps { + icon: string; + userId: string; + link: string; +} + +const LinkItem = ({ icon, userId, link }: LinkItemProps) => { const handleClick = () => { window.location.href = link; }; diff --git a/src/pages/MyProfile/Main.tsx b/src/pages/MyProfile/Main.tsx index c0cc9ed..f7c0051 100644 --- a/src/pages/MyProfile/Main.tsx +++ b/src/pages/MyProfile/Main.tsx @@ -42,7 +42,12 @@ const Main = () => { Links {linkData.map((el) => ( - + ))} From 78719fccc7e98ccf12e8b88c8383499c84dc5185 Mon Sep 17 00:00:00 2001 From: CSE-pebble Date: Sat, 4 May 2024 03:33:57 +0900 Subject: [PATCH 46/56] =?UTF-8?q?Chore:=20=EB=B0=B0=ED=8F=AC=20=EB=B2=84?= =?UTF-8?q?=EA=B7=B8=20=EC=88=98=EC=A0=95=20=EC=8B=9C=EB=8F=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 ++ src/data/user.json | 3 +-- src/pages/MyProfile/Header.tsx | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 8bf082c..8071fd3 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,8 @@ https://discord-react-typescript.vercel.app/ ## 👩‍💻 구현 기능 +- 하단바 아이콘을 누르면 해당하는 페이지로 라우팅 + ## 🥳 후기 ## 💡 새롭게 배운 점 diff --git a/src/data/user.json b/src/data/user.json index 4948fa0..837f4bb 100644 --- a/src/data/user.json +++ b/src/data/user.json @@ -3,8 +3,7 @@ { "id": 0, "name": "지원", - "profileImg": "mine.svg", - "loginId": "jioni" + "profileImg": "mine.svg" }, { "id": 1, diff --git a/src/pages/MyProfile/Header.tsx b/src/pages/MyProfile/Header.tsx index 78134f1..7c01ef2 100644 --- a/src/pages/MyProfile/Header.tsx +++ b/src/pages/MyProfile/Header.tsx @@ -19,7 +19,7 @@ const Header = () => { {me.name} - {me.loginId} + jioni From fdd1e34cc130642d7b4b86fc6805bf17b05baa1f Mon Sep 17 00:00:00 2001 From: CSE-pebble Date: Sat, 4 May 2024 03:41:40 +0900 Subject: [PATCH 47/56] =?UTF-8?q?Fix:=20=EB=B0=B0=ED=8F=AC=20=EC=97=90?= =?UTF-8?q?=EB=9F=AC=20=EC=88=98=EC=A0=95=20=EC=8B=9C=EB=8F=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/store/index.tsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/store/index.tsx b/src/store/index.tsx index ca54513..accdd3b 100644 --- a/src/store/index.tsx +++ b/src/store/index.tsx @@ -43,9 +43,11 @@ const setInitialChatsData = () => { const chats = chat.chats; localStorage.setItem(key, JSON.stringify(chats)); } + const storedChats = localStorage.getItem(key); + const parsedChats = storedChats ? JSON.parse(storedChats) : []; initialChats.push({ opponent: key, - chats: JSON.parse(localStorage.getItem(key) || "[]"), // localStorage에서 가져와 파싱 + chats: parsedChats, }); } return initialChats; // initialChats 배열 반환 From c374194931c75b7d732b95f1a6c6d4a79b09c822 Mon Sep 17 00:00:00 2001 From: CSE-pebble Date: Sun, 5 May 2024 00:31:29 +0900 Subject: [PATCH 48/56] Chore: Update ReadME.md --- README.md | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/README.md b/README.md index 8071fd3..ed10a71 100644 --- a/README.md +++ b/README.md @@ -7,19 +7,58 @@ https://discord-react-typescript.vercel.app/ ## 👩‍💻 구현 기능 - 하단바 아이콘을 누르면 해당하는 페이지로 라우팅 +- 채팅 목록 페이지에서 특정 채팅을 누르면 해당 채팅방으로 이동 +- 채팅방 메세지 보내기 기능 +- 채팅 상대 토글 기능 +- 유저 프로필 조회 및 유저 링크 바로가기 기능 ## 🥳 후기 +Redux, Routing 기능을 처음 공부해서 사용해봤습니다! 걱정을 많이 했는데 생각보다 Redux가 어렵지 않았고 코드 구현을 하면서 재미도 많이 느꼈습니다. Routing도 페이지가 많지 않아서 그런 건지 쉽게 구현했습니다. + +오히려 타입스크립트와 localStorage 관련 부분에서 더 어려움을 겪었던 것 같습니다. + +그리고 프로젝트를 하면서 점점 느끼는 것은 무작정 코드를 짜기 시작하는 것보다 전체적인 구조와 세부 컴포넌트 틀, 전역으로 관리할 상태 등을 미리 정리하고 코드를 짜는 게 중요하다는 생각이 들었습니다. 그 과정이 처음에 할 때 오래 걸릴지 몰라도 개발에 들어가면 훨씬 수월하게 개발할 수 있는 것 같습니다. + ## 💡 새롭게 배운 점 +- Redux를 이용한 전역 상태관리 +- Routing 기능 + ## 🔥 어려웠던 부분 / 의문점 +- localStorage: localStorage에 저장될 때 key가 문자열 타입이라는 것을 잊고 에러 해결하는데 한참을 헤맸습니다🥲 +- 타입스크립트: 어디부터 어디까지 타입을 작성해주어야 하는지 아직 감이 잘 오지 않습니다. 그리고 어떻게 작성해야 가독성이 좋을지도 고민이 많이 되는 것 같아요. 좀 더 공부가 필요할 것 같습니다! + ## ✨ 더 구현해보고 싶은 기능 +- 시간 관계 상 친구 목록 페이지는 별다른 기능 없이 이미지로만 넣어뒀는데 수정하고 싶습니다. 여유가 되면 시도해보겠습니다. +- 채팅 목록 최신순 정렬 기능 +- 검색 기능(현재는 그냥 이미지) + ## ❓ Key Questions ### 1. Routing이란? +- 웹 애플리케이션에서 라우팅이라는 개념은 사용자가 요청한 URL에 따라 알맞는 페이지를 보여주는 것 +- ex) 블로그를 만든다면? + - **글쓰기 페이지**: 새로운 포스트를 작성하는 페이지 + - **포스트 목록 페이지**: 블로그에 작성된 여러 포스트들의 목록을 보여주는 페이지 + - **포스트 읽기 페이지**: 하나의 포스트를 보여주는 페이지 +- 리액트에서 라우팅을 하기 위한 대표적인 두 가지 방법 + - **리액트 라우터(React Router)**: 이 라이브러리는 리액트의 라우팅 관련 라이브러리들 중에서 가장 오래됐고, 가장 많이 사용되고 있다. 이 라이브러리는 컴포넌트 기반으로 라우팅 시스템을 설정할 수 있다. + - **Next.js**: Next.js 는 리액트 프로젝트의 프레임워크이다. 이 프레임워크는 우리가 사용했던 Create React App처럼 리액트 프로젝트 설정을 하는 기능, 라우팅 시스템, 최적화, 다국어 시스템 지원, 서버 사이드 렌더링 등 다양한 기능들을 제공한다. → 이 프레임워크의 라우팅 시스템은 파일 경로 기반으로 작동하여 파일경로만 설정해주면 라우팅이 자동으로 적용되는 형태이다 + ### 2. SPA란? +- 싱글페이지 어플리케이션이란 index.html이 하나인, 한 개의 페이지로 이루어진 어플리케이션이라는 의미 + ↔ 멀티 페이지 애플리케이션에서는 사용자가 다른 페이지로 이동할 때마다 새로운 html을 받아오고, 페이지를 로딩할 때마다 서버에서 CSS, JS, 이미지 파일 등의 리소스를 전달받아 브라우저 화면에 보여 주었다 ! +- 사용자 인터랙션이 별로 없는 정적인 페이지들은 기존의 방식(MPA)이 적합하지만, 사용자 인터랙션이 많고 다양한 정보를 제공하는 모던 웹 애플리케이션은 이 방식이 적합하지 않음 → SPA를 통해 html을 한 번만 받아와서 웹 어플리케이션을 실행시킨 후에, 그 이후에는 필요한 데이터만 화면에 업데이트! + ### 3. 상태관리란? + +- 데이터를 관리하는 방법. 여러 component간에 데이터 전달과 이벤트 통신을 한 곳에서 관리하는 것. +- 상태 관리가 필요한 이유 + 1. 데이터가 바뀌어도 페이지가 렌더링 되지 않게 하기 위해 + 2. 상태(state)들이 복잡하게 얽혀있다면, 상호간에 의존성이 많아지게 되어서 UI가 어떻게 변하는지 알기 어렵기 때문에 효율적인 관리가 필요하다. +- 상태 관리 라이브러리 종류 : redux,MobX,Overmind.js,recoil From fc62bf974efc3bf573cf427dfea45c52ed110493 Mon Sep 17 00:00:00 2001 From: CSE-pebble Date: Sun, 5 May 2024 01:16:34 +0900 Subject: [PATCH 49/56] =?UTF-8?q?Chore:=20=EB=B9=8C=EB=93=9C=20=EC=97=90?= =?UTF-8?q?=EB=9F=AC=20=ED=99=95=EC=9D=B8=EC=9D=84=20=EC=9C=84=ED=95=B4=20?= =?UTF-8?q?minify=20=EC=98=B5=EC=85=98=20=EB=81=84=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- vite.config.ts | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/vite.config.ts b/vite.config.ts index 5a33944..4c0a4b6 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,7 +1,10 @@ -import { defineConfig } from 'vite' -import react from '@vitejs/plugin-react' +import { defineConfig } from "vite"; +import react from "@vitejs/plugin-react"; // https://vitejs.dev/config/ export default defineConfig({ plugins: [react()], -}) + build: { + minify: false, + }, +}); From 5278602de1e8dc2ae9b1002bb4da7d8d646d89b5 Mon Sep 17 00:00:00 2001 From: CSE-pebble Date: Sun, 5 May 2024 02:12:51 +0900 Subject: [PATCH 50/56] =?UTF-8?q?Chore:=20=EB=B0=B0=ED=8F=AC=20=EC=97=90?= =?UTF-8?q?=EB=9F=AC=20=EC=88=98=EC=A0=95=20=EC=8B=9C=EB=8F=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/ChattingList/ChattingItem.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/pages/ChattingList/ChattingItem.tsx b/src/pages/ChattingList/ChattingItem.tsx index 98a9e24..b385875 100644 --- a/src/pages/ChattingList/ChattingItem.tsx +++ b/src/pages/ChattingList/ChattingItem.tsx @@ -31,6 +31,8 @@ const ChattingItem = ({ id, chatArray }: ChattingItemProps) => { navigate("/room"); }; + console.log(userData.users[idNum].profileImg); + return ( Date: Sun, 5 May 2024 02:29:33 +0900 Subject: [PATCH 51/56] =?UTF-8?q?Chore:=20=EB=B0=B0=ED=8F=AC=20=EC=97=90?= =?UTF-8?q?=EB=9F=AC=20=EC=88=98=EC=A0=95=20=EC=8B=9C=EB=8F=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 1 + src/core/router.tsx | 2 +- src/pages/ChattingList/ChattingItem.tsx | 3 +++ yarn.lock | 12 ++++++++++++ 4 files changed, 17 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index d93cbbc..4ef3794 100644 --- a/package.json +++ b/package.json @@ -19,6 +19,7 @@ "styled-components": "^6.1.8" }, "devDependencies": { + "@types/node": "^20.12.8", "@types/react": "^18.2.66", "@types/react-dom": "^18.2.22", "@typescript-eslint/eslint-plugin": "^7.2.0", diff --git a/src/core/router.tsx b/src/core/router.tsx index 4893e0c..d41a9b3 100644 --- a/src/core/router.tsx +++ b/src/core/router.tsx @@ -6,7 +6,7 @@ import MyProfile from "../pages/MyProfile/MyProfile"; function Router() { return ( - + } /> } /> diff --git a/src/pages/ChattingList/ChattingItem.tsx b/src/pages/ChattingList/ChattingItem.tsx index b385875..8a0b73e 100644 --- a/src/pages/ChattingList/ChattingItem.tsx +++ b/src/pages/ChattingList/ChattingItem.tsx @@ -31,6 +31,9 @@ const ChattingItem = ({ id, chatArray }: ChattingItemProps) => { navigate("/room"); }; + console.log(userData); + console.log(userData.users); + console.log(userData.users[idNum]); console.log(userData.users[idNum].profileImg); return ( diff --git a/yarn.lock b/yarn.lock index 3b4034f..378b6be 100644 --- a/yarn.lock +++ b/yarn.lock @@ -578,6 +578,13 @@ resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== +"@types/node@^20.12.8": + version "20.12.8" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.12.8.tgz#35897bf2bfe3469847ab04634636de09552e8256" + integrity sha512-NU0rJLJnshZWdE/097cdCBbyW1h4hEg0xpovcoAQYHl8dnEyp/NAOiE45pvc+Bd1Dt+2r94v2eGFpQJ4R7g+2w== + dependencies: + undici-types "~5.26.4" + "@types/prop-types@*": version "15.7.12" resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.12.tgz#12bb1e2be27293c1406acb6af1c3f3a1481d98c6" @@ -1768,6 +1775,11 @@ typescript@^5.2.2: resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.4.3.tgz#5c6fedd4c87bee01cd7a528a30145521f8e0feff" integrity sha512-KrPd3PKaCLr78MalgiwJnA25Nm8HAmdwN3mYUYZgG/wizIo9EainNVQI9/yDavtVFRN2h3k8uf3GLHuhDMgEHg== +undici-types@~5.26.4: + version "5.26.5" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" + integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== + update-browserslist-db@^1.0.13: version "1.0.13" resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz#3c5e4f5c083661bd38ef64b6328c26ed6c8248c4" From ba8acd8ea1e3d45a2e391cc15f8a3cdd3ed1b5bf Mon Sep 17 00:00:00 2001 From: CSE-pebble Date: Sun, 5 May 2024 02:40:11 +0900 Subject: [PATCH 52/56] =?UTF-8?q?Chore:=20=EB=B0=B0=ED=8F=AC=20=EC=97=90?= =?UTF-8?q?=EB=9F=AC=20=EC=88=98=EC=A0=95..?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/core/router.tsx | 2 +- src/pages/ChattingList/ChattingItem.tsx | 13 +++++-------- 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/src/core/router.tsx b/src/core/router.tsx index d41a9b3..4893e0c 100644 --- a/src/core/router.tsx +++ b/src/core/router.tsx @@ -6,7 +6,7 @@ import MyProfile from "../pages/MyProfile/MyProfile"; function Router() { return ( - + } /> } /> diff --git a/src/pages/ChattingList/ChattingItem.tsx b/src/pages/ChattingList/ChattingItem.tsx index 8a0b73e..504cc6d 100644 --- a/src/pages/ChattingList/ChattingItem.tsx +++ b/src/pages/ChattingList/ChattingItem.tsx @@ -31,16 +31,13 @@ const ChattingItem = ({ id, chatArray }: ChattingItemProps) => { navigate("/room"); }; - console.log(userData); - console.log(userData.users); - console.log(userData.users[idNum]); - console.log(userData.users[idNum].profileImg); - return ( - + {userData.users[idNum] && ( + + )} {userData.users[idNum].name} From 46024f087d06c071c31c808a69c7b2047df1ab86 Mon Sep 17 00:00:00 2001 From: CSE-pebble Date: Sun, 5 May 2024 02:43:21 +0900 Subject: [PATCH 53/56] =?UTF-8?q?Chore:=20=EC=97=90=EB=9F=AC=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=EC=A4=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/ChattingList/ChattingItem.tsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/pages/ChattingList/ChattingItem.tsx b/src/pages/ChattingList/ChattingItem.tsx index 504cc6d..62b9e78 100644 --- a/src/pages/ChattingList/ChattingItem.tsx +++ b/src/pages/ChattingList/ChattingItem.tsx @@ -40,7 +40,9 @@ const ChattingItem = ({ id, chatArray }: ChattingItemProps) => { )} - {userData.users[idNum].name} + {userData.users[idNum] && ( + {userData.users[idNum].name} + )} From e02bd9213bb31ba26c39ddd47d6a5b076e58d9e6 Mon Sep 17 00:00:00 2001 From: CSE-pebble Date: Sun, 5 May 2024 02:47:36 +0900 Subject: [PATCH 54/56] =?UTF-8?q?Fix:=20=EC=84=9C=EB=B2=84=20=EB=B0=B0?= =?UTF-8?q?=ED=8F=AC=20=EC=98=A4=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/core/router.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/router.tsx b/src/core/router.tsx index 4893e0c..d41a9b3 100644 --- a/src/core/router.tsx +++ b/src/core/router.tsx @@ -6,7 +6,7 @@ import MyProfile from "../pages/MyProfile/MyProfile"; function Router() { return ( - + } /> } /> From 9caa627b18dd7f684f32a642cdc7f3092a6f5244 Mon Sep 17 00:00:00 2001 From: CSE-pebble Date: Sun, 5 May 2024 02:54:22 +0900 Subject: [PATCH 55/56] =?UTF-8?q?Fix:=20=EB=B0=B0=ED=8F=AC=20=ED=9B=84=20?= =?UTF-8?q?=EB=9D=BC=EC=9A=B0=ED=8C=85=20=ED=8E=98=EC=9D=B4=EC=A7=80?= =?UTF-8?q?=EC=97=90=EC=84=9C=20=EC=83=88=EB=A1=9C=EA=B3=A0=EC=B9=A8=20?= =?UTF-8?q?=EC=8B=9C=20=EC=98=A4=EB=A5=98=EB=82=98=EB=8A=94=20=EB=AC=B8?= =?UTF-8?q?=EC=A0=9C=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/core/router.tsx | 1 + vercel.json | 3 +++ 2 files changed, 4 insertions(+) create mode 100644 vercel.json diff --git a/src/core/router.tsx b/src/core/router.tsx index d41a9b3..4a0d9ed 100644 --- a/src/core/router.tsx +++ b/src/core/router.tsx @@ -9,6 +9,7 @@ function Router() { } /> + } /> } /> } /> } /> diff --git a/vercel.json b/vercel.json new file mode 100644 index 0000000..3a48e56 --- /dev/null +++ b/vercel.json @@ -0,0 +1,3 @@ +{ + "rewrites": [{ "source": "/(.*)", "destination": "/" }] +} From 5d6fd2349ed7b6be890a28c0a356089a03efb132 Mon Sep 17 00:00:00 2001 From: CSE-pebble Date: Sun, 5 May 2024 02:56:45 +0900 Subject: [PATCH 56/56] =?UTF-8?q?Chore:=20=EC=93=B8=EB=8D=B0=20=EC=97=86?= =?UTF-8?q?=EB=8A=94=20=EC=BD=94=EB=93=9C=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/core/router.tsx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/core/router.tsx b/src/core/router.tsx index 4a0d9ed..4893e0c 100644 --- a/src/core/router.tsx +++ b/src/core/router.tsx @@ -6,10 +6,9 @@ import MyProfile from "../pages/MyProfile/MyProfile"; function Router() { return ( - + } /> - } /> } /> } /> } />