}
+ icon={
+
+ }
style={{ cursor: "pointer" }}
onClick={() => handleClick(team.id)}
styles={{
itemWrapper: { width: "100%" },
- itemLabel: { width: "100%" }
+ itemLabel: { width: "100%" },
}}
w="100%"
>
diff --git a/src/features/teams/components/team-profile/header.tsx b/src/features/teams/components/team-profile/header.tsx
index 94ab769..6d08bfb 100644
--- a/src/features/teams/components/team-profile/header.tsx
+++ b/src/features/teams/components/team-profile/header.tsx
@@ -5,13 +5,19 @@ import { Team } from "../../types";
interface HeaderProps {
name: string;
logo?: string;
+ id?: string;
}
-const Header = ({ name, logo }: HeaderProps) => {
+const Header = ({ name, logo, id }: HeaderProps) => {
return (
<>
-
+
{name}
diff --git a/src/features/teams/components/team-profile/index.tsx b/src/features/teams/components/team-profile/index.tsx
index 2baaefc..9e7d1eb 100644
--- a/src/features/teams/components/team-profile/index.tsx
+++ b/src/features/teams/components/team-profile/index.tsx
@@ -36,7 +36,7 @@ const TeamProfile = ({ id }: ProfileProps) => {
];
return (
<>
-
+
diff --git a/src/features/teams/hooks/use-create-team.ts b/src/features/teams/hooks/use-create-team.ts
index cbf7bdc..513b90a 100644
--- a/src/features/teams/hooks/use-create-team.ts
+++ b/src/features/teams/hooks/use-create-team.ts
@@ -12,9 +12,6 @@ const useCreateTeam = () => {
onMutate: (data) => {
logger.info('Creating team', data);
},
- onSuccess: (team) => {
- navigate({ to: '/teams/$id', params: { id: team.id } });
- },
successMessage: 'Team created successfully!',
});
};
diff --git a/src/features/tournaments/components/edit-enrolled-teams.tsx b/src/features/tournaments/components/edit-enrolled-teams.tsx
index 0f857e2..31b7a54 100644
--- a/src/features/tournaments/components/edit-enrolled-teams.tsx
+++ b/src/features/tournaments/components/edit-enrolled-teams.tsx
@@ -34,7 +34,15 @@ const TeamItem = memo(({ team, onUnenroll, disabled }: TeamItemProps) => {
return (
-
+
{team.name}
diff --git a/src/features/tournaments/components/seed-tournament.tsx b/src/features/tournaments/components/seed-tournament.tsx
index 74fdd6a..8cafb19 100644
--- a/src/features/tournaments/components/seed-tournament.tsx
+++ b/src/features/tournaments/components/seed-tournament.tsx
@@ -27,11 +27,11 @@ interface SeedTournamentProps {
const SeedTournament: React.FC = ({
tournamentId,
- teams
+ teams,
}) => {
const [orderedTeams, setOrderedTeams] = useState(teams);
const { data: bracketPreview } = useBracketPreview(teams.length);
- const queryClient = useQueryClient()
+ const queryClient = useQueryClient();
const bracket: BracketData = useMemo(
() => ({
@@ -48,7 +48,7 @@ const SeedTournament: React.FC = ({
: undefined,
}))
),
- losers: bracketPreview.losers
+ losers: bracketPreview.losers,
}),
[bracketPreview, orderedTeams]
);
@@ -58,8 +58,8 @@ const SeedTournament: React.FC = ({
successMessage: "Tournament bracket generated successfully!",
onSuccess: () => {
queryClient.invalidateQueries({
- queryKey: tournamentKeys.details(tournamentId)
- })
+ queryKey: tournamentKeys.details(tournamentId),
+ });
},
});
@@ -99,7 +99,7 @@ const SeedTournament: React.FC = ({
};
return (
-
+
@@ -171,7 +171,16 @@ const SeedTournament: React.FC = ({
}}
/>
-
+
{team.name}
@@ -197,8 +206,8 @@ const SeedTournament: React.FC = ({
Confirm Seeding
-
-
diff --git a/src/features/tournaments/components/upcoming-tournament/enroll-team/index.tsx b/src/features/tournaments/components/upcoming-tournament/enroll-team/index.tsx
index 1a271d6..6f81647 100644
--- a/src/features/tournaments/components/upcoming-tournament/enroll-team/index.tsx
+++ b/src/features/tournaments/components/upcoming-tournament/enroll-team/index.tsx
@@ -8,12 +8,16 @@ import TeamForm from "@/features/teams/components/team-form";
import { teamQueries } from "@/features/teams/queries";
import { Team } from "@/features/teams/types";
import { useQuery } from "@tanstack/react-query";
+import { Loader } from "@mantine/core";
+import useEnrollTeam from "@/features/tournaments/hooks/use-enroll-team";
+import { useServerQuery } from "@/lib/tanstack-query/hooks";
interface EnrollTeamProps {
tournamentId: string;
+ onSubmit: () => void;
}
-const EnrollTeam = ({ tournamentId }: EnrollTeamProps) => {
+const EnrollTeam = ({ tournamentId, onSubmit }: EnrollTeamProps) => {
const { open, isOpen, toggle } = useSheet();
const { user } = useAuth();
@@ -22,14 +26,14 @@ const EnrollTeam = ({ tournamentId }: EnrollTeamProps) => {
const [showTeamForm, setShowTeamForm] = useState(!hasTeams);
const [selectedTeam, setSelectedTeam] = useState(null);
- const { data: teamData } = useQuery({
+ const { data: teamData } = useServerQuery({
...teamQueries.details(selectedTeamId!),
- enabled: !!selectedTeamId,
+ options: { enabled: !!selectedTeamId }
});
useEffect(() => {
- if (teamData?.success) {
- setSelectedTeam(teamData.data);
+ if (teamData) {
+ setSelectedTeam(teamData);
setShowTeamForm(true);
}
}, [teamData]);
@@ -71,6 +75,16 @@ const EnrollTeam = ({ tournamentId }: EnrollTeamProps) => {
};
}, [selectedTeam]);
+ const { mutate: enrollTeam, isPending: isEnrolling } = useEnrollTeam();
+ const handleEnrollTeam = (teamId: string) => {
+ enrollTeam({ tournamentId, teamId }, {
+ onSuccess: () => {
+ toggle();
+ onSubmit();
+ }
+ });
+ }
+
return (
<>
- {showTeamForm ? (
+ { isEnrolling && }
+ {showTeamForm && !isEnrolling ? (
) : (
<>
diff --git a/src/features/tournaments/components/upcoming-tournament/index.tsx b/src/features/tournaments/components/upcoming-tournament/index.tsx
index 6949d6e..056a04d 100644
--- a/src/features/tournaments/components/upcoming-tournament/index.tsx
+++ b/src/features/tournaments/components/upcoming-tournament/index.tsx
@@ -1,27 +1,21 @@
-import { useMemo } from "react";
+import { Suspense, useCallback, useMemo } from "react";
import { Tournament } from "../../types";
import { useAuth } from "@/contexts/auth-context";
-import {
- Box,
- Card,
- Divider,
- Group,
- Stack,
- Text,
-} from "@mantine/core";
+import { Box, Button, Card, Divider, Group, Stack, Text } from "@mantine/core";
import Countdown from "@/components/countdown";
import ListLink from "@/components/list-link";
import ListButton from "@/components/list-button";
-import {
- UsersIcon,
- ListIcon,
-} from "@phosphor-icons/react";
+import { UsersIcon, ListIcon } from "@phosphor-icons/react";
import EnrollTeam from "./enroll-team";
import EnrollFreeAgent from "./enroll-free-agent";
import TeamListButton from "./team-list-button";
import Header from "./header";
-import EmojiPicker from "@/features/reactions/components/emoji-picker";
-import EmojiBar from "@/features/reactions/components/emoji-bar";
+import TeamCardSkeleton from "@/features/teams/components/team-card-skeleton";
+import TeamCard from "@/features/teams/components/team-card";
+import UpdateTeam from "./update-team";
+import UnenrollTeam from "./unenroll-team";
+import { useQueryClient } from "@tanstack/react-query";
+import { tournamentKeys } from "../../queries";
const UpcomingTournament: React.FC<{ tournament: Tournament }> = ({
tournament,
@@ -43,18 +37,21 @@ const UpcomingTournament: React.FC<{ tournament: Tournament }> = ({
: new Date(tournament.start_time);
const isEnrollmentOpen = enrollmentDeadline > new Date();
+ const queryClient = useQueryClient();
+ const handleSubmit = () => {
+ queryClient.invalidateQueries({ queryKey: tournamentKeys.current })
+ }
+
+ console.log(userTeam)
+
return (
-
-
-
-
{tournament.desc && {tournament.desc}}
-
+
-
+
Enrollment
@@ -70,17 +67,29 @@ const UpcomingTournament: React.FC<{ tournament: Tournament }> = ({
)}
- {!isEnrollmentOpen && !isUserEnrolled && (
- Enrollment has been closed for this tournament.
+ {!isUserEnrolled &&!isEnrollmentOpen && (
+
+ Enrollment has been closed for this tournament.
+
)}
- {!isUserEnrolled && isEnrollmentOpen && (
+ {!isUserEnrolled &&isEnrollmentOpen && (
<>
-
+
>
)}
+
+ {
+ isUserEnrolled && <>
+ }>
+
+
+
+ { isEnrollmentOpen && }
+ >
+ }
diff --git a/src/features/tournaments/components/upcoming-tournament/unenroll-team.tsx b/src/features/tournaments/components/upcoming-tournament/unenroll-team.tsx
new file mode 100644
index 0000000..51e07a7
--- /dev/null
+++ b/src/features/tournaments/components/upcoming-tournament/unenroll-team.tsx
@@ -0,0 +1,46 @@
+import Button from "@/components/button";
+import Sheet from "@/components/sheet/sheet";
+import { useSheet } from "@/hooks/use-sheet";
+import { useCallback } from "react";
+import useUnenrollTeam from "../../hooks/use-unenroll-team";
+import { Stack, Text } from "@mantine/core";
+
+interface UnenrollTeamProps {
+ tournamentId: string;
+ teamId: string
+ onSubmit: () => void;
+}
+
+const UnenrollTeam = ({ tournamentId, teamId, onSubmit }: UnenrollTeamProps) => {
+ const { open, isOpen, toggle } = useSheet();
+ const { mutate: unenrollTeam } = useUnenrollTeam();
+ const handleUnenrollTeam = useCallback(
+ async () => {
+ await unenrollTeam({ tournamentId, teamId }, {
+ onSuccess: () => {
+ toggle();
+ onSubmit();
+ }
+ });
+ },
+ [unenrollTeam, tournamentId]
+ );
+
+ return (
+ <>
+
+
+
+
+ Are you sure you want to unenroll from this tournament? You can enroll again at any point before the deadline.
+
+
+
+
+ >
+ );
+};
+
+export default UnenrollTeam;
diff --git a/src/features/tournaments/components/upcoming-tournament/update-team.tsx b/src/features/tournaments/components/upcoming-tournament/update-team.tsx
new file mode 100644
index 0000000..e34e1fc
--- /dev/null
+++ b/src/features/tournaments/components/upcoming-tournament/update-team.tsx
@@ -0,0 +1,59 @@
+import Button from "@/components/button";
+import Sheet from "@/components/sheet/sheet";
+import { useAuth } from "@/contexts/auth-context";
+import { useSheet } from "@/hooks/use-sheet";
+import { useMemo, useState, useCallback, useEffect } from "react";
+import TeamSelectionView from "./enroll-team/team-selection-view";
+import TeamForm from "@/features/teams/components/team-form";
+import { teamQueries, useTeam } from "@/features/teams/queries";
+import { Team } from "@/features/teams/types";
+import { useQuery } from "@tanstack/react-query";
+import { Loader } from "@mantine/core";
+import useEnrollTeam from "@/features/tournaments/hooks/use-enroll-team";
+
+interface UpdateTeamProps {
+ tournamentId: string;
+ teamId: string
+}
+
+const UpdateTeam = ({ tournamentId, teamId }: UpdateTeamProps) => {
+ const { open, isOpen, toggle } = useSheet();
+
+ const { data: team } = useTeam(teamId);
+
+ const initialValues = useMemo(() => {
+ if (!team) return undefined;
+
+ return {
+ name: team.name,
+ song_id: team.song_id,
+ song_name: team.song_name,
+ song_artist: team.song_artist,
+ song_album: team.song_album,
+ song_start: team.song_start,
+ song_end: team.song_end,
+ song_image_url: team.song_image_url,
+ players: team.players?.map(player => player.id),
+ };
+ }, [team]);
+
+ return (
+ <>
+
+
+
+ close()}
+ />
+
+ >
+ );
+};
+
+export default UpdateTeam;
diff --git a/src/lib/pocketbase/util/transform-types.ts b/src/lib/pocketbase/util/transform-types.ts
index 99a67eb..c7789e7 100644
--- a/src/lib/pocketbase/util/transform-types.ts
+++ b/src/lib/pocketbase/util/transform-types.ts
@@ -22,6 +22,7 @@ export function transformTeamInfo(record: any): TeamInfo {
primary_color: record.primary_color,
accent_color: record.accent_color,
players,
+ logo: record.logo
};
}
@@ -108,7 +109,7 @@ export function transformTeam(record: any): Team {
song_artist: record.song_artist,
song_album: record.song_album,
song_start: record.song_start,
- song_end: 0,
+ song_end: record.song_end,
song_image_url: record.song_image_url,
created: record.created,
updated: record.updated,