Contact
CoCalc Logo Icon
StoreFeaturesDocsShareSupport News AboutSign UpSign In
| Download
Views: 39550
1
###
2
API Key Configuration
3
###
4
5
misc = require('smc-util/misc')
6
7
{webapp_client} = require('./webapp_client')
8
9
{React, ReactDOM, rtypes, rclass, redux} = require('./smc-react')
10
11
{CloseX, ErrorDisplay, Icon, LabeledRow, Loading} = require('./r_misc')
12
13
{Button, FormControl, Well} = require('react-bootstrap')
14
15
exports.APIKeySetting = rclass
16
getInitialState: ->
17
api_key : undefined # if it has been loaded
18
password : '' # must be defined so that input control is controlled
19
error : undefined
20
state : 'init'
21
22
###
23
The states are:
24
'init' - initial state -- show nothing and wait to click to request to view key; no info
25
'error' - showing an error
26
'password' - requesting password from user
27
'loading' - loading something from backend (doing api call)
28
'showkey' - showing the api key (or that there is none)
29
'confirm-delete' - confirming delete of API key
30
'confirm-regenerate' - confirming regenerate of API key
31
###
32
33
componentDidMount: ->
34
@_mounted = true
35
36
componentWillUnmount: ->
37
@_mounted = false
38
39
render_confirm: ->
40
switch @state.state
41
when 'confirm-delete'
42
action = 'delete'
43
mesg = "Are you sure you want to delete your API key? "
44
when 'confirm-regenerate'
45
action = 'regenerate'
46
mesg = "Are you sure you want to regenerate your API key? "
47
<div>
48
{mesg} <b><i>Anything using the current API key will stop working.</i></b>
49
<br/>
50
<br/>
51
<Button onClick={=>@do_action(action)} style={marginRight:'5px'} bsStyle='warning'>
52
Yes
53
</Button>
54
<Button onClick={=>@setState(state:'showkey')}>
55
Cancel
56
</Button>
57
</div>
58
59
60
do_action: (action) ->
61
@setState(state:'loading')
62
webapp_client.api_key
63
action : action
64
password : @state.password
65
cb : (err, api_key) =>
66
if @_mounted
67
if err
68
@setState(error:err, password:undefined, api_key:undefined, state:'error')
69
else
70
@setState(api_key:api_key, state:'showkey')
71
72
render_api_key: ->
73
if @state.api_key
74
<div>
75
<pre>
76
{@state.api_key}
77
</pre>
78
{@render_button('delete', 'Delete key')}
79
<span style={marginRight:'5px'}></span>
80
{@render_button('regenerate', 'Regenerate key')}
81
</div>
82
else
83
<div>
84
You do not have an API key.
85
<br/>
86
<br/>
87
{@render_button('regenerate', 'Create API Key')}
88
</div>
89
90
click_action_button: (action) ->
91
switch @state.state
92
when 'init'
93
@setState(state: 'password')
94
when 'password'
95
@do_action(action)
96
when 'showkey'
97
if @state.api_key
98
@setState(state: "confirm-#{action}")
99
else
100
@do_action(action)
101
102
render_button: (action, name, disabled) ->
103
if not name?
104
switch action
105
when 'get'
106
name = 'Reveal key'
107
when 'delete'
108
name = 'Delete key'
109
when 'regenerate'
110
name = 'Regenerate key'
111
if misc.startswith(@state.state, 'confirm-')
112
disabled = true
113
<Button
114
onClick = {=>@click_action_button(action)}
115
disabled = {disabled}
116
>
117
{name}{if @state.api_key or @state.state == 'init' then "..." else ""}
118
</Button>
119
120
render_get_password: ->
121
<div style={display:'flex'}>
122
<FormControl
123
autoFocus
124
style = {flex:1, marginRight:'5px'}
125
type = 'password'
126
ref = 'password'
127
placeholder = 'Current Password'
128
value = {@state.password}
129
onChange = {=>@setState(password : ReactDOM.findDOMNode(@refs.password).value)}
130
/>
131
{@render_button('get', undefined, not @state.password)}
132
</div>
133
134
render_content: ->
135
if @state.error
136
return <ErrorDisplay error={@state.error} onClose={=>@setState(error:'', state:'init', password:undefined)} />
137
switch @state.state
138
when 'loading'
139
return <Loading />
140
when 'password'
141
return @render_get_password()
142
when 'showkey'
143
return @render_api_key()
144
when 'confirm-delete', 'confirm-regenerate'
145
return <span>{@render_api_key()}<br/>{@render_confirm()}</span>
146
147
render_close: ->
148
<CloseX on_close={=>@setState(@getInitialState())} style={marginRight:'5px'} />
149
150
render_docs: ->
151
<div>
152
<hr/>
153
<span style={color:'#666'}>
154
See the <a href="#{window.app_base_url}/doc/api.html" target="_blank">CoCalc API documentation</a> to learn about the API.
155
</span>
156
</div>
157
158
render_well: ->
159
<div>
160
{@render_close()}
161
<Well>
162
{@render_content()}
163
{@render_docs()}
164
</Well>
165
</div>
166
167
render_init: ->
168
<div className='pull-right'>
169
{@render_button('get')}
170
</div>
171
172
render: ->
173
<LabeledRow label='API key'>
174
<div style={minHeight:'30px'}>
175
{if @state.state == 'init' then @render_init() else @render_well()}
176
</div>
177
</LabeledRow>
178
179