popup.js 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431
  1. $(function () {
  2. sync = {
  3. /**
  4. * 初始化函数
  5. */
  6. init: function () {
  7. let that = this;
  8. that.base64 = new Base64();
  9. // 码云的API根地址
  10. that.baseUrl = "https://gitee.com/api/v5/";
  11. that.getCacheUserInfo();
  12. that.bindEvent();
  13. },
  14. /**
  15. * 表单收集
  16. */
  17. createFormObj: function () {
  18. let formObj = {};
  19. formObj.access_token = $("#tbAccessToken").val();
  20. formObj.owner = $("#tbOwner").val();
  21. formObj.repo = $("#tbRepo").val();
  22. formObj.path = $("#tbPath").val();
  23. formObj.branch = $("#tbBranch").val();
  24. return formObj;
  25. },
  26. /**
  27. * 弹出窗开始时从缓存读取已经存储的数据
  28. */
  29. getCacheUserInfo: function () {
  30. let that = this;
  31. // 从缓存中读取数据并设置到表单中
  32. chrome.storage.local.get(["access_token", "owner", "repo", "path", "branch", "remember"], function (obj) {
  33. // 插件最开始的状态是记住开关打开了,但是chrome本地缓存中还没有设置值
  34. if (!obj.remember) {
  35. if ($("#rememberDot").hasClass("green")) {
  36. that.saveRememberState("on");
  37. } else {
  38. that.saveRememberState("off");
  39. }
  40. } else if (obj.remember == "on") {
  41. $("#rememberDot").addClass("green");
  42. } else {
  43. $("#rememberDot").removeClass("green");
  44. }
  45. if ($("#rememberDot").hasClass("green")) {
  46. if (obj.access_token || obj.owner || obj.repo || obj.path || obj.branch) {
  47. $("#tbAccessToken").val(obj.access_token);
  48. $("#tbOwner").val(obj.owner);
  49. $("#tbRepo").val(obj.repo);
  50. $("#tbPath").val(obj.path);
  51. $("#tbBranch").val(obj.branch);
  52. that.rememberOn();
  53. }
  54. }
  55. });
  56. },
  57. rememberOn: function () {
  58. let that = this;
  59. $("#rememberText").addClass("grey");
  60. $("#rememberDot").addClass("green");
  61. that.saveRememberState("on");
  62. },
  63. rememberOff: function () {
  64. let that = this;
  65. $("#rememberText").removeClass("grey");
  66. $("#rememberDot").removeClass("green");
  67. that.saveRememberState("off");
  68. },
  69. /**
  70. * 清除用户信息
  71. */
  72. clearUserInfo: function () {
  73. chrome.storage.local.clear(function () {
  74. console.log('clear user info success');
  75. });
  76. },
  77. /**
  78. * 保存用户信息
  79. */
  80. saveUserInfo: function () {
  81. let that = this;
  82. let formObj = that.createFormObj();
  83. chrome.storage.local.set(formObj, function () {
  84. console.log('save user info success');
  85. });
  86. },
  87. /**
  88. * 保存记住按钮的状态
  89. * state:on(记住),off(不记住)
  90. */
  91. saveRememberState: function (state) {
  92. let rememberObj = {};
  93. rememberObj.remember = state;
  94. chrome.storage.local.set(rememberObj, function () {
  95. console.log('save remember state success');
  96. });
  97. },
  98. /**
  99. * 获取浏览器的书签数据
  100. */
  101. getBookmarks: function (fn) {
  102. // 获取整个书签树(包括书签栏和其他书签,相当于chrome.bookmarks.getSubTree("0", fn))
  103. // chrome.bookmarks.getTree(fn);
  104. // 0-根目录 1-书签栏 2-其他书签
  105. chrome.bookmarks.getSubTree("1", fn);
  106. },
  107. /**
  108. * 清空书签栏文件夹(不能直接清除根书签栏,只能遍历一个一个文件夹清除)
  109. */
  110. emptyBookmarks: function (fn) {
  111. chrome.bookmarks.getChildren("1", function (children) {
  112. // 需要判断书签栏是否原来就是空的
  113. if (children.length <= 0) {
  114. fn();
  115. return;
  116. }
  117. for (let i = 0; i < children.length; i++) {
  118. let item = children[i];
  119. chrome.bookmarks.removeTree(item.id, function () {
  120. // 判断是不是已经删除到最后一个了,是的话就调用回调函数
  121. if (i == (children.length - 1)) {
  122. fn();
  123. }
  124. });
  125. }
  126. });
  127. },
  128. bindEvent: function () {
  129. let that = this;
  130. // 记住按钮点击事件
  131. $("#rememberDot").on("click", function () {
  132. // 先判断当前记住按钮的状态,假如已经记住则不再记住,清空缓存
  133. if ($("#rememberDot").hasClass("green")) {
  134. that.clearUserInfo();
  135. that.rememberOff();
  136. } else {
  137. // 获取表单数据,有则保存到缓存中
  138. let formObj = that.createFormObj();
  139. let existRes = that.checkFormExist(formObj);
  140. if (existRes) {
  141. that.saveUserInfo();
  142. }
  143. that.rememberOn();
  144. }
  145. });
  146. // 输入框的输入事件,用来记忆表单数据
  147. $(".input").on("input", function () {
  148. if ($("#rememberDot").hasClass("green")) {
  149. that.saveUserInfo();
  150. that.rememberOn();
  151. }
  152. });
  153. // 点击上传按钮
  154. $("#btnUpload").on("click", function () {
  155. let formObj = that.createFormObj();
  156. let formRes = that.checkForm(formObj);
  157. if (formRes != "ok") {
  158. $("#toast").text(formRes).show();
  159. return;
  160. }
  161. // 假如记住按钮已经点击了
  162. if ($("#rememberDot").hasClass("green")) {
  163. that.saveUserInfo();
  164. that.rememberOn();
  165. } else {
  166. that.clearUserInfo();
  167. that.rememberOff();
  168. }
  169. $("#loaderWrap").show();
  170. // 从码云上获取书签内容
  171. that.getGit(formObj, function (getState, getRes) {
  172. // 获取浏览器的书签
  173. that.getBookmarks(function (bookmarks) {
  174. // 获取码云的内容存在则更新文件,否则更新文件
  175. if (getState) {
  176. let sha = getRes.sha;
  177. that.updateGit(formObj, bookmarks, sha, function (updState, updRes) {
  178. // 更新成功,则提示,否则提示错误
  179. if (updState) {
  180. $("#successWrap").show();
  181. $(".successText").text("Upload Success");
  182. } else {
  183. $("#toast").text(updRes).show();
  184. }
  185. $("#loaderWrap").hide();
  186. });
  187. } else {
  188. that.createGit(formObj, bookmarks, function (createState, createRes) {
  189. // 创建成功,则提示,否则提示错误
  190. if (createState) {
  191. $("#successWrap").show();
  192. $(".successText").text("Upload Success");
  193. } else {
  194. $("#toast").text(createRes).show();
  195. }
  196. $("#loaderWrap").hide();
  197. });
  198. }
  199. });
  200. });
  201. });
  202. // 点击下载按钮事件
  203. $("#btnDownload").on("click", function () {
  204. let formObj = that.createFormObj();
  205. let formRes = that.checkForm(formObj);
  206. if (formRes != "ok") {
  207. $("#toast").text(formRes).show();
  208. return;
  209. }
  210. // 假如记住按钮已经点击了
  211. if ($("#rememberDot").hasClass("green")) {
  212. that.saveUserInfo();
  213. that.rememberOn();
  214. } else {
  215. that.clearUserInfo();
  216. that.rememberOff();
  217. }
  218. $("#loaderWrap").show();
  219. // 从码云上获取书签内容
  220. that.getGit(formObj, function (getState, getRes) {
  221. // 获取码云的内容存在则创建文件,否则提示文件不存在
  222. if (getState) {
  223. let gitContent = that.base64.decode(getRes["content"]);
  224. let bookmarksParent = JSON.parse(gitContent);
  225. let bookmarks = bookmarksParent[0];
  226. // 清空书签栏
  227. that.emptyBookmarks(function () {
  228. // 等所有书签都清空后开始设置书签
  229. that.setBookmarks("1", bookmarks);
  230. $("#successWrap").show();
  231. $(".successText").text("Download Success");
  232. });
  233. } else {
  234. $("#toast").text("Git文件不存在").show();
  235. }
  236. $("#loaderWrap").hide();
  237. });
  238. });
  239. },
  240. /**
  241. * 将git获取的内容设置到浏览器书签上去
  242. */
  243. setBookmarks: function (parentId, bookmarks) {
  244. let that = this;
  245. if (!bookmarks.children || bookmarks.children.length <= 0) {
  246. return;
  247. }
  248. for (let i = 0; i < bookmarks.children.length; i++) {
  249. let item = bookmarks.children[i];
  250. chrome.bookmarks.create({
  251. parentId: parentId,
  252. index: item.index,
  253. title: item.title,
  254. url: item.url
  255. }, function (res) {
  256. // 判断假如还有子元素则递归调用自身添加
  257. if (item.children && item.children.length > 0) {
  258. that.setBookmarks(res.id, item);
  259. }
  260. });
  261. }
  262. },
  263. /**
  264. * 校验表单
  265. */
  266. checkForm: function (formObj) {
  267. if (!formObj.access_token) {
  268. $("#tbAccessToken").addClass('error');
  269. return 'access_token is required';
  270. }
  271. $("#tbAccessToken").removeClass('error');
  272. if (!formObj.owner) {
  273. $("#tbOwner").addClass('error');
  274. return 'owner is required';
  275. }
  276. $("#tbOwner").removeClass('error');
  277. if (!formObj.repo) {
  278. $("#tbRepo").addClass('error');
  279. return 'repo is required';
  280. }
  281. $("#tbRepo").removeClass('error');
  282. if (!formObj.path) {
  283. $("#tbPath").addClass('error');
  284. return 'path is required';
  285. }
  286. $("#tbPath").removeClass('error');
  287. if (!formObj.branch) {
  288. $("#tbBranch").addClass('error');
  289. return 'branch is required';
  290. }
  291. $("#tbBranch").removeClass('error');
  292. return "ok";
  293. },
  294. /**
  295. * 查看表单是否至少有一个值
  296. */
  297. checkFormExist: function (formObj) {
  298. if (formObj.access_token != '') {
  299. return true;
  300. }
  301. if (formObj.owner != '') {
  302. return true;
  303. }
  304. if (formObj.repo != '') {
  305. return true;
  306. }
  307. if (formObj.path != '') {
  308. return true;
  309. }
  310. if (formObj.branch != '') {
  311. return true;
  312. }
  313. return false;
  314. },
  315. /**
  316. * 获取Gitee上的数据
  317. * curl -X GET --header 'Content-Type: application/json;charset=UTF-8' 'https://gitee.com/api/v5/repos/xieyf00/chrome/contents/bookmark/bookmark-4.json?access_token=16c6176faea12d4b2dba667872d9b21c&ref=master'
  318. */
  319. getGit: function (formObj, fn) {
  320. let that = this;
  321. let getUrl = that.baseUrl + "repos/" + formObj.owner + "/" + formObj.repo + "/contents/" + formObj.path + "?access_token=" + formObj.access_token + "&ref=" + formObj.branch;
  322. $.ajax({
  323. type: "GET",
  324. url: getUrl,
  325. crossDomain: true,
  326. success: function (res) {
  327. fn && fn(true, res);
  328. },
  329. error: function (xhr, textStatus, error) {
  330. fn && fn(false, error);
  331. }
  332. });
  333. },
  334. /**
  335. * 创建Git文件
  336. * curl -X POST --header 'Content-Type: application/json;charset=UTF-8' 'https://gitee.com/api/v5/repos/xieyf00/chrome/contents/bookmark/bookmark-copy.json' -d '{"access_token":"16c6176faea12d4b2dba667872d9b21c","content":"xxx","message":"xieyangfan commit","branch":"master"}'
  337. * createContentRaw:文件内容, 要用 base64 编码
  338. */
  339. createGit: function (formObj, createContentRaw, fn) {
  340. let that = this;
  341. let createContent = that.base64.encode(JSON.stringify(createContentRaw));
  342. // Git提交信息
  343. let createMessage = "Chrome Browser Bookmark Created" + new Date();
  344. // 构建
  345. let createData = {};
  346. createData.access_token = formObj.access_token;
  347. createData.content = createContent;
  348. createData.message = createMessage;
  349. createData.branch = formObj.branch;
  350. let createUrl = that.baseUrl + "repos/" + formObj.owner + "/" + formObj.repo + "/contents/" + formObj.path;
  351. $.ajax({
  352. type: "POST",
  353. url: createUrl,
  354. data: createData,
  355. crossDomain: true,
  356. success: function (res) {
  357. fn && fn(true, res);
  358. },
  359. error: function (xhr, textStatus, error) {
  360. fn && fn(false, error);
  361. }
  362. });
  363. },
  364. /**
  365. * 更新Git文件
  366. * curl -X PUT --header 'Content-Type: application/json;charset=UTF-8' 'https://gitee.com/api/v5/repos/xieyf00/chrome/contents/bookmark/bookmark-6.json' -d '{"access_token":"16c6176faea12d4b2dba667872d9b21c","content":"InhpZXlhbmdmYW4gMjAxOTA3MjQgMTU0OCI=","sha":"dce85293664c50792d2ebcfc4ede23bf3e1197c2","message":"xieyangfan 20190724 1736","branch":"master"}'
  367. * updateContentRaw:文件内容, 要用 base64 编码
  368. * sha:文件的 Blob SHA,可通过 [获取仓库具体路径下的内容] API 获取
  369. */
  370. updateGit: function (formObj, updateContentRaw, sha, fn) {
  371. let that = this;
  372. let updateContent = that.base64.encode(JSON.stringify(updateContentRaw));
  373. // Git提交信息
  374. let updateMessage = "Chrome Browser Bookmark Updated" + new Date();
  375. // 构建
  376. let updateData = {};
  377. updateData.access_token = formObj.access_token;
  378. updateData.content = updateContent;
  379. updateData.message = updateMessage;
  380. updateData.sha = sha;
  381. updateData.branch = formObj.branch;
  382. let updateUrl = that.baseUrl + "repos/" + formObj.owner + "/" + formObj.repo + "/contents/" + formObj.path;
  383. $.ajax({
  384. type: "PUT",
  385. url: updateUrl,
  386. data: updateData,
  387. crossDomain: true,
  388. success: function (res) {
  389. fn && fn(true, res);
  390. },
  391. error: function (xhr, textStatus, error) {
  392. fn && fn(false, error);
  393. }
  394. });
  395. },
  396. /**
  397. * 删除Git文件
  398. * curl -X DELETE --header 'Content-Type: application/json;charset=UTF-8' 'https://gitee.com/api/v5/repos/xieyf00/chrome/contents/bookmark/bookmark-6.json?access_token=16c6176faea12d4b2dba667872d9b21c&sha=dce85293664c50792d2ebcfc4ede23bf3e1197c2&message=Chrome%20Browser%20Bookmark%20Deleted&branch=master'
  399. * sha:文件的 Blob SHA,可通过 [获取仓库具体路径下的内容] API 获取
  400. */
  401. deleteGit: function (formObj, sha, fn) {
  402. let that = this;
  403. // Git提交信息
  404. let deleteMessage = "Chrome Browser Bookmark Deleted" + new Date();
  405. // 构建
  406. let deleteData = {};
  407. deleteData.access_token = formObj.access_token;
  408. deleteData.message = deleteMessage;
  409. deleteData.sha = sha;
  410. deleteData.branch = formObj.branch;
  411. let deleteUrl = that.baseUrl + "repos/" + formObj.owner + "/" + formObj.repo + "/contents/" + formObj.path;
  412. $.ajax({
  413. type: "DELETE",
  414. url: deleteUrl,
  415. data: deleteData,
  416. crossDomain: true,
  417. success: function (res) {
  418. fn && fn(true, res);
  419. },
  420. error: function (xhr, textStatus, error) {
  421. fn && fn(false, error);
  422. }
  423. });
  424. }
  425. }
  426. sync.init();
  427. });