2020-07-16 04:36:29 +03:00
import * as React from "react" ;
import * as Actions from "~/common/actions" ;
2020-07-28 09:54:15 +03:00
import * as Constants from "~/common/constants" ;
2020-07-16 04:36:29 +03:00
import * as System from "~/components/system" ;
2020-07-28 09:54:15 +03:00
import * as SVG from "~/components/system/svg" ;
2020-07-16 04:36:29 +03:00
import { css } from "@emotion/react" ;
import ScenePage from "~/components/core/ScenePage" ;
2020-08-22 07:25:34 +03:00
import ScenePageHeader from "~/components/core/ScenePageHeader" ;
2020-07-29 02:08:38 +03:00
import CodeBlock from "~/components/system/CodeBlock" ;
2020-07-16 04:36:29 +03:00
2020-07-28 09:54:15 +03:00
const STYLES _KEY = css `
display : flex ;
align - items : center ;
justify - content : space - between ;
margin - bottom : 12 px ;
2020-08-09 01:04:17 +03:00
width : 100 % ;
2020-08-09 06:52:22 +03:00
max - width : 416 px ;
2020-08-09 01:04:17 +03:00
background - color : $ { Constants . system . black } ;
color : $ { Constants . system . white } ;
border : 4 px solid $ { Constants . system . black } ;
2020-08-09 06:52:22 +03:00
border - radius : 36 px ;
2020-07-28 09:54:15 +03:00
` ;
const STYLES _KEY _LEFT = css `
2020-08-09 01:04:17 +03:00
min - width : 10 % ;
width : 100 % ;
2020-07-28 09:54:15 +03:00
font - family : $ { Constants . font . code } ;
2020-08-09 01:04:17 +03:00
padding : 12 px 16 px 12 px 16 px ;
font - size : 11 px ;
2020-07-28 09:54:15 +03:00
` ;
const STYLES _KEY _RIGHT = css `
padding - left : 24 px ;
2020-08-09 01:04:17 +03:00
flex - shrink : 0 ;
2020-07-28 09:54:15 +03:00
` ;
const STYLES _CIRCLE _BUTTON = css `
2020-08-09 06:52:22 +03:00
height : 32 px ;
width : 32 px ;
border - radius : 32 px ;
2020-07-28 09:54:15 +03:00
display : inline - flex ;
align - items : center ;
justify - content : center ;
user - select : none ;
2020-08-09 01:04:17 +03:00
background : $ { Constants . system . white } ;
color : $ { Constants . system . black } ;
2020-07-28 09:54:15 +03:00
box - shadow : 0 1 px 4 px rgba ( 0 , 0 , 0 , 0.07 ) ;
cursor : pointer ;
2020-08-09 01:04:17 +03:00
transition : 200 ms ease all ;
: hover {
background : $ { Constants . system . brand } ;
color : $ { Constants . system . white } ;
}
2020-07-28 09:54:15 +03:00
` ;
class Key extends React . Component {
state = { visible : false } ;
_handleToggleVisible = ( ) => {
this . setState ( { visible : ! this . state . visible } ) ;
} ;
2020-08-09 01:04:17 +03:00
_handleDelete = async ( id ) => {
await this . props . onDelete ( id ) ;
} ;
2020-07-28 09:54:15 +03:00
render ( ) {
return (
< div css = { STYLES _KEY } >
{ this . state . visible ? (
< div css = { STYLES _KEY _LEFT } > { this . props . data . key } < / d i v >
) : (
2020-08-22 07:25:34 +03:00
< div css = { STYLES _KEY _LEFT } >
XXXXXXXXXXX - XXXX - XXXX - XXXX - XXXXXXXXXXXXXX
< / d i v >
2020-07-28 09:54:15 +03:00
) }
< div css = { STYLES _KEY _RIGHT } >
< span
css = { STYLES _CIRCLE _BUTTON }
onClick = { this . _handleToggleVisible }
style = { {
2020-08-09 06:52:22 +03:00
marginRight : 8 ,
2020-08-22 07:25:34 +03:00
} }
>
2020-07-28 09:54:15 +03:00
< SVG . Privacy height = "16px" / >
< / s p a n >
2020-08-09 06:52:22 +03:00
< span
css = { STYLES _CIRCLE _BUTTON }
onClick = { ( ) => this . _handleDelete ( this . props . data . id ) }
style = { {
marginRight : 4 ,
2020-08-22 07:25:34 +03:00
} }
>
2020-07-28 09:54:15 +03:00
< SVG . Dismiss height = "16px" / >
< / s p a n >
< / d i v >
< / d i v >
) ;
}
}
2020-08-22 07:25:34 +03:00
const EXAMPLE _GET _SLATE = (
key ,
slateId
) => ` const response = await fetch('https://slate.host/api/v1/get-slate', {
2020-07-29 02:08:38 +03:00
method : 'POST' ,
headers : {
'Content-Type' : 'application/json' ,
// NOTE: your API key
Authorization : 'Basic ${key}' ,
} ,
body : JSON . stringify ( { data : {
2020-08-06 23:49:27 +03:00
// NOTE: your slate ID
2020-07-29 02:08:38 +03:00
id : $ { slateId }
} } )
} ) ;
const json = await response . json ( ) ;
console . log ( json ) ; ` ;
2020-08-22 07:25:34 +03:00
const EXAMPLE _GET = (
key
) => ` const response = await fetch('https://slate.host/api/v1/get', {
2020-08-06 23:49:27 +03:00
method : 'POST' ,
headers : {
'Content-Type' : 'application/json' ,
// NOTE: your API key
Authorization : 'Basic ${key}' ,
} ,
body : JSON . stringify ( { data : {
// NOTE: optional, if you want your private slates too.
private : false
} } )
} ) ;
const json = await response . json ( ) ;
console . log ( json ) ; ` ;
2020-08-08 23:44:27 +03:00
const EXAMPLE _GET _SLATE _RESPONSE = ( key , slateId ) => ` {
2020-07-29 02:08:38 +03:00
data : {
2020-07-29 07:05:42 +03:00
id : '${slateId}' ,
2020-07-29 02:08:38 +03:00
updated _at : '2020-07-27T09:04:53.007Z' ,
created _at : '2020-07-27T09:04:53.007Z' ,
published _at : '2020-07-27T09:04:53.007Z' ,
slatename : 'slatename' ,
data : {
name : "slatename" ,
public : true ,
objects : [
{
id : "data-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" ,
name : "data-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" ,
ownerId : "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" ,
2020-08-28 11:50:45 +03:00
url : "https://slate.host/static/art-v2-social.png"
2020-07-29 02:08:38 +03:00
}
] ,
ownerId : "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
}
} ` ;
2020-08-22 07:25:34 +03:00
const EXAMPLE _UPLOAD _TO _SLATE = (
key ,
slateId
) => ` const url = 'https://slate.host/api/v1/upload-data/ ${ slateId } ';
2020-07-29 02:08:38 +03:00
let file = e . target . files [ 0 ] ;
let data = new FormData ( ) ;
2020-08-04 04:56:41 +03:00
data . append ( "data" , file ) ;
2020-07-29 02:08:38 +03:00
const response = await fetch ( url , {
method : 'POST' ,
headers : {
// NOTE: your API key
Authorization : 'Basic ${key}' ,
} ,
body : data
} ) ;
const json = await response . json ( ) ;
2020-07-29 02:24:15 +03:00
2020-08-08 23:44:27 +03:00
// NOTE: the URL to your asset will be available in the JSON response.
2020-07-29 02:08:38 +03:00
console . log ( json ) ; ` ;
2020-07-16 04:36:29 +03:00
export default class SceneSettingsDeveloper extends React . Component {
2020-07-28 09:54:15 +03:00
state = {
loading : false ,
} ;
_handleSave = async ( e ) => {
this . setState ( { loading : true } ) ;
const response = await Actions . generateAPIKey ( ) ;
if ( response && response . error ) {
// TODO(jim): Proper error message.
alert ( response . decorator ) ;
return this . setState ( { loading : false } ) ;
}
await this . props . onRehydrate ( ) ;
this . setState ( { loading : false } ) ;
} ;
_handleDelete = async ( id ) => {
this . setState ( { loading : true } ) ;
2020-08-22 07:25:34 +03:00
if (
! window . confirm (
"Are you sure you want to delete this key? This action is irreversible"
)
) {
2020-07-28 09:54:15 +03:00
this . setState ( { loading : false } ) ;
return ;
}
const response = await Actions . deleteAPIKey ( { id } ) ;
if ( response && response . error ) {
// TODO(jim): Proper error message.
alert ( response . decorator ) ;
return this . setState ( { loading : false } ) ;
}
await this . props . onRehydrate ( ) ;
this . setState ( { loading : false } ) ;
} ;
2020-07-29 02:08:38 +03:00
async componentDidMount ( ) {
if ( ! this . props . viewer . keys ) {
return ;
}
if ( ! this . props . viewer . keys . length ) {
return ;
}
const response = await fetch ( "/api/v1/get-slate" , {
method : "POST" ,
headers : {
"Content-Type" : "application/json" ,
Authorization : ` Basic ${ this . props . viewer . keys [ 0 ] . key } ` ,
} ,
} ) ;
const json = await response . json ( ) ;
console . log ( json ) ;
}
2020-07-16 04:36:29 +03:00
render ( ) {
2020-07-29 02:08:38 +03:00
let key ;
if ( this . props . viewer . keys ) {
if ( this . props . viewer . keys . length ) {
key = this . props . viewer . keys [ 0 ] . key ;
}
}
let slateId = "your-slate-uuid-v4-value" ;
if ( this . props . viewer . slates ) {
if ( this . props . viewer . slates . length ) {
slateId = this . props . viewer . slates [ 0 ] . id ;
}
}
2020-07-28 09:54:15 +03:00
return (
< ScenePage >
2020-08-22 07:25:34 +03:00
< ScenePageHeader title = "Developer API" >
You can use your API key to get slates and add images to slates . You
can have a total of 10 keys at any given time .
< / S c e n e P a g e H e a d e r >
< br / >
< br / >
2020-07-28 09:54:15 +03:00
{ this . props . viewer . keys . map ( ( k ) => {
return < Key key = { k . id } data = { k } onDelete = { this . _handleDelete } / > ;
} ) }
< div style = { { marginTop : 24 } } >
2020-08-22 07:25:34 +03:00
< System . ButtonPrimary
onClick = { this . _handleSave }
loading = { this . state . loading }
>
2020-07-28 09:54:15 +03:00
Generate
< / S y s t e m . B u t t o n P r i m a r y >
< / d i v >
2020-07-29 02:08:38 +03:00
{ key ? (
< React . Fragment >
< System . H2 style = { { marginTop : 64 } } > Usage ( JavaScript ) < / S y s t e m . H 2 >
2020-08-06 23:49:27 +03:00
< System . DescriptionGroup
style = { { marginTop : 48 } }
label = "Get all slates"
description = "This API request will return all of your public slates."
/ >
2020-08-22 07:25:34 +03:00
< CodeBlock
children = { EXAMPLE _GET ( key ) }
style = { { maxWidth : "768px" } }
/ >
2020-08-06 23:49:27 +03:00
< br / >
< br / >
2020-07-29 02:08:38 +03:00
< System . DescriptionGroup
style = { { marginTop : 48 } }
label = "Get slate by ID"
2020-08-06 23:49:27 +03:00
description = "This API request will return a specific slate. If you don't provide an ID argument the response will contain the most recently modified slate."
/ >
2020-08-22 07:25:34 +03:00
< CodeBlock
children = { EXAMPLE _GET _SLATE ( key , slateId ) }
style = { { maxWidth : "768px" } }
/ >
2020-08-09 06:52:22 +03:00
< System . DescriptionGroup
style = { { marginTop : 48 , marginBottom : 16 } }
label = "Get slate by ID: Response"
description = "This is the shape of the response."
/ >
2020-08-22 07:25:34 +03:00
< CodeBlock
children = { EXAMPLE _GET _SLATE _RESPONSE ( key ) }
style = { { maxWidth : "768px" } }
/ >
2020-07-29 02:08:38 +03:00
< System . DescriptionGroup
style = { { marginTop : 48 } }
label = "Upload data to slate by ID"
2020-08-06 23:49:27 +03:00
description = "This API request will add a JavaScript file object to your slate."
/ >
2020-08-22 07:25:34 +03:00
< CodeBlock
children = { EXAMPLE _UPLOAD _TO _SLATE ( key , slateId ) }
style = { { maxWidth : "768px" } }
/ >
2020-07-29 02:08:38 +03:00
< / R e a c t . F r a g m e n t >
) : null }
2020-07-28 09:54:15 +03:00
< / S c e n e P a g e >
) ;
2020-07-16 04:36:29 +03:00
}
}