index.js 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443
  1. var app = new Vue({
  2. el: "#app",
  3. data: {
  4. user: {},
  5. user_email: "",
  6. system_avatar: {
  7. backgroundColor: "f0e9e9",
  8. foregroundColor: "8b5d5d",
  9. bold: false,
  10. uppercase: false
  11. },
  12. validation: {},
  13. registerDuration: 0,
  14. pageStats: {
  15. pageCount: 0,
  16. reviewCount: 0,
  17. averateRating: 0.0
  18. }
  19. },
  20. mounted: function() {
  21. this.getUser();
  22. this.getValidation();
  23. mountBackgroundColorPicker();
  24. mountForegroundColorPicker();
  25. mountSystemAssignedCheckboxes();
  26. },
  27. updated: function() {
  28. $(".tooltip")
  29. .popup("destroy")
  30. .popup();
  31. },
  32. methods: {
  33. getUser: function() {
  34. $.ajax({
  35. url: "/api/user/",
  36. type: "GET",
  37. cache: false,
  38. success: function(data) {
  39. app.user = data;
  40. // app.getRegisteredDuration();
  41. // var da = getUserStats(data.id);
  42. getUserStats(data.id, app.statsRecievedCallback);
  43. app.registerDuration = dateToDays(data.registerDate);
  44. },
  45. error: toast.defaultAjaxError
  46. });
  47. },
  48. statsRecievedCallback: function(data) {
  49. app.pageStats = data;
  50. },
  51. requestUserEmail: function(userId) {
  52. $.ajax({
  53. url: "/api/user/email/",
  54. method: "GET",
  55. success: function(data) {
  56. app.user_email = data.message;
  57. },
  58. error: toast.defaultAjaxError
  59. });
  60. },
  61. getValidation: function() {
  62. $.ajax({
  63. url: "/api/validate/",
  64. type: "GET",
  65. cache: false,
  66. success: function(data) {
  67. app.validation = data;
  68. },
  69. error: toast.defaultAjaxError
  70. });
  71. },
  72. nameKeyUp: function() {
  73. $("#updateNameButton").attr("disabled", false);
  74. },
  75. updateName: function() {
  76. let newName = $("#nameInput").val();
  77. let formData = new FormData();
  78. formData.append("name", newName);
  79. $.ajax({
  80. url: "/api/user/name/",
  81. type: "PUT",
  82. data: formData,
  83. cache: false,
  84. contentType: false,
  85. processData: false,
  86. success: function(data) {
  87. $("#nameInputDiv").removeClass("error");
  88. $("#updateNameButton").attr("disabled", true);
  89. $("#nameInput").transition("glow");
  90. app.user.name = newName;
  91. toast.info(null, data.message, false);
  92. },
  93. error: function(xhr, status, error) {
  94. $("#nameInputDiv").addClass("error");
  95. toast.defaultAjaxError(xhr, status, error);
  96. }
  97. });
  98. },
  99. usernameKeyUp: function() {
  100. $("#updateUsernameButton").attr("disabled", false);
  101. },
  102. updateUsername: function() {
  103. let newUsername = $("#usernameInput").val();
  104. let formData = new FormData();
  105. formData.append("username", newUsername);
  106. $.ajax({
  107. url: "/api/user/username/",
  108. type: "PUT",
  109. data: formData,
  110. cache: false,
  111. contentType: false,
  112. processData: false,
  113. success: function(data) {
  114. $("#usernameInputDiv").removeClass("error");
  115. $("#updateUsernameButton").attr("disabled", true);
  116. $("#usernameInput").transition("glow");
  117. app.user.username = newUsername;
  118. toast.info(null, data.message, false);
  119. },
  120. error: function(xhr, status, error) {
  121. $("#usernameInputDiv").addClass("error");
  122. toast.defaultAjaxError(xhr, status, error);
  123. }
  124. });
  125. },
  126. emailKeyUp: function() {
  127. $("#changeEmailButton").attr("disabled", false);
  128. },
  129. passwordKeyUp1: function() {
  130. $("#passwordInput2").attr("disabled", false);
  131. this.checkEnableSendPassword();
  132. },
  133. passwordKeyUp2: function() {
  134. this.checkEnableSendPassword();
  135. },
  136. checkEnableSendPassword() {
  137. let val1 = $("#passwordInput1").val();
  138. let val2 = $("#passwordInput2").val();
  139. let match = val1 === val2;
  140. $("#changePasswordButton").attr("disabled", !match);
  141. },
  142. sendEmail: function() {
  143. $.ajax({
  144. url: "/api/user/preferences/email/",
  145. method: "POST",
  146. success: function(data) {
  147. // do nothing?
  148. },
  149. error: toast.defaultAjaxError
  150. });
  151. },
  152. systemAssignedAvatar: function() {
  153. $("#systemAssignedAvatarModal")
  154. .modal("destroy")
  155. .modal({
  156. onApprove: function() {
  157. let jsonString = JSON.stringify(app.system_avatar);
  158. $.ajax({
  159. url: "/api/avatar/system-managed/",
  160. type: "POST",
  161. contentType: "application/json; charset=utf-8",
  162. data: jsonString,
  163. success: function(data) {
  164. app.user.avatarId = data.message;
  165. toast.success(null, "Avatar Updated", false);
  166. },
  167. error: toast.defaultAjaxError
  168. });
  169. }
  170. })
  171. .modal("show");
  172. },
  173. updateSystemAssignedAvatar: function() {
  174. let usedName = !app.user.name || app.user.name.length == 0 ? app.user.username : app.user.name;
  175. usedName = encodeURIComponent(usedName);
  176. let url = "https://ui-avatars.com/api/" + "?name=" + usedName + "&size=128";
  177. url += "&background=" + app.system_avatar.backgroundColor;
  178. url += "&color=" + app.system_avatar.foregroundColor;
  179. url += "&bold=" + app.system_avatar.bold;
  180. url += "&uppercase=" + app.system_avatar.uppercase;
  181. $("#systemAssignedPreview").attr("src", url);
  182. },
  183. gravatarAvatar: function() {
  184. $("#gravatarAvatarModal")
  185. .modal("destroy")
  186. .modal({
  187. onApprove: function() {
  188. let email = $("#gravatarEmail").val();
  189. let hash = md5(email).trim();
  190. let data = {
  191. emailHash: hash
  192. };
  193. var jsonString = JSON.stringify(data);
  194. $.ajax({
  195. url: "/api/avatar/gravatar/",
  196. type: "POST",
  197. contentType: "application/json; charset=utf-8",
  198. data: jsonString,
  199. success: function(data) {
  200. app.user.avatarId = data.message;
  201. toast.success(null, "Avatar Updated", false);
  202. },
  203. error: toast.defaultAjaxError
  204. });
  205. }
  206. })
  207. .modal("show");
  208. },
  209. customAvatar: function() {
  210. $("#customAvatarModal")
  211. .modal("destroy")
  212. .modal({
  213. onApprove: function() {
  214. let form = $("#custom-avatar-form");
  215. var data = new FormData(form[0]);
  216. $.ajax({
  217. url: form.attr("action"),
  218. type: form.attr("method"),
  219. contentType: false,
  220. data: data,
  221. cache: false,
  222. processData: false,
  223. success: function(data) {
  224. app.user.avatarId = data.message;
  225. toast.success(null, "Avatar Updated", false);
  226. },
  227. error: toast.defaultAjaxError
  228. });
  229. }
  230. })
  231. .modal("show");
  232. },
  233. customAvatarChanged: function() {
  234. let input = document.getElementById("custom-avatar-input");
  235. let reader = new FileReader();
  236. reader.onload = function(event) {
  237. let img = new Image();
  238. img.onload = function() {
  239. if (this.width > 320 || this.height > 320) {
  240. toast.error("Invalid Dimensions", "Image must be 320 x 320 pixels or less.", true);
  241. input.value = "";
  242. return;
  243. }
  244. let imgElement = $("#custom-avatar-image");
  245. console.log("correct filetype and dimensions");
  246. $(imgElement).attr("src", event.target.result);
  247. };
  248. img.src = event.target.result;
  249. };
  250. reader.readAsDataURL(input.files[0]);
  251. },
  252. validateCode: function() {
  253. let validationCode = $("#validationCode").val();
  254. if (validationCode.length > 10) {
  255. let formData = new FormData();
  256. formData.append("code", validationCode);
  257. $.ajax({
  258. url: "/api/validate/",
  259. method: "POST",
  260. data: formData,
  261. cache: false,
  262. contentType: false,
  263. processData: false,
  264. success: function(data) {
  265. app.getValidation();
  266. toast.success(null, data.message, false);
  267. },
  268. error: toast.defaultAjaxError
  269. });
  270. }
  271. },
  272. resendValidation: function() {
  273. $.ajax({
  274. url: "/api/validate/resend/",
  275. method: "POST",
  276. cache: false,
  277. contentType: false,
  278. processData: false,
  279. success: function(data) {
  280. toast.info(null, data.message, true);
  281. },
  282. error: toast.defaultAjaxError
  283. });
  284. },
  285. changeDetails: function(type) {
  286. let val = "";
  287. switch (type) {
  288. case "email":
  289. val = $("#emailInput").val();
  290. $("#changeEmailButton").attr("disabled", true);
  291. break;
  292. case "password":
  293. val = $("#passwordInput1").val();
  294. $("#changePasswordButton").attr("disabled", true);
  295. if (val.length < 6) {
  296. toast.error(null, "Password must be at least 6 characters in length.", true);
  297. return;
  298. }
  299. break;
  300. }
  301. let formData = new FormData();
  302. formData.append("type", type);
  303. formData.append("value", val);
  304. $.ajax({
  305. url: "/api/validate/details/",
  306. method: "POST",
  307. data: formData,
  308. cache: false,
  309. contentType: false,
  310. processData: false,
  311. success: function(data) {
  312. app.getValidation();
  313. toast.info(null, data.message, true);
  314. },
  315. error: toast.defaultAjaxError
  316. });
  317. },
  318. cancelValidationRequest: function() {
  319. $.ajax({
  320. url: "/api/validate/cancel/",
  321. method: "POST",
  322. success: function(data) {
  323. app.getValidation();
  324. toast.success(null, data.message, false);
  325. },
  326. error: toast.defaultAjaxError
  327. });
  328. },
  329. getRegisteredDuration: function() {
  330. let now = moment(new Date().getTime());
  331. let registered = moment(this.user.registerDate);
  332. let diff = now.diff(registered, "days");
  333. app.registerDuration = diff;
  334. },
  335. millisToDate: function(millis) {
  336. return moment(millis).format("dddd Do MMMM YYYY - HH:mm");
  337. }
  338. }
  339. });
  340. function mountBackgroundColorPicker() {
  341. // these colors are set manually in the modal, here and in JS below.
  342. // we should probably centralize them somewhere.
  343. // var bgColor = "f0e9e9";
  344. // var fgColor = "8b5d5d";
  345. // var useBold = false;
  346. // var useUppercase = false;
  347. $("#backgroundColorSelector").ColorPicker({
  348. color: "#f0e9e9",
  349. onShow: function(colpkr) {
  350. $(colpkr).fadeIn(100);
  351. return false;
  352. },
  353. onHide: function(colpkr) {
  354. $(colpkr).fadeOut(100);
  355. return false;
  356. },
  357. onChange: function(hsb, hex, rgb) {
  358. $("#backgroundColorSelector div").css("backgroundColor", "#" + hex);
  359. app.system_avatar.backgroundColor = hex;
  360. }
  361. });
  362. }
  363. function mountForegroundColorPicker() {
  364. $("#fontColorSelector").ColorPicker({
  365. color: "#8b5d5d",
  366. onShow: function(colpkr) {
  367. $(colpkr).fadeIn(100);
  368. return false;
  369. },
  370. onHide: function(colpkr) {
  371. $(colpkr).fadeOut(100);
  372. return false;
  373. },
  374. onChange: function(hsb, hex, rgb) {
  375. $("#fontColorSelector div").css("backgroundColor", "#" + hex);
  376. app.system_avatar.foregroundColor = hex;
  377. }
  378. });
  379. }
  380. function mountSystemAssignedCheckboxes() {
  381. $("#uppercaseSystemAvatar").click(function() {
  382. app.system_avatar.uppercase = $(this).is(":checked");
  383. });
  384. $("#boldSystemAvatar").click(function() {
  385. app.system_avatar.bold = $(this).is(":checked");
  386. });
  387. }