From b83366b60b8e048200115e2b3dfa3c75f0513c9f Mon Sep 17 00:00:00 2001 From: swve Date: Thu, 24 Apr 2025 19:23:19 +0200 Subject: [PATCH] feat: enhance CourseThumbnailLanding to display active authors with avatars --- .../Thumbnails/CourseThumbnailLanding.tsx | 54 ++++++++++++++++++- 1 file changed, 52 insertions(+), 2 deletions(-) diff --git a/apps/web/components/Objects/Thumbnails/CourseThumbnailLanding.tsx b/apps/web/components/Objects/Thumbnails/CourseThumbnailLanding.tsx index fbfd2403..69c59db0 100644 --- a/apps/web/components/Objects/Thumbnails/CourseThumbnailLanding.tsx +++ b/apps/web/components/Objects/Thumbnails/CourseThumbnailLanding.tsx @@ -4,7 +4,7 @@ import AuthenticatedClientElement from '@components/Security/AuthenticatedClient import ConfirmationModal from '@components/Objects/StyledElements/ConfirmationModal/ConfirmationModal' import { getUriWithOrg } from '@services/config/config' import { deleteCourseFromBackend } from '@services/courses/courses' -import { getCourseThumbnailMediaDirectory } from '@services/media/media' +import { getCourseThumbnailMediaDirectory, getUserAvatarMediaDirectory } from '@services/media/media' import { revalidateTags } from '@services/utils/ts/requests' import { BookMinus, FilePenLine, Settings2, MoreVertical } from 'lucide-react' import { useLHSession } from '@components/Contexts/LHSessionContext' @@ -12,6 +12,7 @@ import Link from 'next/link' import { useRouter } from 'next/navigation' import React from 'react' import toast from 'react-hot-toast' +import UserAvatar from '@components/Objects/UserAvatar' import { DropdownMenu, DropdownMenuContent, @@ -26,6 +27,18 @@ type Course = { thumbnail_image: string org_id: string update_date: string + authors?: Array<{ + user: { + id: string + user_uuid: string + avatar_image: string + first_name: string + last_name: string + username: string + } + authorship: 'CREATOR' | 'CONTRIBUTOR' | 'MAINTAINER' | 'REPORTER' + authorship_status: 'ACTIVE' | 'INACTIVE' | 'PENDING' + }> } type PropsType = { @@ -94,6 +107,11 @@ const CourseThumbnailLanding: React.FC = ({ course, orgslug, customLi const org = useOrg() as any const session = useLHSession() as any + const activeAuthors = course.authors?.filter(author => author.authorship_status === 'ACTIVE') || [] + const displayedAuthors = activeAuthors.slice(0, 3) + const hasMoreAuthors = activeAuthors.length > 3 + const remainingAuthorsCount = activeAuthors.length - 3 + const deleteCourse = async () => { const toastId = toast.loading('Deleting course...') try { @@ -131,7 +149,7 @@ const CourseThumbnailLanding: React.FC = ({ course, orgslug, customLi

{course.description}

-
+
{course.update_date && (
@@ -139,6 +157,38 @@ const CourseThumbnailLanding: React.FC = ({ course, orgslug, customLi
)} + + {displayedAuthors.length > 0 && ( +
+ {displayedAuthors.map((author, index) => ( +
+ +
+ ))} + {hasMoreAuthors && ( +
+
+ +{remainingAuthorsCount} +
+
+ )} +
+ )}