YT-AI-Automation / frontend /src /hooks /useBackendPlatform.ts
github-actions
Sync Docker Space
5f3e9f5
import { useEffect, useState } from 'react'
import { api } from '../api/client'
export type BackendPlatform = 'windows' | 'non-windows' | 'unknown'
export interface BackendCapabilities {
platform: BackendPlatform
/**
* True when the backend reports a usable video engine (PowerPoint COM
* on Windows *or* MoviePy on Linux/macOS). Controls the MP4 output
* option in the wizard.
*/
videoEngineReady: boolean
/**
* True when the backend can emit .pptx decks — still requires a
* Windows host with PowerPoint COM automation, since the MoviePy
* engine only produces MP4.
*/
pptxReady: boolean
}
/**
* Peek at the backend's platform + video engine capabilities via the
* (cached) preflight response.
*
* Used to gate MP4 / PowerPoint output. The MP4 gate now opens when
* *either* engine is available so a Linux backend with MoviePy can
* export video even though PowerPoint COM is Windows-only.
*/
export function useBackendPlatform(): BackendPlatform {
return useBackendCapabilities().platform
}
export function useBackendCapabilities(): BackendCapabilities {
const [caps, setCaps] = useState<BackendCapabilities>({
platform: 'unknown',
videoEngineReady: false,
pptxReady: false,
})
useEffect(() => {
let cancelled = false
api
.preflight()
.then((r) => {
if (cancelled) return
const detail = (r.checks.platform?.detail ?? '').toLowerCase()
const platform: BackendPlatform = detail.startsWith('windows')
? 'windows'
: detail
? 'non-windows'
: 'unknown'
const pptxReady = r.checks.powerpoint?.ok === true
const videoEngineReady =
r.checks.video_engine?.ok === true || pptxReady
setCaps({ platform, videoEngineReady, pptxReady })
})
.catch(() => {
if (!cancelled) {
setCaps({
platform: 'unknown',
videoEngineReady: false,
pptxReady: false,
})
}
})
return () => {
cancelled = true
}
}, [])
return caps
}