import { useMemo, useState } from 'react';
import useSampleImages from '@/hooks/useSampleImages';
import SampleImageCard from './SampleImageCard';
import { Job } from '@prisma/client';
import { JobConfig } from '@/types';
import { LuImageOff, LuLoader, LuBan } from 'react-icons/lu';
import { Button } from '@headlessui/react';
import { FaDownload } from 'react-icons/fa';
import { apiClient } from '@/utils/api';
import classNames from 'classnames';
interface SampleImagesMenuProps {
job?: Job | null;
}
export const SampleImagesMenu = ({ job }: SampleImagesMenuProps) => {
const [isZipping, setIsZipping] = useState(false);
const downloadZip = async () => {
if (isZipping) return;
setIsZipping(true);
try {
const res = await apiClient.post('/api/zip', {
zipTarget: 'samples',
jobName: job?.name,
});
const zipPath = res.data.zipPath; // e.g. /mnt/Train2/out/ui/.../samples.zip
if (!zipPath) throw new Error('No zipPath in response');
const downloadPath = `/api/files/${encodeURIComponent(zipPath)}`;
const a = document.createElement('a');
a.href = downloadPath;
// optional: suggest filename (browser may ignore if server sets Content-Disposition)
a.download = 'samples.zip';
document.body.appendChild(a);
a.click();
a.remove();
} catch (err) {
console.error('Error downloading zip:', err);
} finally {
setIsZipping(false);
}
};
return (
);
};
interface SampleImagesProps {
job: Job;
}
export default function SampleImages({ job }: SampleImagesProps) {
const { sampleImages, status, refreshSampleImages } = useSampleImages(job.id, 5000);
const numSamples = useMemo(() => {
if (job?.job_config) {
const jobConfig = JSON.parse(job.job_config) as JobConfig;
const sampleConfig = jobConfig.config.process[0].sample;
if (sampleConfig.prompts) {
return sampleConfig.prompts.length;
} else {
return sampleConfig.samples.length;
}
}
return 10;
}, [job]);
const PageInfoContent = useMemo(() => {
let icon = null;
let text = '';
let subtitle = '';
let showIt = false;
let bgColor = '';
let textColor = '';
let iconColor = '';
if (sampleImages.length > 0) return null;
if (status == 'loading') {
icon =
{subtitle}