import * as React from 'react'; import * as reactStringReplace from 'react-string-replace'; import { intersperse } from '../../../../util/react'; export interface Props { name: React.ReactNode; values: Value[]; displayMode: DisplayMode; type?: number; } export type Value = [string, DisplayValueAugment]; export enum DisplayValueAugment { simple = 0, augmented = 1, fire_damage = 4, cold_damage = 5, lightning_damage = 6, chaos_damage = 7, } export enum DisplayMode { colon_joined = 0, space_joined = 1, progressbar = 2, printf = 3, } const FormattedValue: React.SFC<{ value: Value }> = ({ value: [value, augment], }) => { const className = DisplayValueAugment[augment]; if (className === undefined) { throw new Error(`unrecognized DisplayValueAugment '${augment}'`); } return {value}; }; export default class LineContent extends React.PureComponent { public render() { const { displayMode, values, name } = this.props; const formatted_values = values.map((value, index) => ( )); switch (displayMode) { case DisplayMode.colon_joined: return ( <> {name}: {intersperse(formatted_values, () => ', ')} ); case DisplayMode.space_joined: return ( <> {intersperse(formatted_values, () => ', ')} {name} ); case DisplayMode.progressbar: throw new Error('not implemented'); case DisplayMode.printf: return reactStringReplace(name, /%(\d+)/g, match => { const argument_index = +match; const value = formatted_values[argument_index]; if (value === undefined) { throw new Error( `no value given for param ${match}(=${argument_index})`, ); } return value; }); default: throw new Error(`unrecognized displayMode '${displayMode}'`); } } }