Untitled

 avatar
unknown
plain_text
24 days ago
9.0 kB
2
Indexable
"use client";

import React from 'react';
import { useMetrics } from '@/hooks/useMetrics';
import { AppSidebar } from "@/components/app-sidebar";
import {
  Breadcrumb,
  BreadcrumbItem,
  BreadcrumbLink,
  BreadcrumbList,
  BreadcrumbSeparator,
} from "@/components/ui/breadcrumb";
import { Separator } from "@/components/ui/separator";
import {
  SidebarInset,
  SidebarProvider,
  SidebarTrigger,
} from "@/components/ui/sidebar";
import { Card, CardHeader, CardTitle, CardContent } from "@/components/ui/card";
import { Progress } from "@/components/ui/progress";
import { Badge } from "@/components/ui/badge";
import { 
  Trophy,
  Lock, 
  Unlock, 
  Target, 
  Calendar,
  CalendarRange,
  Recycle,
  Trees,
  Leaf,
  Timer,
  Binary,
  Trash2,
  Scale,
  Network,
  BarChart,
  Flame,
  Zap,
  Share2,
  Activity,
  Star,
  SunDim,
  Snowflake,
  Bird,
  Moon,
  Sun,
  StickyNote,
  Footprints
} from 'lucide-react';
import { useTranslation, type SupportedLanguages } from "@/utils/translations";
import { useSettings } from "@/hooks/useSettings";

