import React, {useState} from 'react'; import {useFormContext, UseFormReturn} from 'react-hook-form'; import {FileUploadProvider} from '@common/uploads/uploader/file-upload-provider'; import {FormTextField} from '@common/ui/forms/input-field/text-field/text-field'; import {Trans} from '@common/i18n/trans'; import {TitleSelect} from '@app/titles/title-select'; import {FormImageSelector} from '@common/ui/images/image-selector'; import {FormSelect, Option} from '@common/ui/forms/select/select'; import {useSettings} from '@common/core/settings/use-settings'; import {useTrans} from '@common/i18n/use-trans'; import {useValueLists} from '@common/http/value-lists'; import {message} from '@common/i18n/message'; import {CreateVideoPayload} from '@app/admin/videos/requests/use-create-video'; import {InfoDialogTriggerIcon} from '@common/ui/overlays/dialog/info-dialog-trigger/info-dialog-trigger-icon'; import {Video} from '@app/titles/models/video'; import {VideoPlayerSkeleton} from '@app/videos/video-player-skeleton'; import {SiteVideoPlayer} from '@app/videos/site-video-player'; import {CaptionsPanel} from '@app/admin/videos/captions/captions-panel'; import {FormFileEntryField} from '@common/ui/forms/input-field/file-entry-field'; import {RadioGroup} from '@common/ui/forms/radio-group/radio-group'; import {Radio} from '@common/ui/forms/radio-group/radio'; import {Disk} from '@common/uploads/types/backend-metadata'; interface Props { form: UseFormReturn; video?: Video; } export function CrupdateVideoForm({form, video}: Props) { return (
); } function ReloadMessage({form}: Props) { const dirty = form.formState.dirtyFields; if (!dirty.src && !dirty.thumbnail) return null; return (
); } interface VideoPreviewProps { video?: Video; } function VideoPreview({video}: VideoPreviewProps) { if (!video || !video.src) { return ; } // timestamp will force reload of player when video is updated return ( ); } function VideoForm() { return ( } className="mb-24" required /> } diskPrefix="video-thumbnails" className="mb-24" /> ); } function SourceTypeSelect() { const {setValue} = useFormContext(); return ( } className="mb-24" onSelectionChange={() => setValue('src', '')} > ); } function SourceField() { const {watch} = useFormContext(); const isEmbed = watch('type') === 'embed'; const isUrl = watch('type') === 'external'; const canUpload = watch('type') === 'video'; const {trans} = useTrans(); if (canUpload) { return ; } return ( } className="mb-24" type={isUrl ? 'url' : undefined} placeholder={ isEmbed ? trans(message('Full embed code snippet or just src url')) : undefined } inputElementType={isEmbed ? 'textarea' : 'input'} rows={4} /> ); } function DirectSourceField() { const form = useFormContext(); const [type, setType] = useState<'url' | 'file'>(() => { const src = form.getValues('src'); return src.includes('api/v1/file-entries') || src.includes('storage/title-videos') ? 'file' : 'url'; }); return (
setType(e.target.value as any)} > setType(e.target.value as any)} > {type === 'file' ? ( } /> ) : ( } inputElementType="textarea" rows={2} required type="url" /> )}
); } function QualitySelect() { const {streaming} = useSettings(); const qualities = streaming?.qualities || []; return ( } className="mb-24" > {qualities.map((quality: string) => ( ))} ); } function LanguageSelect() { const {trans} = useTrans(); const query = useValueLists(['languages']); return ( } className="mb-24" > {query.data?.languages?.map(language => ( ))} ); } function ContentTypeSelect() { return ( } className="mb-24" > ); }