forked from Kenshin/simpread
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsitemgr.js
More file actions
255 lines (234 loc) · 11.1 KB
/
sitemgr.js
File metadata and controls
255 lines (234 loc) · 11.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
console.log( "==== simpread options page: sitemanager load ====" )
import '../assets/css/simpread.css';
import '../assets/css/option.css';
import '../assets/css/options_page.css';
import '../assets/css/options_custom.css';
import '../assets/css/options_sitemgr.css';
import 'notify_css';
import Velocity from 'velocity';
import Notify from 'notify';
import TextField from 'textfield';
import Button from 'button';
import AC from 'ac';
import * as waves from 'waves';
import * as tt from 'tooltip';
import Editor from 'editor';
import Import from 'enhancesite';
import {storage} from 'storage';
import * as ss from 'stylesheet';
import * as watch from 'watch';
import PureRead from 'puread';
let cur_site, org_site, pr,
state = { name: 0, url: 0, title: 0, desc: 0, include: 0, exclude: 0, avatar:{ name: 0, url: 0 }, paging: { prev:0, next: 0} }; // 0: success -1: faield -2: not empty0
/**
* Entry:
* - storage get data form chrome storage
* - waves.Render()
* - tooltip.Render()
*/
storage.Read( () => {
console.log( "simpread storage get success!", storage.sites );
pr = new PureRead( storage.sites );
navRender();
controlbarRender();
tt.Render( "body" );
waves.Render({ root: "body" });
$( "body" ).velocity({ opacity: 1 }, { duration: 1000, complete: ()=> {
$( "body" ).removeAttr( "style" );
}});
console.log( "current puread object is ", pr )
});
// hack code
window.addEventListener( "sitechanged", event => {
const [ url, site, type, info ] = [ event.data.site.url, event.data.site, event.data.site.target, event.data.info ];
org_site = [ url, site ];
siteeditorRender( url, site, type, info );
});
// hack code
function changeSiteinfo( info ) {
const evt = document.createEvent("Event");
evt.data = { info };
evt.initEvent( "siteinfochanged", true, false );
window.dispatchEvent( evt );
}
/**
* navigation Render
*/
function navRender() {
const navClick = () => {
location.href = location.origin + "/options/options.html#sites";
};
const button = <Button waves="md-waves-effect md-waves-circle" hoverColor="transparent" icon={ ss.IconPath( "gohome_icon" ) } onClick={ ()=>navClick() } />;
ReactDOM.render( button, $( ".header .nav" )[0] );
}
/**
* controlbar Render
*/
function controlbarRender() {
const getCursite = ( type, value ) => {
if ( value == "" ) return;
const site = pr.Getsite( type, value );
org_site = [ site[0], site[1] ];
site.length > 0 && siteeditorRender( site[0], site[1], type );
site.length > 0 && changeSiteinfo( site[1].info );
},
add = () => {
const msg = cur_site ? "是否覆盖当前站点并新建立一个?" : "是否建立一个新站?";
new Notify().Render( "snackbar", msg, "新建", () => {
org_site = [ "", "" ];
siteeditorRender( "", { name: "", title: "<title>", desc: "", include: "", exclude: [] }, "local" );
});
},
remove = () => {
new Notify().Render( "snackbar", "是否删除当前站点?", "删除", () => save( "delete" ));
},
remote = ( type ) => {
save( type, "remote" );
},
save = ( type, state ) => {
if ( !cur_site ) {
new Notify().Render( 2, "请选择一个站点源。" );
return;
}
if ( type != "delete" && !verify() ) return;
const key = cur_site.target,
url = cur_site.url,
site= pr.Cleansite({ ...cur_site });
let flag = -1;
if ( site.info && state != "remote" && cur_site.target == "person" &&( type == "update" || type == "delete" )) {
if ( site.info.id.substr(0,8) == storage.user.uid.substr(0,8) ) {
setTimeout( ()=>new Notify().Render( 2, "当前站有远程数据,请保持同步更新。" ), 500 );
}
}
if ( type == "update" && state == "remote" ) {
site.info = { ...storage.remote.info };
if ( cur_site.target == "global" ) {
pr.Updatesite( "person", org_site[0], [ url, pr.Cleansite(site) ] );
} else if ( cur_site.target == "local" || cur_site.target == "custom" ) {
pr.Deletesite( cur_site.target, org_site[0], result => {
pr.Updatesite( "person", org_site[0], [ url, pr.Cleansite(site) ] );
});
}
org_site = [ url, site ];
flag = 0;
setTimeout( () => new Notify().Render( 2, "当前站提交时会自动增加到「站点集市适配源」!" ), 500 );
} else if ( type == "delete" && state == "remote" ) {
pr.Deletesite( "person", org_site[0], result => {
result != -1 ? flag = 1 : new Notify().Render( "当前站点已删除,请勿重复提交。" );
});
} else if ( type == "update" ) {
pr.Updatesite( key, org_site[0], [ url, pr.Cleansite(site) ] );
org_site = [ url, site ];
flag = 0;
/*
} else if ( type == "safe" ) {
delete site.info;
pr.Updatesite( key, org_site[0], [ url, pr.Cleansite(site) ] );
org_site = [ url, site ];
flag = 0;
}
*/
} else {
pr.Deletesite( key, org_site[0], result => {
result != -1 ? flag = 1 : new Notify().Render( "当前站点已删除,请勿重复提交。" );
});
}
flag != -1 && storage.Writesite( pr.sites, ()=> {
console.log( "current site is ", cur_site, org_site )
watch.SendMessage( "site", true );
new Notify().Render( `当前站点${ flag == 0 ? "更新" : "删除" }成功,请刷新本页。` );
});
};
const doms = <div>
<group className="lab">
<group><AC placeholder={ `官方适配源(${storage.sites.global.length} 条)`} items={ formatsites( storage.sites.global )} onChange={ v=>getCursite( "global", v) } /></group>
<group><AC placeholder={ `站点集市适配源(${storage.sites.person.length} 条)` } items={ formatsites( storage.sites.person )} onChange={ v=>getCursite( "person", v) } /></group>
<group><AC placeholder={ `第三方适配源(${storage.sites.custom.length} 条)` } items={ formatsites( storage.sites.custom )} onChange={ v=>getCursite( "custom", v) } /></group>
<group><AC placeholder={ `自定义适配源(${storage.sites.local.length} 条)` } items={ formatsites( storage.sites.local )} onChange={ v=>getCursite( "local", v) } /></group>
</group>
<group className="lab">
<group>
<Button type="raised" text="新建一个站"
style={{ "margin": "0" }} width="100%"
color="#fff" backgroundColor="#4CAF50"
waves="md-waves-effect md-waves-button"
onClick={ ()=>add() } />
</group>
<group>
<Button type="raised" text="保存当前站"
style={{ "margin": "0" }} width="100%"
color="#fff" backgroundColor="#3F51B5"
waves="md-waves-effect md-waves-button"
onClick={ ()=>save( "update" ) } />
</group>
<group>
<Button type="raised" text="删除当前站"
style={{ "margin": "0" }} width="100%"
color="#fff" backgroundColor="#FF5252"
waves="md-waves-effect md-waves-button"
onClick={ ()=>remove() } />
</group>
</group>
<group className="lab" style={{display:"none"}}>
<div className="sites"></div>
</group>
<group className="lab">
<Import uid={ storage.user.uid } onUpdate={ t=>remote(t)} />
</group>
</div>;
ReactDOM.render( doms, $( ".custom .property" )[0] );
}
/**
* siteeditor Render
*/
function siteeditorRender( url, site, type, info ) {
$( "sr-opt-read" ).length > 0 &&
$( ".custom .preview" ).empty();
cur_site = pr.Safesite( site, type, url );
// set remote site( include info )
//storage.remote = JSON.parse(JSON.stringify( cur_site ));
storage.remote = cur_site;
info && ( storage.remote.info = info );
changeSiteinfo( storage.remote.info );
const doms = <Editor site={ cur_site } state={ state } />;
ReactDOM.render( doms, $( ".custom .preview" )[0] );
console.log( "current site is ", cur_site )
}
/**
* Format storage sites
*
* @param {array} sites
*/
function formatsites( sites ) {
return sites.map( item => {
return { value: item[0], name: item[0] }
});
}
/**
* Verify site editor site
*
* @return {boolean}
*/
function verify() {
let flag = false;
if ( [ "url", "name", "title", "include" ].findIndex( key => cur_site[key] == "" ) != -1 ) {
new Notify().Render( 3, "【标识、域名、标题、高亮】不能为空。" );
}
else if ( Object.values( state ).findIndex( key => typeof key == "number" && key != 0 ) != -1 ||
( state.avatar.name != 0 || state.avatar.url != 0 ) ||
( state.paging.prev != 0 || state.paging.next != 0 )
) {
new Notify().Render( 3, "请正确填写【标识、域名、标题、高亮】后再提交。" );
} else if (( cur_site.avatar[0].name != "" && cur_site.avatar[1].url == "" ) || ( cur_site.avatar[0].name == "" && cur_site.avatar[1].url != "" )) {
new Notify().Render( 3, "【头像的名称与地址】必须同时设定。" );
} else if (( cur_site.paging[0].prev != "" && cur_site.paging[1].next == "" ) || ( cur_site.paging[0].prev == "" && cur_site.paging[1].next != "" )) {
new Notify().Render( 3, "【前一页与后一页】必须同时设定。" );
} else if ( cur_site.name.startsWith( "tempread::" ) ) {
new Notify().Render( 2, "标识不能包含 tempread:: 请删除。" );
} else if ( cur_site.include.trim() == "" ) {
new Notify().Render( 2, "高亮区域不能为空。" );
} else {
flag = true;
}
return flag;
}