From c36c15e5805bce3e2a65b672991c1f713eee1bdb Mon Sep 17 00:00:00 2001 From: G-hoon Date: Tue, 20 Aug 2024 02:44:46 +0900 Subject: [PATCH 1/4] =?UTF-8?q?[feat/#20]=20github=20action=20=EB=B9=8C?= =?UTF-8?q?=EB=93=9C=20=EC=8B=A4=ED=8C=A8=EC=8B=9C=20=EC=95=8C=EB=9E=8C?= =?UTF-8?q?=EC=9D=B4=20=EC=98=A4=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95,?= =?UTF-8?q?=20=ED=8A=B8=EB=9E=98=ED=82=B9=20stroke=20=EC=83=89=EC=83=81=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/main.yml | 13 +++++++++---- public/icons/group-side-nav-button.svg | 7 +++++++ src/utils/drawer.ts | 7 +++++-- 3 files changed, 21 insertions(+), 6 deletions(-) create mode 100644 public/icons/group-side-nav-button.svg diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 2974e9b..3cbe8a1 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -23,10 +23,13 @@ jobs: run: yarn install - name: Generate build + id: build run: yarn build + continue-on-error: true - name: Deploy to S3 id: deploy + if: steps.build.outcome == 'success' env: AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} @@ -49,7 +52,7 @@ jobs: 작성자: ${{ steps.get_commit_info.outputs.author }} - name: Discord notification - Failure - if: steps.deploy.outcome == 'failure' + if: steps.build.outcome == 'failure' || steps.deploy.outcome == 'failure' env: DISCORD_WEBHOOK: ${{ secrets.DISCORD_DEPLOY_WEBHOOK }} DISCORD_USERNAME: GitHub @@ -57,12 +60,14 @@ jobs: uses: Ilshidur/action-discord@master with: args: | - ❌ 배포 중 오류가 발생했습니다. + ❌ ${{ steps.build.outcome == 'failure' && '빌드 중' || '배포 중' }} 오류가 발생했습니다. 브랜치: develop 커밋: ${{ steps.get_commit_info.outputs.message }} - 작성자: <@${{ steps.get_commit_info.outputs.author_username }}> + 작성자: <@${{ secrets.DISCORD_ID_1 }}> 실패한 워크플로우: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} + ${{ steps.build.outcome == 'failure' && '빌드 오류 메시지:' || '' }} + ${{ steps.build.outcome == 'failure' && steps.build.outputs.stderr || '' }} - name: Check deploy result - if: steps.deploy.outcome == 'failure' + if: steps.build.outcome == 'failure' || steps.deploy.outcome == 'failure' run: exit 1 diff --git a/public/icons/group-side-nav-button.svg b/public/icons/group-side-nav-button.svg new file mode 100644 index 0000000..7769f95 --- /dev/null +++ b/public/icons/group-side-nav-button.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/utils/drawer.ts b/src/utils/drawer.ts index fca7bf4..478749a 100644 --- a/src/utils/drawer.ts +++ b/src/utils/drawer.ts @@ -15,7 +15,7 @@ export const drawPose = (poses: pose[], canvas: HTMLCanvasElement): void => { ctx.beginPath() ctx.moveTo(leftShoulder.x, leftShoulder.y) ctx.lineTo(rightShoulder.x, rightShoulder.y) - ctx.strokeStyle = "red" + ctx.strokeStyle = "#00C670" ctx.lineWidth = 2 ctx.stroke() } @@ -24,8 +24,11 @@ export const drawPose = (poses: pose[], canvas: HTMLCanvasElement): void => { if (keypoint.confidence > 0.25) { ctx.beginPath() ctx.arc(keypoint.x, keypoint.y, 5, 0, 2 * Math.PI) - ctx.fillStyle = "red" + ctx.fillStyle = "white" ctx.fill() + ctx.strokeStyle = "#00C670" // 초록색 테두리 + ctx.lineWidth = 2 // 테두리 두께 + ctx.stroke() // 테 } }) }) From 52d4cb7130e6a832d98ddc4bb29f59bf49c9b4de Mon Sep 17 00:00:00 2001 From: G-hoon Date: Sat, 24 Aug 2024 15:21:38 +0900 Subject: [PATCH 2/4] =?UTF-8?q?[feat/#20]=20=EA=B7=B8=EB=A3=B9=20=ED=99=94?= =?UTF-8?q?=EB=A9=B4=20=EA=B5=AC=ED=98=84=20=EB=B0=8F=20=EC=86=8C=EC=BC=93?= =?UTF-8?q?=20=ED=86=B5=EC=8B=A0=20=EC=97=B0=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 1 + src/assets/icons/crew-panel-close-button.svg | 4 + .../icons/good-posture-check-button-icon.svg | 10 + .../icons/posture-guide-button-icon.svg | 10 + src/assets/icons/question-info-icon.svg | 12 ++ src/components/PoseDetector.tsx | 23 ++- src/components/Posture/PostrueCrew.tsx | 101 +++++++++ src/index.tsx | 6 +- src/pages/MonitoringPage.tsx | 36 +++- yarn.lock | 194 ++++++++++++------ 10 files changed, 316 insertions(+), 81 deletions(-) create mode 100644 src/assets/icons/crew-panel-close-button.svg create mode 100644 src/assets/icons/good-posture-check-button-icon.svg create mode 100644 src/assets/icons/posture-guide-button-icon.svg create mode 100644 src/assets/icons/question-info-icon.svg create mode 100644 src/components/Posture/PostrueCrew.tsx diff --git a/package.json b/package.json index f1f73c6..acfbf96 100644 --- a/package.json +++ b/package.json @@ -20,6 +20,7 @@ "react": "^18.2.0", "react-dom": "^18.2.0", "react-router-dom": "^6.8.1", + "socket.io-client": "^4.7.5", "zustand": "^4.5.5" }, "devDependencies": { diff --git a/src/assets/icons/crew-panel-close-button.svg b/src/assets/icons/crew-panel-close-button.svg new file mode 100644 index 0000000..ce7b446 --- /dev/null +++ b/src/assets/icons/crew-panel-close-button.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/icons/good-posture-check-button-icon.svg b/src/assets/icons/good-posture-check-button-icon.svg new file mode 100644 index 0000000..5f7c4a7 --- /dev/null +++ b/src/assets/icons/good-posture-check-button-icon.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/assets/icons/posture-guide-button-icon.svg b/src/assets/icons/posture-guide-button-icon.svg new file mode 100644 index 0000000..326e45b --- /dev/null +++ b/src/assets/icons/posture-guide-button-icon.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/assets/icons/question-info-icon.svg b/src/assets/icons/question-info-icon.svg new file mode 100644 index 0000000..6cf024e --- /dev/null +++ b/src/assets/icons/question-info-icon.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/src/components/PoseDetector.tsx b/src/components/PoseDetector.tsx index eecee31..2debe9c 100644 --- a/src/components/PoseDetector.tsx +++ b/src/components/PoseDetector.tsx @@ -6,6 +6,8 @@ import { worker } from "@/utils/worker" import { useCallback, useEffect, useRef, useState } from "react" import Camera from "./Camera" import GuidePopup from "./Posture/GuidePopup" +import PostureCheckIcon from "@assets/icons/good-posture-check-button-icon.svg?react" +import GuideIcon from "@assets/icons/posture-guide-button-icon.svg?react" const PoseDetector: React.FC = () => { const [isScriptLoaded, setIsScriptLoaded] = useState(false) @@ -13,7 +15,6 @@ const PoseDetector: React.FC = () => { const [slope, setSlope] = useState(null) const [isTextNeck, setIsTextNeck] = useState(null) const [isModelLoaded, setIsModelLoaded] = useState(false) - const [mode] = useState("snapshot") const [isSnapSaved, setIsSnapSaved] = useState(false) const [isPopupVisible, setIsPopupVisible] = useState(false) const modelRef = useRef(null) @@ -74,7 +75,7 @@ const PoseDetector: React.FC = () => { } if (snapRef.current) { const _slope = detectSlope(snapRef.current, results, false) - const _isTextNeck = detectTextNeck(snapRef.current, results, mode === "snapshot") + const _isTextNeck = detectTextNeck(snapRef.current, results, true) if (_slope !== null) setSlope(_slope) if (_isTextNeck !== null) setIsTextNeck(_isTextNeck) @@ -97,7 +98,7 @@ const PoseDetector: React.FC = () => { } } }, - [mode, setSlope, setIsTextNeck, showNotification] + [setSlope, setIsTextNeck, showNotification] ) const detectStart = useCallback( @@ -173,18 +174,24 @@ const PoseDetector: React.FC = () => { : "올바르지 않은 자세입니다."} {!isSnapSaved && ( -
+
)} diff --git a/src/components/Posture/PostrueCrew.tsx b/src/components/Posture/PostrueCrew.tsx new file mode 100644 index 0000000..c8fdd0f --- /dev/null +++ b/src/components/Posture/PostrueCrew.tsx @@ -0,0 +1,101 @@ +import CloseCrewPanelIcon from "@assets/icons/crew-panel-close-button.svg?react" +import QuestionIcon from "@assets/icons/question-info-icon.svg?react" +import { useEffect, useState } from "react" + +interface IPostureCrew { + groupUserId: number + uid: number + nickname: string + rank: number + score: number +} + +interface PostureCrewProps { + toggleSidebar: () => void +} + +export default function PostrueCrew(props: PostureCrewProps) { + const { toggleSidebar } = props + const [crews, setCrews] = useState([]) + // const [isConnected, setIsConnected] = useState(false) + const [isEnabled, setIsEnabled] = useState(true) + + useEffect(() => { + const token = + "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJoZXJvLWFsaWdubGFiLWFwaSIsImF1ZCI6Imhlcm8tYWxpZ25sYWItYXBpIiwiaWQiOjIwMDAwMSwidHlwZSI6ImFjY2Vzc1Rva2VuIiwiZXhwIjoxNzM1Mzk4MDAwfQ.pIl87yrMX4EVoLlBOG0A2X5AMRRUXalwMKnfH6cSDE8" + const socket = new WebSocket(`wss://api.alignlab.site/ws/v1/groups/1/users?X-HERO-AUTH-TOKEN=${token}`) + + socket.onopen = () => { + console.log("WebSocket connected") + // setIsConnected(true) + } + + socket.onmessage = (event) => { + const data = JSON.parse(event.data) + setCrews(data.groupUsers || []) + } + + socket.onerror = (error) => { + console.error("WebSocket error:", error) + } + + socket.onclose = (event) => { + console.log("WebSocket disconnected. Code:", event.code, "Reason:", event.reason) + // setIsConnected(false) + } + + return () => { + socket.close() + } + }, []) + + const onClickCloseSideNavButton = () => { + toggleSidebar() + } + + return ( +
+ +
+
+ 자세 알림 +
+ + +
+
+ 자세 랭킹 + +
+
+ {crews.length === 0 ? ( +

접속자가 없습니다.

+ ) : ( +
    + {crews.map((user, index) => ( +
  • +
    + {user.rank} + {user.nickname} +
    + {user.score}회 +
  • + ))} +
+ )} +
+
+ ) +} diff --git a/src/index.tsx b/src/index.tsx index 040d5ba..2b2a333 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -3,8 +3,4 @@ import ReactDOM from "react-dom/client" import App from "./App" import "@/style/tailwind.css" -ReactDOM.createRoot(document.getElementById("root")!).render( - - - -) +ReactDOM.createRoot(document.getElementById("root")!).render() diff --git a/src/pages/MonitoringPage.tsx b/src/pages/MonitoringPage.tsx index 131e4a5..f919550 100644 --- a/src/pages/MonitoringPage.tsx +++ b/src/pages/MonitoringPage.tsx @@ -1,11 +1,41 @@ import { PoseDetector } from "@/components" +import PostrueCrew from "@/components/Posture/PostrueCrew" +import GroupSideIcon from "@assets/icons/group-side-nav-button.svg?react" +import React, { useState } from "react" const MonitoringPage: React.FC = () => { + const [isSidebarOpen, setIsSidebarOpen] = useState(false) + + const toggleSidebar = () => { + setIsSidebarOpen((prev) => !prev) + } + return ( -
-
- +
+ {/* Main content area */} +
+
+
+ +
+
+ + {/* 사이드바 */} +
+ {isSidebarOpen && } +
+ + {/* 토글 버튼 */} + {!isSidebarOpen && ( + + )}
) } diff --git a/yarn.lock b/yarn.lock index 0cba271..7c52c5a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -210,7 +210,7 @@ "@esbuild/darwin-arm64@0.18.20": version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz#08172cbeccf95fbc383399a7f39cfbddaeb0d7c1" + resolved "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz" integrity sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA== "@esbuild/darwin-x64@0.18.20": @@ -305,19 +305,19 @@ "@eslint-community/eslint-utils@^4.2.0": version "4.4.0" - resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" + resolved "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz" integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== dependencies: eslint-visitor-keys "^3.3.0" "@eslint-community/regexpp@^4.4.0", "@eslint-community/regexpp@^4.6.1": version "4.11.0" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.11.0.tgz#b0ffd0312b4a3fd2d6f77237e7248a5ad3a680ae" + resolved "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz" integrity sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A== "@eslint/eslintrc@^2.1.4": version "2.1.4" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz#388a269f0f25c1b6adc317b5a2c55714894c70ad" + resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz" integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ== dependencies: ajv "^6.12.4" @@ -332,12 +332,12 @@ "@eslint/js@8.57.0": version "8.57.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.0.tgz#a5417ae8427873f1dd08b70b3574b453e67b5f7f" + resolved "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz" 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" + resolved "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz" integrity sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg== dependencies: "@humanwhocodes/object-schema" "^2.0.2" @@ -351,7 +351,7 @@ "@humanwhocodes/object-schema@^2.0.2": version "2.0.3" - resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3" + resolved "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz" integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== "@isaacs/cliui@^8.0.2": @@ -446,6 +446,11 @@ estree-walker "^2.0.2" picomatch "^2.3.1" +"@socket.io/component-emitter@~3.1.0": + version "3.1.2" + resolved "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz" + integrity sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA== + "@svgr/babel-plugin-add-jsx-attribute@8.0.0": version "8.0.0" resolved "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-8.0.0.tgz" @@ -531,12 +536,12 @@ "@tanstack/query-core@5.51.21": version "5.51.21" - resolved "https://registry.yarnpkg.com/@tanstack/query-core/-/query-core-5.51.21.tgz#a510469c6c30d3de2a8b8798e340169a4b0fd08f" + resolved "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.51.21.tgz" integrity sha512-POQxm42IUp6n89kKWF4IZi18v3fxQWFRolvBA6phNVmA8psdfB1MvDnGacCJdS+EOX12w/CyHM62z//rHmYmvw== "@tanstack/react-query@^5.51.23": version "5.51.23" - resolved "https://registry.yarnpkg.com/@tanstack/react-query/-/react-query-5.51.23.tgz#83c223f4cb6054b206de8856b73ca7e41a63ba1f" + resolved "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.51.23.tgz" integrity sha512-CfJCfX45nnVIZjQBRYYtvVMIsGgWLKLYC4xcUiYEey671n1alvTZoCBaU9B85O8mF/tx9LPyrI04A6Bs2THv4A== dependencies: "@tanstack/query-core" "5.51.21" @@ -601,7 +606,7 @@ "@types/json-schema@^7.0.9": version "7.0.15" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" + resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz" integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== "@types/json5@^0.0.29": @@ -611,7 +616,7 @@ "@types/node@^20.7.1": version "20.14.15" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.14.15.tgz#e59477ab7bc7db1f80c85540bfd192a0becc588b" + resolved "https://registry.npmjs.org/@types/node/-/node-20.14.15.tgz" integrity sha512-Fz1xDMCF/B00/tYSVMlmK7hVeLh7jE5f3B7X1/hmV0MJBwE27KlS7EvD/Yp+z1lm8mVhwV5w+n8jOZG8AfTlKw== dependencies: undici-types "~5.26.4" @@ -623,19 +628,19 @@ "@types/qs@^6.9.7": version "6.9.15" - resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.15.tgz#adde8a060ec9c305a82de1babc1056e73bd64dce" + resolved "https://registry.npmjs.org/@types/qs/-/qs-6.9.15.tgz" integrity sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg== "@types/react-dom@^18.0.10": version "18.3.0" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.3.0.tgz#0cbc818755d87066ab6ca74fbedb2547d74a82b0" + resolved "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.0.tgz" integrity sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg== dependencies: "@types/react" "*" "@types/react@*", "@types/react@^18.0.26": version "18.3.3" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.3.3.tgz#9679020895318b0915d7a3ab004d92d33375c45f" + resolved "https://registry.npmjs.org/@types/react/-/react-18.3.3.tgz" integrity sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw== dependencies: "@types/prop-types" "*" @@ -643,12 +648,12 @@ "@types/semver@^7.3.12": version "7.5.8" - resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.8.tgz#8268a8c57a3e4abd25c165ecd36237db7948a55e" + resolved "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz" integrity sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ== "@typescript-eslint/eslint-plugin@^5.59.1": version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz#aeef0328d172b9e37d9bab6dbc13b87ed88977db" + resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz" integrity sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag== dependencies: "@eslint-community/regexpp" "^4.4.0" @@ -664,7 +669,7 @@ "@typescript-eslint/parser@^5.59.1": version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.62.0.tgz#1b63d082d849a2fcae8a569248fbe2ee1b8a56c7" + resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz" integrity sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA== dependencies: "@typescript-eslint/scope-manager" "5.62.0" @@ -682,7 +687,7 @@ "@typescript-eslint/type-utils@5.62.0": version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz#286f0389c41681376cdad96b309cedd17d70346a" + resolved "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz" integrity sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew== dependencies: "@typescript-eslint/typescript-estree" "5.62.0" @@ -710,7 +715,7 @@ "@typescript-eslint/utils@5.62.0": version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.62.0.tgz#141e809c71636e4a75daa39faed2fb5f4b10df86" + resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz" integrity sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ== dependencies: "@eslint-community/eslint-utils" "^4.2.0" @@ -732,12 +737,12 @@ "@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" + resolved "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz" integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== "@vitejs/plugin-react@^4.2.0": version "4.3.1" - resolved "https://registry.yarnpkg.com/@vitejs/plugin-react/-/plugin-react-4.3.1.tgz#d0be6594051ded8957df555ff07a991fb618b48e" + resolved "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.3.1.tgz" integrity sha512-m/V2syj5CuVnaxcUJOQRel/Wr31FFXRFlnOoq1TVtkCxsY5veGMTEmpWHndrhB2U8ScHtCQB1e+4hWYExQc6Lg== dependencies: "@babel/core" "^7.24.5" @@ -760,7 +765,7 @@ acorn-walk@^8.1.1: acorn@^8.11.0, acorn@^8.4.1, acorn@^8.9.0: version "8.12.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.12.1.tgz#71616bdccbe25e27a54439e0046e89ca76df2248" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz" integrity sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg== ajv@^6.12.4: @@ -931,7 +936,7 @@ asynckit@^0.4.0: autoprefixer@^10.4.14: version "10.4.20" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.20.tgz#5caec14d43976ef42e32dcb4bd62878e96be5b3b" + resolved "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz" integrity sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g== dependencies: browserslist "^4.23.3" @@ -1181,7 +1186,7 @@ debug@^3.2.7: dependencies: ms "^2.1.1" -debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: +debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@~4.3.1, debug@~4.3.2: version "4.3.6" resolved "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz" integrity sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg== @@ -1247,7 +1252,7 @@ doctrine@^2.1.0: doctrine@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + resolved "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz" integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== dependencies: esutils "^2.0.2" @@ -1280,6 +1285,22 @@ emoji-regex@^9.2.2: resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz" integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== +engine.io-client@~6.5.2: + version "6.5.4" + resolved "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.5.4.tgz" + integrity sha512-GeZeeRjpD2qf49cZQ0Wvh/8NJNfeXkXXcoGh+F77oEAgo9gUHwT1fCRxSNU+YEEaysOJTnsFHmM5oAcPy4ntvQ== + dependencies: + "@socket.io/component-emitter" "~3.1.0" + debug "~4.3.1" + engine.io-parser "~5.2.1" + ws "~8.17.1" + xmlhttprequest-ssl "~2.0.0" + +engine.io-parser@~5.2.1: + version "5.2.3" + resolved "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz" + integrity sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q== + enhanced-resolve@^5.12.0: version "5.17.1" resolved "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz" @@ -1418,7 +1439,7 @@ es-to-primitive@^1.2.1: esbuild@^0.18.10: version "0.18.20" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.18.20.tgz#4709f5a34801b43b799ab7d6d82f7284a9b7a7a6" + resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz" integrity sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA== optionalDependencies: "@esbuild/android-arm" "0.18.20" @@ -1461,7 +1482,7 @@ escape-string-regexp@^4.0.0: eslint-config-prettier@^8.6.0: version "8.10.0" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz#3a06a662130807e2502fc3ff8b4143d8a0658e11" + resolved "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz" integrity sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg== eslint-import-resolver-node@^0.3.9: @@ -1475,7 +1496,7 @@ eslint-import-resolver-node@^0.3.9: eslint-import-resolver-typescript@^3.5.2: version "3.6.1" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.1.tgz#7b983680edd3f1c5bce1a5829ae0bc2d57fe9efa" + resolved "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.1.tgz" integrity sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg== dependencies: debug "^4.3.4" @@ -1495,7 +1516,7 @@ eslint-module-utils@^2.7.4, eslint-module-utils@^2.8.0: eslint-plugin-import@^2.27.5: version "2.29.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz#d45b37b5ef5901d639c15270d74d46d161150643" + resolved "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz" integrity sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw== dependencies: array-includes "^3.1.7" @@ -1525,12 +1546,12 @@ eslint-plugin-prettier@^4.2.1: eslint-plugin-react-hooks@^4.6.0: version "4.6.2" - resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz#c829eb06c0e6f484b3fbb85a97e57784f328c596" + resolved "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz" integrity sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ== eslint-plugin-react@^7.32.1: version "7.35.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.35.0.tgz#00b1e4559896710e58af6358898f2ff917ea4c41" + resolved "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.35.0.tgz" integrity sha512-v501SSMOWv8gerHkk+IIQBkcGRGrO2nfybfj5pLxuJNFTPxxA3PSryhXTK+9pNbtkggheDdsC0E9Q8CuPk6JKA== dependencies: array-includes "^3.1.8" @@ -1554,7 +1575,7 @@ eslint-plugin-react@^7.32.1: eslint-scope@^5.1.1: version "5.1.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz" integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== dependencies: esrecurse "^4.3.0" @@ -1562,7 +1583,7 @@ eslint-scope@^5.1.1: eslint-scope@^7.2.2: version "7.2.2" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz" integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== dependencies: esrecurse "^4.3.0" @@ -1575,7 +1596,7 @@ eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4 eslint@^8.43.0: version "8.57.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.0.tgz#c786a6fd0e0b68941aaf624596fb987089195668" + resolved "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz" integrity sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ== dependencies: "@eslint-community/eslint-utils" "^4.2.0" @@ -1619,7 +1640,7 @@ eslint@^8.43.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" + resolved "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz" integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== dependencies: acorn "^8.9.0" @@ -1628,7 +1649,7 @@ espree@^9.6.0, espree@^9.6.1: esquery@^1.4.2: version "1.6.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.6.0.tgz#91419234f804d852a82dceec3e16cdc22cf9dae7" + resolved "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz" integrity sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg== dependencies: estraverse "^5.1.0" @@ -1642,7 +1663,7 @@ esrecurse@^4.3.0: estraverse@^4.1.1: version "4.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: @@ -1700,7 +1721,7 @@ fastq@^1.6.0: 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" + resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz" integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== dependencies: flat-cache "^3.0.4" @@ -1722,7 +1743,7 @@ find-up@^5.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" + resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz" integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw== dependencies: flatted "^3.2.9" @@ -1770,7 +1791,7 @@ fraction.js@^4.3.7: fs.realpath@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== fsevents@~2.3.2: @@ -1858,7 +1879,7 @@ glob@^10.3.10: glob@^7.1.3: version "7.2.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== dependencies: fs.realpath "^1.0.0" @@ -1875,7 +1896,7 @@ globals@^11.1.0: globals@^13.19.0: version "13.24.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.24.0.tgz#8432a19d78ce0c1e833949c36adb345400bb1171" + resolved "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz" integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ== dependencies: type-fest "^0.20.2" @@ -1988,7 +2009,7 @@ imurmurhash@^0.1.4: inflight@^1.0.4: version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== dependencies: once "^1.3.0" @@ -1996,7 +2017,7 @@ inflight@^1.0.4: inherits@2: version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== internal-slot@^1.0.7: @@ -2291,7 +2312,7 @@ json5@^2.2.3: keyv@^4.5.3: version "4.5.4" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" + resolved "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz" integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== dependencies: json-buffer "3.0.1" @@ -2437,7 +2458,7 @@ nanoid@^3.3.7: natural-compare-lite@^1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz#17b09581988979fddafe0201e931ba933c96cbb4" + resolved "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz" integrity sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g== natural-compare@^1.4.0: @@ -2537,7 +2558,7 @@ object.values@^1.1.6, object.values@^1.1.7, object.values@^1.2.0: once@^1.3.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== dependencies: wrappy "1" @@ -2602,7 +2623,7 @@ path-exists@^4.0.0: 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" + resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== path-key@^3.1.0: @@ -2720,12 +2741,12 @@ prettier-linter-helpers@^1.0.0: prettier-plugin-tailwindcss@^0.2.5: version "0.2.8" - resolved "https://registry.yarnpkg.com/prettier-plugin-tailwindcss/-/prettier-plugin-tailwindcss-0.2.8.tgz#e9c0356680331f909a86fefe8fc2b247c21e23a2" + resolved "https://registry.npmjs.org/prettier-plugin-tailwindcss/-/prettier-plugin-tailwindcss-0.2.8.tgz" integrity sha512-KgPcEnJeIijlMjsA6WwYgRs5rh3/q76oInqtMXBA/EMcamrcYJpyhtRhyX1ayT9hnHlHTuO8sIifHF10WuSDKg== prettier@^2.8.8: version "2.8.8" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" + resolved "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz" integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== prop-types@^15.8.1: @@ -2749,7 +2770,7 @@ punycode@^2.1.0: qs@^6.11.0: version "6.13.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.13.0.tgz#6ca3bd58439f7e245655798997787b0d88a51906" + resolved "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz" integrity sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg== dependencies: side-channel "^1.0.6" @@ -2871,14 +2892,14 @@ reusify@^1.0.4: rimraf@^3.0.2: version "3.0.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== dependencies: glob "^7.1.3" rollup@^3.27.1: version "3.29.4" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-3.29.4.tgz#4d70c0f9834146df8705bfb69a9a19c9e1109981" + resolved "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz" integrity sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw== optionalDependencies: fsevents "~2.3.2" @@ -2923,7 +2944,7 @@ semver@^6.3.1: semver@^7.3.7: version "7.6.3" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" + resolved "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz" integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== set-function-length@^1.2.1: @@ -2988,13 +3009,39 @@ snake-case@^3.0.4: dot-case "^3.0.4" tslib "^2.0.3" +socket.io-client@^4.7.5: + version "4.7.5" + resolved "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.7.5.tgz" + integrity sha512-sJ/tqHOCe7Z50JCBCXrsY3I2k03iOiUe+tj1OmKeD2lXPiGH/RUCdTZFoqVyN7l1MnpIzPrGtLcijffmeouNlQ== + dependencies: + "@socket.io/component-emitter" "~3.1.0" + debug "~4.3.2" + engine.io-client "~6.5.2" + socket.io-parser "~4.2.4" + +socket.io-parser@~4.2.4: + version "4.2.4" + resolved "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz" + integrity sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew== + dependencies: + "@socket.io/component-emitter" "~3.1.0" + debug "~4.3.1" + source-map-js@^1.2.0: version "1.2.0" resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz" integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg== -"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0: - name string-width-cjs +"string-width-cjs@npm:string-width@^4.2.0": + version "4.2.3" + resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string-width@^4.1.0: version "4.2.3" resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -3066,7 +3113,14 @@ string.prototype.trimstart@^1.0.8: define-properties "^1.2.1" es-object-atoms "^1.0.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: +"strip-ansi-cjs@npm:strip-ansi@^6.0.1": + version "6.0.1" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -3129,7 +3183,7 @@ svg-parser@^2.0.4: tailwindcss@^3.3.1: version "3.4.9" - resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.4.9.tgz#9e04cddce1924d530df62af37d3520f0e2a9d85e" + resolved "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.9.tgz" integrity sha512-1SEOvRr6sSdV5IDf9iC+NU4dhwdqzF4zKKq3sAbasUWHEM6lsMhX+eNN5gkPx1BvLFEnZQEUFbXnGj8Qlp83Pg== dependencies: "@alloc/quick-lru" "^5.2.0" @@ -3256,7 +3310,7 @@ type-check@^0.4.0, type-check@~0.4.0: type-fest@^0.20.2: version "0.20.2" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz" integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== typed-array-buffer@^1.0.2: @@ -3305,7 +3359,7 @@ typed-array-length@^1.0.6: typescript@^5.1.6: version "5.5.4" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.5.4.tgz#d9852d6c82bad2d2eda4fd74a5762a8f5909e9ba" + resolved "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz" integrity sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q== unbox-primitive@^1.0.2: @@ -3340,7 +3394,7 @@ uri-js@^4.2.2: use-sync-external-store@1.2.2: version "1.2.2" - resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.2.2.tgz#c3b6390f3a30eba13200d2302dcdf1e7b57b2ef9" + resolved "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.2.tgz" integrity sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw== util-deprecate@^1.0.2: @@ -3364,7 +3418,7 @@ vite-plugin-svgr@^4.2.0: vite-tsconfig-paths@^4.2.0: version "4.3.2" - resolved "https://registry.yarnpkg.com/vite-tsconfig-paths/-/vite-tsconfig-paths-4.3.2.tgz#321f02e4b736a90ff62f9086467faf4e2da857a9" + resolved "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-4.3.2.tgz" integrity sha512-0Vd/a6po6Q+86rPlntHye7F31zA2URZMbH8M3saAZ/xR9QoGN/L21bxEGfXdWmFdNkqPpRdxFT7nmNe12e9/uA== dependencies: debug "^4.1.1" @@ -3373,7 +3427,7 @@ vite-tsconfig-paths@^4.2.0: vite@^4.3.9: version "4.5.3" - resolved "https://registry.yarnpkg.com/vite/-/vite-4.5.3.tgz#d88a4529ea58bae97294c7e2e6f0eab39a50fb1a" + resolved "https://registry.npmjs.org/vite/-/vite-4.5.3.tgz" integrity sha512-kQL23kMeX92v3ph7IauVkXkikdDRsYMGTVl5KY2E9OY4ONLvkHf04MDTbnfo6NKxZiDLWzVpP5oTa8hQD8U3dg== dependencies: esbuild "^0.18.10" @@ -3464,9 +3518,19 @@ wrap-ansi@^8.1.0: wrappy@1: version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== +ws@~8.17.1: + version "8.17.1" + resolved "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz" + integrity sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ== + +xmlhttprequest-ssl@~2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz" + integrity sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A== + yallist@^3.0.2: version "3.1.1" resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz" @@ -3489,7 +3553,7 @@ yocto-queue@^0.1.0: zustand@^4.5.5: version "4.5.5" - resolved "https://registry.yarnpkg.com/zustand/-/zustand-4.5.5.tgz#f8c713041543715ec81a2adda0610e1dc82d4ad1" + resolved "https://registry.npmjs.org/zustand/-/zustand-4.5.5.tgz" integrity sha512-+0PALYNJNgK6hldkgDq2vLrw5f6g/jCInz52n9RTpropGgeAf/ioFUCdtsjCqu4gNhW9D01rUQBROoRjdzyn2Q== dependencies: use-sync-external-store "1.2.2" From 418cdf5eb8de49ba2a62a1d94474ae3289359cfc Mon Sep 17 00:00:00 2001 From: G-hoon Date: Sun, 25 Aug 2024 19:51:47 +0900 Subject: [PATCH 3/4] =?UTF-8?q?[feat/#20]=20=EA=B7=B8=EB=A3=B9=20=EC=82=AC?= =?UTF-8?q?=EC=9D=B4=EB=93=9C=20=EB=84=A4=EB=B9=84=EA=B2=8C=EC=9D=B4?= =?UTF-8?q?=EC=85=98=20=EB=A7=88=ED=81=AC=EC=97=85=20=EB=A7=88=EB=AC=B4?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/Posture/PostrueCrew.tsx | 64 ++++++++++++++++++-------- src/components/SelectBox.tsx | 52 +++++++++++++++++++++ src/layouts/Layout.tsx | 2 +- src/pages/MonitoringPage.tsx | 6 +-- 4 files changed, 101 insertions(+), 23 deletions(-) create mode 100644 src/components/SelectBox.tsx diff --git a/src/components/Posture/PostrueCrew.tsx b/src/components/Posture/PostrueCrew.tsx index c8fdd0f..29c7bf3 100644 --- a/src/components/Posture/PostrueCrew.tsx +++ b/src/components/Posture/PostrueCrew.tsx @@ -1,6 +1,7 @@ import CloseCrewPanelIcon from "@assets/icons/crew-panel-close-button.svg?react" import QuestionIcon from "@assets/icons/question-info-icon.svg?react" import { useEffect, useState } from "react" +import SelectBox from "@components/SelectBox" interface IPostureCrew { groupUserId: number @@ -17,8 +18,9 @@ interface PostureCrewProps { export default function PostrueCrew(props: PostureCrewProps) { const { toggleSidebar } = props const [crews, setCrews] = useState([]) - // const [isConnected, setIsConnected] = useState(false) + const [isConnected, setIsConnected] = useState<"loading" | "success" | "disconnected">("loading") const [isEnabled, setIsEnabled] = useState(true) + const [notiAlarmTime, setNotiAlarmTime] = useState("틀어진 즉시") useEffect(() => { const token = @@ -27,7 +29,7 @@ export default function PostrueCrew(props: PostureCrewProps) { socket.onopen = () => { console.log("WebSocket connected") - // setIsConnected(true) + setIsConnected("success") } socket.onmessage = (event) => { @@ -41,7 +43,7 @@ export default function PostrueCrew(props: PostureCrewProps) { socket.onclose = (event) => { console.log("WebSocket disconnected. Code:", event.code, "Reason:", event.reason) - // setIsConnected(false) + setIsConnected("disconnected") } return () => { @@ -53,14 +55,18 @@ export default function PostrueCrew(props: PostureCrewProps) { toggleSidebar() } + const onClickNotiAlarmTime = (value: string) => { + setNotiAlarmTime(value) + } + return ( -
- -
+
- 자세 알림 + 자세 알림
-
- 자세 랭킹 - + +
+ +
+ +
+ 자세 랭킹 + + +
- {crews.length === 0 ? ( + {isConnected === "loading" &&

서버와 연결 중입니다.

} + {isConnected === "disconnected" &&

서버와 연결 끊어졌습니다.

} + {isConnected === "success" && crews.length === 0 && (

접속자가 없습니다.

- ) : ( + )} + {isConnected === "success" && crews.length > 0 && (
    {crews.map((user, index) => ( -
  • -
    - {user.rank} - {user.nickname} +
  • +
    +
    + + {user.rank} + + {user.nickname} +
    + {user.score}회
    - {user.score}회
  • ))}
diff --git a/src/components/SelectBox.tsx b/src/components/SelectBox.tsx new file mode 100644 index 0000000..d400de2 --- /dev/null +++ b/src/components/SelectBox.tsx @@ -0,0 +1,52 @@ +import { useState } from "react" + +interface SelectBoxProps { + value: string + options: string[] + onClick: (selectedValue: string) => void +} + +export default function SelectBox(props: SelectBoxProps) { + const { value, options, onClick } = props + const [isOpen, setIsOpen] = useState(false) + + const toggleDropdown = () => setIsOpen(!isOpen) + + const handleOptionClick = (option: string) => { + onClick(option) + setIsOpen(false) + } + + return ( +
+
+ {value} + + + +
+ {isOpen && ( +
+ {options.map((option) => ( +
handleOptionClick(option)} + > + {option} +
+ ))} +
+ )} +
+ ) +} diff --git a/src/layouts/Layout.tsx b/src/layouts/Layout.tsx index e833c1d..a49649d 100644 --- a/src/layouts/Layout.tsx +++ b/src/layouts/Layout.tsx @@ -9,7 +9,7 @@ const Layout: React.FC = () => { {/* Main Content */} -
+
diff --git a/src/pages/MonitoringPage.tsx b/src/pages/MonitoringPage.tsx index f919550..b62cdd7 100644 --- a/src/pages/MonitoringPage.tsx +++ b/src/pages/MonitoringPage.tsx @@ -23,7 +23,7 @@ const MonitoringPage: React.FC = () => { {/* 사이드바 */}
@@ -32,8 +32,8 @@ const MonitoringPage: React.FC = () => { {/* 토글 버튼 */} {!isSidebarOpen && ( - )}
From 6725f10067ff24421707cdc4442dc5f578ce740f Mon Sep 17 00:00:00 2001 From: G-hoon Date: Sun, 25 Aug 2024 20:49:40 +0900 Subject: [PATCH 4/4] =?UTF-8?q?[feat/#20]=20=EA=B7=B8=EB=A3=B9=20=EA=B4=80?= =?UTF-8?q?=EB=A0=A8=20=EB=A7=88=ED=81=AC=EC=97=85=20=EB=A7=88=EB=AC=B4?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/assets/icons/more-icon.svg | 20 ----- src/assets/images/ranking-guide.png | Bin 0 -> 43720 bytes src/components/Posture/PostrueCrew.tsx | 118 ++++++++++++++----------- src/pages/MonitoringPage.tsx | 2 +- 4 files changed, 67 insertions(+), 73 deletions(-) delete mode 100644 src/assets/icons/more-icon.svg create mode 100644 src/assets/images/ranking-guide.png diff --git a/src/assets/icons/more-icon.svg b/src/assets/icons/more-icon.svg deleted file mode 100644 index ad4632f..0000000 --- a/src/assets/icons/more-icon.svg +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/src/assets/images/ranking-guide.png b/src/assets/images/ranking-guide.png new file mode 100644 index 0000000000000000000000000000000000000000..d40137346ad84698f3c613063060c5744a9a3927 GIT binary patch literal 43720 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 KMNUMnLSTZWH5ljs literal 0 HcmV?d00001 diff --git a/src/components/Posture/PostrueCrew.tsx b/src/components/Posture/PostrueCrew.tsx index 29c7bf3..13462a8 100644 --- a/src/components/Posture/PostrueCrew.tsx +++ b/src/components/Posture/PostrueCrew.tsx @@ -1,5 +1,7 @@ import CloseCrewPanelIcon from "@assets/icons/crew-panel-close-button.svg?react" import QuestionIcon from "@assets/icons/question-info-icon.svg?react" +import PostureGuide from "@assets/icons/posture-guide-button-icon.svg?react" +import RankingGuideToolTip from "@assets/images/ranking-guide.png" import { useEffect, useState } from "react" import SelectBox from "@components/SelectBox" @@ -60,67 +62,79 @@ export default function PostrueCrew(props: PostureCrewProps) { } return ( -
+
-
-
- 자세 알림 +
+
+
+ 자세 알림 +
+ +
-
-
- 자세 랭킹 - +
+
+ 자세 랭킹 + +
- -
-
- {isConnected === "loading" &&

서버와 연결 중입니다.

} - {isConnected === "disconnected" &&

서버와 연결 끊어졌습니다.

} - {isConnected === "success" && crews.length === 0 && ( -

접속자가 없습니다.

- )} - {isConnected === "success" && crews.length > 0 && ( -
    - {crews.map((user, index) => ( -
  • -
    -
    - - {user.rank} - - {user.nickname} +
    + 랭킹 가이드 +
    +
    +
    + {isConnected === "loading" &&

    서버와 연결 중입니다.

    } + {isConnected === "disconnected" &&

    서버와 연결 끊어졌습니다.

    } + {isConnected === "success" && crews.length === 0 && ( +

    접속자가 없습니다.

    + )} + {isConnected === "success" && crews.length > 0 && ( +
      + {crews.map((user, index) => ( +
    • +
      +
      + + {user.rank} + + {user.nickname} +
      + {user.score}회
      - {user.score}회 -
    -
  • - ))} -
- )} + + ))} + + )} +
+
+
+
+ + 바른자세 가이드 +
) diff --git a/src/pages/MonitoringPage.tsx b/src/pages/MonitoringPage.tsx index b62cdd7..16535db 100644 --- a/src/pages/MonitoringPage.tsx +++ b/src/pages/MonitoringPage.tsx @@ -32,7 +32,7 @@ const MonitoringPage: React.FC = () => { {/* 토글 버튼 */} {!isSidebarOpen && ( - )}