diff --git a/components/app.js b/components/app.js index d098e1c..1751521 100644 --- a/components/app.js +++ b/components/app.js @@ -187,7 +187,8 @@ export default class App extends Component { this.handleBufferScrollTop = this.handleBufferScrollTop.bind(this); this.handleDialogDismiss = this.handleDialogDismiss.bind(this); this.handleAddNetworkClick = this.handleAddNetworkClick.bind(this); - this.handleAddNetworkSubmit = this.handleAddNetworkSubmit.bind(this); + this.handleNetworkSubmit = this.handleNetworkSubmit.bind(this); + this.handleNetworkRemove = this.handleNetworkRemove.bind(this); this.dismissError = this.dismissError.bind(this); this.saveReceipts = debounce(this.saveReceipts.bind(this), 500); @@ -984,20 +985,55 @@ export default class App extends Component { } handleAddNetworkClick() { - this.setState({ dialog: "add-network" }); + this.setState({ dialog: "network", networkDialog: null }); } - handleAddNetworkSubmit(attrs) { + handleManageNetworkClick(netID) { + var network = this.state.networks.get(netID); + var bouncerNetID = network.isupport.get("BOUNCER_NETID"); + var bouncerNetwork = this.state.bouncerNetworks.get(bouncerNetID); + this.setState({ + dialog: "network", + networkDialog: { + id: bouncerNetID, + params: bouncerNetwork, + }, + }); + } + + handleNetworkSubmit(attrs) { var client = this.clients.values().next().value; + + if (this.state.networkDialog && this.state.networkDialog.id) { + if (Object.keys(attrs).length == 0) { + this.setState({ dialog: null }); + return; + } + + client.send({ + command: "BOUNCER", + params: ["CHANGENETWORK", this.state.networkDialog.id, irc.formatTags(attrs)], + }); + } else { + attrs = { ...attrs, tls: "1" }; + client.send({ + command: "BOUNCER", + params: ["ADDNETWORK", irc.formatTags(attrs)], + }); + } + + this.setState({ dialog: null, networkDialog: null }); + } + + handleNetworkRemove() { + var client = this.clients.values().next().value; + client.send({ command: "BOUNCER", - params: ["ADDNETWORK", irc.formatTags({ - ...attrs, - name: attrs.host, - tls: 1, - })], + params: ["DELNETWORK", this.state.networkDialog.id], }); - this.setState({ dialog: null }); + + this.setState({ dialog: null, networkDialog: null }); } componentDidMount() { @@ -1045,6 +1081,7 @@ export default class App extends Component { onClose=${() => this.close(activeBuffer)} onJoin=${() => this.handleJoinClick(activeBuffer.network)} onAddNetwork=${this.handleAddNetworkClick} + onManageNetwork=${() => this.handleManageNetworkClick(activeBuffer.network)} /> `; @@ -1067,10 +1104,15 @@ export default class App extends Component { var dialog = null; switch (this.state.dialog) { - case "add-network": + case "network": + var title = this.state.networkDialog ? "Edit network" : "Add network"; dialog = html` - <${Dialog} title="Add network" onDismiss=${this.handleDialogDismiss}> - <${NetworkForm} onSubmit=${this.handleAddNetworkSubmit}/> + <${Dialog} title=${title} onDismiss=${this.handleDialogDismiss}> + <${NetworkForm} + onSubmit=${this.handleNetworkSubmit} + onRemove=${this.handleNetworkRemove} + params=${this.state.networkDialog ? this.state.networkDialog.params : null} + /> `; break; diff --git a/components/buffer-header.js b/components/buffer-header.js index a2bf9e4..4b23842 100644 --- a/components/buffer-header.js +++ b/components/buffer-header.js @@ -20,7 +20,7 @@ function NickStatus(props) { } export default function BufferHeader(props) { - function handlePartClick(event) { + function handleCloseClick(event) { event.preventDefault(); props.onClose(); } @@ -32,6 +32,10 @@ export default function BufferHeader(props) { event.preventDefault(); props.onAddNetwork(); } + function handleManageNetworkClick(event) { + event.preventDefault(); + props.onManageNetwork(); + } var description = null; if (props.buffer.serverInfo) { @@ -72,27 +76,40 @@ export default function BufferHeader(props) { } var actions = null; - var closeText = "Close"; switch (props.buffer.type) { case BufferType.SERVER: - if (props.isBouncer && !props.network.isupport.get("BOUNCER_NETID")) { - actions = html`Add network`; + if (props.isBouncer) { + if (props.network.isupport.get("BOUNCER_NETID")) { + actions = html` + Join + ${" "} + Manage network + `; + } else { + actions = html` + Add network + ${" "} + Disconnect + `; + } } else { - actions = html`Join`; + actions = html` + Join + ${" "} + Disconnect + `; } - closeText = "Disconnect"; break; case BufferType.CHANNEL: - closeText = "Part"; + actions = html`Part`; + break; + case BufferType.NICK: + actions = html`Close`; break; } return html` ${description} - - ${actions} - ${" "} - ${closeText} - + ${actions} `; } diff --git a/components/network-form.js b/components/network-form.js index eab98b2..bae5089 100644 --- a/components/network-form.js +++ b/components/network-form.js @@ -1,20 +1,40 @@ import { html, Component } from "../lib/index.js"; +const defaultParams = { + name: "", + host: "", + port: 6697, + nickname: "", + username: "", + realname: "", + pass: "", +}; + export default class NetworkForm extends Component { + prevParams = null; state = { - host: "", - port: 6697, - nickname: "", - username: "", - realname: "", - pass: "", + ...defaultParams, + isNew: true, }; constructor(props) { super(props); + this.prevParams = { ...defaultParams }; + this.handleChange = this.handleChange.bind(this); this.handleSubmit = this.handleSubmit.bind(this); + + this.state.isNew = !props.params; + + if (props.params) { + Object.keys(defaultParams).forEach((k) => { + if (props.params[k] !== undefined) { + this.state[k] = props.params[k]; + this.prevParams[k] = props.params[k]; + } + }); + } } handleChange(event) { @@ -26,19 +46,27 @@ export default class NetworkForm extends Component { handleSubmit(event) { event.preventDefault(); - var params = { - host: this.state.host, - port: this.state.port, - nickname: this.state.nickname, - username: this.state.username, - realname: this.state.realname, - pass: this.state.pass, - }; + var params = {}; + Object.keys(defaultParams).forEach((k) => { + if (this.prevParams[k] == this.state[k]) { + return; + } + params[k] = this.state[k]; + }); this.props.onSubmit(params); } render() { + var removeNetwork = null; + if (!this.state.isNew) { + removeNetwork = html` + + `; + } + return html`


+ +

+