diff --git a/app/components/details/attachment.tsx b/app/components/details/attachment.tsx index c81e126..de4823e 100644 --- a/app/components/details/attachment.tsx +++ b/app/components/details/attachment.tsx @@ -1,16 +1,16 @@ import { FileText, Image, File } from "lucide-react"; +import type { Attachment } from "~/lib/api"; -export default function AttachmentItem({ attachment }: { attachment: string }) { +export default function AttachmentItem({ attachment }: { attachment: Attachment }) { return ( - {getIcon(attachment)} + {getIcon(attachment.name)} - {getName(attachment) || "Sans Nom"} + {attachment.name} ); @@ -44,9 +44,3 @@ const getIcon = (attachment: string) => { return ; } }; - -const getName = (attachment: string) => { - const parts = attachment.replace("pj_doc", "").split("_"); - const nameParts = parts.slice(2); // remove the first two parts - return nameParts.join("_"); -}; diff --git a/app/components/home/colle-card.tsx b/app/components/home/colle-card.tsx index 7fa4a3a..1c3295c 100644 --- a/app/components/home/colle-card.tsx +++ b/app/components/home/colle-card.tsx @@ -2,7 +2,7 @@ import type { Colle, UserPreferences } from "~/lib/api"; import { Link } from "react-router"; import { Card } from "~/components/ui/card"; -import { User, Star, CalendarDays, MapPin } from "lucide-react"; +import { User, Star, CalendarDays, MapPin, Paperclip } from "lucide-react"; import { Badge } from "~/components/ui/badge"; import { cn, @@ -35,8 +35,11 @@ export default function ColleCard({ // onToggleFavorite(colle.id, newValue); // }; - const subjectColor = getColorClass(getSubjectColor(colle.subject.name, preferences)); + const subjectColor = getColorClass( + getSubjectColor(colle.subject.name, preferences) + ); const subjectEmoji = getSubjectEmoji(colle.subject.name, preferences); + const attachmentsCount = colle.attachments?.length || 0; return ( @@ -114,13 +117,12 @@ export default function ColleCard({ )} - {/* TODO: Attachments */} - {/* {colle.attachmentsCount > 0 && ( -
- - {colle.attachmentsCount} -
- )} */} + {attachmentsCount > 0 && ( +
+ + {attachmentsCount} +
+ )} diff --git a/app/lib/api.ts b/app/lib/api.ts index 5631b68..ab4d37c 100644 --- a/app/lib/api.ts +++ b/app/lib/api.ts @@ -182,7 +182,7 @@ export interface Colle { bjid?: string; // Optional field content?: string; // Optional field comment?: string; // Optional field - attachments?: string[]; // Optional field, array of attachment URLs + attachments?: Attachment[]; // Optional field, array of attachment URLs } interface CollePayload { @@ -278,6 +278,20 @@ export const useColle = (id: number) => { }; }; +export const refreshColle = async (id: number) => { + return makePostRequest( + `/colles/${id}/refresh`, + {}, + "Échec de la demande de rafraîchissement de la colle", + "POST" + ); +}; + +export interface Attachment { + path: string; + name: string; +} + /** * === SUBJECTS API === */ diff --git a/app/routes/colles.tsx b/app/routes/colles.tsx index fe1c804..df73bee 100644 --- a/app/routes/colles.tsx +++ b/app/routes/colles.tsx @@ -25,9 +25,10 @@ import ColleDetailsSkeleton from "~/components/details/skeleton-details"; import AttachmentItem from "~/components/details/attachment"; import Error from "~/components/error"; import { Badge } from "~/components/ui/badge"; -import { AUTH_ERROR, useColle, useUser } from "~/lib/api"; +import { AUTH_ERROR, refreshColle, useColle, useUser } from "~/lib/api"; import { toast } from "sonner"; import { formatDate, formatGrade, formatTime, goBack } from "~/lib/utils"; +import { useQueryClient } from "@tanstack/react-query"; // TODO: Preferences for subject colors const getSubjectColor = (_: string) => { @@ -42,10 +43,17 @@ const getSubjectEmoji = (_: string) => { // TODO: Move all code to components export default function ColleDetailPage() { const { user, isLoading: isUserLoading, error: userError } = useUser(); + const queryClient = useQueryClient(); const navigate = useNavigate(); const params = useParams<{ colleId: string }>(); + const colleId = parseInt(params.colleId!); + if (isNaN(colleId)) { + return ; + } + const { colle, error, isLoading } = useColle(colleId); + const [isReloading, setIsReloading] = useState(false); if (isUserLoading) { @@ -61,12 +69,6 @@ export default function ColleDetailPage() { // TODO: Favorite toggle function const toggleStar = () => {}; - const colleId = parseInt(params.colleId!); - if (isNaN(colleId)) { - return ; - } - - const { colle, error, isLoading } = useColle(colleId); if (error) return ( { setIsReloading(true); - // TODO: HARD RELOAD + refreshColle(colle.id) + .then(() => { + toast("Les données de cette colle vont être mises à jour", { + icon: "🔄", + description: "Rafraîchissement en cours...", + }); + }) + .catch((error) => { + console.error("Error refreshing colle:", error); + toast.error("Échec du rafraîchissement de la colle", { + icon: "❌", + description: "Veuillez réessayer plus tard.", + }); + }) + .finally(() => { + setIsReloading(false); + queryClient.invalidateQueries({ + queryKey: ["colle", colle.id], + }); + }); }; const handleShare = async () => { @@ -331,12 +352,11 @@ export default function ColleDetailPage() { )} - {/* TODO: Attachments */} {colle.attachments && colle.attachments?.length > 0 && (

- Attachments + Pièces jointes

{colle.attachments.map((attachment, index) => (