lemmy-ui/src/shared/components/home/setup.tsx
Alec Armbruster 80e2c9602e
Admin Settings: Bugfixes (#1313)
* move loading state to AdminSettings, pass as prop, tweak margin on some labels, add missing bind

* default loading state to false on setup.tsx, add util

* rename util to make more sense

* make @dessalines suggested changes
2023-06-16 11:52:47 -04:00

243 lines
6.6 KiB
TypeScript

import { Component, linkEvent } from "inferno";
import { Helmet } from "inferno-helmet";
import {
CreateSite,
GetSiteResponse,
LoginResponse,
Register,
} from "lemmy-js-client";
import { i18n } from "../../i18next";
import { UserService } from "../../services";
import { HttpService, RequestState } from "../../services/HttpService";
import { fetchThemeList, setIsoData } from "../../utils";
import { Spinner } from "../common/icon";
import { SiteForm } from "./site-form";
interface State {
form: {
username?: string;
email?: string;
password?: string;
password_verify?: string;
show_nsfw: boolean;
captcha_uuid?: string;
captcha_answer?: string;
honeypot?: string;
answer?: string;
};
doneRegisteringUser: boolean;
registerRes: RequestState<LoginResponse>;
themeList: string[];
siteRes: GetSiteResponse;
}
export class Setup extends Component<any, State> {
private isoData = setIsoData(this.context);
state: State = {
registerRes: { state: "empty" },
themeList: [],
form: {
show_nsfw: true,
},
doneRegisteringUser: !!UserService.Instance.myUserInfo,
siteRes: this.isoData.site_res,
};
constructor(props: any, context: any) {
super(props, context);
this.handleCreateSite = this.handleCreateSite.bind(this);
}
async componentDidMount() {
this.setState({ themeList: await fetchThemeList() });
}
get documentTitle(): string {
return `${i18n.t("setup")} - Lemmy`;
}
render() {
return (
<div className="container-lg">
<Helmet title={this.documentTitle} />
<div className="row">
<div className="col-12 offset-lg-3 col-lg-6">
<h3>{i18n.t("lemmy_instance_setup")}</h3>
{!this.state.doneRegisteringUser ? (
this.registerUser()
) : (
<SiteForm
showLocal
onSaveSite={this.handleCreateSite}
siteRes={this.state.siteRes}
themeList={this.state.themeList}
loading={false}
/>
)}
</div>
</div>
</div>
);
}
registerUser() {
return (
<form onSubmit={linkEvent(this, this.handleRegisterSubmit)}>
<h5>{i18n.t("setup_admin")}</h5>
<div className="form-group row">
<label className="col-sm-2 col-form-label" htmlFor="username">
{i18n.t("username")}
</label>
<div className="col-sm-10">
<input
type="text"
className="form-control"
id="username"
value={this.state.form.username}
onInput={linkEvent(this, this.handleRegisterUsernameChange)}
required
minLength={3}
pattern="[a-zA-Z0-9_]+"
/>
</div>
</div>
<div className="form-group row">
<label className="col-sm-2 col-form-label" htmlFor="email">
{i18n.t("email")}
</label>
<div className="col-sm-10">
<input
type="email"
id="email"
className="form-control"
placeholder={i18n.t("optional")}
value={this.state.form.email}
onInput={linkEvent(this, this.handleRegisterEmailChange)}
minLength={3}
/>
</div>
</div>
<div className="form-group row">
<label className="col-sm-2 col-form-label" htmlFor="password">
{i18n.t("password")}
</label>
<div className="col-sm-10">
<input
type="password"
id="password"
value={this.state.form.password}
onInput={linkEvent(this, this.handleRegisterPasswordChange)}
className="form-control"
required
autoComplete="new-password"
minLength={10}
maxLength={60}
/>
</div>
</div>
<div className="form-group row">
<label className="col-sm-2 col-form-label" htmlFor="verify-password">
{i18n.t("verify_password")}
</label>
<div className="col-sm-10">
<input
type="password"
id="verify-password"
value={this.state.form.password_verify}
onInput={linkEvent(this, this.handleRegisterPasswordVerifyChange)}
className="form-control"
required
autoComplete="new-password"
minLength={10}
maxLength={60}
/>
</div>
</div>
<div className="form-group row">
<div className="col-sm-10">
<button type="submit" className="btn btn-secondary">
{this.state.registerRes.state == "loading" ? (
<Spinner />
) : (
i18n.t("sign_up")
)}
</button>
</div>
</div>
</form>
);
}
async handleRegisterSubmit(i: Setup, event: any) {
event.preventDefault();
i.setState({ registerRes: { state: "loading" } });
const {
username,
password_verify,
password,
email,
show_nsfw,
captcha_uuid,
captcha_answer,
honeypot,
answer,
} = i.state.form;
if (username && password && password_verify) {
const form: Register = {
username,
password,
password_verify,
email,
show_nsfw,
captcha_uuid,
captcha_answer,
honeypot,
answer,
};
i.setState({
registerRes: await HttpService.client.register(form),
});
if (i.state.registerRes.state == "success") {
const data = i.state.registerRes.data;
UserService.Instance.login(data);
if (UserService.Instance.jwtInfo) {
i.setState({ doneRegisteringUser: true });
}
}
}
}
async handleCreateSite(form: CreateSite) {
const createRes = await HttpService.client.createSite(form);
if (createRes.state === "success") {
this.props.history.replace("/");
location.reload();
}
}
handleRegisterUsernameChange(i: Setup, event: any) {
i.state.form.username = event.target.value.trim();
i.setState(i.state);
}
handleRegisterEmailChange(i: Setup, event: any) {
i.state.form.email = event.target.value;
i.setState(i.state);
}
handleRegisterPasswordChange(i: Setup, event: any) {
i.state.form.password = event.target.value;
i.setState(i.state);
}
handleRegisterPasswordVerifyChange(i: Setup, event: any) {
i.state.form.password_verify = event.target.value;
i.setState(i.state);
}
}