import { useEffect, useMemo, useState } from "react"; import { Edit2, Loader2, MoreVertical } from "lucide-react"; import { Button } from "../../../components/ui/button"; import { Card } from "../../../components/ui/card"; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, } from "../../../components/ui/dropdown-menu"; import { ResolvedImage } from "../../../components/media/ResolvedImage"; import type { ParentContextPractice, PracticePublishStatus, } from "../../../types/course.types"; import { isPracticePublished, practicePublishStatus, } from "../../../lib/parentContextPractice"; import { resolveThumbnailForPreview } from "../../../lib/videoPreview"; import { cn } from "../../../lib/utils"; import { PublishStatusConfirmDialog } from "./PublishStatusConfirmDialog"; type ModulePracticeCardProps = { practice: ParentContextPractice; statusUpdating?: boolean; onEdit?: () => void; onPublish?: () => void; onSaveAsDraft?: () => void; }; export function ModulePracticeCard({ practice, statusUpdating = false, onEdit, onPublish, onSaveAsDraft, }: ModulePracticeCardProps) { const isPublished = isPracticePublished(practice); const statusLabel = practicePublishStatus(practice) ?? "DRAFT"; const thumbnailSrc = useMemo( () => resolveThumbnailForPreview(practice.story_image), [practice.story_image], ); const [thumbFailed, setThumbFailed] = useState(false); const [confirmOpen, setConfirmOpen] = useState(false); const [pendingStatus, setPendingStatus] = useState(null); useEffect(() => { setThumbFailed(false); }, [thumbnailSrc]); const requestStatusChange = ( nextStatus: PracticePublishStatus, e?: React.MouseEvent, ) => { e?.stopPropagation(); if (statusUpdating) return; setPendingStatus(nextStatus); setConfirmOpen(true); }; const confirmStatusChange = () => { if (!pendingStatus) return; if (pendingStatus === "PUBLISHED") { onPublish?.(); } else { onSaveAsDraft?.(); } setConfirmOpen(false); setPendingStatus(null); }; return ( <>
{thumbnailSrc && !thumbFailed ? ( setThumbFailed(true)} /> ) : null}
{statusLabel}
{ requestStatusChange( isPublished ? "DRAFT" : "PUBLISHED", e, ); }} > {isPublished ? "Save as draft" : "Publish practice"}

{practice.title}

{ setConfirmOpen(open); if (!open) setPendingStatus(null); }} nextStatus={pendingStatus} contentLabel="practice" confirming={statusUpdating} onConfirm={confirmStatusChange} /> ); }