← vibesdk
src/features/presentation/components/PresentationHeaderActions.tsx
2.3 KB
Download file
import { User, Monitor, Expand, FileDown } from 'lucide-react';
import { HeaderButton, HeaderToggleButton, HeaderDivider } from '@/components/shared/header-actions';
import type { HeaderActionsProps } from '../../core/types';
// Presentation-specific state keys
const SPEAKER_MODE_KEY = 'speakerMode';
const PREVIEW_MODE_KEY = 'previewMode';
export function PresentationHeaderActions({
previewRef,
featureState,
setFeatureState,
}: HeaderActionsProps) {
const speakerMode = featureState[SPEAKER_MODE_KEY] as boolean | undefined;
const previewMode = featureState[PREVIEW_MODE_KEY] as boolean | undefined;
const handleToggleSpeakerMode = () => {
const newValue = !speakerMode;
setFeatureState(SPEAKER_MODE_KEY, newValue);
// Speaker mode and preview mode are mutually exclusive
if (newValue) {
setFeatureState(PREVIEW_MODE_KEY, false);
}
};
const handleTogglePreviewMode = () => {
const newValue = !previewMode;
setFeatureState(PREVIEW_MODE_KEY, newValue);
// Speaker mode and preview mode are mutually exclusive
if (newValue) {
setFeatureState(SPEAKER_MODE_KEY, false);
}
};
const handleFullscreen = () => {
previewRef.current?.requestFullscreen();
};
const handleExportPdf = () => {
// PDF export via Reveal.js print stylesheet
const iframe = previewRef.current;
if (!iframe?.contentWindow) return;
// Navigate iframe to print view
const currentSrc = iframe.src;
const printUrl = currentSrc.includes('?')
? `${currentSrc}&print-pdf`
: `${currentSrc}?print-pdf`;
// Open print view in new window for PDF export
window.open(printUrl, '_blank', 'noopener,noreferrer');
};
return (
<>
<HeaderToggleButton
icon={User}
label="Speaker"
onClick={handleToggleSpeakerMode}
title="Speaker Mode (with notes and preview)"
active={speakerMode}
/>
<HeaderToggleButton
icon={Monitor}
label="Preview"
onClick={handleTogglePreviewMode}
title="Preview Mode (current and next slide)"
active={previewMode}
/>
<HeaderButton
icon={Expand}
onClick={handleFullscreen}
title="Fullscreen"
iconOnly
/>
<HeaderDivider />
<HeaderButton
icon={FileDown}
label="Export PDF"
onClick={handleExportPdf}
title="Export presentation as PDF"
/>
</>
);
}