Path: blob/master/src/packages/frontend/admin/users/user.tsx
1496 views
/*1* This file is part of CoCalc: Copyright © 2020 Sagemath, Inc.2* License: MS-RSL – see LICENSE.md for details3*/45/*6Display of basic information about a user, with link to get more information about that user.7*/89import { useState } from "react";10import { Icon, TimeAgo } from "@cocalc/frontend/components";11import { capitalize } from "@cocalc/util/misc";12import { Card, Space, Tag } from "antd";13import type { User } from "@cocalc/frontend/frame-editors/generic/client";14import { Projects } from "./projects";15import { Impersonate } from "./impersonate";16import { PasswordReset } from "./password-reset";17import { Ban } from "./ban";18import PayAsYouGoMinBalance from "@cocalc/frontend/frame-editors/crm-editor/users/pay-as-you-go-min-balance";19import { PurchasesButton } from "@cocalc/frontend/purchases/purchases";20import { PaymentsButton } from "@cocalc/frontend/purchases/payments";21import { CreatePaymentButton } from "./create-payment";22import { CopyToClipBoard } from "@cocalc/frontend/components";23import Money from "./money";2425interface State {26projects: boolean;27purchases: boolean;28activity: boolean;29impersonate: boolean;30password: boolean;31ban: boolean;32}3334type More =35| "projects"36| "purchases"37| "activity"38| "impersonate"39| "password"40| "ban";4142export function UserResult({43first_name,44last_name,45email_address,46created,47last_active,48account_id,49banned,50}: User) {51const [details, setDetails] = useState<boolean>(false);52const [state, setState] = useState<State>({53projects: false,54purchases: false,55activity: false,56impersonate: false,57password: false,58ban: false,59});6061const renderCreated = () => {62if (!created) {63return <span>ancient times</span>;64}65return <TimeAgo date={created} />;66};6768const renderLastActive = () => {69if (!last_active) {70return <span>never</span>;71}72return <TimeAgo date={last_active} />;73};7475const renderMoreLink = (name: More) => {76return (77<Tag.CheckableTag78style={{ fontSize: "11pt" }}79checked={state[name]}80onChange={() => setState({ ...state, [name]: !state[name] })}81>82{capitalize(name)}83</Tag.CheckableTag>84);85};8687return (88<Card89style={{ margin: "15px 0", background: "#fafafa" }}90styles={{91body: { padding: "0 24px" },92title: { padding: "0" },93}}94title={95<div96style={{ cursor: "pointer" }}97onClick={details ? undefined : () => setDetails(true)}98>99<Icon100onClick={() => setDetails(!details)}101name={details ? "minus-square" : "plus-square"}102style={{ marginRight: "15px" }}103/>104<div style={{ float: "right", color: "#666" }}>105Active {renderLastActive()} (Created {renderCreated()})106</div>107<Space style={{ color: "#666" }}>108{first_name} {last_name}{" "}109{email_address ? (110<CopyToClipBoard111style={{ color: "#666" }}112value={email_address}113/>114) : (115"NO Email"116)}117</Space>118</div>119}120>121{details && (122<div>123<div style={{ float: "right" }}>124<CopyToClipBoard125copyTip={"Copied account_id!"}126style={{ color: "#666" }}127before128value={account_id}129/>130{banned && (131<div132style={{133fontSize: "10pt",134color: "white",135paddingLeft: "5px",136background: "red",137}}138>139BANNED140</div>141)}142</div>143<Space style={{ marginTop: "5px" }}>144{renderMoreLink("impersonate")}145{renderMoreLink("password")}146{renderMoreLink("ban")}147{renderMoreLink("projects")}148{renderMoreLink("purchases")}149</Space>150{state.impersonate && (151<Impersonate152account_id={account_id}153first_name={first_name ?? ""}154last_name={last_name ?? ""}155/>156)}157{state.password && email_address && (158<Card title="Password">159<PasswordReset160account_id={account_id}161email_address={email_address}162/>163</Card>164)}165{state.ban && (166<Card167title={168<>169Ban {first_name} {last_name} {email_address}170</>171}172>173<Ban174account_id={account_id}175banned={banned}176name={`${first_name} ${last_name} ${email_address}`}177/>178</Card>179)}180{state.projects && (181<Projects182account_id={account_id}183title={`Recently active projects that ${first_name} ${last_name} collaborates on`}184/>185)}186{state.purchases && (187<Card title="Purchases">188<div style={{ margin: "15px 0" }}>189<Money account_id={account_id} />190<div style={{ height: "15px" }} />191<PayAsYouGoMinBalance account_id={account_id} />192<div style={{ height: "15px" }} />193<PurchasesButton account_id={account_id} />194<div style={{ height: "15px" }} />195<PaymentsButton account_id={account_id} />196<div style={{ height: "15px" }} />197<CreatePaymentButton account_id={account_id} />198</div>199</Card>200)}201</div>202)}203</Card>204);205}206207export default UserResult;208209210