const AchievementsPage = () => {
  const { metrics, loading, error } = useMetrics();
  const { settings } = useSettings();
  const { t } = useTranslation(settings?.language as SupportedLanguages || 'EN');

  if (loading) return <div className="p-4">Loading achievements...</div>;
  if (error) return <div className="p-4 text-red-500">Error loading achievements</div>;
  if (!metrics) return null;

  const achievements = Object.entries(metrics.achievements);
  const unlockedCount = achievements.filter(([_, a]) => a.status === 'completed').length;
  const totalCount = achievements.length;

  const formatDate = (dateString: string) => {
    const date = new Date(dateString);
    return date.toLocaleDateString('de-DE', {
      day: '2-digit',
      month: '2-digit',
      year: 'numeric'
    });
  };

  const getAchievementTranslation = (id: string) => {
    return {
      name: t(`achievements.${id}.name`),
      description: t(`achievements.${id}.description`)
    };
  };

  const getAchievementIcon = (achievement, id: string) => {
    // First check for tier-specific trophies
    if (achievement.tier) {
      const baseSize = "w-8 h-8";
      switch (achievement.tier) {
        case 'bronze': return <Trophy className={`${baseSize} text-amber-600`} />;
        case 'silver': return <Trophy className={`${baseSize} text-gray-400`} />;
        case 'gold': return <Trophy className={`${baseSize} text-yellow-400`} />;
      }
    }

    const baseSize = "w-8 h-8 text-primary";

    // Specific achievement mappings based on achievement ID
    switch (id) {
      case 'first_sort': return <Footprints className={baseSize} />;
      case 'seasonal_master': return <SunDim className={baseSize} />;
      case 'winter_sorter': return <Snowflake className={baseSize} />;
      case 'monthly_master': return <Calendar className={baseSize} />;
      case 'paper_specialist': return <StickyNote className={baseSize} />;
      case 'early_bird': return <Bird className={baseSize} />;
      case 'night_owl': return <Moon className={baseSize} />;
      case 'weekend_warrior': return <CalendarRange className={baseSize} />;
      case 'summer_sorter': return <Sun className={baseSize} />;
      case 'recycling_specialist': return <Recycle className={baseSize} />;
      case 'quick_draw': return <Timer className={baseSize} />;
      case 'organic_specialist': return <Leaf className={baseSize} />;
      case 'residual_specialist': return <Trash2 className={baseSize} />;
      case 'tree_hero': return <Trees className={baseSize} />;
      case 'time_lord': return <Timer className={baseSize} />;
      case 'perfect_balance': return <Scale className={baseSize} />;
      case 'efficient_manager': return <BarChart className={baseSize} />;
      default: return <Star className={baseSize} />;
    }
  };

  return (
    <SidebarProvider>
      <AppSidebar />
      <SidebarInset>
        <header className="flex shrink-0 items-center gap-2 border-b px-4 py-6">
          <SidebarTrigger className="-ml-1" />
          <Separator orientation="vertical" className="mr-2 h-4" />
          <Breadcrumb>
            <BreadcrumbList>
              <BreadcrumbItem>
                <BreadcrumbLink href="/">{t('navigation.home')}</BreadcrumbLink>
              </BreadcrumbItem>
              <BreadcrumbSeparator />
              <BreadcrumbItem>
                <BreadcrumbLink href="/achievements">{t('navigation.achievements')}</BreadcrumbLink>
              </BreadcrumbItem>
            </BreadcrumbList>
          </Breadcrumb>
        </header>

        <main className="p-4">
          <Card className="mb-6">
            <CardHeader>
              <CardTitle className="flex items-center gap-2">
                <Trophy className="w-6 h-6 text-primary" />
                {t('navigation.achievements')}
              </CardTitle>
            </CardHeader>
            <CardContent>
              <div className="flex items-center gap-4">
                <Progress value={(unlockedCount / totalCount) * 100} className="w-full" />
                <span className="text-sm font-medium">
                  {unlockedCount}/{totalCount}
                </span>
              </div>
            </CardContent>
          </Card>

          <div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4">
            {achievements.sort(([, a], [, b]) => {
              if (a.status === 'completed' && b.status !== 'completed') return -1;
              if (a.status !== 'completed' && b.status === 'completed') return 1;
              return (b.progress / b.target) - (a.progress / a.target);
            }).map(([id, achievement]) => {
              const translation = getAchievementTranslation(id);
              return (
                <Card 
                  key={id}
                  className={`relative overflow-hidden transition-all duration-200 ${
                    achievement.status === 'completed' 
                      ? 'dark:bg-gradient-to-br dark:from-primary/10 dark:to-primary/5 ' +
                        'bg-gradient-to-br from-primary/20 to-background border-primary/50 ' +
                        'shadow-lg shadow-primary/5'
                      : 'opacity-75'
                  }`}
                >
                  <CardHeader>
                    <CardTitle className="flex items-center justify-between">
                      <div className="flex items-center gap-2">
                        {getAchievementIcon(achievement, id)}
                        <span>{translation.name}</span>
                      </div>
                      {achievement.status === 'completed' ? (
                        <Unlock className="w-5 h-5 text-primary" />
                      ) : (
                        <Lock className="w-5 h-5" />
                      )}
                    </CardTitle>
                  </CardHeader>
                  <CardContent>
                    <p className="mb-4 text-sm text-muted-foreground">
                      {translation.description}
                    </p>
                    <div className="space-y-4">
                      <div className="flex items-center gap-2">
                        <Target className="w-4 h-4" />
                        <Progress 
                          value={achievement.status === 'completed' ? 100 : (achievement.progress / achievement.target) * 100} 
                          className="flex-1"
                        />
                        <span className="text-sm font-medium">
                          {achievement.status === 'completed' ? achievement.target : achievement.progress}/{achievement.target}
                        </span>
                      </div>
                      {achievement.unlock_date && (
                        <div className="flex items-center gap-2 text-sm text-muted-foreground">
                          <Calendar className="w-4 h-4" />
                          <span>Unlocked: {formatDate(achievement.unlock_date)}</span>
                        </div>
                      )}
                      {achievement.tier && (
                        <Badge variant={
                          achievement.tier === 'gold' ? 'default' :
                          achievement.tier === 'silver' ? 'secondary' :
                          'outline'
                        }>
                          {achievement.tier.charAt(0).toUpperCase() + achievement.tier.slice(1)} Tier
                        </Badge>
                      )}
                    </div>
                  </CardContent>
                </Card>
              );
            })}
          </div>
        </main>
      </SidebarInset>
    </SidebarProvider>
  );
};

export default AchievementsPage;
Leave a Comment