@@ -16,10 +16,7 @@
|
||||
*/
|
||||
|
||||
import React, { useEffect, useMemo, useState } from 'react';
|
||||
import { useNavigate } from 'react-router-dom';
|
||||
import { Content, fetchImages, ImageRecord, publishContent, generateImagePrompts } from '../services/api';
|
||||
import { useToast } from '../components/ui/toast/ToastContainer';
|
||||
import { useFeatureFlag } from '../hooks/useFeatureFlag';
|
||||
import { Content, fetchImages, ImageRecord } from '../services/api';
|
||||
import { ArrowLeftIcon, CalendarIcon, TagIcon, FileTextIcon, CheckCircleIcon, XCircleIcon, ClockIcon } from '../icons';
|
||||
|
||||
interface ContentViewTemplateProps {
|
||||
@@ -594,59 +591,6 @@ export default function ContentViewTemplate({ content, loading, onBack }: Conten
|
||||
|
||||
const shouldShowFeaturedBlock = imagesLoading || Boolean(resolvedFeaturedImage);
|
||||
|
||||
const navigate = useNavigate();
|
||||
const toast = useToast();
|
||||
const [publishing, setPublishing] = useState(false);
|
||||
const [generatingImages, setGeneratingImages] = useState(false);
|
||||
const featureEnabled = useFeatureFlag('feature.content_manager_refactor');
|
||||
|
||||
const handleEditContent = () => {
|
||||
const siteId = content?.site ?? content?.site_id ?? null;
|
||||
if (!siteId || !content?.id) {
|
||||
toast.error('Site or content id missing');
|
||||
return;
|
||||
}
|
||||
navigate(`/sites/${siteId}/posts/${content.id}/edit`);
|
||||
};
|
||||
|
||||
const handleGenerateImages = async () => {
|
||||
if (!content?.id) return;
|
||||
try {
|
||||
setGeneratingImages(true);
|
||||
const result = await generateImagePrompts([content.id]);
|
||||
if (result && result.success) {
|
||||
toast.success('Image generation started');
|
||||
// If async task_id returned, open progress modal elsewhere; refresh images after short delay
|
||||
setTimeout(() => window.location.reload(), 1500);
|
||||
} else {
|
||||
toast.error(result?.error || 'Failed to start image generation');
|
||||
}
|
||||
} catch (e: any) {
|
||||
toast.error(`Failed to generate images: ${e?.message || e}`);
|
||||
} finally {
|
||||
setGeneratingImages(false);
|
||||
}
|
||||
};
|
||||
|
||||
const handlePublish = async () => {
|
||||
if (!content?.id) return;
|
||||
try {
|
||||
setPublishing(true);
|
||||
const result = await publishContent(content.id);
|
||||
if (result && (result.external_url || result.external_id)) {
|
||||
toast.success('Content published successfully');
|
||||
// Reload to show updated external_id/status
|
||||
setTimeout(() => window.location.reload(), 800);
|
||||
} else {
|
||||
toast.error('Failed to publish content');
|
||||
}
|
||||
} catch (e: any) {
|
||||
toast.error(`Publish failed: ${e?.message || e}`);
|
||||
} finally {
|
||||
setPublishing(false);
|
||||
}
|
||||
};
|
||||
|
||||
if (loading) {
|
||||
return (
|
||||
<div className="min-h-screen bg-gray-50 dark:bg-gray-900 py-8">
|
||||
@@ -733,7 +677,7 @@ export default function ContentViewTemplate({ content, loading, onBack }: Conten
|
||||
<div className="bg-white dark:bg-gray-800 rounded-2xl shadow-sm border border-gray-200 dark:border-gray-700 overflow-hidden">
|
||||
{/* Header Section */}
|
||||
<div className="bg-gradient-to-r from-brand-500 to-brand-600 px-8 py-6 text-white">
|
||||
<div className="flex items-start justify-between gap-4">
|
||||
<div className="flex items-start justify-between gap-4">
|
||||
<div className="flex-1">
|
||||
<div className="flex items-center gap-3 mb-3">
|
||||
<FileTextIcon className="w-6 h-6" />
|
||||
@@ -750,34 +694,6 @@ export default function ContentViewTemplate({ content, loading, onBack }: Conten
|
||||
</p>
|
||||
)}
|
||||
</div>
|
||||
<div className="flex-shrink-0 flex items-center gap-2">
|
||||
{featureEnabled && (content.status === 'draft' || content.status === 'review') && (
|
||||
<button
|
||||
onClick={handleEditContent}
|
||||
className="inline-flex items-center gap-2 px-3 py-2 bg-white text-gray-700 rounded-lg border border-gray-200 hover:bg-gray-50 transition"
|
||||
>
|
||||
Edit content
|
||||
</button>
|
||||
)}
|
||||
{featureEnabled && content.status === 'draft' && (
|
||||
<button
|
||||
onClick={handleGenerateImages}
|
||||
disabled={generatingImages}
|
||||
className="inline-flex items-center gap-2 px-3 py-2 bg-white text-gray-700 rounded-lg border border-gray-200 hover:bg-gray-50 transition"
|
||||
>
|
||||
{generatingImages ? 'Generating...' : 'Generate images'}
|
||||
</button>
|
||||
)}
|
||||
{featureEnabled && content.status === 'review' && (
|
||||
<button
|
||||
onClick={handlePublish}
|
||||
disabled={publishing}
|
||||
className="inline-flex items-center gap-2 px-3 py-2 bg-emerald-600 text-white rounded-lg hover:bg-emerald-700 transition"
|
||||
>
|
||||
{publishing ? 'Publishing...' : 'Publish'}
|
||||
</button>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
Reference in New Issue
Block a user