mirror of
https://codeberg.org/emersion/gamja
synced 2025-03-13 07:48:37 +01:00

The intent of the auto-join field is to ask the user whether they really want to join the pre-filled channel. Users rarely want to customize this field, they can just manually click "Join" after connecting if they want to join another channel.
230 lines
4.4 KiB
JavaScript
230 lines
4.4 KiB
JavaScript
import { html, Component, createRef } from "../lib/index.js";
|
|
|
|
export default class ConnectForm extends Component {
|
|
state = {
|
|
url: "",
|
|
pass: "",
|
|
nick: "",
|
|
password: "",
|
|
rememberMe: false,
|
|
username: "",
|
|
realname: "",
|
|
autojoin: true,
|
|
};
|
|
nickInput = createRef();
|
|
|
|
constructor(props) {
|
|
super(props);
|
|
|
|
this.handleChange = this.handleChange.bind(this);
|
|
this.handleSubmit = this.handleSubmit.bind(this);
|
|
|
|
if (props.params) {
|
|
this.state = {
|
|
...this.state,
|
|
url: props.params.url || "",
|
|
nick: props.params.nick || "",
|
|
rememberMe: props.params.autoconnect || false,
|
|
username: props.params.username || "",
|
|
realname: props.params.realname || "",
|
|
};
|
|
}
|
|
}
|
|
|
|
handleChange(event) {
|
|
let target = event.target;
|
|
let value = target.type == "checkbox" ? target.checked : target.value;
|
|
this.setState({ [target.name]: value });
|
|
}
|
|
|
|
handleSubmit(event) {
|
|
event.preventDefault();
|
|
|
|
if (this.props.connecting) {
|
|
return;
|
|
}
|
|
|
|
let params = {
|
|
url: this.state.url,
|
|
pass: this.state.pass,
|
|
nick: this.state.nick,
|
|
autoconnect: this.state.rememberMe,
|
|
username: this.state.username,
|
|
realname: this.state.realname,
|
|
saslPlain: null,
|
|
autojoin: [],
|
|
};
|
|
|
|
if (this.state.password) {
|
|
params.saslPlain = {
|
|
username: params.username || params.nick,
|
|
password: this.state.password,
|
|
};
|
|
} else if (this.props.auth === "external") {
|
|
params.saslExternal = true;
|
|
}
|
|
|
|
if (this.state.autojoin) {
|
|
params.autojoin = this.props.params.autojoin || [];
|
|
}
|
|
|
|
this.props.onSubmit(params);
|
|
}
|
|
|
|
componentDidMount() {
|
|
if (this.nickInput.current) {
|
|
this.nickInput.current.focus();
|
|
}
|
|
}
|
|
|
|
render() {
|
|
let disabled = this.props.connecting;
|
|
|
|
let serverURL = null;
|
|
if (!this.props.params || !this.props.params.url) {
|
|
serverURL = html`
|
|
<label>
|
|
Server URL:<br/>
|
|
<input
|
|
type="text"
|
|
name="url"
|
|
value=${this.state.url}
|
|
disabled=${disabled}
|
|
inputmode="url"
|
|
/>
|
|
</label>
|
|
<br/><br/>
|
|
`;
|
|
}
|
|
|
|
let status = null;
|
|
if (this.props.connecting) {
|
|
status = html`
|
|
<p>Connecting...</p>
|
|
`;
|
|
} else if (this.props.error) {
|
|
status = html`
|
|
<p class="error-text">${this.props.error}</p>
|
|
`;
|
|
}
|
|
|
|
let auth = null;
|
|
if (this.props.auth !== "disabled" && this.props.auth !== "external") {
|
|
auth = html`
|
|
<label>
|
|
Password:<br/>
|
|
<input
|
|
type="password"
|
|
name="password"
|
|
value=${this.state.password}
|
|
disabled=${disabled}
|
|
required=${this.props.auth === "mandatory"}
|
|
placeholder=${this.props.auth !== "mandatory" ? "(optional)" : ""}
|
|
/>
|
|
</label>
|
|
<br/><br/>
|
|
`;
|
|
}
|
|
|
|
let autojoin = null;
|
|
let channels = this.props.params.autojoin || [];
|
|
if (channels.length > 0) {
|
|
let s = channels.length > 1 ? "s" : "";
|
|
autojoin = html`
|
|
<label>
|
|
<input
|
|
type="checkbox"
|
|
name="autojoin"
|
|
checked=${this.state.autojoin}
|
|
/>
|
|
Auto-join channel${s} <strong>${channels.join(', ')}</strong>
|
|
</label>
|
|
<br/><br/>
|
|
`;
|
|
}
|
|
|
|
return html`
|
|
<form onChange=${this.handleChange} onSubmit=${this.handleSubmit}>
|
|
<h2>Connect to IRC</h2>
|
|
|
|
<label>
|
|
Nickname:<br/>
|
|
<input
|
|
type="username"
|
|
name="nick"
|
|
value=${this.state.nick}
|
|
disabled=${disabled}
|
|
ref=${this.nickInput}
|
|
required
|
|
/>
|
|
</label>
|
|
<br/><br/>
|
|
|
|
${auth}
|
|
|
|
${autojoin}
|
|
|
|
<label>
|
|
<input
|
|
type="checkbox"
|
|
name="rememberMe"
|
|
checked=${this.state.rememberMe}
|
|
disabled=${disabled}
|
|
/>
|
|
Remember me
|
|
</label>
|
|
<br/><br/>
|
|
|
|
<details>
|
|
<summary role="button">Advanced options</summary>
|
|
|
|
<br/>
|
|
|
|
${serverURL}
|
|
|
|
<label>
|
|
Username:<br/>
|
|
<input
|
|
type="username"
|
|
name="username"
|
|
value=${this.state.username}
|
|
disabled=${disabled}
|
|
placeholder="Same as nickname"
|
|
/>
|
|
</label>
|
|
<br/><br/>
|
|
|
|
<label>
|
|
Real name:<br/>
|
|
<input
|
|
type="text"
|
|
name="realname"
|
|
value=${this.state.realname}
|
|
disabled=${disabled}
|
|
placeholder="Same as nickname"
|
|
/>
|
|
</label>
|
|
<br/><br/>
|
|
|
|
<label>
|
|
Server password:<br/>
|
|
<input
|
|
type="text"
|
|
name="pass"
|
|
value=${this.state.pass}
|
|
disabled=${disabled}
|
|
placeholder="None"
|
|
/>
|
|
</label>
|
|
<br/><br/>
|
|
</details>
|
|
|
|
<br/>
|
|
<button disabled=${disabled}>Connect</button>
|
|
|
|
${status}
|
|
</form>
|
|
`;
|
|
}
|
|
}
|