From 27afc63d8853f2deedc0fcf2c9c94c5e92baf100 Mon Sep 17 00:00:00 2001 From: "IGNY8 VPS (Salman)" Date: Mon, 19 Jan 2026 15:46:47 +0000 Subject: [PATCH] spinner added in contetn calednar page --- .../src/pages/Publisher/ContentCalendar.tsx | 80 +++++++++---------- 1 file changed, 37 insertions(+), 43 deletions(-) diff --git a/frontend/src/pages/Publisher/ContentCalendar.tsx b/frontend/src/pages/Publisher/ContentCalendar.tsx index 6e2b98f1..743a9af2 100644 --- a/frontend/src/pages/Publisher/ContentCalendar.tsx +++ b/frontend/src/pages/Publisher/ContentCalendar.tsx @@ -14,6 +14,7 @@ import PageMeta from '../../components/common/PageMeta'; import PageHeader from '../../components/common/PageHeader'; import ComponentCard from '../../components/common/ComponentCard'; import { Card } from '../../components/ui/card'; +import { Spinner } from '../../components/ui/spinner'; import Button from '../../components/ui/button/Button'; import IconButton from '../../components/ui/button/IconButton'; import { ButtonGroup, ButtonGroupItem } from '../../components/ui/button-group/ButtonGroup'; @@ -168,55 +169,41 @@ export default function ContentCalendar() { const loadQueue = useCallback(async () => { if (!activeSite?.id) return; - + + const siteId = activeSite.id; + + const safeFetch = async (url: string) => { + try { + const response = await fetchAPI(url); + return response?.results || []; + } catch (error: any) { + return []; + } + }; + try { setLoading(true); - - // IMPORTANT: Since content is ordered by -created_at, we need to fetch items by specific site_status - // Otherwise old scheduled/failed items will be on later pages and won't load - // NOTE: fetchAPI doesn't support params object - must use URL query strings - - const siteId = activeSite.id; - - // Fetch scheduled items (all of them, regardless of page) - const scheduledResponse = await fetchAPI( - `/v1/writer/content/?site_id=${siteId}&page_size=1000&site_status=scheduled` - ); - - // Fetch failed items (all of them) - const failedResponse = await fetchAPI( - `/v1/writer/content/?site_id=${siteId}&page_size=1000&site_status=failed` - ); - - // Fetch review items (for review count display) - const reviewResponse = await fetchAPI( - `/v1/writer/content/?site_id=${siteId}&page_size=100&status=review` - ); - - // Fetch approved items (for sidebar drag-drop) - not yet published to site - const approvedResponse = await fetchAPI( - `/v1/writer/content/?site_id=${siteId}&page_size=100&status=approved&site_status=not_published` - ); - - // Fetch published items (site_status=published) for display - const publishedResponse = await fetchAPI( - `/v1/writer/content/?site_id=${siteId}&page_size=100&site_status=published&ordering=-updated_at` - ); - - // Combine all results, removing duplicates by ID + + const [scheduledItems, failedItems, reviewItems, approvedItems, publishedItems] = await Promise.all([ + safeFetch(`/v1/writer/content/?site_id=${siteId}&page_size=1000&site_status=scheduled`), + safeFetch(`/v1/writer/content/?site_id=${siteId}&page_size=1000&site_status=failed`), + safeFetch(`/v1/writer/content/?site_id=${siteId}&page_size=100&status=review`), + safeFetch(`/v1/writer/content/?site_id=${siteId}&page_size=100&status=approved&site_status=not_published`), + safeFetch(`/v1/writer/content/?site_id=${siteId}&page_size=100&site_status=published&ordering=-updated_at`), + ]); + const allItems = [ - ...(scheduledResponse.results || []), - ...(failedResponse.results || []), - ...(reviewResponse.results || []), - ...(approvedResponse.results || []), - ...(publishedResponse.results || []), + ...scheduledItems, + ...failedItems, + ...reviewItems, + ...approvedItems, + ...publishedItems, ]; - - // Remove duplicates by ID + const uniqueItems = Array.from( new Map(allItems.map(item => [item.id, item])).values() ); - + setAllContent(uniqueItems); } catch (error: any) { toast.error(`Failed to load content: ${error.message}`); @@ -604,7 +591,14 @@ export default function ContentCalendar() {
{/* Main Calendar/List View */}
- {queueItems.length === 0 && approvedItems.length === 0 ? ( + {loading ? ( + +
+ +

Loading calendar...

+
+
+ ) : queueItems.length === 0 && approvedItems.length === 0 ? (