2021-07-04 21:28:45 +02:00
|
|
|
import { html, Component, createRef } from "../lib/index.js";
|
2021-11-29 13:38:07 +01:00
|
|
|
import linkify from "../lib/linkify.js";
|
2020-06-18 14:23:08 +02:00
|
|
|
|
2021-03-09 13:25:31 +01:00
|
|
|
export default class ConnectForm extends Component {
|
2020-06-18 14:23:08 +02:00
|
|
|
state = {
|
2021-05-31 18:04:02 +02:00
|
|
|
url: "",
|
|
|
|
pass: "",
|
2020-06-18 14:23:08 +02:00
|
|
|
nick: "",
|
|
|
|
password: "",
|
|
|
|
rememberMe: false,
|
|
|
|
username: "",
|
|
|
|
realname: "",
|
2021-11-27 12:08:23 +01:00
|
|
|
autojoin: true,
|
2020-06-18 14:23:08 +02:00
|
|
|
};
|
2021-07-04 21:28:45 +02:00
|
|
|
nickInput = createRef();
|
2020-06-18 14:23:08 +02:00
|
|
|
|
|
|
|
constructor(props) {
|
|
|
|
super(props);
|
|
|
|
|
2023-01-10 11:05:57 -03:00
|
|
|
this.handleInput = this.handleInput.bind(this);
|
2020-06-18 14:23:08 +02:00
|
|
|
this.handleSubmit = this.handleSubmit.bind(this);
|
|
|
|
|
|
|
|
if (props.params) {
|
|
|
|
this.state = {
|
|
|
|
...this.state,
|
2021-05-31 18:04:02 +02:00
|
|
|
url: props.params.url || "",
|
2020-06-18 14:23:08 +02:00
|
|
|
nick: props.params.nick || "",
|
2020-06-24 18:14:46 +02:00
|
|
|
rememberMe: props.params.autoconnect || false,
|
2020-06-18 14:23:08 +02:00
|
|
|
username: props.params.username || "",
|
|
|
|
realname: props.params.realname || "",
|
|
|
|
};
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-01-10 11:05:57 -03:00
|
|
|
handleInput(event) {
|
2021-06-10 18:11:11 +02:00
|
|
|
let target = event.target;
|
2024-10-14 00:56:18 +02:00
|
|
|
let value = target.type === "checkbox" ? target.checked : target.value;
|
2020-06-18 14:23:08 +02:00
|
|
|
this.setState({ [target.name]: value });
|
|
|
|
}
|
|
|
|
|
|
|
|
handleSubmit(event) {
|
|
|
|
event.preventDefault();
|
|
|
|
|
2021-06-06 11:33:00 +02:00
|
|
|
if (this.props.connecting) {
|
2020-06-18 14:23:08 +02:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2021-06-10 18:11:11 +02:00
|
|
|
let params = {
|
2021-05-31 18:04:02 +02:00
|
|
|
url: this.state.url,
|
|
|
|
pass: this.state.pass,
|
2020-06-18 14:23:08 +02:00
|
|
|
nick: this.state.nick,
|
2020-06-24 18:14:46 +02:00
|
|
|
autoconnect: this.state.rememberMe,
|
2021-05-31 17:57:17 +02:00
|
|
|
username: this.state.username,
|
|
|
|
realname: this.state.realname,
|
2020-06-18 14:23:08 +02:00
|
|
|
saslPlain: null,
|
|
|
|
autojoin: [],
|
|
|
|
};
|
|
|
|
|
|
|
|
if (this.state.password) {
|
|
|
|
params.saslPlain = {
|
2021-05-31 18:04:02 +02:00
|
|
|
username: params.username || params.nick,
|
2020-06-18 14:23:08 +02:00
|
|
|
password: this.state.password,
|
|
|
|
};
|
2021-10-12 17:29:56 +02:00
|
|
|
} else if (this.props.auth === "external") {
|
|
|
|
params.saslExternal = true;
|
2022-09-12 11:38:43 +02:00
|
|
|
} else if (this.props.auth === "oauth2") {
|
|
|
|
params.saslOauthBearer = this.props.params.saslOauthBearer;
|
2020-06-18 14:23:08 +02:00
|
|
|
}
|
|
|
|
|
2021-11-27 12:08:23 +01:00
|
|
|
if (this.state.autojoin) {
|
|
|
|
params.autojoin = this.props.params.autojoin || [];
|
|
|
|
}
|
2020-06-18 14:23:08 +02:00
|
|
|
|
|
|
|
this.props.onSubmit(params);
|
|
|
|
}
|
|
|
|
|
2021-07-04 21:28:45 +02:00
|
|
|
componentDidMount() {
|
|
|
|
if (this.nickInput.current) {
|
|
|
|
this.nickInput.current.focus();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-06-18 14:23:08 +02:00
|
|
|
render() {
|
2021-06-10 18:11:11 +02:00
|
|
|
let disabled = this.props.connecting;
|
2021-06-06 11:33:00 +02:00
|
|
|
|
2021-06-10 18:11:11 +02:00
|
|
|
let serverURL = null;
|
2021-05-31 18:13:44 +02:00
|
|
|
if (!this.props.params || !this.props.params.url) {
|
|
|
|
serverURL = html`
|
|
|
|
<label>
|
|
|
|
Server URL:<br/>
|
2021-07-04 21:51:42 +02:00
|
|
|
<input
|
|
|
|
type="text"
|
|
|
|
name="url"
|
|
|
|
value=${this.state.url}
|
|
|
|
disabled=${disabled}
|
|
|
|
inputmode="url"
|
|
|
|
/>
|
2021-05-31 18:13:44 +02:00
|
|
|
</label>
|
|
|
|
<br/><br/>
|
|
|
|
`;
|
|
|
|
}
|
|
|
|
|
2021-06-10 18:11:11 +02:00
|
|
|
let status = null;
|
2021-06-06 11:33:00 +02:00
|
|
|
if (this.props.connecting) {
|
|
|
|
status = html`
|
|
|
|
<p>Connecting...</p>
|
|
|
|
`;
|
|
|
|
} else if (this.props.error) {
|
|
|
|
status = html`
|
2021-11-29 13:38:07 +01:00
|
|
|
<p class="error-text">${linkify(this.props.error)}</p>
|
2021-06-06 11:33:00 +02:00
|
|
|
`;
|
|
|
|
}
|
|
|
|
|
2021-06-10 18:11:11 +02:00
|
|
|
let auth = null;
|
2022-09-12 11:38:43 +02:00
|
|
|
if (this.props.auth !== "disabled" && this.props.auth !== "external" && this.props.auth !== "oauth2") {
|
2021-06-10 11:40:59 -04:00
|
|
|
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/>
|
|
|
|
`;
|
|
|
|
}
|
|
|
|
|
2021-11-27 12:08:23 +01:00
|
|
|
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}
|
|
|
|
/>
|
2022-02-26 09:54:31 +01:00
|
|
|
Auto-join channel${s} <strong>${channels.join(", ")}</strong>
|
2021-11-27 12:08:23 +01:00
|
|
|
</label>
|
|
|
|
<br/><br/>
|
|
|
|
`;
|
|
|
|
}
|
2021-06-10 18:21:18 +02:00
|
|
|
|
2020-06-18 14:23:08 +02:00
|
|
|
return html`
|
2023-01-10 11:05:57 -03:00
|
|
|
<form onInput=${this.handleInput} onSubmit=${this.handleSubmit}>
|
2020-06-18 14:23:08 +02:00
|
|
|
<h2>Connect to IRC</h2>
|
|
|
|
|
|
|
|
<label>
|
|
|
|
Nickname:<br/>
|
2021-07-04 21:51:42 +02:00
|
|
|
<input
|
|
|
|
type="username"
|
|
|
|
name="nick"
|
|
|
|
value=${this.state.nick}
|
|
|
|
disabled=${disabled}
|
|
|
|
ref=${this.nickInput}
|
|
|
|
required
|
2022-09-12 13:43:58 +02:00
|
|
|
autofocus
|
2021-07-04 21:51:42 +02:00
|
|
|
/>
|
2020-06-18 14:23:08 +02:00
|
|
|
</label>
|
|
|
|
<br/><br/>
|
|
|
|
|
2021-06-10 11:40:59 -04:00
|
|
|
${auth}
|
2020-06-18 14:23:08 +02:00
|
|
|
|
2021-11-27 12:08:23 +01:00
|
|
|
${autojoin}
|
2021-06-10 18:21:18 +02:00
|
|
|
|
2021-05-26 18:43:11 +02:00
|
|
|
<label>
|
2021-07-04 21:51:42 +02:00
|
|
|
<input
|
|
|
|
type="checkbox"
|
|
|
|
name="rememberMe"
|
|
|
|
checked=${this.state.rememberMe}
|
|
|
|
disabled=${disabled}
|
|
|
|
/>
|
2021-05-26 18:43:11 +02:00
|
|
|
Remember me
|
|
|
|
</label>
|
|
|
|
<br/><br/>
|
2020-06-18 14:23:08 +02:00
|
|
|
|
|
|
|
<details>
|
2021-06-06 12:05:57 +02:00
|
|
|
<summary role="button">Advanced options</summary>
|
2020-06-18 14:23:08 +02:00
|
|
|
|
|
|
|
<br/>
|
|
|
|
|
2021-05-31 18:13:44 +02:00
|
|
|
${serverURL}
|
2020-06-18 14:23:08 +02:00
|
|
|
|
|
|
|
<label>
|
|
|
|
Username:<br/>
|
2021-07-04 21:51:42 +02:00
|
|
|
<input
|
|
|
|
type="username"
|
|
|
|
name="username"
|
|
|
|
value=${this.state.username}
|
|
|
|
disabled=${disabled}
|
|
|
|
placeholder="Same as nickname"
|
|
|
|
/>
|
2020-06-18 14:23:08 +02:00
|
|
|
</label>
|
|
|
|
<br/><br/>
|
|
|
|
|
|
|
|
<label>
|
|
|
|
Real name:<br/>
|
2021-07-04 21:51:42 +02:00
|
|
|
<input
|
|
|
|
type="text"
|
|
|
|
name="realname"
|
|
|
|
value=${this.state.realname}
|
|
|
|
disabled=${disabled}
|
|
|
|
placeholder="Same as nickname"
|
|
|
|
/>
|
2020-06-18 14:23:08 +02:00
|
|
|
</label>
|
|
|
|
<br/><br/>
|
|
|
|
|
|
|
|
<label>
|
|
|
|
Server password:<br/>
|
2021-07-04 21:51:42 +02:00
|
|
|
<input
|
2022-02-11 12:24:01 +01:00
|
|
|
type="password"
|
2021-07-04 21:51:42 +02:00
|
|
|
name="pass"
|
|
|
|
value=${this.state.pass}
|
|
|
|
disabled=${disabled}
|
|
|
|
placeholder="None"
|
|
|
|
/>
|
2020-06-18 14:23:08 +02:00
|
|
|
</label>
|
|
|
|
<br/><br/>
|
|
|
|
</details>
|
|
|
|
|
|
|
|
<br/>
|
2021-06-06 11:33:00 +02:00
|
|
|
<button disabled=${disabled}>Connect</button>
|
|
|
|
|
|
|
|
${status}
|
2020-06-18 14:23:08 +02:00
|
|
|
</form>
|
|
|
|
`;
|
|
|
|
}
|
|
|
|
}
|