import { useState, useEffect, } from '@wordpress/element'; import { Flex, FlexBlock, Button, TextareaControl, } from '@wordpress/components'; import ApuraToggle from './ApuraToggle'; import ApuraButtonGroup from './ApuraButtonGroup'; import { __ } from '@wordpress/i18n'; type Props = { subControlIds: string[]; isOpen: boolean; } function resolveSubControlId(subControlId: string): string { if (subControlId.includes('[')) { return subControlId; } if (apuraCustomizerControl?.themeOptionField) { return `${apuraCustomizerControl.themeOptionField}[${subControlId}]`; } return subControlId; } export default function SubControls({ subControlIds, isOpen }: Props) { const [subControlValues, setSubControlValues] = useState({}); useEffect(() => { const initialValues: any = {}; const settingListeners: any = {}; subControlIds.forEach((subControlId: string) => { try { const optionId = resolveSubControlId(subControlId); const subControl = wp.customize.control(optionId); if (subControl && subControl.setting) { const setting = subControl.setting; initialValues[subControlId] = setting.get(); // 設定値の変更を監視 const listener = (newValue: any) => { setSubControlValues(prev => ({ ...prev, [subControlId]: newValue, })); }; setting.bind(listener); settingListeners[subControlId] = { setting, listener }; } else { console.warn(`SubControl not found: ${subControlId}`); initialValues[subControlId] = ''; } } catch (error) { console.error(`Error accessing subControl ${subControlId}:`, error); initialValues[subControlId] = ''; } }); setSubControlValues(initialValues); // クリーンアップ関数 return () => { Object.values(settingListeners).forEach((item: any) => { if (item.setting && item.listener) { item.setting.unbind(item.listener); } }); }; }, [subControlIds]); return ( {subControlIds.map((subControlId: string) => { const resolvedControlId = resolveSubControlId(subControlId); const subControl = wp.customize.control(resolvedControlId); // サブコントロールが存在しない場合のエラーハンドリング. if (!subControl || !subControl.setting) { console.warn(`SubControl not found: ${resolvedControlId}`); return null; } const setting = subControl.setting; const choices = subControl.params.choices; if (choices.type === 'textarea') { return ( { setting.set(value); setSubControlValues(prev => ({ ...prev, [subControlId]: value })); }} /> ); } if (choices.type === 'number') { return (
{subControl.params.label}
{subControl.params.description &&

{subControl.params.description}

} { const value = e.target.value; setting.set(value); setSubControlValues(prev => ({ ...prev, [subControlId]: value })); }} min={choices.min !== undefined ? choices.min : undefined} max={choices.max !== undefined ? choices.max : undefined} step={choices.step !== undefined ? choices.step : '1'} />
); } if (choices.type === 'select') { return (
{subControl.params.label}
{subControl.params.description &&

{subControl.params.description}

}
); } if (choices.type === 'apura-button-group') { return ( ); } if (choices.type === 'apura-toggle') { return ( ); } if (choices.type === 'image') { return (
{subControl.params.label}
{subControl.params.description &&

{subControl.params.description}

} {setting.get() && setting.get().url && } {setting.get() && }
); } return (
{subControl.params.label}
{subControl.params.description &&

{subControl.params.description}

} { setting.set(e.target.value); setSubControlValues(prev => ({ ...prev, [subControlId]: e.target.value })); }} />
); })}
); }