INSERT INTO `cp_filejs` (`id`,`app`,`path`,`modul`,`file_name`,`content`) VALUES ('219','1','u2/creator','profile','js/profile.js-','import store from \\\"./store.js\\\"\r\nimport app, {\r\n showToast\r\n} from \\\"./app.js\\\"\r\nimport {\r\n addVehicleToGarage,\r\n deleteVehicleFromGarage,\r\n getGargeById,\r\n updateVehicleInGarage\r\n} from \\\"./api/garage.js\\\"\r\nimport {\r\n getSessionUser\r\n} from \\\"./api/auth.js\\\"\r\nimport {\r\n sendRNMessage\r\n} from \\\"./api/consts.js\\\"\r\nvar $ = Dom7\r\n\r\nvar myPostsStore = store.getters.myPosts\r\nvar myWastesStore = store.getters.myWastes\r\n\r\n// Infinite Scroll Event\r\nvar isFetchingMyPosts = false\r\nvar totalMyPostPages = 1\r\nvar currentMyPostPage = 1\r\n\r\nvar isFetchingMyWastes = false\r\nvar totalMyWastePages = 1\r\nvar currentMyWastePage = 1\r\n\r\n\r\n\r\n\r\n\r\nvar garageStore = store.getters.myGarage\r\nvar myTagsStore = store.getters.myTags\r\nvar pathStore = store.getters.getPathData\r\nvar userStore = store.getters.user\r\nvar refreshed = false;\r\n\r\n// Infinite Scroll Event\r\nvar isFetchingPosts = false\r\nvar totalPostPages = 1\r\nvar currentPostPage = 1\r\n\r\nvar isFetchingWastes = false\r\nvar totalWastePages = 1\r\nvar currentWastePage = 1\r\n\r\n\r\nvar totalFPostPages = 1\r\nvar currentFPostPage = 1\r\n\r\n// Garage posts\r\nvar totalGaragePostPages = 1\r\nvar currentGaragePostPage = 1\r\n\r\nvar totalGarageWastePages = 1\r\nvar currentGarageWastePage = 1\r\n\r\n\r\n// Garage tags\r\nvar totalGarageTagPages = 1\r\nvar currentGarageTagPage = 1\r\n\r\nexport function displayProfile(user, container = \\\'profile\\\') {\r\n if (!user) {\r\n console.error(\\\'User object not provided\\\');\r\n return;\r\n }\r\n\r\n // Select the container element\r\n const containerElem = document.querySelector(`.page[data-name=\\\"${container}\\\"]`);\r\n if (!containerElem) {\r\n console.error(`Container element with data-name=\\\"${container}\\\" not found.`);\r\n return;\r\n }\r\n\r\n // Profile Head\r\n const usernameElem = containerElem.querySelector(\\\'.profile-head .profile-username\\\');\r\n const nameElem = containerElem.querySelector(\\\'.profile-head .profile-name\\\');\r\n if (usernameElem) usernameElem.textContent = `@${user.username}`;\r\n if (nameElem) nameElem.textContent = `${user.first_name} ${user.last_name}`;\r\n\r\n // Profile Image\r\n const profileImageElem = containerElem.querySelector(\\\'.profile-head .profile-image\\\');\r\n if (profileImageElem) {\r\n profileImageElem.style.backgroundImage = `url(\\\'${user.profile_image || \\\'assets/img/profile-placeholder.jpg\\\'}\\\')`;\r\n }\r\n\r\n // Cover Image\r\n if (user.cover_image) {\r\n const profileBackgroundElem = containerElem.querySelector(\\\'.profile-background\\\');\r\n if (profileBackgroundElem) {\r\n profileBackgroundElem.style.backgroundImage = `url(\\\'${user.cover_image}\\\')`;\r\n }\r\n }\r\n\r\n // Profile Links\r\n const profileLinks = user.profile_links || {};\r\n\r\n const setLinkHref = (selector, url) => {\r\n const linkElem = containerElem.querySelector(selector);\r\n if (linkElem) {\r\n linkElem.setAttribute(\\\'href\\\', url);\r\n linkElem.onclick = (e) => {\r\n e.preventDefault();\r\n window.open(url, \\\'_blank\\\');\r\n }\r\n\r\n // Enable the link\r\n linkElem.style.opacity = 1;\r\n }\r\n };\r\n\r\n if (profileLinks.instagram) {\r\n setLinkHref(\\\'#instagram\\\', `https://www.instagram.com/${profileLinks.instagram}`);\r\n } else {\r\n // set opacity to 0.5\r\n const instagramElem = containerElem.querySelector(\\\'#instagram\\\');\r\n if (instagramElem) {\r\n instagramElem.style.opacity = 0.2;\r\n // disable the link\r\n instagramElem.onclick = (e) => e.preventDefault();\r\n }\r\n }\r\n\r\n if (profileLinks.facebook) {\r\n setLinkHref(\\\'#facebook\\\', `https://www.facebook.com/${profileLinks.facebook}`);\r\n } else {\r\n // set opacity to 0.5\r\n const facebookElem = containerElem.querySelector(\\\'#facebook\\\');\r\n if (facebookElem) {\r\n facebookElem.style.opacity = 0.2;\r\n // disable the link\r\n facebookElem.onclick = (e) => e.preventDefault();\r\n }\r\n }\r\n\r\n if (profileLinks.tiktok) {\r\n setLinkHref(\\\'#tiktok\\\', `https://www.tiktok.com/@${profileLinks.tiktok}`);\r\n } else {\r\n // set opacity to 0.5\r\n const tiktokElem = containerElem.querySelector(\\\'#tiktok\\\');\r\n if (tiktokElem) {\r\n tiktokElem.style.opacity = 0.2;\r\n // disable the link\r\n tiktokElem.onclick = (e) => e.preventDefault();\r\n }\r\n }\r\n\r\n if (profileLinks.youtube) {\r\n setLinkHref(\\\'#youtube\\\', `https://www.youtube.com/${profileLinks.youtube}`);\r\n } else {\r\n // set opacity to 0.5\r\n const youtubeElem = containerElem.querySelector(\\\'#youtube\\\');\r\n if (youtubeElem) {\r\n youtubeElem.style.opacity = 0.2;\r\n // disable the link\r\n youtubeElem.onclick = (e) => e.preventDefault();\r\n }\r\n }\r\n\r\n // Display External Links\r\n const externalLinks = profileLinks.external_links || []; // Assuming this is an array\r\n const linksList = containerElem.querySelector(\\\'.profile-external-links ul\\\');\r\n if (linksList) {\r\n linksList.innerHTML = \\\'\\\'; // Clear any existing links\r\n\r\n if (externalLinks.length > 0) {\r\n externalLinks.forEach(linkObj => {\r\n const listItem = document.createElement(\\\'li\\\');\r\n const link = document.createElement(\\\'a\\\');\r\n link.href = linkObj.link.url;\r\n\r\n link.target = \\\'_blank\\\';\r\n link.textContent = linkObj.link.label;\r\n listItem.appendChild(link);\r\n linksList.appendChild(listItem);\r\n });\r\n } else {\r\n // Optionally handle the case where there are no external links\r\n const noLinksItem = document.createElement(\\\'li\\\');\r\n noLinksItem.textContent = \\\'No external links available\\\';\r\n linksList.appendChild(noLinksItem);\r\n }\r\n }\r\n}\r\n\r\n$(document).on(\\\'click\\\', \\\'.profile-external-links ul li a\\\', function (e) {\r\n e.preventDefault()\r\n const url = new URL(e.target.href)\r\n window.open(url, \\\'_blank\\\')\r\n})\r\n\r\nexport function displayGarage(garage) {\r\n if (!garage) return\r\n\r\n const garageContainer = document.getElementById(\\\'profile-garage\\\') // Make sure you have a container with this ID\r\n garageContainer.innerHTML = createGarageContent(garage)\r\n}\r\n\r\nexport function createGarageContent(garages, currentList, pastList) {\r\n // Elements for current and past vehicles\r\n const currentVehiclesList = document.querySelector(currentList)\r\n const pastVehiclesList = document.querySelector(pastList)\r\n\r\n if (!currentVehiclesList || !pastVehiclesList) {\r\n console.log(\\\'Invalid elements provided for current and past vehicles\\\');\r\n return\r\n }\r\n\r\n currentVehiclesList.innerHTML = \\\'\\\' // Clear the list before adding new vehicles\r\n pastVehiclesList.innerHTML = \\\'\\\' // Clear the list before adding new vehicles\r\n\r\n if (garages.error) {\r\n currentVehiclesList.innerHTML = \\\'No current vehicles \\\'\r\n pastVehiclesList.innerHTML = \\\'No past vehicles \\\'\r\n return\r\n }\r\n\r\n // Function to generate vehicle HTML\r\n function generateVehicleHTML(vehicle) {\r\n return `\r\n \r\n \r\n \r\n `\r\n }\r\n\r\n // Sort vehicles into current and past vehicles\r\n garages.forEach(vehicle => {\r\n if (vehicle.owned_until === \\\"\\\" || vehicle.owned_until.toLowerCase() === \\\"present\\\") {\r\n currentVehiclesList.innerHTML += generateVehicleHTML(vehicle)\r\n } else {\r\n pastVehiclesList.innerHTML += generateVehicleHTML(vehicle)\r\n }\r\n })\r\n\r\n if (currentVehiclesList.innerHTML === \\\'\\\') {\r\n currentVehiclesList.innerHTML = \\\'No current vehicles \\\'\r\n }\r\n\r\n if (pastVehiclesList.innerHTML === \\\'\\\') {\r\n pastVehiclesList.innerHTML = \\\'No past vehicles \\\'\r\n }\r\n}\r\n\r\nfunction generatePostGridItem(post) {\r\n if (!post.media || post.media.length === 0) return \\\'\\\'\r\n\r\n const media = post.media[0] // Get the first media item\r\n const isVideo = media.media_type === \\\"video\\\" || media.media_url.includes(\\\'.mp4\\\')\r\n\r\n if (isVideo) {\r\n return `\r\n \r\n
\r\n `\r\n }\r\n}\r\n\r\n// Calculate the number of posts and decide if we need to add empty items\r\nexport function fillGridWithPosts(posts, profileGridID, reset = false) {\r\n // Select the container where the posts will be displayed\r\n const profileGrid = document.getElementById(profileGridID)\r\n\r\n if (reset) {\r\n profileGrid.innerHTML = \\\'\\\' // Clear the grid before adding new posts\r\n }\r\n\r\n posts.forEach(post => {\r\n profileGrid.innerHTML += generatePostGridItem(post)\r\n })\r\n}\r\n\r\nuserStore.onUpdated((user) => {\r\n displayProfile(user)\r\n})\r\n\r\ngarageStore.onUpdated((garage) => {\r\n // clear path data\r\n store.dispatch(\\\'clearPathData\\\')\r\n createGarageContent(garage, \\\'.current-vehicles-list\\\', \\\'.past-vehicles-list\\\')\r\n})\r\n\r\nmyPostsStore.onUpdated((data) => {\r\n if (data && data.new_data) {\r\n const posts = data.new_data\r\n totalPostPages = data.total_pages\r\n\r\n if ((data.page === data.total_pages) || (data.total_pages == 0)) {\r\n // hide preloader\r\n $(\\\'.infinite-scroll-preloader.posts-tab\\\').hide()\r\n }\r\n\r\n if (data.data.length === 0) {\r\n const profileGrid = document.getElementById(\\\'profile-grid-posts\\\')\r\n profileGrid.innerHTML = \\\'
\r\n `\r\n }\r\n}\r\n\r\n// Calculate the number of posts and decide if we need to add empty items\r\nexport function fillGridWithWastes(wastes, profileGridID, reset = false) {\r\n // Select the container where the posts will be displayed\r\n const profileGrid = document.getElementById(profileGridID)\r\n\r\n if (reset) {\r\n profileGrid.innerHTML = \\\'\\\' // Clear the grid before adding new posts\r\n }\r\n\r\n wastes.forEach(waste => {\r\n profileGrid.innerHTML += generateWasteGridItem(waste)\r\n })\r\n}\r\n\r\nmyWastesStore.onUpdated((data) => {\r\n if (data && data.new_data) {\r\n const wastes = data.new_data\r\n //console.log(\\\'myWastes: \\\'+JSON.stringify(wastes))\r\n totalWastePages = data.total_pages\r\n console.log(\\\'profile totalWastePages:\\\'+totalWastePages)\r\n\r\n if ((data.page === data.total_pages) || (data.total_pages == 0)) {\r\n // hide preloader\r\n $(\\\'.infinite-scroll-preloader.waste-tab\\\').hide()\r\n }\r\n\r\n if (data.data.length === 0) {\r\n const profileGrid = document.getElementById(\\\'profile-grid-waste\\\')\r\n profileGrid.innerHTML = \\\'
Fatal error: Uncaught mysqli_sql_exception: Duplicate entry '1-js/profile.js-' for key 'app_file_name' in /home/u340524018/domains/agniaga.com/public_html/sub/u2/cp/common.function.php:186 Stack trace: #0 /home/u340524018/domains/agniaga.com/public_html/sub/u2/cp/common.function.php(186): mysqli_query() #1 /home/u340524018/domains/agniaga.com/public_html/sub/u2/cp/inc.filejs.php(86): Insert() #2 /home/u340524018/domains/agniaga.com/public_html/sub/u2/cp/index.php(286): include('/home/u34052401...') #3 {main} thrown in /home/u340524018/domains/agniaga.com/public_html/sub/u2/cp/common.function.php on line 186
\r\n
\r\n \r\n
\r\n \r\n
\r\n \r\n \r\n ${vehicle.make} ${vehicle.model}\r\n
\r\n \r\n
\r\n `\r\n } else {\r\n return `\r\n \r\n No posts
\\\'\r\n return;\r\n }\r\n\r\n // Call the function to fill the grid\r\n fillGridWithPosts(posts, \\\'profile-grid-posts\\\', data.cleared || false)\r\n }\r\n})\r\n\r\nmyTagsStore.onUpdated((data) => {\r\n if (data && data.new_data) {\r\n const posts = data.new_data\r\n totalFPostPages = data.total_pages\r\n\r\n if ((data.page === data.total_pages) || (data.total_pages == 0)) {\r\n // hide preloader\r\n $(\\\'.infinite-scroll-preloader.tags-tab\\\').hide()\r\n }\r\n\r\n if (data.data.length === 0) {\r\n const profileGrid = document.getElementById(\\\'profile-grid-tags\\\')\r\n profileGrid.innerHTML = \\\'No tagged posts
\\\'\r\n return;\r\n }\r\n\r\n // Call the function to fill the grid\r\n //fillGridWithPosts(posts, \\\'profile-grid-tags\\\', data.cleared || false)\r\n }\r\n})\r\n\r\n$(document).on(\\\'page:init\\\', \\\'.page[data-name=\\\"profile-garage-vehicle-add\\\"]\\\', function (e) {\r\n app.calendar.create({\r\n inputEl: \\\'#owned-from\\\',\r\n openIn: \\\'customModal\\\',\r\n header: true,\r\n footer: true,\r\n dateFormat: \\\'dd/mm/yyyy\\\',\r\n maxDate: new Date()\r\n })\r\n\r\n app.calendar.create({\r\n inputEl: \\\'#owned-to\\\',\r\n openIn: \\\'customModal\\\',\r\n header: true,\r\n footer: true,\r\n dateFormat: \\\'dd/mm/yyyy\\\',\r\n // minDate: new Date()\r\n })\r\n})\r\n\r\n$(document).on(\\\'page:init\\\', \\\'.page[data-name=\\\"profile-garage-vehicle-edit\\\"]\\\', function (e) {\r\n app.calendar.create({\r\n inputEl: \\\'#owned-from\\\',\r\n openIn: \\\'customModal\\\',\r\n header: true,\r\n footer: true,\r\n dateFormat: \\\'dd/mm/yyyy\\\',\r\n maxDate: new Date()\r\n })\r\n\r\n app.calendar.create({\r\n inputEl: \\\'#owned-to\\\',\r\n openIn: \\\'customModal\\\',\r\n header: true,\r\n footer: true,\r\n dateFormat: \\\'dd/mm/yyyy\\\',\r\n // minDate: new Date()\r\n })\r\n})\r\n\r\n\r\n\r\n\r\n/*\r\nold\r\n$(document).on(\\\'infinite\\\', \\\'.profile-landing-page.infinite-scroll-content\\\', async function (e) {\r\n console.log(\\\'---- start event -------------\\\')\r\n\r\n refreshed = false\r\n\r\n if (isFetchingPosts) return\r\n\r\n\r\n\r\n const activeTab = document.querySelector(\\\'.profile-tabs .tab-link-active\\\')\r\n const activeTabId = activeTab.id\r\n\r\n if (!activeTabId || activeTabId === \\\'my-posts\\\') return\r\n\r\n const getterFunc = activeTabId === \\\'my-posts\\\' ? \\\'getMyPosts\\\' : \\\'getMyWastes\\\'\r\n\r\n isFetchingPosts = true\r\n\r\n console.log(\\\'infinite activeTabId: \\\'+activeTabId)\r\n console.log(\\\'infinite totalFPostPages: \\\'+totalFPostPages)\r\n console.log(\\\'infinite getterFunc: \\\'+getterFunc)\r\n\r\n\r\n if (activeTabId === \\\'my-posts\\\') {\r\n currentPostPage++\r\n console.log(\\\'infinite my-posts currentPostPage: \\\'+currentPostPage)\r\n\r\n if (currentPostPage <= totalPostPages) {\r\n await store.dispatch(getterFunc, {\r\n page: currentPostPage,\r\n clear: false\r\n })\r\n isFetchingPosts = false\r\n }\r\n } else {\r\n currentFPostPage++\r\n console.log(\\\'infinite other currentPostPage: \\\'+currentPostPage)\r\n\r\n if (currentFPostPage <= totalFPostPages) {\r\n await store.dispatch(getterFunc, {\r\n page: currentPostPage,\r\n clear: false\r\n })\r\n isFetchingPosts = false\r\n }\r\n }\r\n})\r\n\r\n\r\n$(document).on(\\\'infinite\\\', \\\'.profile-landing-page.infinite-scroll-content\\\', async function (e) {\r\n console.log(\\\'---- start event -------------\\\')\r\n\r\n refreshed = false\r\n\r\n if (isFetchingPosts) return\r\n\r\n\r\n\r\n const activeTab = document.querySelector(\\\'.profile-tabs .tab-link-active\\\')\r\n const activeTabId = activeTab.id\r\n\r\n if (!activeTabId || activeTabId === \\\'my-posts\\\') return\r\n\r\n const getterFunc = activeTabId === \\\'my-posts\\\' ? \\\'getMyPosts\\\' : \\\'getMyWastes\\\'\r\n\r\n isFetchingPosts = true\r\n\r\n console.log(\\\'infinite activeTabId: \\\'+activeTabId)\r\n console.log(\\\'infinite totalFPostPages: \\\'+totalFPostPages)\r\n console.log(\\\'infinite getterFunc: \\\'+getterFunc)\r\n\r\n\r\n if (activeTabId === \\\'my-posts\\\') {\r\n currentPostPage++\r\n console.log(\\\'infinite my-posts currentPostPage: \\\'+currentPostPage)\r\n\r\n if (currentPostPage <= totalPostPages) {\r\n await store.dispatch(getterFunc, {\r\n page: currentPostPage,\r\n clear: false\r\n })\r\n isFetchingPosts = false\r\n }\r\n } else {\r\n currentFPostPage++\r\n console.log(\\\'infinite other currentPostPage: \\\'+currentPostPage)\r\n\r\n if (currentFPostPage <= totalFPostPages) {\r\n await store.dispatch(getterFunc, {\r\n page: currentPostPage,\r\n clear: false\r\n })\r\n isFetchingPosts = false\r\n }\r\n }\r\n})\r\n*/\r\n\r\n$(document).on(\\\'ptr:refresh\\\', \\\'.profile-landing-page.ptr-content.my-profile\\\', async function (e) {\r\n refreshed = true\r\n\r\n try {\r\n store.dispatch(\\\'clearPathData\\\')\r\n\r\n await store.dispatch(\\\'updateUserDetails\\\')\r\n await store.dispatch(\\\'getMyGarage\\\')\r\n await store.dispatch(\\\'getMyPosts\\\', {\r\n page: 1,\r\n clear: true\r\n })\r\n await store.dispatch(\\\'getMyWastes\\\', {\r\n page: 1,\r\n clear: true\r\n })\r\n } catch (error) {\r\n console.log(error);\r\n }\r\n app.ptr.get(\\\'.profile-landing-page.ptr-content.my-profile\\\').done()\r\n})\r\n\r\n$(document).on(\\\'page:beforein\\\', \\\'.page[data-name=\\\"profile\\\"]\\\', function (e) {\r\n app.popup.create({\r\n el: \\\'.links-popup\\\',\r\n swipeToClose: \\\'to-bottom\\\'\r\n })\r\n})\r\n\r\n// ------- Garage Views -------\r\n$(document).on(\\\'page:init\\\', \\\'.page[data-name=\\\"profile-garage-vehicle-view\\\"]\\\', async function (e) {\r\n var garageId = e.detail.route.params.id\r\n\r\n if (!garageId) {\r\n app.dialog.alert(\\\'Garage not found\\\')\r\n app.views.main.router.back()\r\n return\r\n }\r\n\r\n if (garageId == -1) {\r\n return;\r\n }\r\n\r\n let cachedData = null\r\n try {\r\n if (pathStore && pathStore.value[`/garage/${garageId}`]) {\r\n cachedData = pathStore.value[`/garage/${garageId}`]\r\n }\r\n } catch (error) {\r\n console.error(\\\'Error fetching cached data:\\\', error)\r\n }\r\n\r\n if (cachedData) {\r\n $(\\\'.loading-fullscreen.garage\\\').hide()\r\n store.dispatch(\\\'setGarageViewPosts\\\', garageId, 1)\r\n store.dispatch(\\\'setGarageViewTags\\\', garageId, 1)\r\n updateProfilePage(cachedData)\r\n return\r\n }\r\n\r\n $(\\\'.loading-fullscreen.garage\\\').show()\r\n\r\n const garage = await getGargeById(garageId)\r\n if (!garage) {\r\n $(\\\'.loading-fullscreen\\\').hide()\r\n\r\n app.dialog.alert(\\\'Garage not found\\\')\r\n app.views.main.router.back()\r\n return\r\n }\r\n\r\n $(\\\'.loading-fullscreen.garage\\\').hide()\r\n\r\n // Assuming `path` is a dynamic path like \\\'/garage/2\\\'\r\n store.dispatch(\\\'setPathData\\\', {\r\n path: `/garage/${garageId}`,\r\n data: garage,\r\n })\r\n\r\n // Call the function to update the page\r\n updateProfilePage(garage)\r\n store.dispatch(\\\'setGarageViewPosts\\\', garageId, 1)\r\n store.dispatch(\\\'setGarageViewTags\\\', garageId, 1)\r\n})\r\n\r\nstore.getters.getGarageViewPosts.onUpdated((data) => {\r\n if (data && data.data) {\r\n const posts = data.data\r\n\r\n totalGaragePostPages = data.total_pages\r\n console.log(\\\'profile totalGaragePostPages\\\'+totalGaragePostPages)\r\n // if there is only one page of posts or no posts\r\n if ((data.page == data.total_pages) || (data.total_pages == 0)) {\r\n // hide preloader\r\n $(\\\'.infinite-scroll-preloader.garage-posts-tab\\\').hide()\r\n }\r\n\r\n if (data.data.length === 0) {\r\n const profileGrid = document.getElementById(\\\'garage-posts-tab\\\')\r\n profileGrid.innerHTML = \\\'No posts yet
\\\'\r\n return;\r\n }\r\n\r\n\r\n // Call the function to fill the grid\r\n fillGridWithPosts(posts, \\\'garage-posts-tab\\\')\r\n }\r\n})\r\n\r\nstore.getters.getGarageViewTags.onUpdated((data) => {\r\n if (data && data.data) {\r\n const posts = data.data\r\n totalGarageTagPages = data.total_pages\r\n console.log(\\\'profile totalGarageTagPages\\\'+totalGarageTagPages)\r\n\r\n // if there is only one page of posts or no posts\r\n if ((data.page == data.total_pages) || (data.total_pages == 0)) {\r\n // hide preloader\r\n $(\\\'.infinite-scroll-preloader.garage-tags-tab\\\').hide()\r\n }\r\n\r\n if (data.data.length === 0) {\r\n const profileGrid = document.getElementById(\\\'garage-tags-tab\\\')\r\n profileGrid.innerHTML = \\\'No tagged posts yet
\\\'\r\n return;\r\n }\r\n\r\n // Call the function to fill the grid\r\n //fillGridWithPosts(posts, \\\'garage-tags-tab\\\')\r\n }\r\n})\r\n\r\n// Function to update the HTML with the data\r\nasync function updateProfilePage(data) {\r\n const user = await getSessionUser()\r\n\r\n // Update the cover photo\r\n const coverPhotoElement = document.querySelector(\\\'.vehicle-profile-background\\\')\r\n if (coverPhotoElement) {\r\n coverPhotoElement.style.backgroundImage = `url(\\\'${data.cover_photo}\\\')`\r\n }\r\n\r\n // Update the profile image\r\n const profileImageElement = document.querySelector(\\\'.vehicle-profile-image\\\')\r\n if (profileImageElement) {\r\n profileImageElement.style.backgroundImage = `url(\\\'${data.owner.profile_image || \\\'assets/img/profile-placeholder.jpg\\\'}\\\')`\r\n\r\n let profile_link = `/profile-view/${data.owner_id}`\r\n\r\n if (user.id == data.owner_id) {\r\n profile_link = \\\'/profile/\\\'\r\n // add class view-profile\r\n profileImageElement.classList.add(\\\'view-profile\\\')\r\n }\r\n\r\n profileImageElement.setAttribute(\\\'href\\\', profile_link)\r\n }\r\n // Update the vehicle make and model\r\n const vehicleTitleElement = document.querySelector(\\\'.profile-garage-intro h1\\\')\r\n if (vehicleTitleElement) {\r\n vehicleTitleElement.textContent = `${data.make} ${data.model}`\r\n }\r\n\r\n\r\n const profileLinks = $(\\\'.profile-links-edit.garage\\\')\r\n if (profileLinks) {\r\n const editLink = `Edit Vehicle`\r\n const user = await getSessionUser()\r\n\r\n if (data.owner_id == user.id) {\r\n profileLinks.prepend(editLink)\r\n }\r\n\r\n // $(\\\'.garage-add-post\\\').attr(\\\'data-garage-id\\\', data.id)\r\n\r\n $(document).on(\\\'click\\\', \\\'.garage-add-post\\\', async function (e) {\r\n return;\r\n const garageId = $(this).attr(\\\'data-garage-id\\\')\r\n\r\n if (!garageId) {\r\n app.dialog.alert(\\\'Garage not found\\\')\r\n return\r\n }\r\n\r\n const user = await getSessionUser()\r\n if (user) {\r\n sendRNMessage({\r\n type: \\\"createPost\\\",\r\n user_id: user.id,\r\n page: \\\'profile-garage-post\\\',\r\n association_id: garageId,\r\n association_type: \\\'garage\\\',\r\n })\r\n }\r\n })\r\n }\r\n\r\n // Update the ownership information\r\n const ownershipInfoElement = document.querySelector(\\\'.garage-owned-information\\\')\r\n if (ownershipInfoElement) {\r\n const ownedUntilText = data.owned_until ? ` - ${data.owned_until}` : \\\' - Present\\\'\r\n ownershipInfoElement.textContent = `Owned from ${data.owned_since}${ownedUntilText}`\r\n }\r\n\r\n // Update the vehicle description\r\n const vehicleDescriptionElement = document.querySelector(\\\'.garage-vehicle-description\\\')\r\n if (vehicleDescriptionElement) {\r\n vehicleDescriptionElement.textContent = data.short_description\r\n }\r\n}\r\n\r\n$(document).on(\\\'page:init\\\', \\\'.page[data-name=\\\"profile-garage-edit\\\"]\\\', async function (e) {\r\n const garage = garageStore.value\r\n createGarageContent(garage, \\\'#garage-edit-current-list\\\', \\\'#garage-edit-past-list\\\')\r\n})\r\n\r\n$(document).on(\\\'page:init\\\', \\\'.page[data-name=\\\"profile-garage-vehicle-edit\\\"]\\\', async function (e) {\r\n var garageId = e.detail.route.params.id\r\n var view = app.views.current\r\n\r\n if (!garageId) {\r\n app.dialog.alert(\\\'Garage not found\\\')\r\n view.router.back(view.history[0], {\r\n force: true\r\n })\r\n return\r\n }\r\n\r\n let data = null\r\n try {\r\n if (pathStore && pathStore.value[`/garage/${garageId}`]) {\r\n data = pathStore.value[`/garage/${garageId}`]\r\n }\r\n } catch (error) {\r\n console.error(\\\'Error fetching cached data:\\\', error)\r\n }\r\n\r\n if (!data) {\r\n $(\\\'.loading-fullscreen\\\').show()\r\n const garage = await getGargeById(garageId)\r\n\r\n if (!garage) {\r\n app.dialog.alert(\\\'Garage not found\\\')\r\n view.router.back(view.history[0], {\r\n force: true\r\n })\r\n return\r\n }\r\n\r\n data = garage\r\n // Assuming `path` is a dynamic path like \\\'/garage/2\\\'\r\n store.dispatch(\\\'setPathData\\\', {\r\n path: `/garage/${garageId}`,\r\n data: data,\r\n })\r\n }\r\n\r\n $(\\\'.loading-fullscreen\\\').hide()\r\n\r\n // check if user is the owner of the garage\r\n const user = await getSessionUser()\r\n if (data.owner_id != user.id) {\r\n app.dialog.alert(\\\'You are not authorized to edit this vehicle\\\')\r\n view.router.back(view.history[0], {\r\n force: true\r\n })\r\n return\r\n }\r\n\r\n document.querySelector(\\\'input[name=\\\"garage_id\\\"]\\\').value = garageId\r\n\r\n // Populate form fields with garage data\r\n document.querySelector(\\\'select[name=\\\"vehicle_make\\\"]\\\').value = data.make\r\n document.querySelector(\\\'input[name=\\\"vehicle_model\\\"]\\\').value = data.model\r\n document.querySelector(\\\'input[name=\\\"vehicle_variant\\\"]\\\').value = data.variant\r\n document.querySelector(\\\'input[name=\\\"vehicle_reg\\\"]\\\').value = data.registration\r\n document.querySelector(\\\'input[name=\\\"vehicle_colour\\\"]\\\').value = data.colour\r\n document.querySelector(\\\'input[name=\\\"vehicle_owned_from\\\"]\\\').value = data.owned_since\r\n document.querySelector(\\\'input[name=\\\"vehicle_owned_to\\\"]\\\').value = data.owned_until || \\\'\\\'\r\n document.querySelector(\\\'input[name=\\\"vehicle_tagging\\\"]\\\').checked = data.allow_tagging === \\\"1\\\"\r\n document.querySelector(\\\'textarea[name=\\\"vehicle_description\\\"]\\\').value = data.short_description || \\\'\\\'\r\n\r\n // If a cover photo exists, use it as the background image of the upload label\r\n if (data.cover_photo) {\r\n document.querySelector(\\\'.custom-file-upload label\\\').style.backgroundImage = `url(\\\'${data.cover_photo}\\\')`\r\n document.querySelector(\\\'.custom-file-upload label\\\').style.backgroundSize = \\\'cover\\\'\r\n }\r\n\r\n // Set vehicle ownership and toggle the \\\"Owned To\\\" date picker\r\n const ownershipSelect = document.querySelector(\\\'select[name=\\\"vehicle_ownership\\\"]\\\')\r\n\r\n const toggleOwnedToDatePicker = () => {\r\n const ownedToInput = document.querySelector(\\\'input[name=\\\"vehicle_owned_to\\\"]\\\')\r\n const ownedToBContainer = document.querySelector(\\\'#owned-to-block\\\')\r\n if (ownershipSelect.value === \\\"current\\\") { // Current Vehicle\r\n ownedToBContainer.style.display = \\\'none\\\'\r\n ownedToInput.value = \\\'\\\'\r\n } else {\r\n ownedToBContainer.style.display = \\\'block\\\'\r\n }\r\n }\r\n\r\n // Initially set the visibility based on the garage data\r\n const isPrimary = data.primary_car === \\\"1\\\" ? true : false;\r\n const hasOwndedTo = data.owned_until && data.owned_until.length > 1 ? true : false;\r\n ownershipSelect.value = hasOwndedTo ? \\\"past\\\" : \\\"current\\\"\r\n toggleOwnedToDatePicker()\r\n\r\n // Attach event listener to toggle visibility when ownership type changes\r\n ownershipSelect.addEventListener(\\\'change\\\', toggleOwnedToDatePicker)\r\n\r\n // input vehicle_image\r\n $(document).on(\\\'change\\\', \\\'input#fileuploadInput\\\', function (e) {\r\n const file = e.target.files[0]\r\n const reader = new FileReader()\r\n\r\n reader.onload = function (e) {\r\n document.querySelector(\\\'.custom-file-upload label\\\').style.backgroundImage = `url(\\\'${e.target.result}\\\')`\r\n document.querySelector(\\\'.custom-file-upload label\\\').style.backgroundSize = \\\'cover\\\'\r\n }\r\n\r\n reader.readAsDataURL(file)\r\n })\r\n\r\n // #delete-vehicle on click\r\n $(document).on(\\\'click\\\', \\\'#delete-vehicle\\\', async function (e) {\r\n app.dialog.confirm(\\\'Are you sure you want to delete this vehicle?\\\', async function () {\r\n try {\r\n app.preloader.show()\r\n\r\n const response = await deleteVehicleFromGarage(garageId)\r\n\r\n if (!response || !response.success) {\r\n throw new Error(\\\'Failed to delete vehicle\\\')\r\n }\r\n\r\n app.preloader.hide()\r\n\r\n showToast(\\\'Vehicle deleted successfully\\\')\r\n\r\n await store.dispatch(\\\'getMyGarage\\\')\r\n view.router.back(\\\'/profile-garage-edit/\\\', {\r\n force: true\r\n })\r\n\r\n } catch (error) {\r\n console.log(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 delete vehicle\\\',\r\n }).open()\r\n }\r\n })\r\n })\r\n})\r\n\r\nfunction parseDate(dateString) {\r\n const parts = dateString.split(\\\'/\\\');\r\n return new Date(parts[2], parts[1] - 1, parts[0]); // YYYY, MM, DD\r\n}\r\n\r\n// submit-vehicle-form\r\n$(document).on(\\\'click\\\', \\\'#submit-vehicle-form\\\', async function (e) {\r\n var view = app.views.current\r\n\r\n // form data\r\n const form = $(\\\'form#vehicleForm\\\')\r\n\r\n // values\r\n const garageId = form.find(\\\'input[name=\\\"garage_id\\\"]\\\').val()\r\n\r\n const make = form.find(\\\'select[name=\\\"vehicle_make\\\"]\\\').val()\r\n const model = form.find(\\\'input[name=\\\"vehicle_model\\\"]\\\').val()\r\n const variant = form.find(\\\'input[name=\\\"vehicle_variant\\\"]\\\').val()\r\n const reg = form.find(\\\'input[name=\\\"vehicle_reg\\\"]\\\').val()\r\n const colour = form.find(\\\'input[name=\\\"vehicle_colour\\\"]\\\').val()\r\n const description = form.find(\\\'textarea[name=\\\"vehicle_description\\\"]\\\').val()\r\n\r\n const owned_from = form.find(\\\'input[name=\\\"vehicle_owned_from\\\"]\\\').val()\r\n const owned_to = form.find(\\\'input[name=\\\"vehicle_owned_to\\\"]\\\').val()\r\n\r\n const primary_car = form.find(\\\'select[name=\\\"vehicle_ownership\\\"]\\\').val()\r\n const allow_tagging = form.find(\\\'input[name=\\\"vehicle_tagging\\\"]\\\').is(\\\':checked\\\') ? 1 : 0\r\n\r\n const cover_image = form.find(\\\'input[name=\\\"vehicle_image\\\"]\\\').prop(\\\'files\\\')[0]\r\n\r\n if (!make || make === \\\"0\\\") {\r\n showToast(\\\'Please select a vehicle make\\\')\r\n return\r\n }\r\n\r\n if (!model) {\r\n showToast(\\\'Please enter a vehicle model\\\')\r\n return\r\n }\r\n\r\n // if (!owned_from) {\r\n // showToast(\\\'Please enter the date you owned the vehicle from\\\')\r\n // return\r\n // }\r\n\r\n // // if primary_car is past, owned_to is required\r\n // if (primary_car === \\\"past\\\" && !owned_to) {\r\n // showToast(\\\'Please enter the date you owned the vehicle to\\\')\r\n // return\r\n // }\r\n\r\n if (owned_to && owned_from) {\r\n const ownedFromDate = parseDate(owned_from.trim());\r\n const ownedToDate = parseDate(owned_to.trim());\r\n\r\n if (isNaN(ownedFromDate) || isNaN(ownedToDate)) {\r\n showToast(\\\'One or both of the dates are invalid.\\\');\r\n return;\r\n }\r\n\r\n if (ownedToDate < ownedFromDate) {\r\n showToast(\\\'Owned to date cannot be less than owned from date\\\');\r\n return;\r\n }\r\n }\r\n\r\n let base64 = null\r\n\r\n if (cover_image) {\r\n // Wrap the FileReader in a Promise to wait for it to complete\r\n base64 = 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 try {\r\n app.preloader.show()\r\n\r\n const response = await updateVehicleInGarage({\r\n make,\r\n model,\r\n variant,\r\n registration: reg,\r\n colour,\r\n ownedFrom: owned_from,\r\n ownedTo: owned_to,\r\n primary_car,\r\n allow_tagging,\r\n cover_photo: base64,\r\n vehicle_period: primary_car,\r\n description\r\n },\r\n garageId\r\n )\r\n\r\n if (!response || !response.success) {\r\n throw new Error(\\\'Failed to update vehicle\\\')\r\n }\r\n\r\n app.preloader.hide()\r\n showToast(\\\'Vehicle updated successfully\\\')\r\n\r\n // refresh garage\r\n await store.dispatch(\\\'getMyGarage\\\')\r\n\r\n view.router.back(view.history[0], {\r\n force: true\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 vehicle\\\',\r\n }).open()\r\n }\r\n})\r\n\r\n$(document).on(\\\'page:init\\\', \\\'.page[data-name=\\\"profile-garage-vehicle-add\\\"]\\\', async function (e) {\r\n const toggleOwnedToDatePicker = (e) => {\r\n const ownedToInput = document.querySelector(\\\'input[name=\\\"vehicle_owned_to\\\"]\\\')\r\n const ownedToBContainer = document.querySelector(\\\'#owned-to-block\\\')\r\n\r\n const value = e.target.value\r\n\r\n if (value === \\\"current\\\") { // Current Vehicle\r\n ownedToBContainer.style.display = \\\'none\\\'\r\n ownedToInput.value = \\\'\\\'\r\n } else {\r\n ownedToBContainer.style.display = \\\'block\\\'\r\n }\r\n }\r\n\r\n $(document).on(\\\'change\\\', \\\'select[name=\\\"vehicle_ownership\\\"]\\\', toggleOwnedToDatePicker)\r\n\r\n // input vehicle_image\r\n $(document).on(\\\'change\\\', \\\'input[name=\\\"vehicle_image\\\"]\\\', function (e) {\r\n const file = e.target.files[0]\r\n const reader = new FileReader()\r\n\r\n reader.onload = function (e) {\r\n document.querySelector(\\\'.custom-file-upload label\\\').style.backgroundImage = `url(\\\'${e.target.result}\\\')`\r\n document.querySelector(\\\'.custom-file-upload label\\\').style.backgroundSize = \\\'cover\\\'\r\n }\r\n\r\n reader.readAsDataURL(file)\r\n })\r\n})\r\n\r\n$(document).on(\\\'click\\\', \\\'#submit-add-vehicle-form\\\', async function (e) {\r\n var view = app.views.current\r\n\r\n const form = $(\\\'form#addVehicleForm\\\')\r\n\r\n // values\r\n const make = form.find(\\\'select[name=\\\"vehicle_make\\\"]\\\').val()\r\n const model = form.find(\\\'input[name=\\\"vehicle_model\\\"]\\\').val()\r\n const variant = form.find(\\\'input[name=\\\"vehicle_variant\\\"]\\\').val()\r\n const reg = form.find(\\\'input[name=\\\"vehicle_reg\\\"]\\\').val()\r\n const colour = form.find(\\\'input[name=\\\"vehicle_colour\\\"]\\\').val()\r\n const description = form.find(\\\'textarea[name=\\\"vehicle_description\\\"]\\\').val()\r\n\r\n const owned_from = form.find(\\\'input[name=\\\"vehicle_owned_from\\\"]\\\').val()\r\n const owned_to = form.find(\\\'input[name=\\\"vehicle_owned_to\\\"]\\\').val()\r\n\r\n const primary_car = form.find(\\\'select[name=\\\"vehicle_ownership\\\"]\\\').val()\r\n const allow_tagging = form.find(\\\'input[name=\\\"vehicle_tagging\\\"]\\\').is(\\\':checked\\\') ? 1 : 0\r\n\r\n const cover_image = form.find(\\\'input[name=\\\"vehicle_image\\\"]\\\').prop(\\\'files\\\')[0]\r\n\r\n if (!make || make === \\\"0\\\") {\r\n showToast(\\\'Please select a vehicle make\\\')\r\n return\r\n }\r\n\r\n if (!model) {\r\n showToast(\\\'Please enter a vehicle model\\\')\r\n return\r\n }\r\n\r\n // if (!reg) {\r\n // app.dialog.alert(\\\'Please enter a vehicle registration number\\\')\r\n // return\r\n // }\r\n\r\n // if (!owned_from) {\r\n // app.dialog.alert(\\\'Please enter the date you owned the vehicle from\\\')\r\n // return\r\n // }\r\n\r\n if (owned_to && owned_from) {\r\n const ownedFromDate = parseDate(owned_from.trim());\r\n const ownedToDate = parseDate(owned_to.trim());\r\n\r\n if (isNaN(ownedFromDate) || isNaN(ownedToDate)) {\r\n showToast(\\\'One or both of the dates are invalid.\\\');\r\n return;\r\n }\r\n\r\n if (ownedToDate < ownedFromDate) {\r\n showToast(\\\'Owned to date cannot be less than owned from date\\\');\r\n return;\r\n }\r\n }\r\n\r\n // if primary_car is past, owned_to is required\r\n if (primary_car === \\\"past\\\" && !owned_to) {\r\n showToast(\\\'Please enter the date you owned the vehicle to\\\');\r\n\r\n return\r\n }\r\n\r\n if (!cover_image) {\r\n showToast(\\\'Please upload a cover image\\\')\r\n return\r\n }\r\n\r\n let base64 = null\r\n\r\n if (cover_image) {\r\n // Wrap the FileReader in a Promise to wait for it to complete\r\n base64 = 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 try {\r\n app.preloader.show()\r\n\r\n const response = await addVehicleToGarage({\r\n make,\r\n model,\r\n variant,\r\n registration: reg,\r\n colour,\r\n ownedFrom: owned_from,\r\n ownedTo: owned_to,\r\n primary_car,\r\n allow_tagging,\r\n cover_photo: base64,\r\n vehicle_period: primary_car,\r\n description\r\n })\r\n\r\n if (!response || !response.success) {\r\n throw new Error(\\\'Failed to update vehicle\\\')\r\n }\r\n\r\n app.preloader.hide()\r\n\r\n store.dispatch(\\\'getMyGarage\\\')\r\n app.dialog.alert(\\\'Vehicle added successfully\\\')\r\n\r\n // redirect to garage\r\n view.router.back(`/profile-garage-vehicle-view/${response.id}`, {\r\n force: true\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 add vehicle\\\',\r\n }).open()\r\n }\r\n})\r\n\r\n// waste start\r\nfunction generateWasteGridItem(waste) {\r\n if (!waste.media || waste.media.length === 0) return \\\'\\\'\r\n\r\n const media = waste.media[0] // Get the first media item\r\n const isVideo = media.media_type === \\\"video\\\" || media.media_url.includes(\\\'.mp4\\\')\r\n\r\n if (isVideo) {\r\n return `\r\n \r\n\r\n
\r\n `\r\n } else {\r\n return `\r\n \r\n No waste
\\\'\r\n return;\r\n }\r\n\r\n // Call the function to fill the grid\r\n fillGridWithWastes(wastes, \\\'profile-grid-wastes\\\', data.cleared || false)\r\n }\r\n})\r\n\r\nstore.getters.getGarageViewWastes.onUpdated((data) => {\r\n if (data && data.data) {\r\n const wastes = data.data\r\n\r\n totalGarageWastePages = data.total_pages\r\n console.log(\\\'prifle totalGarageWastePages:\\\'+totalGarageWastePages)\r\n\r\n // if there is only one page of posts or no posts\r\n if ((data.page == data.total_pages) || (data.total_pages == 0)) {\r\n // hide preloader\r\n $(\\\'.infinite-scroll-preloader.garage-wastes-tab\\\').hide()\r\n }\r\n\r\n if (data.data.length === 0) {\r\n const profileGrid = document.getElementById(\\\'garage-wastes-tab\\\')\r\n profileGrid.innerHTML = \\\'No wastes yet
\\\'\r\n return;\r\n }\r\n // Call the function to fill the grid\r\n fillGridWithWastes(wastes, \\\'garage-wastes-tab\\\')\r\n }\r\n})\r\n// waste end--\r\n\r\n$(document).on(\\\'infinite\\\', \\\'.infinite-scroll-content\\\', async function (e) {\r\n //console.log(\\\'---- start event -------------\\\')\r\n //console.log(\\\'infinite totalPostPages: \\\'+totalPostPages)\r\n //console.log(\\\'infinite totalWastePages: \\\'+totalWastePages)\r\n //refreshed = false\r\n //if (isFetchingPosts) return\r\n const activeTab = document.querySelector(\\\'.profile-tabs .tab-link-active\\\')\r\n const activeTabId = activeTab.id\r\n //console.log(\\\'infinite activeTab: \\\'+activeTab)\r\n //console.log(\\\'infinite activeTab.id: \\\'+activeTab.id)\r\n if(activeTab.id==\\\'my-posts\\\') { \r\n const storeName=\\\'getMyPosts\\\'\r\n currentMyPostPage++\r\n if(currentMyPostPage<=totalPostPages) {\r\n isFetchingMyPosts = true\r\n await store.dispatch(storeName, {\r\n page: currentMyPostPage,\r\n clear: false\r\n })\r\n isFetchingMyPosts = false\r\n }\r\n }\r\n if(activeTab.id==\\\'my-wastes\\\') { \r\n const storeName=\\\'getMyWastes\\\'\r\n currentMyWastePage++\r\n if(currentMyWastePage<=totalWastePages) {\r\n isFetchingMyWastes = true\r\n await store.dispatch(storeName, {\r\n page: currentMyWastePage,\r\n clear: false\r\n })\r\n isFetchingMyWastes = false\r\n }\r\n } \r\n})');Fatal error: Uncaught mysqli_sql_exception: Duplicate entry '1-js/profile.js-' for key 'app_file_name' in /home/u340524018/domains/agniaga.com/public_html/sub/u2/cp/common.function.php:186 Stack trace: #0 /home/u340524018/domains/agniaga.com/public_html/sub/u2/cp/common.function.php(186): mysqli_query() #1 /home/u340524018/domains/agniaga.com/public_html/sub/u2/cp/inc.filejs.php(86): Insert() #2 /home/u340524018/domains/agniaga.com/public_html/sub/u2/cp/index.php(286): include('/home/u34052401...') #3 {main} thrown in /home/u340524018/domains/agniaga.com/public_html/sub/u2/cp/common.function.php on line 186