Zackriya-Solutions/meetily · error · Error

Summary contains no visible content to save.

Error message

Summary contains no visible content to save.

What it means

handleSaveSummary in useMeetingData throws this when the MeetingSummary object being saved has no visible content, i.e. hasVisibleSummaryContent(summary) returns false. The app refuses to persist a summary that would render as empty (no title, no tldr/body/sections of substance). It is a data-validation guard placed before the api_save_meeting_summary Tauri command is invoked.

Source

Thrown at frontend/src/hooks/meeting-details/useMeetingData.ts:44

  // Sidebar context
  const { setCurrentMeeting, setMeetings, meetings: sidebarMeetings } = useSidebar();

  // Sync aiSummary state when summaryData prop changes (fixes display of fetched summaries)
  useEffect(() => {
    console.log('[useMeetingData] Syncing summary data from prop:', summaryData ? 'present' : 'null');
    setAiSummary(summaryData);
  }, [summaryData]); // Only trigger when parent prop changes, not when aiSummary changes

  const handleSummaryChange = useCallback((newSummary: Summary) => {
    setAiSummary(newSummary);
  }, []);



  const handleSaveSummary = useCallback(async (summary: MeetingSummary) => {
    if (!hasVisibleSummaryContent(summary)) {
      throw new Error('Summary contains no visible content to save.');
    }

    const formattedSummary = 'markdown' in summary || 'summary_json' in summary
      ? summary
      : { MeetingName: meetingTitle, ...summary };
    await invokeTauri('api_save_meeting_summary', {
      meetingId: meeting.id,
      summary: formattedSummary,
    });
  }, [meeting.id, meetingTitle]);

  const saveAllChanges = useCallback(async () => {
    setIsSaving(true);
    try {
      // Save BlockNote editor changes if dirty
      if (blockNoteSummaryRef.current?.isDirty) {
        console.log('💾 Saving BlockNote editor changes...');
        await blockNoteSummaryRef.current.saveSummary();

View on GitHub (pinned to a2cb62e827)

Solutions

  1. Check hasVisibleSummaryContent(summary) in the caller before invoking handleSaveSummary, and show a validation message instead of saving.
  2. Verify the summarizer output actually populated visible fields (Tldr, sections, action items) before attempting save.
  3. Regenerate the summary for the meeting, then save.
  4. If the summary is legitimately minimal, populate at least a title/tldr so it passes the visibility check.

Example fix

// before
await handleSaveSummary(summary);
// after
if (hasVisibleSummaryContent(summary)) {
  await handleSaveSummary(summary);
} else {
  showToast('Nothing to save: the summary is empty.');
}
Defensive patterns

Strategy: validation

Validate before calling

import { hasVisibleSummaryContent } from '@/lib/summary';
// in the component before saving:
if (!hasVisibleSummaryContent(summary)) {
  toast.error('Summary is empty; nothing to save.');
  return;
}
await handleSaveSummary(summary);

Type guard

function isSavableSummary(s: MeetingSummary): boolean {
  return hasVisibleSummaryContent(s) && (typeof (s as any).Tldr === 'string' || 'summary_json' in s || 'markdown' in s);
}

Try / catch

try {
  await handleSaveSummary(summary);
} catch (e) {
  if (e instanceof Error && e.message.includes('no visible content')) {
    toast.error('Nothing to save: the summary is empty.');
  } else { throw e; }
}

Prevention

When it happens

Trigger: Calling handleSaveSummary(summary) from useMeetingData with a summary object whose visible fields (e.g. MeetingName, Tldr, and section/action item content) are all empty, null, or whitespace-only, so hasVisibleSummaryContent fails.

Common situations: A summarization run produced an empty result (model returned nothing or parsing stripped all content) and the UI still tried to save; user clicked Save before the summary finished generating; a migration or older meeting record yielded a summary with only internal/hidden fields.

Understand the failure class

Background: "must not be empty", "cannot be empty" — required-field validation errors across open-source libraries — this error's family across 41 libraries.

Related errors


AI-assisted analysis of Zackriya-Solutions/meetily@a2cb62e827 (2026-09-12). Data as JSON: /api/errors/30ad1558f5c8c7c3. Report an issue: GitHub.