Path: blob/master/src/packages/frontend/admin/users/password-reset.tsx
1496 views
/*1* This file is part of CoCalc: Copyright © 2020 Sagemath, Inc.2* License: MS-RSL – see LICENSE.md for details3*/45import { Component, Rendered } from "@cocalc/frontend/app-framework";6import { Button } from "@cocalc/frontend/antd-bootstrap";7import {8CopyToClipBoard,9Icon,10ErrorDisplay,11} from "@cocalc/frontend/components";12import { webapp_client } from "../../webapp-client";13import { appBasePath } from "@cocalc/frontend/customize/app-base-path";1415interface Props {16account_id: string;17email_address: string;18}1920interface State {21error?: string;22running: boolean;23link?: string;24}2526export class PasswordReset extends Component<Props, State> {27mounted: boolean = true;2829constructor(props: any) {30super(props);31this.state = { running: false };32}3334componentWillUnmount(): void {35this.mounted = false;36}3738async do_request(): Promise<void> {39this.setState({ running: true });40let link: string;41try {42link = await webapp_client.conat_client.hub.system.adminResetPasswordLink(43{ user_account_id: this.props.account_id },44);45} catch (err) {46if (!this.mounted) return;47this.setState({ error: `${err}`, running: false });48return;49}50if (!this.mounted) return;51link = `${document.location.origin}${52appBasePath.length <= 1 ? "" : appBasePath53}${link}`;54this.setState({ link, running: false });55}5657render_password_reset_button(): Rendered {58return (59<Button60disabled={this.state.running}61onClick={() => {62this.do_request();63}}64>65<Icon66name={this.state.running ? "sync" : "lock-open"}67spin={this.state.running}68/>{" "}69Request Password Reset Link...70</Button>71);72}7374render_error(): Rendered {75if (!this.state.error) {76return;77}78return (79<ErrorDisplay80style={{ margin: "30px" }}81error={this.state.error}82onClose={() => {83this.setState({ error: undefined });84}}85/>86);87}8889render_password_reset_link(): Rendered {90if (!this.state.link) return;91return (92<div>93<div style={{ marginTop: "20px" }}>94{" "}95Send this somehow to{" "}96<a97href={`mailto:${this.props.email_address}`}98target="_blank"99rel="noopener noreferrer"100>101{this.props.email_address}.102</a>103<br />104<CopyToClipBoard value={this.state.link} />105</div>106</div>107);108}109110render(): Rendered {111if (!this.props.email_address) {112return (113<div>114User does not have an email address set, so password reset does not115make sense.116</div>117);118}119return (120<div>121<b>Password Reset:</b>122<br />123{this.render_error()}124{this.render_password_reset_button()}125{this.render_password_reset_link()}126<br />127<br />128</div>129);130}131}132133134