diff --git a/Frontend/src/app/components/player/player-search.tsx b/Frontend/src/app/components/player/player-search.tsx index 44d925f..04e4ce2 100644 --- a/Frontend/src/app/components/player/player-search.tsx +++ b/Frontend/src/app/components/player/player-search.tsx @@ -1,10 +1,14 @@ +"use client"; + import MinecraftButton from "@/components/button/minecraft-button"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; -import { redirect } from "next/navigation"; -import { ReactElement } from "react"; +import { useRouter } from "next/navigation"; +import { FormEvent, ReactElement, useState } from "react"; import SimpleTooltip from "@/components/simple-tooltip"; +import { AppRouterInstance } from "next/dist/shared/lib/app-router-context.shared-runtime"; +import { Loader2 } from "lucide-react"; /** * Props for a player search. @@ -23,14 +27,25 @@ type PlayerSearchProps = { * @returns the search component jsx */ const PlayerSearch = ({ query }: PlayerSearchProps): ReactElement => { - const handleRedirect = async (form: FormData): Promise => { - "use server"; - redirect(`/player/${form.get("query")}`); + const router: AppRouterInstance = useRouter(); + const [loading, setLoading] = useState(false); // If the search is loading + + const handleRedirect = async ( + event: FormEvent + ): Promise => { + setLoading(true); // Start loading + event.preventDefault(); // Prevent the form from submitting + + // Get the form data + const form: FormData = new FormData(event.currentTarget); + router.push(`/player/${form.get("query")}`); }; + + // Render the search form return (
{/* Input */}
@@ -48,7 +63,12 @@ const PlayerSearch = ({ query }: PlayerSearchProps): ReactElement => { {/* Search */} - Search + + {loading && ( + + )} + Search + ); diff --git a/Frontend/src/app/components/server/server-search.tsx b/Frontend/src/app/components/server/server-search.tsx index 29732df..d94ee62 100644 --- a/Frontend/src/app/components/server/server-search.tsx +++ b/Frontend/src/app/components/server/server-search.tsx @@ -1,3 +1,5 @@ +"use client"; + import MinecraftButton from "@/components/button/minecraft-button"; import { Input } from "@/components/ui/input"; @@ -10,10 +12,12 @@ import { SelectValue, } from "@/components/ui/select"; import { capitalize } from "@/app/common/string-utils"; -import { redirect } from "next/navigation"; -import { ReactElement } from "react"; +import { useRouter } from "next/navigation"; +import { FormEvent, ReactElement, useState } from "react"; import { ServerPlatform } from "restfulmc-lib"; import SimpleTooltip from "@/components/simple-tooltip"; +import { AppRouterInstance } from "next/dist/shared/lib/app-router-context.shared-runtime"; +import { Loader2 } from "lucide-react"; /** * Props for a server search. @@ -22,7 +26,7 @@ type ServerSearchProps = { /** * The original platform to query for. */ - platform: ServerPlatform | undefined; + platform: string | undefined; /** * The original hostname to query for. @@ -41,21 +45,36 @@ const ServerSearch = ({ platform, hostname, }: ServerSearchProps): ReactElement => { - const handleRedirect = async (form: FormData): Promise => { - "use server"; - redirect(`/server/${form.get("platform")}/${form.get("hostname")}`); + const router: AppRouterInstance = useRouter(); + const [loading, setLoading] = useState(false); // If the search is loading + + const handleRedirect = async ( + event: FormEvent + ): Promise => { + setLoading(true); // Start loading + event.preventDefault(); // Prevent the form from submitting + + // Get the form data + const form: FormData = new FormData(event.currentTarget); + router.push(`/server/${form.get("platform")}/${form.get("hostname")}`); }; + + // Render the search form return (
{/* Input */}
{/* Platform Selection */}
- @@ -91,7 +110,12 @@ const ServerSearch = ({ {/* Search */} - Search + + {loading && ( + + )} + Search + );