diff --git a/client/package.json b/client/package.json index a1310d4..a77ec0e 100644 --- a/client/package.json +++ b/client/package.json @@ -27,7 +27,7 @@ "mediasoup-client": "^3.20.0", "react": "^19.2.7", "react-dom": "^19.2.7", - "react-router-dom": "^7.18.1", + "react-router": "^8.3.0", "socket.io-client": "^4.8.3", "three": "^0.185.1" }, diff --git a/client/src/App.tsx b/client/src/App.tsx index b4bec72..a3f3604 100644 --- a/client/src/App.tsx +++ b/client/src/App.tsx @@ -1,4 +1,4 @@ -import { Routes, Route } from 'react-router-dom'; +import { Routes, Route } from 'react-router'; import LandingPage from './pages/LandingPage'; import LobbyPage from './pages/LobbyPage'; import RoomPage from './pages/RoomPage'; diff --git a/client/src/components/ProtectedRoute.tsx b/client/src/components/ProtectedRoute.tsx index 7ce7dc3..1ac2c9b 100644 --- a/client/src/components/ProtectedRoute.tsx +++ b/client/src/components/ProtectedRoute.tsx @@ -1,4 +1,4 @@ -import { Navigate, useLocation } from 'react-router-dom'; +import { Navigate, useLocation } from 'react-router'; import { Box, CircularProgress } from '@mui/material'; import { useAuth } from '../context/AuthContext'; import type { ReactNode } from 'react'; diff --git a/client/src/components/RoomGuard.test.tsx b/client/src/components/RoomGuard.test.tsx index f50b849..28ccd1b 100644 --- a/client/src/components/RoomGuard.test.tsx +++ b/client/src/components/RoomGuard.test.tsx @@ -1,6 +1,6 @@ import { describe, it, expect, vi, beforeEach } from 'vitest'; import { render, screen } from '@testing-library/react'; -import { MemoryRouter, Routes, Route } from 'react-router-dom'; +import { MemoryRouter, Routes, Route } from 'react-router'; import RoomGuard from './RoomGuard.jsx'; import api from '../api/axios'; diff --git a/client/src/components/RoomGuard.tsx b/client/src/components/RoomGuard.tsx index ecf930d..73fc147 100644 --- a/client/src/components/RoomGuard.tsx +++ b/client/src/components/RoomGuard.tsx @@ -1,5 +1,5 @@ import { createContext, useEffect, useState, type ReactNode } from 'react'; -import { useParams, useNavigate, useLocation } from 'react-router-dom'; +import { useParams, useNavigate, useLocation } from 'react-router'; import { Box, CircularProgress } from '@mui/material'; import api from '../api/axios'; import CheckMeetingCode from '../pages/CheckMeetingCode'; diff --git a/client/src/components/UpcomingMeetings.tsx b/client/src/components/UpcomingMeetings.tsx index 4a13398..fc2b41a 100644 --- a/client/src/components/UpcomingMeetings.tsx +++ b/client/src/components/UpcomingMeetings.tsx @@ -1,5 +1,5 @@ import { useState, useEffect, useCallback } from 'react'; -import { useNavigate } from 'react-router-dom'; +import { useNavigate } from 'react-router'; import { Box, Stack, Typography, Button, IconButton, Menu, MenuItem, ListItemIcon, CircularProgress, Snackbar, Dialog, DialogTitle, DialogContent, DialogActions, diff --git a/client/src/main.tsx b/client/src/main.tsx index c098830..6600975 100644 --- a/client/src/main.tsx +++ b/client/src/main.tsx @@ -1,5 +1,5 @@ import { createRoot } from 'react-dom/client'; -import { BrowserRouter } from 'react-router-dom'; +import { BrowserRouter } from 'react-router'; import { ThemeProvider } from '@mui/material/styles'; import CssBaseline from '@mui/material/CssBaseline'; import theme from './theme/theme'; diff --git a/client/src/pages/CheckMeetingCode.tsx b/client/src/pages/CheckMeetingCode.tsx index c738896..2834c75 100644 --- a/client/src/pages/CheckMeetingCode.tsx +++ b/client/src/pages/CheckMeetingCode.tsx @@ -1,4 +1,4 @@ -import { useNavigate } from 'react-router-dom'; +import { useNavigate } from 'react-router'; import { Box, Button, Link, Paper, Stack, Typography } from '@mui/material'; import { Security as SecurityIcon } from '@mui/icons-material'; import BrandMark from '../components/BrandMark'; diff --git a/client/src/pages/LandingPage.tsx b/client/src/pages/LandingPage.tsx index 55dfc6e..fbb9554 100644 --- a/client/src/pages/LandingPage.tsx +++ b/client/src/pages/LandingPage.tsx @@ -1,5 +1,5 @@ import { useState, type FormEvent } from "react"; -import { useNavigate } from "react-router-dom"; +import { useNavigate } from "react-router"; import { motion } from "framer-motion"; import { Avatar, diff --git a/client/src/pages/LinkDiscordPage.test.tsx b/client/src/pages/LinkDiscordPage.test.tsx index 4d86e3f..e234ba1 100644 --- a/client/src/pages/LinkDiscordPage.test.tsx +++ b/client/src/pages/LinkDiscordPage.test.tsx @@ -1,5 +1,5 @@ import { render, screen } from '@testing-library/react'; -import { MemoryRouter } from 'react-router-dom'; +import { MemoryRouter } from 'react-router'; import { ThemeProvider } from '@mui/material/styles'; import { afterEach, beforeAll, describe, expect, it, vi } from 'vitest'; import theme from '../theme/theme'; diff --git a/client/src/pages/LinkDiscordPage.tsx b/client/src/pages/LinkDiscordPage.tsx index 1bc702a..27a1071 100644 --- a/client/src/pages/LinkDiscordPage.tsx +++ b/client/src/pages/LinkDiscordPage.tsx @@ -1,5 +1,5 @@ import { useEffect, useRef, useState } from 'react'; -import { useSearchParams } from 'react-router-dom'; +import { useSearchParams } from 'react-router'; import { Box, Button, CircularProgress, Paper, Stack, Typography } from '@mui/material'; import { CheckCircle as CheckCircleIcon, diff --git a/client/src/pages/LobbyPage.test.tsx b/client/src/pages/LobbyPage.test.tsx index 200b6b0..ea628dc 100644 --- a/client/src/pages/LobbyPage.test.tsx +++ b/client/src/pages/LobbyPage.test.tsx @@ -1,5 +1,5 @@ import { fireEvent, render, screen, waitFor, within } from '@testing-library/react'; -import { MemoryRouter, Route, Routes } from 'react-router-dom'; +import { MemoryRouter, Route, Routes } from 'react-router'; import { ThemeProvider } from '@mui/material/styles'; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from 'vitest'; import theme from '../theme/theme'; @@ -7,7 +7,7 @@ import theme from '../theme/theme'; // Capture router navigation without a real history. useParams stays real so the // page still reads :roomId from the route. const navigateMock = vi.fn(); -vi.mock('react-router-dom', async (importOriginal) => ({ +vi.mock('react-router', async (importOriginal) => ({ ...(await importOriginal()), useNavigate: () => navigateMock, })); diff --git a/client/src/pages/LobbyPage.tsx b/client/src/pages/LobbyPage.tsx index 6e361ee..d26d949 100644 --- a/client/src/pages/LobbyPage.tsx +++ b/client/src/pages/LobbyPage.tsx @@ -1,5 +1,5 @@ import { useContext, useEffect, useRef, type MouseEvent, type ElementType } from 'react'; -import { useNavigate, useParams } from 'react-router-dom'; +import { useNavigate, useParams } from 'react-router'; import { motion } from 'framer-motion'; import { Avatar, Box, Button, FormControl, diff --git a/client/src/pages/RoomPage.tsx b/client/src/pages/RoomPage.tsx index ccbe64f..0be13cd 100644 --- a/client/src/pages/RoomPage.tsx +++ b/client/src/pages/RoomPage.tsx @@ -1,5 +1,5 @@ import { useCallback, useContext, useEffect, useRef, useState, type ComponentProps, type FormEvent } from 'react'; -import { useParams, useNavigate, useLocation } from 'react-router-dom'; +import { useParams, useNavigate, useLocation } from 'react-router'; import { Alert, Avatar, AvatarGroup, Box, Button, Chip, Dialog, DialogActions, DialogContent, DialogTitle, IconButton, Popover, diff --git a/package-lock.json b/package-lock.json index 6bd3ed0..7bcfc1e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -57,7 +57,7 @@ "mediasoup-client": "^3.20.0", "react": "^19.2.7", "react-dom": "^19.2.7", - "react-router-dom": "^7.18.1", + "react-router": "^8.3.0", "socket.io-client": "^4.8.3", "three": "^0.185.1" }, @@ -3967,16 +3967,16 @@ "license": "MIT" }, "node_modules/brace-expansion": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.7.tgz", - "integrity": "sha512-7oFy703dxfY3/NLxC1fh2SUCQ0H9rmAY+5EpDVfXjUTTs+HEwR2nYaqLv+GWcTsumwxPfiz6CzCNkwXwBUwqCA==", + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.9.tgz", + "integrity": "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==", "dev": true, "license": "MIT", "dependencies": { "balanced-match": "^4.0.2" }, "engines": { - "node": "18 || 20 || >=22" + "node": "20 || >=22" } }, "node_modules/braces": { @@ -4250,15 +4250,15 @@ } }, "node_modules/concurrently": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-10.0.3.tgz", - "integrity": "sha512-hc3LH4UaKWd/bbyDK/IGVa4RB6PtQ3CUYwtrkzqHn+wIG3Hr5fhpRlk0L/gCa8ZE1L/Ufj50Zho69cI5w8SQBA==", + "version": "10.0.4", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-10.0.4.tgz", + "integrity": "sha512-trZql+7l/0+WRAsAnEdctr4+iiOS6ZrViI6H8QWcCF9MFS/LT0dKpe8vluB1to6it+OxSI4VospFTIFMW8DJRw==", "dev": true, "license": "MIT", "dependencies": { "chalk": "5.6.2", "rxjs": "7.8.2", - "shell-quote": "1.8.4", + "shell-quote": "1.9.0", "supports-color": "10.2.2", "tree-kill": "1.2.2", "yargs": "18.0.0" @@ -4311,6 +4311,12 @@ "node": ">= 0.6" } }, + "node_modules/cookie-es": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/cookie-es/-/cookie-es-3.1.1.tgz", + "integrity": "sha512-UaXxwISYJPTr9hwQxMFYZ7kNhSXboMXP+Z3TRX6f1/NyaGPfuNUZOWP1pUEb75B2HjfklIYLVRfWiFZJyC6Npg==", + "license": "MIT" + }, "node_modules/cookie-parser": { "version": "1.4.7", "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.7.tgz", @@ -8079,20 +8085,19 @@ "license": "MIT" }, "node_modules/react-router": { - "version": "7.18.1", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.18.1.tgz", - "integrity": "sha512-GDLgg3i3uM0aeJO3Fm+TCS+sDQ7gu12T6x0qdTEzcwqEfleci7JwugVNIF3U//0FWKnJT7ptG+20B2jfDqnZAg==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-8.3.0.tgz", + "integrity": "sha512-qyPMvW83jGIct3yiieisxdk9M745anqhpIMKN5m1t6yBMfgVPpt77aHOqs5fUlEJRMCGffg9BaQLH9oPVOL7xQ==", "license": "MIT", "dependencies": { - "cookie": "^1.0.1", - "set-cookie-parser": "^2.6.0" + "cookie-es": "^3.1.1" }, "engines": { - "node": ">=20.0.0" + "node": ">=22.22.0" }, "peerDependencies": { - "react": ">=18", - "react-dom": ">=18" + "react": ">=19.2.7", + "react-dom": ">=19.2.7" }, "peerDependenciesMeta": { "react-dom": { @@ -8100,35 +8105,6 @@ } } }, - "node_modules/react-router-dom": { - "version": "7.18.1", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.18.1.tgz", - "integrity": "sha512-KaZh+X/6UtEp28x51AUYZDMg9NGoz2ja3dNHa+ta/tk40vCzKhQ/RypCWBMLbmDr6//E24Vv5uPsrqXFozdkAg==", - "license": "MIT", - "dependencies": { - "react-router": "7.18.1" - }, - "engines": { - "node": ">=20.0.0" - }, - "peerDependencies": { - "react": ">=18", - "react-dom": ">=18" - } - }, - "node_modules/react-router/node_modules/cookie": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", - "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, "node_modules/react-transition-group": { "version": "4.4.5", "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", @@ -8403,12 +8379,6 @@ "resolved": "server", "link": true }, - "node_modules/set-cookie-parser": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz", - "integrity": "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==", - "license": "MIT" - }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", @@ -8439,9 +8409,9 @@ } }, "node_modules/shell-quote": { - "version": "1.8.4", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.4.tgz", - "integrity": "sha512-VsC6n6vz1ihYYyZZwX7YZSF5l5x36ca17OC+a69h94YqB7X6XLwf+5MOgynYir2SLFUbl8gIYvBo8K8RoNQ6bQ==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.9.0.tgz", + "integrity": "sha512-Iov+JwFv/2HcTpcwNMKd8+IWNb8tboQJNQTkAY/LLVK7gGH9jy+LGkVqPxfekHl+yMmiqXszdGWXgkfml7hjqA==", "dev": true, "license": "MIT", "engines": { @@ -8873,9 +8843,9 @@ "license": "MIT" }, "node_modules/tar": { - "version": "7.5.20", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.20.tgz", - "integrity": "sha512-9FcyK4PA6+WbzlTM9WhQm6vB5W7cP7dUiPsv1g7YDwEQnQ1CGpK3MGlKk/ITVWMk05kHZuBhmVhiv8LZoy/PFQ==", + "version": "7.5.22", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.22.tgz", + "integrity": "sha512-MFO/QzvtAOmJbkhOaCTvbGcFN9L9b+JunIsDwaKljSOdcLMea3NJ1k9Usz/rjdfSXTq4dfzfeS7W4p4YOAAHeA==", "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/fs-minipass": "^4.0.0",