import * as React from 'react'; import { Installable } from '../../../common/protocol/installable'; import { ArduinoComponent } from '../../../common/protocol/arduino-component'; import { ComponentListItem } from './component-list-item'; import { ListItemRenderer } from './list-item-renderer'; export class ComponentList extends React.Component< ComponentList.Props > { protected container?: HTMLElement; render(): React.ReactNode { return (
{this.props.items.map((item) => this.createItem(item))}
); } componentDidMount(): void { if (this.container && this.props.resolveContainer) { this.props.resolveContainer(this.container); } } protected setRef = (element: HTMLElement | null) => { this.container = element || undefined; }; protected createItem(item: T): React.ReactNode { return ( key={this.props.itemLabel(item)} item={item} itemRenderer={this.props.itemRenderer} install={this.props.install} uninstall={this.props.uninstall} /> ); } } export namespace ComponentList { export interface Props { readonly items: T[]; readonly itemLabel: (item: T) => string; readonly itemDeprecated: (item: T) => boolean; readonly itemRenderer: ListItemRenderer; readonly install: (item: T, version?: Installable.Version) => Promise; readonly uninstall: (item: T) => Promise; readonly resolveContainer: (element: HTMLElement) => void; } }