import { Moon, Palette, Save, Sun, Undo } from "lucide-react"; import { Card, CardHeader, CardTitle, CardDescription, CardContent, } from "~/components/ui/card"; import { Label } from "~/components/ui/label"; import { cn, colors, DEFAULT_COLOR, DEFAULT_EMOJI, getColorClass, getSubjectColor, getSubjectEmoji, } from "~/lib/utils"; import { Badge } from "../ui/badge"; import { Button } from "../ui/button"; import { Separator } from "../ui/separator"; import { updateUserPreferences, useSubjects, type User } from "~/lib/api"; import EmojiInput from "./emoji-input"; import { useState } from "react"; import { toast } from "sonner"; import { useQueryClient } from "@tanstack/react-query"; import { useDisplayedTheme } from "../theme-provider"; export default function Preferences({ user }: { user: User }) { const [preferences, setPreferences] = useState(user.preferences || []); const [unsavedChanges, setUnsavedChanges] = useState(false); const { theme, setTheme } = useDisplayedTheme(); // TODO: Add a loading state and error handling const { subjects, isLoading, isError } = useSubjects(); const resetPreferences = () => { setPreferences(user.preferences || []); setUnsavedChanges(false); }; const setPref = (subjectName: string, key: string, value: string) => { const existingPreference = preferences.find((p) => p.name === subjectName); const updatedPreferences = existingPreference ? preferences.map((p) => p.name === subjectName ? { ...p, [key]: value } : p ) : [ ...preferences, Object.assign( { name: subjectName, emoji: DEFAULT_EMOJI, color: DEFAULT_COLOR }, { name: subjectName, [key]: value, } ), ]; if (!unsavedChanges) { toast("Vos changements n'ont pas été sauvegardés", { description: "N'oubliez pas de sauvegarder vos préférences en bas de la page.", duration: 3000, }); setUnsavedChanges(true); } setPreferences(updatedPreferences); }; function savePreferences() { updateUserPreferences( // Filter out any incomplete preferences preferences.filter((p) => p.name && p.emoji && p.color) ) .then(() => { // Invalidate the user query to refresh the data const queryClient = useQueryClient(); queryClient.removeQueries({ queryKey: ["user"] }); toast.success("Vos préférences ont été sauvegardé avec succès !"); setUnsavedChanges(false); }) .catch((error) => { console.error( "Erreur lors de la sauvegarde de vos préférences :", error ); toast.error("Échec de la sauvegarde. Veuillez réessayer."); }); } return (
{/* Theme card: darmode light mode */} Thème Personnalisez l'apparence de l'application. {/* TODO: Save user theme */} {/* Theme toggle button */} {/* Subject Customization Section */} Personnalisation Choisissez les couleurs et emojis des matières. {subjects .sort((a, b) => a.localeCompare(b)) .map((subjectName) => ({ subjectName, subjectEmoji: getSubjectEmoji(subjectName, preferences), subjectColor: getSubjectColor(subjectName, preferences), })) .map(({ subjectName, subjectEmoji, subjectColor }) => (
{subjectEmoji} {subjectName}
{/* Color selector */}
{colors.map((colorName) => (
{/* Emoji selector */}
setPref(subjectName, "emoji", emoji) } className="w-full bg-transparent border border-gray-300 rounded-md px-3 py-2 text-sm text-gray-900 dark:text-gray-100 focus:outline-none focus:ring-2 focus:ring-primary" />
))}
); }