Skip to content
This repository was archived by the owner on Apr 30, 2026. It is now read-only.

Commit c621405

Browse files
committed
Add indicator for auto save
Fix #13
1 parent 8524e9a commit c621405

5 files changed

Lines changed: 54 additions & 33 deletions

File tree

src/css/style.css

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
html, body {
2-
min-width: 570px;
2+
min-width: 800px;
33
min-height: 600px;
44
height: 100%;
55
}

src/js/components/AutoSave.js

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import React, { Component } from 'react'
2+
import { inject, observer } from 'mobx-react'
3+
4+
@inject('AppStore')
5+
@observer
6+
export default class NewTabLink extends Component {
7+
render () {
8+
const { saved, autoSaveHandle } = this.props.AppStore
9+
const text = (autoSaveHandle && 'Saving...') || (saved && 'Draft saved')
10+
return (
11+
<div className='pure-u-1-6 include__body'>
12+
<span>
13+
{text}
14+
</span>
15+
</div>
16+
)
17+
}
18+
}

src/js/components/Include.js

Lines changed: 23 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -16,32 +16,30 @@ export default class Include extends Component {
1616
render () {
1717
const { include, includes, extraOpen, toggleExtraOpen, extraValue } = this.props.IncludeStore
1818
return (
19-
<div className='pure-g'>
20-
<div className='pure-u-7-8 include'>
21-
<div className='include__body'>
22-
You can inject <a href='#' onClick={toggleExtraOpen}>your own external scripts</a> or
23-
<label htmlFor='include'> predefined one:</label>
24-
<select
25-
name='include'
26-
value={include}
27-
onChange={this.onSelect}
28-
>
29-
<option value=''> ---- nothing ---- </option>
30-
{
31-
includes.map(({ name, path }) => (
32-
<option key={name} value={path}>
33-
{name}
34-
</option>
35-
))
36-
}
37-
</select>
38-
</div>
39-
<div className={`include__popbox ${extraOpen ? '' : 'is-hidden'}`}>
40-
<div className='include__popbox__body'>
41-
<textarea name='extra-scripts' value={extraValue} onChange={this.onUpdateExtra} />
42-
</div>
43-
<div className='include__popbox__screenmask' onClick={toggleExtraOpen} />
19+
<div className='pure-u-5-6 include'>
20+
<div className='include__body'>
21+
You can inject <a href='#' onClick={toggleExtraOpen}>your own external scripts</a> or
22+
<label htmlFor='include'> predefined one:</label>
23+
<select
24+
name='include'
25+
value={include}
26+
onChange={this.onSelect}
27+
>
28+
<option value=''> ---- nothing ---- </option>
29+
{
30+
includes.map(({ name, path }) => (
31+
<option key={name} value={path}>
32+
{name}
33+
</option>
34+
))
35+
}
36+
</select>
37+
</div>
38+
<div className={`include__popbox ${extraOpen ? '' : 'is-hidden'}`}>
39+
<div className='include__popbox__body'>
40+
<textarea name='extra-scripts' value={extraValue} onChange={this.onUpdateExtra} />
4441
</div>
42+
<div className='include__popbox__screenmask' onClick={toggleExtraOpen} />
4543
</div>
4644
</div>
4745
)

src/js/components/Page.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import React, { Component } from 'react'
2+
import AutoSave from 'components/AutoSave'
23
import Editor from 'components/Editor'
34
import Include from 'components/Include'
45
import queryString from 'query-string'
@@ -80,7 +81,10 @@ export default class Page extends Component {
8081
</label>
8182
</div>
8283
</div>
83-
<Include />
84+
<div className='pure-g'>
85+
<AutoSave />
86+
<Include />
87+
</div>
8488
<div className='pure-g'>
8589
<div className='pure-u-1'>
8690
<Editor />

src/js/stores/AppStore.js

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@ export default class AppStore {
1010
this.store = store
1111
}
1212

13-
autoSaveHandle = null
13+
@observable autoSaveHandle = null
14+
@observable saved = false
1415

1516
@observable hosts = []
1617

@@ -121,23 +122,24 @@ export default class AppStore {
121122

122123
@action
123124
saveDraft = () => {
125+
this.draft = this.customjs
124126
window.localStorage.setItem(
125127
this.domainKey,
126-
JSON.stringify({ draft: this.customjs })
128+
JSON.stringify({ draft: this.draft })
127129
)
130+
this.saved = true
131+
this.autoSaveHandle = null
128132
}
129133

130134
@action
131135
removeDraft = () => {
132136
this.draft = null
137+
this.saved = false
133138
window.localStorage.removeItem(this.domainKey)
134139
}
135140

136141
@action
137142
onChangeSource = (value) => {
138-
if (this.draft) {
139-
this.draft = null
140-
}
141143
this.source = value
142144
if (!this.enable) {
143145
this.enable = true
@@ -196,7 +198,6 @@ export default class AppStore {
196198
autoSave = () => {
197199
if (this.autoSaveHandle) {
198200
clearTimeout(this.autoSaveHandle)
199-
this.autoSaveHandle = null
200201
}
201202
this.autoSaveHandle = setTimeout(this.saveDraft, 500)
202203
}

0 commit comments

Comments
 (0)