This commit is contained in:
rngsurrounded
2025-03-04 01:22:17 +09:00
6 changed files with 113 additions and 8 deletions
@@ -0,0 +1,64 @@
import * as React from "react"
import * as AccordionPrimitive from "@radix-ui/react-accordion"
import { ChevronDownIcon } from "lucide-react"
import { cn } from "@/shared/lib/utils"
function Accordion({
...props
}: React.ComponentProps<typeof AccordionPrimitive.Root>) {
return <AccordionPrimitive.Root data-slot="accordion" {...props} />
}
function AccordionItem({
className,
...props
}: React.ComponentProps<typeof AccordionPrimitive.Item>) {
return (
<AccordionPrimitive.Item
data-slot="accordion-item"
className={cn("border-b last:border-b-0", className)}
{...props}
/>
)
}
function AccordionTrigger({
className,
children,
...props
}: React.ComponentProps<typeof AccordionPrimitive.Trigger>) {
return (
<AccordionPrimitive.Header className="flex">
<AccordionPrimitive.Trigger
data-slot="accordion-trigger"
className={cn(
"focus-visible:border-ring focus-visible:ring-ring/50 flex flex-1 items-start justify-between gap-4 rounded-md py-4 text-left text-sm font-medium transition-all outline-none hover:underline focus-visible:ring-[3px] disabled:pointer-events-none disabled:opacity-50 [&[data-state=open]>svg]:rotate-180",
className
)}
{...props}
>
{children}
<ChevronDownIcon className="text-muted-foreground pointer-events-none size-4 shrink-0 translate-y-0.5 transition-transform duration-200" />
</AccordionPrimitive.Trigger>
</AccordionPrimitive.Header>
)
}
function AccordionContent({
className,
children,
...props
}: React.ComponentProps<typeof AccordionPrimitive.Content>) {
return (
<AccordionPrimitive.Content
data-slot="accordion-content"
className="data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down overflow-hidden text-sm"
{...props}
>
<div className={cn("pt-0 pb-4", className)}>{children}</div>
</AccordionPrimitive.Content>
)
}
export { Accordion, AccordionItem, AccordionTrigger, AccordionContent }
@@ -3,7 +3,11 @@ import { CompetitionGrid } from "./modules/CompetitionsGrid";
import { Tabs, TabsList, TabsTrigger } from "@/components/ui/tabs";
import { useQuery } from "@tanstack/react-query";
import { getCompetitions } from "@/shared/api/competitions";
import { NoCompetitions } from "./modules/NoCompetitions";
import {
NoActiveCompetitions,
NoCompetitions,
NoCompletedCompetitions,
} from "./modules/NoCompetitions";
import { TabsContent } from "@radix-ui/react-tabs";
import { Loading } from "@/components/ui/loading";
import { CompetitionState } from "@/shared/types/competition";
@@ -54,8 +58,8 @@ const CompetitionsPage = () => {
return (
<div className="flex flex-col gap-6 sm:gap-8">
{(activeCompetitionsQuery.data ?? []).length > 0 && (
<Section>
<Tabs value={activeTab} onValueChange={setActiveTab}>
<Tabs value={activeTab} onValueChange={setActiveTab} asChild>
<Section>
<SectionHeader>
<SectionTitle>Мои события</SectionTitle>
@@ -70,14 +74,22 @@ const CompetitionsPage = () => {
</SectionHeader>
<TabsContent value={CompetitionTab.ONGOING} asChild>
<CompetitionGrid competitions={startedCompetitions} />
{startedCompetitions.length > 0 ? (
<CompetitionGrid competitions={startedCompetitions} />
) : (
<NoActiveCompetitions />
)}
</TabsContent>
<TabsContent value={CompetitionTab.COMPLETED} asChild>
<CompetitionGrid competitions={finishedCompetitions} />
{finishedCompetitions.length > 0 ? (
<CompetitionGrid competitions={finishedCompetitions} />
) : (
<NoCompletedCompetitions />
)}
</TabsContent>
</Tabs>
</Section>
</Section>
</Tabs>
)}
<Section>
@@ -13,3 +13,27 @@ export const NoCompetitions = () => {
</div>
);
};
export const NoActiveCompetitions = () => {
return (
<div className="flex flex-col items-center gap-4">
<Ban size={32} />
<div className="flex flex-col items-center gap-2">
<h2 className="text-2xl font-semibold">Нет активных событий</h2>
<p className="text-muted-foreground text-lg">Начните новое</p>
</div>
</div>
);
};
export const NoCompletedCompetitions = () => {
return (
<div className="flex flex-col items-center gap-4">
<Ban size={32} />
<div className="flex flex-col items-center gap-2">
<h2 className="text-2xl font-semibold">Завершенных событий нет</h2>
<p className="text-muted-foreground text-lg">Завершите начатое</p>
</div>
</div>
);
};
@@ -1,4 +1,3 @@
import { User } from "@/shared/types/user";
import { UserInfo } from "./widgets/user-info";
import { UserAchievements } from "./widgets/user-achievements";
import { UserStats } from "./widgets/user-stats";