INSERT INTO `cp_filejs` (`id`,`app`,`path`,`modul`,`file_name`,`content`) VALUES ('618','1','u2/creator','profile','js/profile-edit.js---','import {\r\n deleteUserAccount,\r\n getSessionUser,\r\n updatePassword,\r\n updateUsername\r\n} from \\\\\\\\\\\\\\\"./api/auth.js\\\\\\\\\\\\\\\"\r\nimport {\r\n addUserProfileLinks,\r\n removeProfileLink,\r\n updateCoverImage,\r\n updateProfileImage,\r\n updateUserDetails,\r\n updateSocialLinks\r\n} from \\\\\\\\\\\\\\\"./api/profile.js\\\\\\\\\\\\\\\"\r\nimport app, {\r\n showToast\r\n} from \\\\\\\\\\\\\\\"./app.js\\\\\\\\\\\\\\\"\r\nimport store from \\\\\\\\\\\\\\\"./store.js\\\\\\\\\\\\\\\"\r\n\r\nvar $ = Dom7\r\n\r\n// --------------- Edit Profile Page ---------------\r\n$(document).on(\\\\\\\\\\\\\\\'page:init\\\\\\\\\\\\\\\', \\\\\\\\\\\\\\\'.page[data-name=\\\\\\\\\\\\\\\"profile-edit-mydetails\\\\\\\\\\\\\\\"]\\\\\\\\\\\\\\\', async function (e) {\r\n var view = app.views.current\r\n\r\n const user = await getSessionUser()\r\n\r\n if (!user) {\r\n view.router.navigate(\\\\\\\\\\\\\\\'/login\\\\\\\\\\\\\\\')\r\n return\r\n }\r\n\r\n // Example of how to fill in the form fields with the provided data\r\n document.querySelector(\\\\\\\\\\\\\\\'input[name=\\\\\\\\\\\\\\\"email\\\\\\\\\\\\\\\"]\\\\\\\\\\\\\\\').value = user.email || \\\\\\\\\\\\\\\'\\\\\\\\\\\\\\\';\r\n document.querySelector(\\\\\\\\\\\\\\\'input[name=\\\\\\\\\\\\\\\"first_name\\\\\\\\\\\\\\\"]\\\\\\\\\\\\\\\').value = user.first_name || \\\\\\\\\\\\\\\'\\\\\\\\\\\\\\\';\r\n document.querySelector(\\\\\\\\\\\\\\\'input[name=\\\\\\\\\\\\\\\"last_name\\\\\\\\\\\\\\\"]\\\\\\\\\\\\\\\').value = user.last_name || \\\\\\\\\\\\\\\'\\\\\\\\\\\\\\\';\r\n document.querySelector(\\\\\\\\\\\\\\\'input[name=\\\\\\\\\\\\\\\"tel_no\\\\\\\\\\\\\\\"]\\\\\\\\\\\\\\\').value = user.billing_info?.phone || \\\\\\\\\\\\\\\'\\\\\\\\\\\\\\\';\r\n})\r\n\r\n\r\n$(document).on(\\\\\\\\\\\\\\\'click\\\\\\\\\\\\\\\', \\\\\\\\\\\\\\\'#save-details\\\\\\\\\\\\\\\', async function () {\r\n var view = app.views.current\r\n\r\n const user = await getSessionUser()\r\n\r\n // Get the values from the input fields\r\n const firstName = $(\\\\\\\\\\\\\\\'input[name=\\\\\\\\\\\\\\\"first_name\\\\\\\\\\\\\\\"]\\\\\\\\\\\\\\\').val().trim();\r\n const lastName = $(\\\\\\\\\\\\\\\'input[name=\\\\\\\\\\\\\\\"last_name\\\\\\\\\\\\\\\"]\\\\\\\\\\\\\\\').val().trim();\r\n const email = $(\\\\\\\\\\\\\\\'input[name=\\\\\\\\\\\\\\\"email\\\\\\\\\\\\\\\"]\\\\\\\\\\\\\\\').val().trim();\r\n const telNo = $(\\\\\\\\\\\\\\\'input[name=\\\\\\\\\\\\\\\"tel_no\\\\\\\\\\\\\\\"]\\\\\\\\\\\\\\\').val().trim();\r\n const address = $(\\\\\\\\\\\\\\\'textarea[name=\\\\\\\\\\\\\\\"address\\\\\\\\\\\\\\\"]\\\\\\\\\\\\\\\').val().trim();\r\n const city = $(\\\\\\\\\\\\\\\'input[name=\\\\\\\\\\\\\\\"city\\\\\\\\\\\\\\\"]\\\\\\\\\\\\\\\').val().trim();\r\n const provincy = $(\\\\\\\\\\\\\\\'input[name=\\\\\\\\\\\\\\\"provincy\\\\\\\\\\\\\\\"]\\\\\\\\\\\\\\\').val().trim();\r\n const post_code = $(\\\\\\\\\\\\\\\'input[name=\\\\\\\\\\\\\\\"post_code\\\\\\\\\\\\\\\"]\\\\\\\\\\\\\\\').val().trim();\r\n\r\n // Validate the input fields\r\n if (firstName === \\\\\\\\\\\\\\\'\\\\\\\\\\\\\\\') {\r\n showToast(\\\\\\\\\\\\\\\'Please enter your first name\\\\\\\\\\\\\\\', \\\\\\\\\\\\\\\'Error\\\\\\\\\\\\\\\');\r\n return;\r\n }\r\n\r\n if (lastName === \\\\\\\\\\\\\\\'\\\\\\\\\\\\\\\') {\r\n showToast(\\\\\\\\\\\\\\\'Please enter your last name\\\\\\\\\\\\\\\', \\\\\\\\\\\\\\\'Error\\\\\\\\\\\\\\\');\r\n return;\r\n }\r\n\r\n if (email === \\\\\\\\\\\\\\\'\\\\\\\\\\\\\\\') {\r\n showToast(\\\\\\\\\\\\\\\'Please enter your email\\\\\\\\\\\\\\\', \\\\\\\\\\\\\\\'Error\\\\\\\\\\\\\\\');\r\n return;\r\n }\r\n\r\n // Simple email validation\r\n const emailPattern = /^[^s@]+@[^s@]+.[^s@]+$/;\r\n if (!emailPattern.test(email)) {\r\n showToast(\\\\\\\\\\\\\\\'Please enter a valid email address\\\\\\\\\\\\\\\', \\\\\\\\\\\\\\\'Error\\\\\\\\\\\\\\\');\r\n return;\r\n }\r\n\r\n // // phone validation\r\n // if (telNo === \\\\\\\\\\\\\\\'\\\\\\\\\\\\\\\') {\r\n // showToast(\\\\\\\\\\\\\\\'Please enter a valid phone number\\\\\\\\\\\\\\\', \\\\\\\\\\\\\\\'Error\\\\\\\\\\\\\\\');\r\n // return\r\n // }\r\n\r\n // Prepare the data for the API request\r\n const requestData = {\r\n first_name: firstName,\r\n last_name: lastName,\r\n email: email,\r\n phone: telNo,\r\n address: address,\r\n city: city,\r\n provincy: provincy,\r\n post_code: post_code,\r\n };\r\n\r\n // check if the request data is the same as userdata\r\n let dirtied = false;\r\n\r\n for (const key in requestData) {\r\n if (key == \\\\\\\\\\\\\\\'phone\\\\\\\\\\\\\\\') {\r\n if (requestData[key] !== user.billing_info.phone) {\r\n dirtied = true\r\n break;\r\n }\r\n continue\r\n }\r\n\r\n if (requestData[key] !== user[key]) {\r\n dirtied = true\r\n break;\r\n }\r\n }\r\n\r\n if (!dirtied) {\r\n return\r\n }\r\n\r\n try {\r\n app.preloader.show()\r\n\r\n const response = await updateUserDetails(requestData, email !== user.email)\r\n\r\n app.preloader.hide()\r\n\r\n\r\n if (response && response.success) {\r\n // showToast(\\\\\\\\\\\\\\\'Details updated successfully\\\\\\\\\\\\\\\', \\\\\\\\\\\\\\\'Success\\\\\\\\\\\\\\\');\r\n showToast(\\\\\\\\\\\\\\\'Details updated successfully\\\\\\\\\\\\\\\')\r\n view.router.navigate(\\\\\\\\\\\\\\\'/profile/\\\\\\\\\\\\\\\')\r\n store.dispatch(\\\\\\\\\\\\\\\'updateUserDetails\\\\\\\\\\\\\\\')\r\n return;\r\n }\r\n\r\n throw new Error(response.message);\r\n } catch (error) {\r\n app.preloader.hide()\r\n app.notification.create({\r\n titleRightText: \\\\\\\\\\\\\\\'now\\\\\\\\\\\\\\\',\r\n subtitle: \\\\\\\\\\\\\\\'Oops, something went wrong\\\\\\\\\\\\\\\',\r\n text: error.message || \\\\\\\\\\\\\\\'Failed to update details\\\\\\\\\\\\\\\',\r\n }).open()\r\n }\r\n});\r\n\r\n$(document).on(\\\\\\\\\\\\\\\'click\\\\\\\\\\\\\\\', \\\\\\\\\\\\\\\'#update_password\\\\\\\\\\\\\\\', async function () {\r\n var view = app.views.current\r\n\r\n // Get the values from the password input fields\r\n const password = $(\\\\\\\\\\\\\\\'input[name=\\\\\\\\\\\\\\\"password\\\\\\\\\\\\\\\"]\\\\\\\\\\\\\\\').val().trim();\r\n const current_password = $(\\\\\\\\\\\\\\\'input[name=\\\\\\\\\\\\\\\"current_password\\\\\\\\\\\\\\\"]\\\\\\\\\\\\\\\').val().trim();\r\n const confirmPassword = $(\\\\\\\\\\\\\\\'input[name=\\\\\\\\\\\\\\\"confirm_password\\\\\\\\\\\\\\\"]\\\\\\\\\\\\\\\').val().trim();\r\n\r\n if (current_password === \\\\\\\\\\\\\\\'\\\\\\\\\\\\\\\') {\r\n showToast(\\\\\\\\\\\\\\\'Please enter your current password\\\\\\\\\\\\\\\', \\\\\\\\\\\\\\\'Error\\\\\\\\\\\\\\\');\r\n return\r\n }\r\n\r\n if (password.length < 8) {\r\n showToast(\\\\\\\\\\\\\\\'Password must be at least 8 characters long.\\\\\\\\\\\\\\\')\r\n return\r\n }\r\n\r\n // Check if password contains at least one lowercase letter\r\n if (!/[a-z]/.test(password)) {\r\n showToast(\\\\\\\\\\\\\\\'Password must contain at least one lowercase letter.\\\\\\\\\\\\\\\')\r\n return\r\n }\r\n\r\n // Check if password contains at least one uppercase letter\r\n if (!/[A-Z]/.test(password)) {\r\n showToast(\\\\\\\\\\\\\\\'Password must contain at least one uppercase letter.\\\\\\\\\\\\\\\')\r\n return\r\n }\r\n\r\n // Check if password contains at least one number\r\n if (!/d/.test(password)) {\r\n showToast(\\\\\\\\\\\\\\\'Password must contain at least one number.\\\\\\\\\\\\\\\')\r\n return\r\n }\r\n\r\n if (confirmPassword === \\\\\\\\\\\\\\\'\\\\\\\\\\\\\\\') {\r\n showToast(\\\\\\\\\\\\\\\'Please confirm your password\\\\\\\\\\\\\\\', \\\\\\\\\\\\\\\'Error\\\\\\\\\\\\\\\');\r\n return;\r\n }\r\n\r\n if (password !== confirmPassword) {\r\n showToast(\\\\\\\\\\\\\\\'Passwords do not match\\\\\\\\\\\\\\\', \\\\\\\\\\\\\\\'Error\\\\\\\\\\\\\\\');\r\n return;\r\n }\r\n\r\n try {\r\n app.preloader.show()\r\n\r\n const response = await updatePassword(password, current_password)\r\n\r\n app.preloader.hide()\r\n\r\n if (response && response.success) {\r\n showToast(\\\\\\\\\\\\\\\'Password updated successfully\\\\\\\\\\\\\\\')\r\n view.router.navigate(\\\\\\\\\\\\\\\'/profile/\\\\\\\\\\\\\\\')\r\n return;\r\n }\r\n\r\n throw new Error(response.message);\r\n } catch (error) {\r\n app.preloader.hide()\r\n app.notification.create({\r\n titleRightText: \\\\\\\\\\\\\\\'now\\\\\\\\\\\\\\\',\r\n subtitle: \\\\\\\\\\\\\\\'Oops, something went wrong\\\\\\\\\\\\\\\',\r\n text: error.message || \\\\\\\\\\\\\\\'Failed to update password\\\\\\\\\\\\\\\',\r\n }).open()\r\n }\r\n})\r\n// --------------- End Edit Profile Page ---------------\r\n\r\n\r\n// --------------- Edit Username Page ---------------\r\n$(document).on(\\\\\\\\\\\\\\\'page:beforein\\\\\\\\\\\\\\\', \\\\\\\\\\\\\\\'.page[data-name=\\\\\\\\\\\\\\\"profile-edit-username\\\\\\\\\\\\\\\"]\\\\\\\\\\\\\\\', async function (e) {\r\n var view = app.views.current\r\n\r\n const user = await getSessionUser()\r\n\r\n if (!user) {\r\n view.router.navigate(\\\\\\\\\\\\\\\'/login\\\\\\\\\\\\\\\')\r\n return\r\n }\r\n\r\n\r\n // Example of how to fill in the form fields with the provided data\r\n $(\\\\\\\\\\\\\\\'.profile-edit-view input[name=\\\\\\\\\\\\\\\"username\\\\\\\\\\\\\\\"]\\\\\\\\\\\\\\\').val(user.username || \\\\\\\\\\\\\\\'\\\\\\\\\\\\\\\')\r\n\r\n if (user.can_update_username) {\r\n $(\\\\\\\\\\\\\\\'#username-editable\\\\\\\\\\\\\\\').remove()\r\n } else {\r\n document.querySelector(\\\\\\\\\\\\\\\'#username-editable\\\\\\\\\\\\\\\').innerText = `You can change your username in ${user.next_update_username} days`\r\n }\r\n})\r\n\r\n$(document).on(\\\\\\\\\\\\\\\'click\\\\\\\\\\\\\\\', \\\\\\\\\\\\\\\'#save-username\\\\\\\\\\\\\\\', async function () {\r\n var view = app.views.current\r\n\r\n const user = await getSessionUser()\r\n\r\n if (!user.can_update_username) {\r\n return\r\n }\r\n\r\n const username = $(\\\\\\\\\\\\\\\'.profile-edit-view input[name=\\\\\\\\\\\\\\\"username\\\\\\\\\\\\\\\"]\\\\\\\\\\\\\\\').val()\r\n\r\n if (username === \\\\\\\\\\\\\\\'\\\\\\\\\\\\\\\') {\r\n showToast(\\\\\\\\\\\\\\\'Please enter a username\\\\\\\\\\\\\\\', \\\\\\\\\\\\\\\'Error\\\\\\\\\\\\\\\')\r\n return\r\n }\r\n\r\n // username can only have letters, numbers, and underscores\r\n var usernamePattern = /^[a-zA-Z0-9_]+$/\r\n if (!usernamePattern.test(username)) {\r\n showToast(\\\\\\\\\\\\\\\'Username can only contain letters, numbers, and underscores\\\\\\\\\\\\\\\')\r\n return\r\n }\r\n\r\n // username must be at least 3 characters long\r\n if (username.length < 3) {\r\n showToast(\\\\\\\\\\\\\\\'Username must be at least 3 characters long\\\\\\\\\\\\\\\')\r\n return\r\n }\r\n\r\n if (username === user.username) {\r\n return\r\n }\r\n\r\n try {\r\n app.preloader.show()\r\n\r\n const response = await updateUsername(username)\r\n\r\n app.preloader.hide()\r\n\r\n if (response && response.success) {\r\n showToast(\\\\\\\\\\\\\\\'Username updated successfully\\\\\\\\\\\\\\\', \\\\\\\\\\\\\\\'Success\\\\\\\\\\\\\\\')\r\n view.router.navigate(\\\\\\\\\\\\\\\'/profile/\\\\\\\\\\\\\\\')\r\n\r\n store.dispatch(\\\\\\\\\\\\\\\'updateUserDetails\\\\\\\\\\\\\\\')\r\n } else {\r\n throw new Error(response.message)\r\n }\r\n } catch (error) {\r\n app.preloader.hide()\r\n app.notification.create({\r\n titleRightText: \\\\\\\\\\\\\\\'now\\\\\\\\\\\\\\\',\r\n subtitle: \\\\\\\\\\\\\\\'Oops, something went wrong\\\\\\\\\\\\\\\',\r\n text: error.message || \\\\\\\\\\\\\\\'Failed to update username\\\\\\\\\\\\\\\',\r\n }).open()\r\n }\r\n\r\n\r\n})\r\n// --------------- End Edit Username Page ---------------\r\n\r\n\r\n// --------------- Edit Profile images Page ---------------\r\n$(document).on(\\\\\\\\\\\\\\\'page:init\\\\\\\\\\\\\\\', \\\\\\\\\\\\\\\'.page[data-name=\\\\\\\\\\\\\\\"profile-edit-images\\\\\\\\\\\\\\\"]\\\\\\\\\\\\\\\', async function (e) {\r\n var view = app.views.current\r\n\r\n const user = await getSessionUser()\r\n\r\n if (!user) {\r\n view.router.navigate(\\\\\\\\\\\\\\\'/login\\\\\\\\\\\\\\\')\r\n return\r\n }\r\n\r\n // If a cover photo exists, use it as the background image of the upload label\r\n if (user.cover_image) {\r\n $(\\\\\\\\\\\\\\\'input[name=\\\\\\\\\\\\\\\"cover_image\\\\\\\\\\\\\\\"]\\\\\\\\\\\\\\\').closest(\\\\\\\\\\\\\\\'.custom-file-upload\\\\\\\\\\\\\\\').find(\\\\\\\\\\\\\\\'label\\\\\\\\\\\\\\\').css(\\\\\\\\\\\\\\\'background-image\\\\\\\\\\\\\\\', `url(\\\\\\\\\\\\\\\'${user.cover_image}\\\\\\\\\\\\\\\')`)\r\n $(\\\\\\\\\\\\\\\'input[name=\\\\\\\\\\\\\\\"cover_image\\\\\\\\\\\\\\\"]\\\\\\\\\\\\\\\').closest(\\\\\\\\\\\\\\\'.custom-file-upload\\\\\\\\\\\\\\\').find(\\\\\\\\\\\\\\\'label\\\\\\\\\\\\\\\').css(\\\\\\\\\\\\\\\'background-size\\\\\\\\\\\\\\\', \\\\\\\\\\\\\\\'cover\\\\\\\\\\\\\\\')\r\n }\r\n\r\n if (user.profile_image) {\r\n $(\\\\\\\\\\\\\\\'input[name=\\\\\\\\\\\\\\\"profile_image\\\\\\\\\\\\\\\"]\\\\\\\\\\\\\\\').closest(\\\\\\\\\\\\\\\'.custom-file-upload\\\\\\\\\\\\\\\').find(\\\\\\\\\\\\\\\'label\\\\\\\\\\\\\\\').css(\\\\\\\\\\\\\\\'background-image\\\\\\\\\\\\\\\', `url(\\\\\\\\\\\\\\\'${user.profile_image}\\\\\\\\\\\\\\\')`)\r\n $(\\\\\\\\\\\\\\\'input[name=\\\\\\\\\\\\\\\"profile_image\\\\\\\\\\\\\\\"]\\\\\\\\\\\\\\\').closest(\\\\\\\\\\\\\\\'.custom-file-upload\\\\\\\\\\\\\\\').find(\\\\\\\\\\\\\\\'label\\\\\\\\\\\\\\\').css(\\\\\\\\\\\\\\\'background-size\\\\\\\\\\\\\\\', \\\\\\\\\\\\\\\'contain\\\\\\\\\\\\\\\')\r\n $(\\\\\\\\\\\\\\\'input[name=\\\\\\\\\\\\\\\"profile_image\\\\\\\\\\\\\\\"]\\\\\\\\\\\\\\\').closest(\\\\\\\\\\\\\\\'.custom-file-upload\\\\\\\\\\\\\\\').find(\\\\\\\\\\\\\\\'label\\\\\\\\\\\\\\\').css(\\\\\\\\\\\\\\\'background-position\\\\\\\\\\\\\\\', \\\\\\\\\\\\\\\'center\\\\\\\\\\\\\\\')\r\n $(\\\\\\\\\\\\\\\'input[name=\\\\\\\\\\\\\\\"profile_image\\\\\\\\\\\\\\\"]\\\\\\\\\\\\\\\').closest(\\\\\\\\\\\\\\\'.custom-file-upload\\\\\\\\\\\\\\\').find(\\\\\\\\\\\\\\\'label\\\\\\\\\\\\\\\').css(\\\\\\\\\\\\\\\'background-repeat\\\\\\\\\\\\\\\', \\\\\\\\\\\\\\\'no-repeat\\\\\\\\\\\\\\\')\r\n }\r\n})\r\n\r\n$(document).on(\\\\\\\\\\\\\\\'click\\\\\\\\\\\\\\\', \\\\\\\\\\\\\\\'#save-profile-images\\\\\\\\\\\\\\\', async function () {\r\n var view = app.views.current\r\n\r\n const cover_image = $(\\\\\\\\\\\\\\\'input[name=\\\\\\\\\\\\\\\"cover_image\\\\\\\\\\\\\\\"]\\\\\\\\\\\\\\\').prop(\\\\\\\\\\\\\\\'files\\\\\\\\\\\\\\\')[0]\r\n const profile_image = $(\\\\\\\\\\\\\\\'input[name=\\\\\\\\\\\\\\\"profile_image\\\\\\\\\\\\\\\"]\\\\\\\\\\\\\\\').prop(\\\\\\\\\\\\\\\'files\\\\\\\\\\\\\\\')[0]\r\n\r\n\r\n let coverBase64 = null\r\n let profileBase64 = null\r\n\r\n if (cover_image) {\r\n // Wrap the FileReader in a Promise to wait for it to complete\r\n coverBase64 = await new Promise((resolve, reject) => {\r\n const reader = new FileReader()\r\n reader.readAsDataURL(cover_image)\r\n\r\n reader.onload = () => resolve(reader.result)\r\n reader.onerror = () => reject(new Error(\\\\\\\\\\\\\\\'Failed to read image as base64\\\\\\\\\\\\\\\'))\r\n })\r\n }\r\n\r\n if (profile_image) {\r\n // Wrap the FileReader in a Promise to wait for it to complete\r\n profileBase64 = await new Promise((resolve, reject) => {\r\n const reader = new FileReader()\r\n reader.readAsDataURL(profile_image)\r\n\r\n reader.onload = () => resolve(reader.result)\r\n reader.onerror = () => reject(new Error(\\\\\\\\\\\\\\\'Failed to read image as base64\\\\\\\\\\\\\\\'))\r\n })\r\n }\r\n\r\n if (!coverBase64 && !profileBase64) {\r\n return\r\n }\r\n\r\n try {\r\n app.preloader.show()\r\n\r\n let promises = []\r\n\r\n if (profileBase64) {\r\n promises.push(updateProfileImage(profileBase64))\r\n }\r\n\r\n if (coverBase64) {\r\n promises.push(updateCoverImage(coverBase64))\r\n }\r\n\r\n const responses = await Promise.all(promises)\r\n app.preloader.hide()\r\n\r\n if (responses.every(response => response && response.success)) {\r\n showToast(\\\\\\\\\\\\\\\'Images updated successfully\\\\\\\\\\\\\\\', \\\\\\\\\\\\\\\'Success\\\\\\\\\\\\\\\')\r\n view.router.navigate(\\\\\\\\\\\\\\\'/profile/\\\\\\\\\\\\\\\')\r\n\r\n store.dispatch(\\\\\\\\\\\\\\\'updateUserDetails\\\\\\\\\\\\\\\')\r\n return\r\n }\r\n\r\n if (responses.some(response => response && !response.success)) {\r\n throw new Error(\\\\\\\\\\\\\\\'Failed to update images\\\\\\\\\\\\\\\')\r\n }\r\n } catch (error) {\r\n app.preloader.hide()\r\n\r\n app.notification.create({\r\n titleRightText: \\\\\\\\\\\\\\\'now\\\\\\\\\\\\\\\',\r\n subtitle: \\\\\\\\\\\\\\\'Oops, something went wrong\\\\\\\\\\\\\\\',\r\n text: error.message || \\\\\\\\\\\\\\\'Failed to update images\\\\\\\\\\\\\\\',\r\n }).open()\r\n }\r\n})\r\n\r\n$(document).on(\\\\\\\\\\\\\\\'change\\\\\\\\\\\\\\\', \\\\\\\\\\\\\\\'input[name=\\\\\\\\\\\\\\\"cover_image\\\\\\\\\\\\\\\"]\\\\\\\\\\\\\\\', function (e) {\r\n const file = e.target.files[0];\r\n const reader = new FileReader();\r\n\r\n reader.onload = function (event) {\r\n console.log($(\\\\\\\\\\\\\\\'.custom-file-upload.cover\\\\\\\\\\\\\\\'));\r\n\r\n $(\\\\\\\\\\\\\\\'.custom-file-upload.cover\\\\\\\\\\\\\\\')\r\n .find(\\\\\\\\\\\\\\\'label\\\\\\\\\\\\\\\')\r\n .css(\\\\\\\\\\\\\\\'background-image\\\\\\\\\\\\\\\', `url(\\\\\\\\\\\\\\\'${event.target.result}\\\\\\\\\\\\\\\')`)\r\n .css(\\\\\\\\\\\\\\\'background-size\\\\\\\\\\\\\\\', \\\\\\\\\\\\\\\'cover\\\\\\\\\\\\\\\');\r\n };\r\n\r\n if (file) {\r\n reader.readAsDataURL(file);\r\n }\r\n});\r\n\r\n$(document).on(\\\\\\\\\\\\\\\'change\\\\\\\\\\\\\\\', \\\\\\\\\\\\\\\'input[name=\\\\\\\\\\\\\\\"profile_image\\\\\\\\\\\\\\\"]\\\\\\\\\\\\\\\', function (e) {\r\n const file = e.target.files[0];\r\n const reader = new FileReader();\r\n\r\n reader.onload = function (event) {\r\n console.log($(\\\\\\\\\\\\\\\'.custom-file-upload.profile\\\\\\\\\\\\\\\'));\r\n\r\n $(\\\\\\\\\\\\\\\'.custom-file-upload.profile\\\\\\\\\\\\\\\')\r\n .find(\\\\\\\\\\\\\\\'label\\\\\\\\\\\\\\\')\r\n .css(\\\\\\\\\\\\\\\'background-image\\\\\\\\\\\\\\\', `url(\\\\\\\\\\\\\\\'${event.target.result}\\\\\\\\\\\\\\\')`)\r\n .css(\\\\\\\\\\\\\\\'background-size\\\\\\\\\\\\\\\', \\\\\\\\\\\\\\\'cover\\\\\\\\\\\\\\\');\r\n };\r\n\r\n if (file) {\r\n reader.readAsDataURL(file);\r\n }\r\n});\r\n// --------------- End Profile images Page ---------------\r\n\r\n\r\n// --------------- Edit Socials Page ---------------\r\n$(document).on(\\\\\\\\\\\\\\\'page:init\\\\\\\\\\\\\\\', \\\\\\\\\\\\\\\'.page[data-name=\\\\\\\\\\\\\\\"profile-edit-socials\\\\\\\\\\\\\\\"]\\\\\\\\\\\\\\\', async function (e) {\r\n var view = app.views.current\r\n\r\n const user = await getSessionUser()\r\n\r\n if (!user) {\r\n view.router.navigate(\\\\\\\\\\\\\\\'/login\\\\\\\\\\\\\\\')\r\n return\r\n }\r\n\r\n const externalLinks = user.profile_links || {};\r\n\r\n app.popup.create({\r\n el: \\\\\\\\\\\\\\\'.add-link-popup\\\\\\\\\\\\\\\',\r\n swipeToClose: \\\\\\\\\\\\\\\'to-bottom\\\\\\\\\\\\\\\'\r\n });\r\n\r\n // Populate form fields\r\n document.querySelector(\\\\\\\\\\\\\\\'input[name=\\\\\\\\\\\\\\\"social_instagram\\\\\\\\\\\\\\\"]\\\\\\\\\\\\\\\').value = externalLinks.instagram || \\\\\\\\\\\\\\\'\\\\\\\\\\\\\\\';\r\n document.querySelector(\\\\\\\\\\\\\\\'input[name=\\\\\\\\\\\\\\\"social_facebook\\\\\\\\\\\\\\\"]\\\\\\\\\\\\\\\').value = externalLinks.facebook || \\\\\\\\\\\\\\\'\\\\\\\\\\\\\\\';\r\n document.querySelector(\\\\\\\\\\\\\\\'input[name=\\\\\\\\\\\\\\\"social_tiktok\\\\\\\\\\\\\\\"]\\\\\\\\\\\\\\\').value = externalLinks.tiktok || \\\\\\\\\\\\\\\'\\\\\\\\\\\\\\\';\r\n document.querySelector(\\\\\\\\\\\\\\\'input[name=\\\\\\\\\\\\\\\"social_youtube\\\\\\\\\\\\\\\"]\\\\\\\\\\\\\\\').value = externalLinks.youtube || \\\\\\\\\\\\\\\'\\\\\\\\\\\\\\\';\r\n document.querySelector(\\\\\\\\\\\\\\\'input[name=\\\\\\\\\\\\\\\"social_mivia\\\\\\\\\\\\\\\"]\\\\\\\\\\\\\\\').value = externalLinks.mivia || \\\\\\\\\\\\\\\'\\\\\\\\\\\\\\\';\r\n document.querySelector(\\\\\\\\\\\\\\\'input[name=\\\\\\\\\\\\\\\"social_custodian\\\\\\\\\\\\\\\"]\\\\\\\\\\\\\\\').value = externalLinks.custodian || \\\\\\\\\\\\\\\'\\\\\\\\\\\\\\\';\r\n\r\n // .social-other-links ul\r\n const externalLinksContainer = $(\\\\\\\\\\\\\\\'.social-other-links ul\\\\\\\\\\\\\\\')[0];\r\n\r\n externalLinks.external_links?.forEach(linkObj => {\r\n const listItem = document.createElement(\\\\\\\\\\\\\\\'li\\\\\\\\\\\\\\\');\r\n\r\n\r\n listItem.innerHTML = `\r\n \r\n
\r\n
\r\n \r\n `;\r\n externalLinksContainer.appendChild(listItem);\r\n });\r\n})\r\n\r\n// Add event listener for the Save button\r\n$(document).on(\\\\\\\\\\\\\\\'click\\\\\\\\\\\\\\\', \\\\\\\\\\\\\\\'#add-link-btn\\\\\\\\\\\\\\\', async function () {\r\n const linkTitle = $(\\\\\\\\\\\\\\\'input[name=\\\\\\\\\\\\\\\"custom_link_title\\\\\\\\\\\\\\\"]\\\\\\\\\\\\\\\').val();\r\n const linkUrl = $(\\\\\\\\\\\\\\\'input[name=\\\\\\\\\\\\\\\"custom_link_url\\\\\\\\\\\\\\\"]\\\\\\\\\\\\\\\').val();\r\n\r\n // Validate the inputs\r\n if (linkTitle === \\\\\\\\\\\\\\\'\\\\\\\\\\\\\\\') {\r\n console.log(\\\\\\\\\\\\\\\'Please enter a link title.\\\\\\\\\\\\\\\', $(\\\\\\\\\\\\\\\'input[name=\\\\\\\\\\\\\\\"custom_link_title\\\\\\\\\\\\\\\"]\\\\\\\\\\\\\\\'));\r\n showToast(\\\\\\\\\\\\\\\'Please enter a link title.\\\\\\\\\\\\\\\', \\\\\\\\\\\\\\\'Error\\\\\\\\\\\\\\\');\r\n return;\r\n }\r\n\r\n if (linkUrl === \\\\\\\\\\\\\\\'\\\\\\\\\\\\\\\') {\r\n showToast(\\\\\\\\\\\\\\\'Please enter a link URL.\\\\\\\\\\\\\\\', \\\\\\\\\\\\\\\'Error\\\\\\\\\\\\\\\');\r\n return;\r\n }\r\n\r\n // Simple URL validation (basic check)\r\n // const urlPattern = /^(https?://)?([da-z.-]+).([a-z.]{2,6})([/w .-]*)*/?$/;\r\n // if (!urlPattern.test(linkUrl)) {\r\n // showToast(\\\\\\\\\\\\\\\'Please enter a valid URL.\\\\\\\\\\\\\\\', \\\\\\\\\\\\\\\'Error\\\\\\\\\\\\\\\');\r\n // return;\r\n // }\r\n\r\n\r\n const urlPattern = /^(https?:\\\\\\\\\\\\\\\\/\\\\\\\\\\\\\\\\/|www\\\\\\\\\\\\\\\\.)[\\\\\\\\\\\\\\\\da-z\\\\\\\\\\\\\\\\.-]+\\\\\\\\\\\\\\\\.[a-z]{2,6}\\\\\\\\\\\\\\\\/?$/;\r\n if (!urlPattern.test(linkUrl)) {\r\n showToast(\\\\\\\\\\\\\\\'Please enter a valid URL.\\\\\\\\\\\\\\\', \\\\\\\\\\\\\\\'Error\\\\\\\\\\\\\\\');\r\n return;\r\n }\r\n\r\n // Mock API request (POST request)\r\n const requestData = {\r\n label: linkTitle,\r\n url: linkUrl\r\n };\r\n\r\n app.popup.close()\r\n\r\n app.preloader.show()\r\n\r\n const response = await addUserProfileLinks({\r\n type: \\\\\\\\\\\\\\\'external_links\\\\\\\\\\\\\\\',\r\n link: requestData\r\n })\r\n\r\n if (response && response.success) {\r\n showToast(\\\\\\\\\\\\\\\'Link added successfully\\\\\\\\\\\\\\\', \\\\\\\\\\\\\\\'Success\\\\\\\\\\\\\\\');\r\n\r\n // Add the new link to the list\r\n const listItem = document.createElement(\\\\\\\\\\\\\\\'li\\\\\\\\\\\\\\\');\r\n listItem.innerHTML = `\r\n \r\n \r\n ${linkObj.link.label}\r\n
\r\n xmark_circle
\r\n \r\n
\r\n \r\n `;\r\n\r\n const externalLinksContainer = $(\\\\\\\\\\\\\\\'.social-other-links ul\\\\\\\\\\\\\\\')[0];\r\n externalLinksContainer.appendChild(listItem);\r\n store.dispatch(\\\\\\\\\\\\\\\'updateUserDetails\\\\\\\\\\\\\\\')\r\n }\r\n\r\n app.preloader.hide()\r\n});\r\n\r\n// Save social links\r\n$(document).on(\\\\\\\\\\\\\\\'click\\\\\\\\\\\\\\\', \\\\\\\\\\\\\\\'#save-profile-socials\\\\\\\\\\\\\\\', async function () {\r\n var view = app.views.current\r\n\r\n const user = await getSessionUser()\r\n\r\n const instagram = $(\\\\\\\\\\\\\\\'input[name=\\\\\\\\\\\\\\\"social_instagram\\\\\\\\\\\\\\\"]\\\\\\\\\\\\\\\').val();\r\n const facebook = $(\\\\\\\\\\\\\\\'input[name=\\\\\\\\\\\\\\\"social_facebook\\\\\\\\\\\\\\\"]\\\\\\\\\\\\\\\').val();\r\n const tiktok = $(\\\\\\\\\\\\\\\'input[name=\\\\\\\\\\\\\\\"social_tiktok\\\\\\\\\\\\\\\"]\\\\\\\\\\\\\\\').val();\r\n const youtube = $(\\\\\\\\\\\\\\\'input[name=\\\\\\\\\\\\\\\"social_youtube\\\\\\\\\\\\\\\"]\\\\\\\\\\\\\\\').val();\r\n const mivia = $(\\\\\\\\\\\\\\\'input[name=\\\\\\\\\\\\\\\"social_mivia\\\\\\\\\\\\\\\"]\\\\\\\\\\\\\\\').val();\r\n const custodian = $(\\\\\\\\\\\\\\\'input[name=\\\\\\\\\\\\\\\"social_custodian\\\\\\\\\\\\\\\"]\\\\\\\\\\\\\\\').val();\r\n\r\n const links = {\r\n instagram,\r\n facebook,\r\n tiktok,\r\n youtube,\r\n mivia,\r\n custodian\r\n };\r\n\r\n // ig, tiktok, yt. mivia, custodian must be string, no special characters except for _ and - and . and\r\n const usernamePattern = /^[a-zA-Z0-9._-]+$/;\r\n\r\n if (instagram && !usernamePattern.test(instagram)) {\r\n showToast(\\\\\\\\\\\\\\\'Please enter a valid Instagram username (letters, numbers, underscores, periods, hyphens only)\\\\\\\\\\\\\\\', \\\\\\\\\\\\\\\'Error\\\\\\\\\\\\\\\');\r\n return;\r\n }\r\n\r\n if (tiktok && !usernamePattern.test(tiktok)) {\r\n showToast(\\\\\\\\\\\\\\\'Please enter a valid TikTok username (letters, numbers, underscores, periods, hyphens only)\\\\\\\\\\\\\\\', \\\\\\\\\\\\\\\'Error\\\\\\\\\\\\\\\');\r\n return;\r\n }\r\n\r\n if (youtube && !usernamePattern.test(youtube)) {\r\n showToast(\\\\\\\\\\\\\\\'Please enter a valid YouTube username (letters, numbers, underscores, periods, hyphens only)\\\\\\\\\\\\\\\', \\\\\\\\\\\\\\\'Error\\\\\\\\\\\\\\\');\r\n return;\r\n }\r\n\r\n if (mivia && !usernamePattern.test(mivia)) {\r\n showToast(\\\\\\\\\\\\\\\'Please enter a valid Mivia username (letters, numbers, underscores, periods, hyphens only)\\\\\\\\\\\\\\\', \\\\\\\\\\\\\\\'Error\\\\\\\\\\\\\\\');\r\n return;\r\n }\r\n\r\n if (custodian && !usernamePattern.test(custodian)) {\r\n showToast(\\\\\\\\\\\\\\\'Please enter a valid Custodian username (letters, numbers, underscores, periods, hyphens only)\\\\\\\\\\\\\\\', \\\\\\\\\\\\\\\'Error\\\\\\\\\\\\\\\');\r\n return;\r\n }\r\n\r\n\r\n\r\n // facebook must be a valid facebook url\r\n const urlPattern = /^(https?:\\\\\\\\\\\\\\\\/\\\\\\\\\\\\\\\\/|www\\\\\\\\\\\\\\\\.)[\\\\\\\\\\\\\\\\da-z\\\\\\\\\\\\\\\\.-]+\\\\\\\\\\\\\\\\.[a-z]{2,6}\\\\\\\\\\\\\\\\/?$/;\r\n if (facebook && !usernamePattern.test(facebook)) {\r\n showToast(\\\\\\\\\\\\\\\'Please enter a valid Facebook username (letters, numbers, underscores, periods, hyphens only)\\\\\\\\\\\\\\\', \\\\\\\\\\\\\\\'Error\\\\\\\\\\\\\\\');\r\n return;\r\n }\r\n\r\n // check if the request data is the same as userdata\r\n let dirtied = false;\r\n\r\n for (const key in links) {\r\n if (links[key] !== user.profile_links[key]) {\r\n dirtied = true\r\n break;\r\n }\r\n }\r\n\r\n if (!dirtied) {\r\n return\r\n }\r\n\r\n app.preloader.show()\r\n\r\n const response = await updateSocialLinks(links);\r\n\r\n app.preloader.hide()\r\n\r\n if (response && response.success) {\r\n showToast(\\\\\\\\\\\\\\\'Social links updated successfully\\\\\\\\\\\\\\\', \\\\\\\\\\\\\\\'Success\\\\\\\\\\\\\\\');\r\n view.router.navigate(\\\\\\\\\\\\\\\'/profile/\\\\\\\\\\\\\\\')\r\n store.dispatch(\\\\\\\\\\\\\\\'updateUserDetails\\\\\\\\\\\\\\\')\r\n } else {\r\n showToast(\\\\\\\\\\\\\\\'Failed to update social links\\\\\\\\\\\\\\\', \\\\\\\\\\\\\\\'Error\\\\\\\\\\\\\\\');\r\n }\r\n})\r\n\r\n// Delete link\r\n$(document).on(\\\\\\\\\\\\\\\'click\\\\\\\\\\\\\\\', \\\\\\\\\\\\\\\'.delete-external-link\\\\\\\\\\\\\\\', async function (e) {\r\n const linkId = e.target.closest(\\\\\\\\\\\\\\\'.item-link\\\\\\\\\\\\\\\').dataset.linkId;\r\n\r\n // confirm dialog\r\n app.dialog.confirm(\\\\\\\\\\\\\\\'Are you sure you want to delete this link?\\\\\\\\\\\\\\\', \\\\\\\\\\\\\\\'Delete Link\\\\\\\\\\\\\\\', async function () {\r\n app.preloader.show()\r\n\r\n const response = await removeProfileLink(linkId);\r\n\r\n app.preloader.hide()\r\n\r\n if (response) {\r\n showToast(\\\\\\\\\\\\\\\'Link deleted successfully\\\\\\\\\\\\\\\', \\\\\\\\\\\\\\\'Success\\\\\\\\\\\\\\\')\r\n // remove the link from the list\r\n e.target.closest(\\\\\\\\\\\\\\\'.item-link\\\\\\\\\\\\\\\').remove();\r\n store.dispatch(\\\\\\\\\\\\\\\'updateUserDetails\\\\\\\\\\\\\\\')\r\n\r\n } else {\r\n showToast(\\\\\\\\\\\\\\\'Failed to delete link\\\\\\\\\\\\\\\', \\\\\\\\\\\\\\\'Error\\\\\\\\\\\\\\\')\r\n }\r\n })\r\n})\r\n// --------------- End Edit Socials Page ---------------\r\n\r\n$(document).on(\\\\\\\\\\\\\\\'input\\\\\\\\\\\\\\\', \\\\\\\\\\\\\\\'#lowercaseInput\\\\\\\\\\\\\\\', function (event) {\r\n this.value = this.value.toLowerCase();\r\n});\r\n\r\n// --------------- Delete Profile Page ---------------\r\n// $(document).on(\\\\\\\\\\\\\\\'page:init\\\\\\\\\\\\\\\', \\\\\\\\\\\\\\\'.page[data-name=\\\\\\\\\\\\\\\"profile-edit-account-settings\\\\\\\\\\\\\\\"]\\\\\\\\\\\\\\\', function (e) {\r\n// });\r\n\r\n$(document).on(\\\\\\\\\\\\\\\'click\\\\\\\\\\\\\\\', \\\\\\\\\\\\\\\'.account-delete\\\\\\\\\\\\\\\', function (e) {\r\n app.dialog.confirm(\\\\\\\\\\\\\\\'Are you sure? It is not possible to restore accounts once deleted.\\\\\\\\\\\\\\\', \\\\\\\\\\\\\\\'Confirm\\\\\\\\\\\\\\\', function (name) {\r\n app.dialog.passwordConfirm(\\\\\\\\\\\\\\\'Please enter your password.\\\\\\\\\\\\\\\', \\\\\\\\\\\\\\\'Delete Account\\\\\\\\\\\\\\\', async function (password) {\r\n await handleDeleteAccount(password);\r\n });\r\n });\r\n});\r\n\r\nasync function handleDeleteAccount(password) {\r\n\r\n try {\r\n app.preloader.show();\r\n\r\n const response = await deleteUserAccount(password);\r\n\r\n app.preloader.hide();\r\n if (!response) {\r\n app.dialog.alert(\\\\\\\\\\\\\\\'Failed to delete account\\\\\\\\\\\\\\\', \\\\\\\\\\\\\\\'Error\\\\\\\\\\\\\\\');\r\n return;\r\n }\r\n\r\n if (response && response.success == false) {\r\n app.dialog.alert(response.message, \\\\\\\\\\\\\\\'Error\\\\\\\\\\\\\\\');\r\n return;\r\n }\r\n\r\n if (response && response.success) {\r\n app.dialog.alert(\\\\\\\\\\\\\\\'Account deleted successfully\\\\\\\\\\\\\\\', \\\\\\\\\\\\\\\'Success\\\\\\\\\\\\\\\');\r\n\r\n setTimeout(() => {\r\n store.dispatch(\\\\\\\\\\\\\\\'logout\\\\\\\\\\\\\\\');\r\n }, 1000);\r\n }\r\n } catch (error) {\r\n app.preloader.hide();\r\n app.dialog.alert(error.message || \\\\\\\\\\\\\\\'Failed to delete account\\\\\\\\\\\\\\\', \\\\\\\\\\\\\\\'Error\\\\\\\\\\\\\\\');\r\n }\r\n}\r\n\r\n// Custom dialog to ask for password\r\napp.dialog.passwordConfirm = function (text, title, callback) {\r\n app.dialog.create({\r\n title: title,\r\n text: text,\r\n content: \\\\\\\\\\\\\\\'\r\n ${linkTitle}\r\n
\r\n xmark_circle
\r\n \\\\\\\\\\\\\\\',\r\n buttons: [{\r\n text: \\\\\\\\\\\\\\\'Cancel\\\\\\\\\\\\\\\',\r\n onClick: function (dialog, e) {\r\n dialog.close();\r\n }\r\n },\r\n {\r\n text: \\\\\\\\\\\\\\\'Delete\\\\\\\\\\\\\\\',\r\n bold: true,\r\n onClick: function (dialog, e) {\r\n var password = dialog.$el.find(\\\\\\\\\\\\\\\'.dialog-input\\\\\\\\\\\\\\\').val(); // Get the password entered\r\n if (!password) {\r\n showToast(\\\\\\\\\\\\\\\'Please enter your password\\\\\\\\\\\\\\\', \\\\\\\\\\\\\\\'Error\\\\\\\\\\\\\\\');\r\n return;\r\n }\r\n callback(password); // Pass the password to the callback\r\n dialog.close();\r\n }\r\n }\r\n ]\r\n }).open();\r\n};');