mirror of
https://git.sr.ht/~emersion/gamja
synced 2024-12-01 11:57:09 -05:00
c4a78283af
Sometimes servers will put links and channels in their error messages. Make it easy for users to click them.
230 lines
4.4 KiB
JavaScript
230 lines
4.4 KiB
JavaScript
import { html, Component, createRef } from "../lib/index.js";
|
|
import linkify from "../lib/linkify.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">${linkify(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>
|
|
`;
|
|
}
|
|
}
|