import * as React from "react"; import * as Actions from "~/common/actions"; import * as Window from "~/common/window"; import * as Constants from "~/common/constants"; import * as System from "~/components/system"; import * as SVG from "~/common/svg"; import * as Events from "~/common/custom-events"; import { css } from "@emotion/react"; import { TabGroup, PrimaryTabGroup, SecondaryTabGroup } from "~/components/core/TabGroup"; import { ConfirmationModal } from "~/components/core/ConfirmationModal"; import ScenePage from "~/components/core/ScenePage"; import ScenePageHeader from "~/components/core/ScenePageHeader"; import SquareButtonGray from "~/components/core/SquareButtonGray"; import APIDocsGetV1 from "~/components/api-docs/v1/get"; import APIDocsGetSlateV1 from "~/components/api-docs/v1/get-slate.js"; import APIDocsUpdateSlateV1 from "~/components/api-docs/v1/update-slate.js"; import APIDocsUploadToSlateV1 from "~/components/api-docs/v1/upload.js"; import APIDocsGetV2 from "~/components/api-docs/v2/get"; import APIDocsGetSlateV2 from "~/components/api-docs/v2/get-slate.js"; import APIDocsGetUserV2 from "~/components/api-docs/v2/get-user.js"; import APIDocsUpdateSlateV2 from "~/components/api-docs/v2/update-slate.js"; import APIDocsUpdateFileV2 from "~/components/api-docs/v2/update-file.js"; import APIDocsUploadToSlateV2 from "~/components/api-docs/v2/upload.js"; import APIDocsCreateLinkV2 from "~/components/api-docs/v2/create-link.js"; import APIDocsCreateCollectionV2 from "~/components/api-docs/v2/create-collection.js"; import APIDocsUploadByCidV2 from "~/components/api-docs/v2/upload-by-cid.js"; import APIDocsUploadByUrlV2 from "~/components/api-docs/v2/upload-by-url.js"; import WebsitePrototypeWrapper from "~/components/core/WebsitePrototypeWrapper"; const STYLES_API_KEY = css` height: 40px; border-radius: 4px; cursor: copy; background-color: ${Constants.semantic.bgLight}; outline: none; border: none; width: 380px; font-family: ${Constants.font.code}; padding: 0 16px; font-size: 14px; `; const STYLES_KEY_CONTAINER = css` height: 40px; display: flex; flex-direction: row; align-items: center; margin-bottom: 8px; `; const STYLES_EXAMPLE = css` margin-bottom: 48px; `; const STYLES_SECTION_HEADER = css` margin-top: 48px; margin-bottom: 24px; `; class Key extends React.Component { _input; state = { visible: false, copying: false, modalShow: false }; _handleDelete = async (res, id) => { if (!res) { this.setState({ modalShow: false }); return; } await this.props.onDelete(id); this.setState({ modalShow: false }); }; _handleCopy = async () => { this._input.select(); document.execCommand("copy"); await this.setState({ copying: true }); await Window.delay(1000); await this.setState({ copying: false }); }; render() { return (
{ this._input = c; }} value={this.state.copying ? "Copied!" : this.props.data.key} readOnly type={this.state.visible || this.state.copying ? "text" : "password"} css={STYLES_API_KEY} onClick={this._handleCopy} onMouseEnter={() => this.setState({ visible: true })} onMouseLeave={() => this.setState({ visible: false })} /> this.setState({ modalShow: true })} style={{ marginLeft: 8, }} > {this.state.modalShow && ( this._handleDelete(e, this.props.data.id)} header={`Are you sure you want to revoke this API key?`} subHeader={`Any services using it will no longer be able to access your Slate account.`} /> )}
); } } export default class SceneSettingsDeveloper extends React.Component { _bucketCID; state = { loading: false, language: "javascript", docs: "GET", copying: false, modalShow: false, }; _handleCopy = async () => { this._bucketCID.select(); document.execCommand("copy"); await this.setState({ copying: true }); await Window.delay(1000); await this.setState({ copying: false }); }; _handleSave = async (e) => { this.setState({ loading: true }); const response = await Actions.generateAPIKey(); Events.hasError(response); this.setState({ loading: false }); }; _handleDelete = async (id) => { this.setState({ loading: true, modalShow: false }); const response = await Actions.deleteAPIKey({ id }); Events.hasError(response); this.setState({ loading: false }); }; _handleChangeLanguage = (newLanguage) => { this.setState({ language: newLanguage }); }; render() { const tab = this.props.page.params?.tab || "v2"; let APIKey = "YOUR-API-KEY-HERE"; let lang = this.state.language; if (this.props.viewer.keys) { if (this.props.viewer.keys.length) { APIKey = this.props.viewer.keys[0].key; } } const userId = this.props.viewer.id; let slateId = "YOUR-SLATE-ID-VALUE"; if (this.props.viewer.slates) { if (this.props.viewer.slates.length) { slateId = this.props.viewer.slates[0].id; } } let textileBucketCID = this.props.viewer?.textileBucketCID; return ( {/*
this._changeDocs("INTRO")}> Introduction api
this._changeDocs("GET")} > Get all slates this._changeDocs("GET_SLATE")} > Get slate by ID this._changeDocs("UPLOAD_TO_SLATE")} > Upload to slate by ID this._changeDocs("UPDATE_SLATE")} > Update slate
guides
*/} You can use your API keys to access your account information outside of Slate and upload files to Slate. You can have a maximum of 10 keys at any given time. {textileBucketCID && (
{ this._bucketCID = c; }} onClick={this._handleCopy} />
)}
{this.props.viewer.keys.map((k) => { return ; })}
{this.props.viewer.keys.length < 10 ? ( Generate ) : ( Generate )} {this.props.viewer.keys.length === 0 ? ( Generate an API key to have it appear in the code examples ) : null}
{/*
this._handleChangeLanguage("javascript")} > JS ICON Node.js
this._handleChangeLanguage("python")} > PY ICON Python3
*/} Slate is currently on v2.0 of the API. While prior versions are still supported, we recommend using the most up to date version. {tab === "v2" ? ( <> Get Update Create ) : ( <> Read operations Update operations Create operations )}
); } }