import * as React from "react"; import * as System from "~/components/system"; import * as Actions from "~/common/actions"; import * as Constants from "~/common/constants"; import * as Strings from "~/common/strings"; import * as Validations from "~/common/validations"; import * as FileUtilities from "~/common/file-utilities"; import { css } from "@emotion/react"; import { dispatchCustomEvent } from "~/common/custom-events"; import ScenePage from "~/components/core/ScenePage"; import Avatar from "~/components/core/Avatar"; const STYLES_FILE_HIDDEN = css` height: 1px; width: 1px; opacity: 0; visibility: hidden; position: fixed; top: -1px; left: -1px; `; const delay = (time) => new Promise((resolve) => setTimeout(() => { resolve(); }, time) ); export default class SceneEditAccount extends React.Component { state = { username: this.props.viewer.username, password: "", confirm: "", body: this.props.viewer.data.body, photo: this.props.viewer.data.photo, name: this.props.viewer.data.name, deleting: false, changingPassword: false, changingUsername: false, changingAvatar: false, }; _handleUpload = async (e) => { this.setState({ changingAvatar: true }); e.persist(); let file = e.target.files[0]; if (!file) { dispatchCustomEvent({ name: "create-alert", detail: { alert: { message: "Something went wrong with the upload. Please try again", }, }, }); return; } // NOTE(jim): Only allow images for account avatar. if (!file.type.startsWith("image/")) { dispatchCustomEvent({ name: "create-alert", detail: { alert: { message: "Upload failed. Only images and gifs are allowed" }, }, }); return; } const json = await FileUtilities.upload({ file }); if (json.error) { dispatchCustomEvent({ name: "create-alert", detail: { alert: { decorator: json.decorator } }, }); this.setState({ changingAvatar: false }); return; } const cid = json.data.ipfs.replace("/ipfs/", ""); const url = Strings.getCIDGatewayURL(cid); await Actions.updateViewer({ data: { photo: Strings.getCIDGatewayURL(cid), body: this.state.body, name: this.state.name, }, }); await this.props.onRehydrate(); this.setState({ changingAvatar: false, photo: url }); }; _handleSaveBio = async (e) => { this.setState({ changingBio: true }); await Actions.updateViewer({ data: { photo: this.state.photo, body: this.state.body, name: this.state.name, }, }); await this.props.onRehydrate(); this.setState({ changingBio: false }); }; _handleSave = async (e) => { this.setState({ changingUsername: true }); if (!Validations.username(this.state.username)) { dispatchCustomEvent({ name: "create-alert", detail: { alert: { message: "Please include only letters and numbers in your username", }, }, }); this.setState({ changingUsername: false }); return; } await Actions.updateViewer({ username: this.state.username, data: { photo: this.state.photo, body: this.state.body, name: this.state.name, }, }); await this.props.onRehydrate(); this.setState({ changingUsername: false }); }; _handleUsernameChange = (e) => { e.persist(); this.setState({ [e.target.name]: e.target.value.toLowerCase() }); }; _handleChangePassword = async (e) => { this.setState({ changingPassword: true }); if (this.state.password !== this.state.confirm) { dispatchCustomEvent({ name: "create-alert", detail: { alert: { message: "Passwords did not match" } }, }); this.setState({ changingPassword: false }); return; } if (!Validations.password(this.state.password)) { dispatchCustomEvent({ name: "create-alert", detail: { alert: { message: "Password length must be more than 8 characters" }, }, }); this.setState({ changingPassword: false }); return; } await Actions.updateViewer({ type: "CHANGE_PASSWORD", password: this.state.password, }); this.setState({ changingPassword: false, password: "", confirm: "" }); }; _handleDelete = async (e) => { this.setState({ deleting: true }); await delay(100); const response = await this.props.onDeleteYourself(); if (!response) { dispatchCustomEvent({ name: "create-alert", detail: { alert: { message: "We're having trouble connecting right now. Please try again later", }, }, }); this.setState({ deleting: false }); } }; _handleChange = (e) => { e.persist(); this.setState({ [e.target.name]: e.target.value }); }; render() { const profileURL = `https://slate.host/${this.state.username}`; return ( Account Settings
Pick avatar
This is your username on Slate. Your username is unique and used for your profile URL{" "} {profileURL} } name="username" value={this.state.username} placeholder="Username" onChange={this._handleUsernameChange} />
Change username
Update information
Change password
Delete my account
); } }