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 Window from "~/common/window"; import * as FileUtilities from "~/common/file-utilities"; import { css } from "@emotion/core"; import { dispatchCustomEvent } from "~/common/custom-events"; import { TabGroup } from "~/components/core/TabGroup"; import ScenePage from "~/components/core/ScenePage"; import ScenePageHeader from "~/components/core/ScenePageHeader"; 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 STYLES_COPY_INPUT = css` pointer-events: none; position: absolute; opacity: 0; `; 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, allow_filecoin_directory_listing: this.props.viewer.allow_filecoin_directory_listing, allow_automatic_data_storage: this.props.viewer.allow_automatic_data_storage, allow_encrypted_data_storage: this.props.viewer.allow_encrypted_data_storage, changingPassword: false, changingUsername: false, changingAvatar: false, changingFilecoin: false, tab: 0, }; _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 response = await FileUtilities.upload({ file, routes: this.props.resources }); if (!response) { dispatchCustomEvent({ name: "create-alert", detail: { alert: { message: "We're having trouble connecting right now" }, }, }); this.setState({ changingAvatar: false }); return; } if (response.error) { dispatchCustomEvent({ name: "create-alert", detail: { alert: { decorator: json.decorator } }, }); this.setState({ changingAvatar: false }); return; } const { json } = response; 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, }, }); 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, }, }); this.setState({ changingBio: false }); }; _handleSaveFilecoin = async (e) => { this.setState({ changingFilecoin: true }); await Actions.updateViewer({ data: { photo: this.state.photo, body: this.state.body, name: this.state.name, allow_filecoin_directory_listing: this.state.allow_filecoin_directory_listing, allow_automatic_data_storage: this.state.allow_automatic_data_storage, allow_encrypted_data_storage: this.state.allow_encrypted_data_storage, }, }); this.setState({ changingFilecoin: 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, }, }); 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 Window.delay(100); const response = await this.props.onDeleteYourself(); this.setState({ deleting: false }); }; _handleChange = (e) => { e.persist(); this.setState({ [e.target.name]: e.target.value }); }; _handleCheckboxChange = (e) => { this.setState({ [e.target.name]: e.target.value }); }; render() { const profileURL = `https://slate.host/${this.state.username}`; return ( this.setState({ tab: value })} /> {this.state.tab === 0 ? (
Upload 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
Save
) : null} {this.state.tab === 1 ? (
Show your successful deals on a directory page where others can retrieve them. Allow Slate to make archive storage deals on your behalf to the Filecoin Network. You will get a receipt in the Filecoin section. Force encryption on archive storage deals (only you can see retrieved data from the Filecoin network).
Save
) : null} {this.state.tab === 2 ? (
Change password
) : null} {this.state.tab === 3 ? (
Delete my account
) : null} { this._ref = c; }} value={this.state.copyValue} tabIndex="-1" css={STYLES_COPY_INPUT} />{" "}
); } }