Skip to content

Commit

Permalink
Merge branch 'refactoring' into development
Browse files Browse the repository at this point in the history
# Conflicts:
#	client/src/pages/game.page.tsx
  • Loading branch information
Timtam committed Feb 1, 2025
2 parents e618d47 + e18e5ef commit dc71833
Show file tree
Hide file tree
Showing 29 changed files with 429 additions and 370 deletions.
18 changes: 0 additions & 18 deletions client/.eslintrc.cjs

This file was deleted.

4 changes: 2 additions & 2 deletions client/src/events.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,9 @@ export interface SfxData {
pan?: number
}

export interface PlaySfxData extends SfxData {}
export type PlaySfxData = SfxData

export interface SfxEndedData extends SfxData {}
export type SfxEndedData = SfxData

export interface GuessedData {
player: Player
Expand Down
6 changes: 3 additions & 3 deletions client/src/hooks.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,15 +27,15 @@ export const useRevalidateOnInterval = ({
const intervalId = setInterval(revalidate, interval)
return () => clearInterval(intervalId)
},
[revalidate],
[enabled, interval, revalidate],
)
}

export const useModalShown = (): boolean => {
let [shown, setShown] = useState(false)
const [shown, setShown] = useState(false)

useEffect(() => {
let id = setInterval(() => {
const id = setInterval(() => {
setShown(document.querySelector(".modal") !== null)
}, 50)

Expand Down
20 changes: 10 additions & 10 deletions client/src/layout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -24,17 +24,17 @@ const updateUserAuth = async () => {
}

export default function Layout() {
let {
const {
t,
i18n: { language },
} = useTranslation()
let [cookies] = useCookies(["user"])
let [user, setUser] = useState<User | null>(null)
let [loading, setLoading] = useState(true)
let [colorScheme] = useLocalStorage("colorScheme", "auto")
let [welcome, setWelcome] = useLocalStorage("welcome")
let prefersColorScheme = usePrefersColorScheme()
let [error, setError] = useState<string | undefined>(undefined)
const [cookies] = useCookies(["user"])
const [user, setUser] = useState<User | null>(null)
const [loading, setLoading] = useState(true)
const [colorScheme] = useLocalStorage("colorScheme", "auto")
const [welcome, setWelcome] = useLocalStorage("welcome")
const prefersColorScheme = usePrefersColorScheme()
const [error, setError] = useState<string | undefined>(undefined)

useEffect(() => {
let timer: ReturnType<typeof setTimeout> | null = null
Expand All @@ -43,7 +43,7 @@ export default function Layout() {
if (timer !== null) clearTimeout(timer)

try {
let user = User.parse({
const user = User.parse({
name: cookies.user.name,
id: cookies.user.id,
virtual: cookies.user.virtual,
Expand Down Expand Up @@ -73,7 +73,7 @@ export default function Layout() {
return () => {
if (timer !== null) clearTimeout(timer)
}
}, [cookies])
}, [cookies, loading])

useEffect(() => {
document.documentElement.lang = language
Expand Down
79 changes: 45 additions & 34 deletions client/src/main.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,42 +9,50 @@ import "./i18n"
import "./index.css"
import Layout from "./layout"
import ErrorPage from "./pages/error-page"
import { Game, loader as GameLoader } from "./pages/game"
import { Lobby, loader as LobbyLoader } from "./pages/lobby"
import { Login, action as LoginAction } from "./pages/login"
import {
Registration,
action as RegistrationAction,
} from "./pages/registration"
import GameLoader from "./pages/game.loader"
import Game from "./pages/game.page"
import LobbyLoader from "./pages/lobby.loader"
import Lobby from "./pages/lobby.page"
import LoginAction from "./pages/login.action"
import Login from "./pages/login.page"
import RegistrationAction from "./pages/registration.action"
import Registration from "./pages/registration.page"

const router = createBrowserRouter([
const router = createBrowserRouter(
[
{
element: <Layout />,
children: [
{
element: <Lobby />,
path: "/",
loader: LobbyLoader,
},
{
element: <Registration />,
path: "/register",
action: RegistrationAction,
},
{
element: <Login />,
path: "/login",
action: LoginAction,
},
{
element: <Game />,
path: "/game/:gameId",
loader: GameLoader,
},
],
errorElement: <ErrorPage />,
},
],
{
element: <Layout />,
children: [
{
element: <Lobby />,
path: "/",
loader: LobbyLoader,
},
{
element: <Registration />,
path: "/register",
action: RegistrationAction,
},
{
element: <Login />,
path: "/login",
action: LoginAction,
},
{
element: <Game />,
path: "/game/:gameId",
loader: GameLoader,
},
],
errorElement: <ErrorPage />,
future: {
v7_relativeSplatPath: true,
},
},
])
)

ReactDOM.createRoot(document.getElementById("root")!).render(
<React.StrictMode>
Expand All @@ -57,7 +65,10 @@ ReactDOM.createRoot(document.getElementById("root")!).render(
"aria-hidden": true,
}}
>
<RouterProvider router={router} />
<RouterProvider
future={{ v7_startTransition: true }}
router={router}
/>
</ToastsProvider>
</CookiesProvider>
</HelmetProvider>
Expand Down
2 changes: 1 addition & 1 deletion client/src/modals/error.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ export default function ErrorModal({
error?: string
onHide: () => void
}) {
let { t } = useTranslation()
const { t } = useTranslation()

return (
<Modal show={error !== undefined} onHide={onHide}>
Expand Down
16 changes: 8 additions & 8 deletions client/src/modals/settings.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -13,22 +13,22 @@ export default function SettingsModal({
show: boolean
onHide: () => void
}) {
let {
const {
t,
i18n: { changeLanguage, language, services },
} = useTranslation()
let [colorScheme, setColorScheme] = useLocalStorage("colorScheme", "auto")
let [musicVolume, setMusicVolume] = useLocalStorage("musicVolume", "1.0")
let [sfxVolume, setSfxVolume] = useLocalStorage("sfxVolume", "1.0")
const [colorScheme, setColorScheme] = useLocalStorage("colorScheme", "auto")
const [musicVolume, setMusicVolume] = useLocalStorage("musicVolume", "1.0")
const [sfxVolume, setSfxVolume] = useLocalStorage("sfxVolume", "1.0")

useEffect(() => {
if (!Object.keys(services.resourceStore.data).includes(language)) {
let lang = Object.keys(services.resourceStore.data).find(
const lang = Object.keys(services.resourceStore.data).find(
(langcode) => language.startsWith(langcode),
)
if (lang !== undefined) changeLanguage(lang)
}
}, [language])
}, [changeLanguage, language, services])

return (
<Modal show={show} onHide={onHide}>
Expand Down Expand Up @@ -88,13 +88,13 @@ export default function SettingsModal({
>
{Object.keys(services.resourceStore.data).map(
(langcode) => {
let nameGenerator = new Intl.DisplayNames(
const nameGenerator = new Intl.DisplayNames(
langcode,
{
type: "language",
},
)
let displayName = nameGenerator.of(langcode)
const displayName = nameGenerator.of(langcode)
return (
<ToggleButton
className="me-2"
Expand Down
2 changes: 1 addition & 1 deletion client/src/modals/shortcuts.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ export default function ShortcutsModal({
show: boolean
onHide: () => void
}) {
let { t } = useTranslation()
const { t } = useTranslation()

return (
<Modal show={show} onHide={onHide}>
Expand Down
8 changes: 4 additions & 4 deletions client/src/modals/welcome.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -16,14 +16,14 @@ export default function WelcomModale({
show: boolean
onHide: () => void
}) {
let { t } = useTranslation()
let [packs, setPacks] = useState<Record<string, number>>({})
const { t } = useTranslation()
const [packs, setPacks] = useState<Record<string, number>>({})

useEffect(() => {
if (show) {
;(async () => {
let hs = new HitService()
let availablePacks = await hs.getAllPacks()
const hs = new HitService()
const availablePacks = await hs.getAllPacks()
setPacks(availablePacks)
})()
EventManager.publish(Events.popup)
Expand Down
10 changes: 5 additions & 5 deletions client/src/navigation.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,11 @@ import SettingsModal from "./modals/settings"
import ShortcutsModal from "./modals/shortcuts"

export default function Navigation({ user }: { user: User | null }) {
let navigate = useNavigate()
const navigate = useNavigate()
const { t } = useTranslation()
let [showSettings, setShowSettings] = useState(false)
let [showShortcuts, setShowShortcuts] = useState(false)
let [_, setWelcome] = useLocalStorage("welcome")
const [showSettings, setShowSettings] = useState(false)
const [showShortcuts, setShowShortcuts] = useState(false)
const [, setWelcome] = useLocalStorage("welcome")

return (
<>
Expand Down Expand Up @@ -131,7 +131,7 @@ export default function Navigation({ user }: { user: User | null }) {
<NavDropdown.Item as="div" className="me-2">
<Nav.Link
onClick={async () => {
let res = await fetch(
const res = await fetch(
"/api/users/logout",
{
method: "POST",
Expand Down
20 changes: 11 additions & 9 deletions client/src/notification-player.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import EventManager from "@lomray/event-manager"
import { ReactNode, useEffect, useRef, useState } from "react"
import { ReactNode, useCallback, useEffect, useRef, useState } from "react"
import { useToasts } from "react-bootstrap-toasts"
import { flushSync } from "react-dom"
import { createRoot } from "react-dom/client"
Expand All @@ -24,11 +24,13 @@ interface SpeechEvent {
const TIMER_DURATION: number = 150

export default function NotificationPlayer({ user }: { user: User | null }) {
let { t } = useTranslation()
let [politeness, setPoliteness] = useState<"polite" | "assertive">("polite")
let output = useRef<HTMLParagraphElement | null>(null)
let events = useRef<SpeechEvent[]>([])
let timer = useRef<ReturnType<typeof setTimeout> | null>(null)
const { t } = useTranslation()
const [politeness, setPoliteness] = useState<"polite" | "assertive">(
"polite",
)
const output = useRef<HTMLParagraphElement | null>(null)
const events = useRef<SpeechEvent[]>([])
const timer = useRef<ReturnType<typeof setTimeout> | null>(null)
const toasts = useToasts()

const nodeToString = (node: ReactNode) => {
Expand All @@ -38,7 +40,7 @@ export default function NotificationPlayer({ user }: { user: User | null }) {
return div.innerText // or innerHTML or textContent
}

const handleSpeechEvent = () => {
const handleSpeechEvent = useCallback(() => {
if (events.current.length === 0) {
if (output.current) output.current.innerHTML = ""
timer.current = null
Expand All @@ -48,7 +50,7 @@ export default function NotificationPlayer({ user }: { user: User | null }) {
if (output.current) output.current.innerHTML = events.current[0].text
events.current.shift()
timer.current = setTimeout(handleSpeechEvent, TIMER_DURATION)
}
}, [])

useEffect(() => {
const unsubscribeNotification = EventManager.subscribe(
Expand Down Expand Up @@ -346,7 +348,7 @@ export default function NotificationPlayer({ user }: { user: User | null }) {
unsubscribeSkippedHit()
unsubscribeTokenReceived()
}
}, [])
}, [handleSpeechEvent, t, toasts, user])

return (
<p
Expand Down
18 changes: 18 additions & 0 deletions client/src/pages/game.loader.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import type { LoaderFunction } from "react-router"
import { json } from "react-router-dom"
import { Game } from "../entities"
import GameService from "../services/games.service"

const loader: LoaderFunction = async ({ params }): Promise<Game> => {
const gs = new GameService()

if (params.gameId !== undefined) {
const game = await gs.get(params.gameId)

if (game !== undefined) return game
throw json({ message: "game id not found", status: 404 })
}
throw json({ message: "internal api error", status: 500 })
}

export default loader
Loading

0 comments on commit dc71833

Please sign in to comment.