"use client"; import React, { useEffect, useMemo, useState } from 'react'; import { Dropdown } from 'antd'; import { ChevronUp } from 'lucide-react'; import { fetchSettingByCode } from '@/api/serversetting'; export type PortraitAnimeValue = 'portrait' | string; type DropdownPlacement = | 'top' | 'bottom' | 'topLeft' | 'topRight' | 'bottomLeft' | 'bottomRight'; export interface PortraitAnimeSelectorProps { value: PortraitAnimeValue; onChange: (value: PortraitAnimeValue) => void; className?: string; disabled?: boolean; placement?: DropdownPlacement; } /** * Portrait/Anime selector with a split button and dropdown for Anime subtype. * @param {PortraitAnimeValue} value - Current value: 'portrait' | '2d' | '3d'. * @param {(value: PortraitAnimeValue) => void} onChange - Change handler. * @param {string} [className] - Optional wrapper class. * @param {boolean} [disabled] - Disable interaction when true. * @param {DropdownPlacement} [placement] - Dropdown placement. * @returns {JSX.Element} - Selector component. */ export function PortraitAnimeSelector({ value, onChange, className, disabled = false, placement = 'top', }: PortraitAnimeSelectorProps) { const [lastAnimeChoice, setLastAnimeChoice] = useState('STANDARD_V1_734684_116483'); const [animeOptions, setAnimeOptions] = useState>([]); useEffect(() => { if (value && value !== 'portrait') { setLastAnimeChoice(value); } }, [value]); useEffect(() => { let mounted = true; (async () => { const list = await fetchSettingByCode>('comic_config', []); if (!mounted) return; if (Array.isArray(list) && list.length > 0) { setAnimeOptions(list); // initialize last choice to first entry if current is still default 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]); const animeMenuItems = (animeOptions.length > 0 ? animeOptions : []).map((opt) => ({ key: opt.pcode, label: (
{opt.name}
), })); return (
{/* Portrait button */} {/* Anime split button */} onChange(key as PortraitAnimeValue), selectable: true, selectedKeys: isPortrait ? [] : [String(currentAnime)], }} trigger={["hover", "click"]} placement={placement} disabled={disabled} >
); } export default PortraitAnimeSelector;