import { Component, ContextType } from "preact"; import { SettingsCtx } from "./SettingsContext.tsx"; import type { ConfigType } from "../config.ts"; import Md3Select from "./Md3Select.tsx"; import { StateUpdater } from "preact/hooks"; interface obj { toString(): string; } type Props = { name: keyof ConfigType; list: { value: T; text?: string; disabled?: boolean }[]; description: string; /**@default {0}*/ selectedIndex?: number; /**@default {false}*/ disabled?: boolean; hintText?: string; set_value?: StateUpdater; }; type State = { selectedIndex: number; }; export default class SettingsSelect extends Component, State> { static contextType = SettingsCtx; declare context: ContextType; constructor(props: Props) { super(props); if (!props.list.length) throw Error("No list."); this.state = { selectedIndex: props.selectedIndex || 0 }; } componentWillReceiveProps( nextProps: Readonly>, _nextContext: unknown, ): void { const selectedIndex = nextProps.selectedIndex || 0; this.setState({ selectedIndex }); } render() { const id = `s-${this.props.name}`; return (
{ this.setState({ selectedIndex }); this.set_value(selectedIndex); }} > {this.props.list.map((v) => { const t = v.text ? v.text : v.value.toString(); return ( ); })}
); } set_changed() { if (this.context) { this.context.set_changed((v) => { v.add(this.props.name); return v; }); } } set_value(index: number) { const value = this.props.list[index].value; if (this.props.set_value) { this.props.set_value(value); this.set_changed(); } else if (this.context) { this.context.set_settings((v) => { if (v) { const t: Record = v; t[this.props.name] = value; this.set_changed(); return t as ConfigType; } }); } } }