"use client"; import React, { useEffect, useMemo, useState } from 'react'; import { Dropdown } from 'antd'; import { DownOutlined } from '@ant-design/icons'; import { fetchSettingByCode } from '@/api/serversetting'; import type { PortraitAnimeValue } from './config-options'; interface PortraitAnimeSelectorProps { /** Current value: 'portrait' or anime pcode */ value: PortraitAnimeValue; /** Change handler */ onChange: (value: PortraitAnimeValue) => void; /** Optional class name */ className?: string; /** Disabled state */ disabled?: boolean; } /** * Portrait/Anime selector with dropdown for Anime subtypes. * Styled to match VideoCreationForm design. * @param {PortraitAnimeValue} value - Current value: 'portrait' or anime pcode * @param {(value: PortraitAnimeValue) => void} onChange - Change handler * @param {string} [className] - Optional wrapper class * @param {boolean} [disabled] - Disable interaction when true * @returns {JSX.Element} */ export function PortraitAnimeSelector({ value, onChange, className, disabled = false, }: PortraitAnimeSelectorProps) { const [lastAnimeChoice, setLastAnimeChoice] = useState('STANDARD_V1_734684_116483'); const [animeOptions, setAnimeOptions] = useState>([]); useEffect(() => { let mounted = true; (async () => { const list = await fetchSettingByCode>('comic_config', []); if (!mounted) return; if (Array.isArray(list) && list.length > 0) { setAnimeOptions(list); setLastAnimeChoice((prev) => (prev === 'STANDARD_V1_734684_116483' ? list[0].pcode : prev)); } else { setAnimeOptions([ { name: 'Korean Comics Long', pcode: 'STANDARD_V1_734684_116483' }, ]); } })(); return () => { mounted = false; }; }, []); const isPortrait = value === 'portrait'; const currentAnime = useMemo(() => (value && value !== 'portrait' ? value : lastAnimeChoice), [value, lastAnimeChoice]); const pcodeToName = useMemo(() => { const map: Record = {}; animeOptions.forEach((o) => { map[o.pcode] = o.name; }); return map; }, [animeOptions]); /** Check if currentAnime is valid in animeOptions */ const isValidAnimeChoice = useMemo(() => { return animeOptions.some(opt => opt.pcode === currentAnime); }, [animeOptions, currentAnime]); /** Anime dropdown menu items */ const animeMenuItems = (animeOptions.length > 0 ? animeOptions : []).map((opt) => ({ key: opt.pcode, label: {opt.name}, })); return (
{/* Portrait button */} {/* Anime dropdown button */} onChange(key as PortraitAnimeValue), className: 'bg-[#1a1a1a] border border-white/10' }} trigger={['click']} disabled={disabled} >
); } export default PortraitAnimeSelector;