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
>
)}
);
}
}