"use client"; import { useState } from "react"; import type { Media } from "@/content/site"; import { MediaFrame } from "./MediaFrame"; type Slot = { name: string | null; caption: string | null; poster: Media | null; src: string | null; externalId: string | null }; const EXTERNAL = { "youtube-nocookie": { label: "YouTube", url: (id: string) => `https://www.youtube-nocookie.com/embed/${encodeURIComponent(id)}?autoplay=1&rel=0` }, vimeo: { label: "Vimeo", url: (id: string) => `https://player.vimeo.com/video/${encodeURIComponent(id)}?autoplay=1&dnt=1` }, } as const; /** * Ein Feedback-Video. Geladen wird erst nach Klick (preload="none"); es * startet nie von selbst mit Ton. Externe Player (YouTube/Vimeo) werden nur * geladen, wenn das Datenschutzkonzept sie erlaubt (EXTERNAL_VIDEO_PROVIDER) * und die Besucherin dem Laden ausdruecklich zustimmt. */ export function VideoSlot({ slot, index, provider, showDrafts }: { slot: Slot; index: number; provider: "none" | "youtube-nocookie" | "vimeo"; showDrafts: boolean }) { const [stage, setStage] = useState<"poster" | "consent" | "playing">("poster"); const label = slot.name ? `Video von ${slot.name} abspielen` : `Feedback-Video ${index + 1} abspielen`; const external = slot.externalId && provider !== "none" ? EXTERNAL[provider] : null; const playable = Boolean(slot.src) || Boolean(external); const poster: Media = slot.poster ?? { kind: "placeholder", label: `Feedback-Video ${index + 1} folgt`, tone: "studio" }; return (
{stage === "playing" && slot.src && ( )} {stage === "playing" && !slot.src && external && slot.externalId && (