From ff54801e4f7092e7593f2c046a87dc6fc0c06d6c Mon Sep 17 00:00:00 2001 From: swve Date: Thu, 24 Apr 2025 19:32:43 +0200 Subject: [PATCH] feat: update CourseThumbnail to display course update date and active authors with avatars --- .../Objects/Thumbnails/CourseThumbnail.tsx | 83 +++++++++++++++++-- 1 file changed, 77 insertions(+), 6 deletions(-) diff --git a/apps/web/components/Objects/Thumbnails/CourseThumbnail.tsx b/apps/web/components/Objects/Thumbnails/CourseThumbnail.tsx index 42ebb5f0..4cbebc70 100644 --- a/apps/web/components/Objects/Thumbnails/CourseThumbnail.tsx +++ b/apps/web/components/Objects/Thumbnails/CourseThumbnail.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, @@ -25,6 +26,19 @@ type Course = { description: string 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 = { @@ -40,6 +54,11 @@ function CourseThumbnail({ course, orgslug, customLink }: PropsType) { 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 { @@ -59,7 +78,7 @@ function CourseThumbnail({ course, orgslug, customLink }: PropsType) { : '../empty_thumbnail.png' return ( -
+
-
-

{course.name}

-

{course.description}

+
+
+

{course.name}

+

{course.description}

+
+ +
+ {course.update_date && ( +
+ + Updated {new Date(course.update_date).toLocaleDateString('en-US', { month: 'short', day: 'numeric', year: 'numeric' })} + +
+ )} + + {displayedAuthors.length > 0 && ( +
+ {displayedAuthors.map((author, index) => ( +
+ +
+ ))} + {hasMoreAuthors && ( +
+
+ +{remainingAuthorsCount} +
+
+ )} +
+ )} +
+ + + Start Learning +
)