open Component module TextArea = (Underlying: COMPONENT) => { module Ports = Underlying.Ports type props = { content: result, imports: Ports.t, onChange: (result, ~exports: Ports.t=?) => unit, } type state = result let serialise = state => switch state { | Ok(s) => Underlying.serialise(s) | Error((_err, str)) => str } let deserialise = (str: string, ~imports: Ports.t) => { switch Underlying.deserialise(str, ~imports) { | Ok((s, e)) => Ok(Ok(s), e) | Error(e) => Ok(Error(e, str), Ports.empty) } } let make = props => { let (editing, setEditing) = React.useState(_ => false) let (text, setText) = React.useState(_ => serialise(props.content)) let onTextChange = (ev: JsxEvent.Form.t) => { let target = JsxEvent.Form.target(ev) let value: string = target["value"] setText(_ => value) } let done = _ => { switch deserialise(text, ~imports=props.imports) { | Ok((st, ex)) => props.onChange(st, ~exports=ex) | Error(_e) => Console.log("Impossible happened") } setEditing(_ => false) } if editing {