public/components/headersForm.js (58 lines of code) (raw):

import {Button, Col, Glyphicon, Input, Row} from "react-bootstrap"; import React from "react"; const emptyHeader = {key: "", value: ""}; export const headerListToHeaderMap = (headerList) => headerList.reduce((acc, {key, value}) => ({ ...acc, [key]: value }), {}) /** * @param props {{ * headers: Array<{key: string, value: string}>, * onChange: (headers: Array<{key: string, value: string}>) => void * }} */ export class HeadersForm extends React.Component { getHeadersOrDefault = () => { return this.props.headers ?? [] } handleHeaderChange = (value, key, index) => { const newHeaders = [...this.getHeadersOrDefault()]; newHeaders[index] = {...newHeaders[index], [key]: value}; this.props.onChange(newHeaders) } addHeader = () => { const newHeaders = [...this.getHeadersOrDefault(), emptyHeader]; this.props.onChange(newHeaders) } removeHeader = (index) => { const newHeaders = this.getHeadersOrDefault().filter((_, localIndex) => localIndex !== index); this.props.onChange(newHeaders) } render = () => <Input label="Headers" labelClassName="col-xs-2" wrapperClassName="wrapper"> <Col xs={10}> {this.getHeadersOrDefault().map(({key, value}, index) => <Row key={index}> <Col xs={4} className="no-margin-bottom"> <input type="text" placeholder="Add a header key" onChange={(e) => this.handleHeaderChange(e.target.value, "key", index)} className="form-control" value={key}> </input> </Col> <Col xs={4} className="no-margin-bottom"> <input type="text" placeholder="Add a header value" onChange={(e) => this.handleHeaderChange(e.target.value, "value", index)} className="form-control" value={value}> </input> </Col> <Col xs={2}> <Button className="remove-btn pull-right btn btn-link btn-sm" onClick={() => this.removeHeader(index)}><Glyphicon glyph="glyphicon glyphicon-minus"/> Remove</Button> </Col> </Row> )} <Row> <Col xs={12}> <Button className="remove-btn pull-left btn btn-link btn-sm" onClick={this.addHeader}><Glyphicon glyph="glyphicon glyphicon-plus"/> Add another header</Button> </Col> </Row> </Col> </Input> }