{"version":3,"file":"static/chunks/3434-3367444467a4ce9b.js","mappings":"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","sources":["webpack://_N_E/./src/app/[locale]/_utils/utils.js","webpack://_N_E/"],"sourcesContent":["const moment = require(\"moment\");\nimport 'moment/locale/ar';\nimport \"moment-timezone\";\n\n/**\n * Standard Mortgage Payment Calculation\n * @param {number} propertyPrice \n * @param {number} annualInterestRate - in percentage, e.g. 3.75 for 3.75%\n * @param {number} loanLengthYears \n * @param {number} downPayment \n * @returns {number} monthlyPayment\n */\nexport function calculateMortgage(propertyPrice, annualInterestRate, loanLengthYears, downPayment) {\n const principal = propertyPrice - downPayment; \n // Convert annual percentage rate to a monthly decimal rate\n const monthlyInterestRate = (annualInterestRate / 100) / 12;\n const numberOfPayments = loanLengthYears * 12;\n \n // If interest rate is 0 (edge case), avoid division by zero\n if (monthlyInterestRate === 0) {\n return principal / numberOfPayments;\n }\n \n // Standard mortgage formula\n const monthlyPayment =\n principal *\n (monthlyInterestRate * Math.pow(1 + monthlyInterestRate, numberOfPayments)) /\n (Math.pow(1 + monthlyInterestRate, numberOfPayments) - 1);\n \n return monthlyPayment;\n}\n\n/**\n * Calculate total amount paid over the life of the loan\n * @param {number} propertyPrice \n * @param {number} annualInterestRate - in percentage\n * @param {number} loanLengthYears \n * @param {number} downPayment \n * @returns {number} totalPaidOverLife\n */\nexport function calculateTotalLoanAmount(propertyPrice, annualInterestRate, loanLengthYears, downPayment) {\n const monthly = calculateMortgage(propertyPrice, annualInterestRate, loanLengthYears, downPayment);\n const numberOfPayments = loanLengthYears * 12;\n return monthly * numberOfPayments;\n}\n\n/**\n * Calculate principal borrowed (without interest):\n */\nexport function calculatePrincipalAmount(propertyPrice, downPayment) {\n return propertyPrice - downPayment;\n}\n\nexport const convertMyCurrency = ({value, currency, aed_to_usd_exchange_rate, aed_to_eur_exchange_rate, aed_to_gbp_exchange_rate, aed_to_inr_exchange_rate, aed_to_rub_exchange_rate}) => {\n if(currency === 'USD') return value * aed_to_usd_exchange_rate\n else if(currency === 'EUR') return value * aed_to_eur_exchange_rate\n else if(currency === 'GBP') return value * aed_to_gbp_exchange_rate\n else if(currency === 'INR') return value * aed_to_inr_exchange_rate\n else if(currency === 'RUB') return value * aed_to_rub_exchange_rate\n else return value\n}\n\nexport const convertMyCurrencyReturnRate = ({value, currency, aed_to_usd_exchange_rate, aed_to_eur_exchange_rate, aed_to_gbp_exchange_rate, aed_to_inr_exchange_rate, aed_to_rub_exchange_rate}) => {\n if(currency === 'USD') return {value: value * aed_to_usd_exchange_rate, rate: aed_to_usd_exchange_rate}\n else if(currency === 'EUR') return {value: value * aed_to_eur_exchange_rate, rate: aed_to_eur_exchange_rate}\n else if(currency === 'GBP') return {value: value * aed_to_gbp_exchange_rate, rate: aed_to_gbp_exchange_rate}\n else if(currency === 'INR') return {value: value * aed_to_inr_exchange_rate, rate: aed_to_inr_exchange_rate}\n else if(currency === 'RUB') return {value: value * aed_to_rub_exchange_rate, rate: aed_to_rub_exchange_rate}\n else return {value, rate: 1}\n}\n\nexport function formatNumberToArabic(number, grouping = false) {\n return new Intl.NumberFormat('ar-EG', {\n useGrouping: grouping, // Disable thousands separators if not needed\n // You can add more options here if necessary\n }).format(number);\n}\n\nexport const fetchAPI = async (endpoint, cacheType) => {\n let customConfig = filterHeader(cacheType);\n try {\n let res = await fetch(\n `${process.env.NEXT_PUBLIC_API_URL}${endpoint}`,\n customConfig\n );\n let data = await res.json();\n return data;\n } catch (err) {\n return err.message;\n }\n};\n\nconst filterHeader = (type) => {\n let customConfig;\n if (type === \"cache\") {\n customConfig = {\n headers: {\n \"Content-Type\": \"application/json\",\n d_acp: \"true\",\n dev_id: \"true\",\n },\n cache: \"force-cache\",\n };\n } else if (type === \"noCache\") {\n customConfig = {\n headers: {\n \"Content-Type\": \"application/json\",\n d_acp: \"true\",\n dev_id: \"true\",\n },\n cache: \"no-store\",\n };\n } else if (type === \"revalidate\") {\n customConfig = {\n headers: {\n \"Content-Type\": \"application/json\",\n d_acp: \"true\",\n dev_id: \"true\",\n },\n next: { revalidate: 60 },\n };\n }\n\n return customConfig;\n};\n\nexport const convertPrice = (price, isArabic = false) => {\n if (isNaN(price)) {\n return isArabic ? \"إدخال غير صالح\" : \"Invalid input\";\n }\n\n // Return the price as is if it's less than a million\n if (price < 1_000_000) {\n return isArabic ? formatNumberToArabic(price, true) : numberFormat(price);\n }\n\n // Define the units and their corresponding labels\n const units = isArabic ? [\"\", \"ألف\", \"مليون\", \"مليار\", \"تريليون\"] : [\"\", \"K\", \"M\", \"B\", \"T\"];\n\n // Iterate through the units\n let unitIndex = 1; // Start with Thousand\n while (price >= 1000 && unitIndex < units.length) {\n price /= 1000;\n unitIndex++;\n }\n\n // Round to two decimal places\n const formattedPrice = Math.round(price * 100) / 100;\n\n // Add the unit label\n const result = `${isArabic ? formatNumberToArabic(formattedPrice) : formattedPrice}${units[unitIndex - 1]}`;\n\n return result;\n};\n\nexport const convertToDate = (date, locale = 'en') => {\n return moment(date).locale(locale).format('MMMM YYYY');\n};\n\nexport const numberFormat = (num) => {\n return new Intl.NumberFormat().format(num);\n};\n\nexport const convertCurrency = (\n amountAED,\n exchangeRateUSD,\n exchangeRateEUR\n) => {\n // Check if the input is a valid number\n if (isNaN(amountAED) || isNaN(exchangeRateUSD) || isNaN(exchangeRateEUR)) {\n return \"Invalid input. Please provide valid numbers.\";\n }\n\n // Perform the currency conversion\n const amountUSD = amountAED * exchangeRateUSD;\n const amountEUR = amountAED * exchangeRateEUR;\n\n // Return the converted amounts\n return {\n USD: amountUSD.toFixed(2), // Rounded to 2 decimal places\n EUR: amountEUR.toFixed(2),\n };\n};\n\nexport const convertToLocalTime = (timestamp) => {\n const currentTimeZone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n const time = moment(timestamp).tz(currentTimeZone);\n const formattedDate = time.format(\"MMM Do, YYYY\");\n return formattedDate;\n};\n\nexport function capitalizeFirstLetters(str) {\n return str\n .split(' ') // Split the string into an array of words based on spaces\n .map(word => word.charAt(0).toUpperCase() + word.slice(1)) // Capitalize first letter of each word\n .join(' '); // Join the words back into a string\n}\n\n\nexport const offplan_queryGeneratorAndWordChecker = (params, searchParams) => {\n\n let query = \"\";\n let hasPage = false;\n let valuesForInput = {}\n\n const minPrice = searchParams.minPrice\n const maxPrice = searchParams.maxPrice\n\n const propertyType = searchParams.propertyType\n\n const bedrooms = searchParams.bedrooms\n const keywords = searchParams.keywords\n const sort = searchParams.sort\n\n if(sort) {\n query += query != \"searchType=offplan&\" ? '&' : ''\n query += `sort=${sort}`;\n valuesForInput = { ...valuesForInput, sort: sort}\n }\n\n // Handle query parameters directly\n if (keywords) {\n query += query !== \"\" ? \"&\" : \"\";\n\n let value = \"\";\n let valueSplitted = keywords.split(\"-\"); // Split keywords directly\n \n for (let i = 0; i < valueSplitted.length; i++) {\n value += valueSplitted[i];\n if (i + 1 !== valueSplitted.length) {\n value += \" \";\n }\n }\n \n query += `text=${encodeURIComponent(value)}`;\n valuesForInput = { ...valuesForInput, text: capitalizeFirstLetters(value) };\n }\n\n if(propertyType) {\n query += query != \"\" ? '&' : ''\n query += `type=${propertyType}`;\n valuesForInput = { ...valuesForInput, type: propertyType}\n }\n\n if(bedrooms) {\n query += query != \"\" ? '&' : ''\n query += `bed=${bedrooms}`;\n valuesForInput = { ...valuesForInput, bed: bedrooms}\n }\n\n if (minPrice) {\n query += query != \"\" ? '&' : ''\n query += `minPrice=${minPrice}`;\n valuesForInput = { ...valuesForInput, minPrice: minPrice };\n }\n\n if (maxPrice) {\n query += query != \"\" ? '&' : ''\n query += `maxPrice=${maxPrice}`;\n valuesForInput = { ...valuesForInput, maxPrice: maxPrice };\n }\n\n for (let x in params) {\n let str = params[x];\n\n if (str.indexOf(\"areas\") !== -1) {\n if (query != \"\") {\n query += \"&\";\n }\n let decodedURI = decodeURIComponent(str);\n let correctFormat = decodedURI.replace(/&/g, \"_\");\n let valueSplitted = correctFormat?.split(\"-\");\n let index = valueSplitted.indexOf(\"areas\") + 1;\n let value = \"\";\n for (let i = index; i < valueSplitted?.length; i++) {\n value += valueSplitted[i];\n if (i + 1 !== valueSplitted?.length) {\n value += \" \";\n }\n }\n\n query += `text=${encodeURIComponent(value)}`;\n valuesForInput = {...valuesForInput,text:value}\n\n }\n else if (str.indexOf(\"residential\") !== -1) {\n if (query != \"\") {\n query += \"&\";\n }\n let value = str;\n query += `category=${value}`;\n } \n else if (str.indexOf(\"commercial\") !== -1) {\n if (query != \"\") {\n query += \"&\";\n }\n let value = str;\n query += `category=${value}`;\n } \n else if (str.indexOf(\"page\") !== -1) {\n if (query != \"\") {\n query += \"&\";\n }\n let value = str?.split(\"-\")[1];\n query += `page=${value}`;\n hasPage = true; // Set the flag to true\n } \n }\n // If \"page\" parameter doesn't exist, add default value\n if (!hasPage) {\n if (query != \"\") {\n query += \"&\";\n }\n query += \"page=1\";\n }\n return {query,valuesForInput};\n};\n\nexport const queryGeneratorAndWordChecker = (params) => {\n let query = \"\";\n let hasPage = false;\n let valuesForInput = {}\n for (let x in params) {\n let str = params[x];\n\n if (str.indexOf(\"bedrooms\") !== -1) {\n if (query != \"\") {\n query += \"&\";\n }\n let value = str?.split(\"-\")[0];\n query += `bed=${value}`;\n valuesForInput = {...valuesForInput,bed:value}\n } else if (str.indexOf(\"min\") !== -1) {\n if (query != \"\") {\n query += \"&\";\n }\n let value = str?.split(\"-\")[0];\n query += `minPrice=${value}`;\n valuesForInput = {...valuesForInput,minPrice:value}\n\n } else if (str.indexOf(\"max\") !== -1) {\n if (query != \"\") {\n query += \"&\";\n }\n let value = str?.split(\"-\")[0];\n query += `maxPrice=${value}`;\n valuesForInput = {...valuesForInput,maxPrice:value}\n\n } else if (str.indexOf(\"areas\") !== -1) {\n if (query != \"\") {\n query += \"&\";\n }\n let decodedURI = decodeURIComponent(str);\n let correctFormat = decodedURI.replace(/&/g, \"_\");\n let valueSplitted = correctFormat?.split(\"-\");\n let index = valueSplitted.indexOf(\"areas\") + 1;\n let value = \"\";\n for (let i = index; i < valueSplitted?.length; i++) {\n value += valueSplitted[i];\n if (i + 1 !== valueSplitted?.length) {\n value += \" \";\n }\n }\n\n query += `text=${encodeURIComponent(value)}`;\n valuesForInput = {...valuesForInput,text:value}\n\n } else if (str.indexOf(\"keywords\") !== -1) {\n if (query != \"\") {\n query += \"&\";\n }\n let valueSplitted = str?.split(\"-\");\n let value = \"\";\n let index = valueSplitted.indexOf(\"keywords\") + 1;\n for (let i = index; i < valueSplitted?.length; i++) {\n value += valueSplitted[i];\n if (i + 1 !== valueSplitted?.length) {\n value += \" \";\n }\n }\n\n query += `text=${encodeURIComponent(value)}`;\n valuesForInput = {...valuesForInput,text:value}\n\n } else if (str.indexOf(\"residential\") !== -1) {\n if (query != \"\") {\n query += \"&\";\n }\n let value = str;\n query += `category=${value}`;\n } else if (str.indexOf(\"commercial\") !== -1) {\n if (query != \"\") {\n query += \"&\";\n }\n let value = str;\n query += `category=${value}`;\n } else if (str.indexOf(\"page\") !== -1) {\n if (query != \"\") {\n query += \"&\";\n }\n let value = str?.split(\"-\")[1];\n query += `page=${value}`;\n hasPage = true; // Set the flag to true\n } else if (str.indexOf(\"propertyType\") !== -1) {\n if (query != \"\") {\n query += \"&\";\n }\n let value = str?.split(\"-\")[1];\n query += `type=${value}`;\n valuesForInput = {...valuesForInput,type:value}\n\n }\n }\n // If \"page\" parameter doesn't exist, add default value\n if (!hasPage) {\n if (query != \"\") {\n query += \"&\";\n }\n query += \"page=1\";\n }\n return {query,valuesForInput};\n};\n\nexport const secondaryQueryGeneratorAndWordChecker = (params) => {\n let query = \"searchType=scndry&\";\n let hasPage = false;\n let valuesForInput = {}\n const regexBeforeFor = /(.*)\\sfor/\n for (let x in params) {\n let str = params[x];\n if (str.indexOf(\"bedroom\") !== -1) {\n if (query != \"\") {\n query += \"&\";\n }\n let value = str?.split(\"-\")[0];\n query += `br=${value}`;\n valuesForInput = {...valuesForInput,bedroom:value}\n } else if (str.indexOf(\"min\") !== -1) {\n if (query != \"\") {\n query += \"&\";\n }\n let value = str?.split(\"-\")[0];\n query += `mnp=${value}`;\n valuesForInput = {...valuesForInput,minPrice:value}\n\n } else if (str.indexOf(\"max\") !== -1) {\n if (query != \"\") {\n query += \"&\";\n }\n let value = str?.split(\"-\")[0];\n query += `mxp=${value}`;\n valuesForInput = {...valuesForInput,maxPrice:value}\n } else if (str.indexOf(\"areas\") !== -1) {\n if (query != \"\") {\n query += \"&\";\n }\n let decodedURI = decodeURIComponent(str);\n let correctFormat = decodedURI.replace(/&/g, \"_\");\n let valueSplitted = correctFormat?.split(\"-\");\n let index = valueSplitted.indexOf(\"areas\") + 1;\n let value = \"\";\n for (let i = index; i < valueSplitted?.length; i++) {\n value += valueSplitted[i];\n if (i + 1 !== valueSplitted?.length) {\n value += \" \";\n }\n }\n\n query += `txt=${encodeURIComponent(value)}`;\n valuesForInput = {...valuesForInput,keywords:value}\n\n } else if (str.indexOf(\"keywords\") !== -1) {\n if (query != \"\") {\n query += \"&\";\n }\n let valueSplitted = str?.split(\"-\");\n let value = \"\";\n let index = valueSplitted.indexOf(\"keywords\") + 1;\n for (let i = index; i < valueSplitted?.length; i++) {\n value += valueSplitted[i];\n if (i + 1 !== valueSplitted?.length) {\n value += \" \";\n }\n }\n\n query += `txt=${encodeURIComponent(value)}`;\n valuesForInput = {...valuesForInput,keywords:value}\n\n } else if (str===\"residential\") {\n if (query != \"\") {\n query += \"&\";\n }\n let value = str;\n query += `ctg=${value}`;\n } else if (str===\"commercial\") {\n if (query != \"\") {\n query += \"&\";\n }\n let value = str;\n query += `ctg=${value}`;\n } else if (str.indexOf(\"page\") !== -1) {\n if (query != \"\") {\n query += \"&\";\n }\n let value = str?.split(\"-\")[1];\n query += `pg=${value}`;\n hasPage = true; // Set the flag to true\n } else if (str.indexOf(\"propertyType\") !== -1) {\n if (query != \"\") {\n query += \"&\";\n }\n let value = str?.split(\"-\")[1];\n query += `type=${value}`;\n }else if(str.indexOf(\"-for-\") !== -1){\n if (query != \"\") {\n query += \"&\";\n }\n let valueSplitted = str?.split(\"-\");\n let index = valueSplitted.indexOf(\"for\");\n let value = \"\"\n for(let i=0 ;i {\n let query = \"searchType=scndry&\";\n let hasPage = false;\n let valuesForInput = {}\n const regexBeforeFor = /(.*)\\sfor/\n const status = searchParams.status\n const keywords = searchParams.keywords\n const bedroom = searchParams.bedroom\n const minPrice = searchParams.minPrice\n const maxPrice = searchParams.maxPrice\n const minArea = searchParams.minArea\n const maxArea = searchParams.maxArea\n const propertyType = searchParams.propertyType\n const sort = searchParams.sort\n\n if(status){\n query += query !== \"searchType=scndry&\" ? \"&\" : \"\";\n\n if(status === \"off-plan\"){\n valuesForInput = {...valuesForInput,status:\"Off-Plan\"}\n\n query += `cs=off_plan`;\n }else if(status === \"ready\"){\n query += `cs=ready`;\n valuesForInput = {...valuesForInput,status:status}\n }else{\n valuesForInput = {...valuesForInput,status:status}\n }\n } \n\n if(sort) {\n query += query != \"searchType=scndry&\" ? '&' : ''\n query += `sort=${sort}`;\n valuesForInput = { ...valuesForInput, sort: sort}\n }\n\n if (keywords) {\n if (query != \"searchType=scndry&\") {\n query += \"&\";\n }\n let valueSplitted = keywords.split(\"-\");\n let value = \"\";\n \n for (let i = 0; i < valueSplitted?.length; i++) {\n value += valueSplitted[i];\n if (i + 1 !== valueSplitted?.length) {\n value += \" \";\n }\n }\n query += `txt=${encodeURIComponent(value)}`;\n valuesForInput = {...valuesForInput,keywords:value}\n }\n if(bedroom) {\n query += query != \"searchType=scndry&\" ? '&' : ''\n query += `br=${bedroom}`;\n valuesForInput = { ...valuesForInput, bedroom: bedroom}\n }\n\n if(propertyType) {\n query += query != \"searchType=scndry&\" ? '&' : ''\n \n if(propertyType !== 'any') query += `pt=${propertyType}`;\n \n valuesForInput = { ...valuesForInput, property_type: propertyType}\n }\n\n if (minPrice) {\n query += query != \"searchType=scndry&\" ? '&' : ''\n query += `mnp=${minPrice}`;\n valuesForInput = { ...valuesForInput, minPrice: minPrice };\n }\n\n if (maxPrice) {\n query += query != \"searchType=scndry&\" ? '&' : ''\n query += `mxp=${maxPrice}`;\n valuesForInput = { ...valuesForInput, maxPrice: maxPrice };\n }\n\n if (minArea) {\n query += query != \"searchType=scndry&\" ? '&' : ''\n query += `minArea=${minArea}`;\n valuesForInput = { ...valuesForInput, minArea: minArea };\n }\n\n if (maxArea) {\n query += query != \"searchType=scndry&\" ? '&' : ''\n query += `maxArea=${maxArea}`;\n valuesForInput = { ...valuesForInput, maxArea: maxArea };\n }\n\n for (let x in params) {\n let str = params[x];\n if (str.indexOf(\"areas\") !== -1) {\n if (query != \"searchType=scndry&\") {\n query += \"&\";\n }\n let decodedURI = decodeURIComponent(str);\n let correctFormat = decodedURI.replace(/&/g, \"_\");\n let valueSplitted = correctFormat?.split(\"-\");\n let index = valueSplitted.indexOf(\"areas\") + 1;\n let value = \"\";\n for (let i = index; i < valueSplitted?.length; i++) {\n value += valueSplitted[i];\n if (i + 1 !== valueSplitted?.length) {\n value += \" \";\n }\n }\n\n query += `txt=${encodeURIComponent(value)}`;\n valuesForInput = {...valuesForInput,keywords:value}\n\n }\n else if (str===\"residential\") {\n if (query != \"searchType=scndry&\") {\n query += \"&\";\n }\n let value = str;\n query += `ctg=${value}`;\n } else if (str===\"commercial\") {\n if (query != \"searchType=scndry&\") {\n query += \"&\";\n }\n let value = str;\n query += `ctg=${value}`;\n } else if (str.indexOf(\"page\") !== -1) {\n if (query != \"searchType=scndry&\") {\n query += \"&\";\n }\n let value = str?.split(\"-\")[1];\n query += `pg=${value}`;\n hasPage = true; // Set the flag to true\n }\n else if(str.indexOf(\"-for-\") !== -1){\n if (query != \"searchType=scndry&\") {\n query += \"&\";\n }\n let valueSplitted = str?.split(\"-\");\n let index = valueSplitted.indexOf(\"for\");\n let value = \"\"\n for(let i=0 ;i {\n const index = array.indexOf(element);\n\n if (index === -1) {\n // Element not found in the array\n return \"\";\n }\n\n const valuesBefore = [];\n for (let i = index - 1; i >= 0; i--) {\n const word = array[i];\n\n // Check if the word is in the stopWords array\n if (stopWords.includes(word.toLowerCase())) {\n // Stop if a stop word is encountered\n break;\n }\n\n // Capitalize the first letter of each word\n valuesBefore.unshift(word.charAt(0).toUpperCase() + word.slice(1));\n }\n\n return valuesBefore.join(\" \");\n};\n\nexport const urlRename = (currentURL, values,type,isUpdatingFields) => {\n // Use regular expressions to find and replace the dynamic parts\n let regexInKeywords = /\\/in-keywords-([^/]+)/;\n let regexMinValue = /\\/(\\d+)-aed-min/;\n let regexBedrooms = /\\/(\\d+)-bedrooms-or-more/;\n let regexAreas = /\\/in-areas-([^/]+)/;\n let regexAedMax = /\\/(\\d+)-aed-max/;\n let regexPropertyType = /\\/propertyType-([^/]+)/;\n let regexCommunity = /\\/community/;\n let regexBuy= /\\/buy/;\n let regexRent= /\\/rent/;\n let regexBedroomCount = /\\/(\\d+)-bedroom/;\n let updatedURL = \"\";\n let regexForSecondaryPropertyType = /\\/([^/]+)-for-([^/]+)/;\n let regexStatus = /\\/status-([^/]+)/;\n updatedURL = currentURL;\n if(type!=\"SECONDARY\"){\n if(!updatedURL.includes(\"community\")){\n if(!updatedURL.includes(\"residential\")){\n updatedURL += \"/properties/residential/sales\"\n }\n }\n }\n \n \n // If the \"in-keywords-\" pattern is found in the URL, replace it with the new value\n if (values?.text) {\n let replacedValue = values?.text?.replace(/ /g, \"-\")?.toLowerCase();\n updatedURL = updatedURL.replace(regexAreas, (match, group) => {\n return `/in-keywords-${replacedValue}`;\n });\n updatedURL = updatedURL.replace(regexInKeywords, (match, group) => {\n return `/in-keywords-${replacedValue}`;\n });\n if (!updatedURL.includes(\"in-keywords\")) {\n updatedURL += `/in-keywords-${replacedValue}`;\n }\n }else{\n updatedURL = updatedURL.replace(regexInKeywords, (match, group) => {\n return \"\";\n });\n }\n\n if (values?.status) {\n let replacedValue = values?.status?.replace(/ /g, \"-\")?.toLowerCase();\n updatedURL = updatedURL.replace(regexStatus, (match, group) => {\n return `/status-${replacedValue}`;\n });\n if (!updatedURL.includes(\"status\")) {\n updatedURL += `/status-${replacedValue}`;\n }\n }\n\n if (values?.property_type) {\n let findoffering = findOfferingType(updatedURL)\n let offeringType = \"\"\n if(findoffering === \"BY\"){\n offeringType = \"sale\"\n }else{\n offeringType = \"rent\"\n\n }\n if(values?.property_type === \"any\"){\n \n updatedURL = updatedURL.replace(regexForSecondaryPropertyType, (match, group) => {\n return `/properties-for-${offeringType}`;\n });\n if (!updatedURL.includes(\"for\")) {\n updatedURL += `/properties-for-${offeringType}`;\n }\n }else{\n let replacedValue = values?.property_type?.replace(/ /g, \"-\")?.toLowerCase();\n updatedURL = updatedURL.replace(regexForSecondaryPropertyType, (match, group) => {\n return `/${replacedValue}-for-${offeringType}`;\n });\n if (!updatedURL.includes(\"for\")) {\n updatedURL += `/${replacedValue}-for-${offeringType}`;\n }\n }\n \n }\n\n if (values?.offer) {\n let findoffering = findOfferingType(updatedURL)\n let offeringType = \"\"\n offeringType = values?.offer === \"buy\" ? \"sale\" :\"rent\"\n\n if(findoffering === \"BY\"){\n updatedURL = updatedURL.replace(regexBuy, `/${values?.offer}`);\n }else{\n updatedURL = updatedURL.replace(regexRent, `/${values?.offer}`);\n }\n if(values?.property_type === \"any\" || !values?.property_type){\n \n updatedURL = updatedURL.replace(regexForSecondaryPropertyType, (match, group) => {\n return `/properties-for-${offeringType}`;\n });\n // if (!updatedURL.includes(\"for\")) {\n // updatedURL += `/properties-for-${offeringType}`;\n // }\n }else{\n let replacedValue = values?.property_type?.replace(/ /g, \"-\")?.toLowerCase();\n updatedURL = updatedURL.replace(regexForSecondaryPropertyType, (match, group) => {\n return `/${replacedValue}-for-${offeringType}`;\n });\n if (!updatedURL.includes(\"for\")) {\n updatedURL += `/${replacedValue}-for-${offeringType}`;\n }\n }\n \n }\n\n // If the \"300000-aed-min\" pattern is found in the URL, replace it with the new value\n if (values?.minPrice) {\n updatedURL = updatedURL.replace(regexMinValue, (match, group) => {\n return `/${values?.minPrice}-aed-min`;\n });\n if (!currentURL.includes(\"-aed-min\")) {\n updatedURL += `/${values?.minPrice}-aed-min`;\n }\n }\n\n if (values?.bed) {\n updatedURL = updatedURL.replace(regexBedrooms, (match, group) => {\n return `/${values?.bed}-bedrooms-or-more`;\n });\n if (!currentURL.includes(\"-bedrooms-or-more\")) {\n updatedURL += `/${values?.bed}-bedrooms-or-more`;\n }\n }\n\n if (values?.bedroom) {\n updatedURL = updatedURL.replace(regexBedroomCount, (match, group) => {\n return `/${values?.bedroom}-bedroom`;\n });\n if (!currentURL.includes(\"-bedroom\")) {\n updatedURL += `/${values?.bedroom}-bedroom`;\n }\n }\n\n\n updatedURL = updatedURL.replace(regexCommunity, \"/residential\");\n\n if (values?.maxPrice) {\n updatedURL = updatedURL.replace(regexAedMax, (match, group) => {\n return `/${values?.maxPrice}-aed-max`;\n });\n if (!currentURL.includes(\"-aed-max\")) {\n updatedURL += `/${values?.maxPrice}-aed-max`;\n }\n }\n if (values?.type) {\n updatedURL = updatedURL.replace(regexPropertyType, (match, group) => {\n return `/propertyType-${values?.type.toLowerCase()}`;\n });\n if (!currentURL.includes(\"propertyType\")) {\n updatedURL += `/propertyType-${values?.type.toLowerCase()}`;\n }\n }\n\n \n let newURl = removePageNumberFromURL(updatedURL)\n if(newURl?.modifiedURL && newURl?.pageNumber){\n if(isUpdatingFields){\n updatedURL = newURl?.modifiedURL\n }else{\n updatedURL = newURl?.modifiedURL + `/${newURl?.pageNumber}`\n\n }\n }\n \n return updatedURL ? updatedURL : false;\n};\n\nexport const secondary_urlRename = (currentURL, values,type,isUpdatingFields) => {\n // Use regular expressions to find and replace the dynamic parts\n let regexInKeywords = /keywords=\\d+/;\n let regexMinValue = /minPrice=\\d+/;\n let regexAedMax = /maxPrice=\\d+/;\n\n let regexMinArea = /minArea=\\d+/;\n let regexMaxArea = /maxArea=\\d+/;\n\n let regexBedrooms = /\\/(\\d+)-bedrooms-or-more/;\n let regexAreas = /\\/in-areas-([^/]+)/;\n let regexPropertyType = /propertyType=\\d+/;\n let regexCommunity = /\\/community/;\n let regexBuy= /\\/buy/;\n let regexRent= /\\/rent/;\n let regexBedroomCount = /bedroom=\\d+/;\n let updatedURL = \"\";\n let regexForSecondaryPropertyType = /\\/([^/]+)-for-([^/]+)/;\n let regexStatus = /status=\\d+/;\n let regexSortOrder = /sort=\\d+/;\n\n let queryExists = false\n\n updatedURL = currentURL;\n\n if (values?.property_type) {\n\n function containsBuyPath(str) {\n return str.includes(\"/buy/\");\n }\n\n let offeringType = containsBuyPath(updatedURL) ? \"sale\" : \"rent\"\n\n if(values?.property_type === \"any\"){\n \n updatedURL = updatedURL.replace(regexForSecondaryPropertyType, (match, group) => {\n return `/properties-for-${offeringType}`;\n });\n if (!updatedURL.includes(\"for\")) {\n updatedURL += `/properties-for-${offeringType}`;\n }\n }else{\n let replacedValue = values?.property_type?.replace(/ /g, \"-\")?.toLowerCase();\n updatedURL = updatedURL.replace(regexForSecondaryPropertyType, (match, group) => {\n return `/${replacedValue}-for-${offeringType}`;\n });\n if (!updatedURL.includes(\"for\")) {\n updatedURL += `/${replacedValue}-for-${offeringType}`;\n }\n }\n }\n\n // if (values?.property_type) {\n // let findoffering = findOfferingType(updatedURL)\n // let offeringType = \"\"\n // if(findoffering === \"BY\"){\n // offeringType = \"sale\"\n // }else{\n // offeringType = \"rent\"\n\n // }\n // if(values?.property_type === \"any\"){\n \n // updatedURL = updatedURL.replace(regexForSecondaryPropertyType, (match, group) => {\n // return `/properties-for-${offeringType}`;\n // });\n // if (!updatedURL.includes(\"for\")) {\n // updatedURL += `/properties-for-${offeringType}`;\n // }\n // }else{\n // let replacedValue = values?.property_type?.replace(/ /g, \"-\")?.toLowerCase();\n // updatedURL = updatedURL.replace(regexForSecondaryPropertyType, (match, group) => {\n // return `/${replacedValue}-for-${offeringType}`;\n // });\n // if (!updatedURL.includes(\"for\")) {\n // updatedURL += `/${replacedValue}-for-${offeringType}`;\n // }\n // }\n \n // }\n\n if (values?.offer) {\n let offeringType = values?.offer === \"buy\" ? \"sale\" :\"rent\"\n if( values?.offer === \"buy\"){\n updatedURL = updatedURL.replace('rent', 'buy')\n } else {\n updatedURL = updatedURL.replace('buy', 'rent')\n }\n if(values?.property_type === \"any\" || !values?.property_type){\n \n updatedURL = updatedURL.replace(regexForSecondaryPropertyType, (match, group) => {\n return `/properties-for-${offeringType}`;\n });\n }\n }\n\n if (values?.bed) {\n updatedURL = updatedURL.replace(regexBedrooms, (match, group) => {\n return `/${values?.bed}-bedrooms-or-more`;\n });\n if (!currentURL.includes(\"-bedrooms-or-more\")) {\n updatedURL += `/${values?.bed}-bedrooms-or-more`;\n }\n }\n\n if (values?.bedroom) {\n updatedURL = updatedURL.replace(regexBedroomCount, `bedroom=${values.bedroom}`);\n // If \"bedroom=\" is not found in the URL, append it with the new value\n if (!currentURL.includes(\"bedroom=\")) {\n updatedURL += queryExists ? '&' : '?'\n updatedURL += `bedroom=${values.bedroom}`;\n queryExists = true\n }\n }\n\n // If the \"in-keywords-\" pattern is found in the URL, replace it with the new value\n if (values?.text) {\n let replacedValue = values?.text?.replace(/ /g, \"-\")?.toLowerCase();\n updatedURL = updatedURL.replace(regexInKeywords, `keywords=${replacedValue}`);\n if (!updatedURL.includes(\"keywords=\")) {\n updatedURL += queryExists ? '&' : '?'\n updatedURL += `keywords=${replacedValue}`;\n queryExists = true\n }\n }else{\n updatedURL = updatedURL.replace(regexInKeywords, (match, group) => {\n return \"\";\n });\n }\n\n updatedURL = updatedURL.replace(regexCommunity, \"/residential\");\n\n // if (values?.type) {\n // updatedURL = updatedURL.replace(regexPropertyType, (match, group) => {\n // return `/propertyType-${values?.type.toLowerCase()}`;\n // });\n // if (!currentURL.includes(\"propertyType\")) {\n // updatedURL += `/propertyType-${values?.type.toLowerCase()}`;\n // }\n // }\n\n if (values?.status) {\n let replacedValue = values?.status?.replace(/ /g, \"-\")?.toLowerCase();\n updatedURL = updatedURL.replace(regexStatus, `status=${replacedValue}`);\n if (!updatedURL.includes(\"status=\")) {\n updatedURL += queryExists ? '&' : '?'\n updatedURL += `status=${replacedValue}`;\n queryExists = true\n }\n }\n\n // If the \"minPrice=\" pattern is found in the URL, replace it with the new value\n if (values?.minPrice) {\n updatedURL = updatedURL.replace(regexMinValue, `minPrice=${values.minPrice}`);\n // If \"minPrice=\" is not found in the URL, append it with the new value\n if (!currentURL.includes(\"minPrice=\")) {\n updatedURL += queryExists ? '&' : '?'\n updatedURL += `minPrice=${values.minPrice}`;\n queryExists = true\n }\n }\n\n // If the \"maxPrice=\" pattern is found in the URL, replace it with the new value\n if (values?.maxPrice) {\n updatedURL = updatedURL.replace(regexAedMax, `maxPrice=${values.maxPrice}`);\n // If \"maxPrice=\" is not found in the URL, append it with the new value\n if (!currentURL.includes(\"maxPrice=\")) {\n updatedURL += queryExists ? '&' : '?'\n updatedURL += `maxPrice=${values.maxPrice}`;\n queryExists = true\n }\n }\n\n // If the \"minArea=\" pattern is found in the URL, replace it with the new value\n if (values?.minArea) {\n updatedURL = updatedURL.replace(regexMinArea, `minArea=${values.minArea}`);\n // If \"minArea=\" is not found in the URL, append it with the new value\n if (!currentURL.includes(\"minArea=\")) {\n updatedURL += queryExists ? '&' : '?'\n updatedURL += `minArea=${values.minArea}`;\n queryExists = true\n }\n }\n \n // If the \"maxArea=\" pattern is found in the URL, replace it with the new value\n if (values?.maxArea) {\n updatedURL = updatedURL.replace(regexMaxArea, `maxArea=${values.maxArea}`);\n // If \"maxArea=\" is not found in the URL, append it with the new value\n if (!currentURL.includes(\"maxArea=\")) {\n updatedURL += queryExists ? '&' : '?'\n updatedURL += `maxArea=${values.maxArea}`;\n queryExists = true\n }\n }\n\n if(values?.sortOrder){\n updatedURL = updatedURL.replace(regexSortOrder, `sort=${values.sortOrder}`)\n if(!currentURL.includes('sort=')){\n updatedURL += queryExists ? '&' : '?'\n updatedURL += `sort=${values.sortOrder}`;\n queryExists = true\n }\n }\n\n let newURl = removePageNumberFromURL(updatedURL)\n if(newURl?.modifiedURL && newURl?.pageNumber){\n if(isUpdatingFields){\n updatedURL = newURl?.modifiedURL\n }else{\n updatedURL = newURl?.modifiedURL + `/${newURl?.pageNumber}`\n\n }\n }\n \n return updatedURL ? updatedURL : false;\n};\n\nexport const offplan_urlRename = (currentURL, values, type, isUpdatingFields) => {\n // Use regular expressions to find and replace the dynamic parts\n let regexInKeywords = /keywords=\\d+/;\n let regexMinValue = /minPrice=\\d+/;\n let regexAedMax = /maxPrice=\\d+/;\n let regexPropertyType = /propertyType=\\d+/;\n let regexBedrooms = /bedrooms=\\d+/;\n let regexAreas = /\\/in-areas-([^/]+)/;\n let regexCommunity = /\\/community/;\n let regexBuy= /\\/buy/;\n let regexRent= /\\/rent/;\n let regexBedroomCount = /\\/(\\d+)-bedroom/;\n let updatedURL = \"\";\n let regexForSecondaryPropertyType = /\\/([^/]+)-for-([^/]+)/;\n let regexStatus = /\\/status-([^/]+)/;\n let regexSortOrder = /sort=\\d+/;\n\n let queryExists = false\n\n updatedURL = currentURL;\n \n // If the \"keywords=\" pattern is found in the URL, replace it with the new value\n if (values?.text) {\n let replacedValue = values?.text?.replace(/ /g, \"-\")?.toLowerCase();\n updatedURL = updatedURL.replace(regexInKeywords, `keywords=${replacedValue}`);\n if (!updatedURL.includes(\"keywords=\")) {\n updatedURL += queryExists ? '&' : '?'\n updatedURL += `keywords=${replacedValue}`;\n queryExists = true\n }\n }else{\n updatedURL = updatedURL.replace(regexInKeywords, (match, group) => {\n return \"\";\n });\n }\n\n if (values?.status) {\n let replacedValue = values?.status?.replace(/ /g, \"-\")?.toLowerCase();\n updatedURL = updatedURL.replace(regexStatus, (match, group) => {\n return `/status-${replacedValue}`;\n });\n if (!updatedURL.includes(\"status\")) {\n updatedURL += `/status-${replacedValue}`;\n }\n }\n\n if (values?.property_type) {\n let findoffering = findOfferingType(updatedURL)\n let offeringType = \"\"\n if(findoffering === \"BY\"){\n offeringType = \"sale\"\n }else{\n offeringType = \"rent\"\n\n }\n if(values?.property_type === \"any\"){\n \n updatedURL = updatedURL.replace(regexForSecondaryPropertyType, (match, group) => {\n return `/properties-for-${offeringType}`;\n });\n if (!updatedURL.includes(\"for\")) {\n updatedURL += `/properties-for-${offeringType}`;\n }\n }else{\n let replacedValue = values?.property_type?.replace(/ /g, \"-\")?.toLowerCase();\n updatedURL = updatedURL.replace(regexForSecondaryPropertyType, (match, group) => {\n return `/${replacedValue}-for-${offeringType}`;\n });\n if (!updatedURL.includes(\"for\")) {\n updatedURL += `/${replacedValue}-for-${offeringType}`;\n }\n }\n \n }\n\n if (values?.offer) {\n let findoffering = findOfferingType(updatedURL)\n let offeringType = \"\"\n offeringType = values?.offer === \"buy\" ? \"sale\" :\"rent\"\n\n if(findoffering === \"BY\"){\n updatedURL = updatedURL.replace(regexBuy, `/${values?.offer}`);\n }else{\n updatedURL = updatedURL.replace(regexRent, `/${values?.offer}`);\n }\n if(values?.property_type === \"any\" || !values?.property_type){\n \n updatedURL = updatedURL.replace(regexForSecondaryPropertyType, (match, group) => {\n return `/properties-for-${offeringType}`;\n });\n // if (!updatedURL.includes(\"for\")) {\n // updatedURL += `/properties-for-${offeringType}`;\n // }\n }else{\n let replacedValue = values?.property_type?.replace(/ /g, \"-\")?.toLowerCase();\n updatedURL = updatedURL.replace(regexForSecondaryPropertyType, (match, group) => {\n return `/${replacedValue}-for-${offeringType}`;\n });\n if (!updatedURL.includes(\"for\")) {\n updatedURL += `/${replacedValue}-for-${offeringType}`;\n }\n }\n \n }\n\n if (values?.bedroom) {\n updatedURL = updatedURL.replace(regexBedroomCount, (match, group) => {\n return `/${values?.bedroom}-bedroom`;\n });\n if (!currentURL.includes(\"-bedroom\")) {\n updatedURL += `/${values?.bedroom}-bedroom`;\n }\n }\n\n updatedURL = updatedURL.replace(regexCommunity, \"/residential\");\n\n // If the \"bed=\" pattern is found in the URL, replace it with the new value\n if (values?.bed) {\n updatedURL = updatedURL.replace(regexBedrooms, `bedrooms=${values.bed}`);\n // If \"bed=\" is not found in the URL, append it with the new value\n if (!currentURL.includes(\"bedrooms=\")) {\n updatedURL += queryExists ? '&' : '?'\n updatedURL += `bedrooms=${values.bed}`;\n queryExists = true\n }\n }\n\n // If the \"propertyType=\" pattern is found in the URL, replace it with the new value\n if (values?.type) {\n updatedURL = updatedURL.replace(regexPropertyType, `propertyType=${values.type}`);\n // If \"propertyType=\" is not found in the URL, append it with the new value\n if (!currentURL.includes(\"propertyType=\")) {\n updatedURL += queryExists ? '&' : '?'\n updatedURL += `propertyType=${values.type}`;\n queryExists = true\n }\n }\n\n // If the \"minPrice=\" pattern is found in the URL, replace it with the new value\n if (values?.minPrice) {\n updatedURL = updatedURL.replace(regexMinValue, `minPrice=${values.minPrice}`);\n // If \"minPrice=\" is not found in the URL, append it with the new value\n if (!currentURL.includes(\"minPrice=\")) {\n updatedURL += queryExists ? '&' : '?'\n updatedURL += `minPrice=${values.minPrice}`;\n queryExists = true\n }\n }\n\n // If the \"maxPrice=\" pattern is found in the URL, replace it with the new value\n if (values?.maxPrice) {\n updatedURL = updatedURL.replace(regexAedMax, `maxPrice=${values.maxPrice}`);\n // If \"maxPrice=\" is not found in the URL, append it with the new value\n if (!currentURL.includes(\"maxPrice=\")) {\n updatedURL += queryExists ? '&' : '?'\n updatedURL += `maxPrice=${values.maxPrice}`;\n queryExists = true\n }\n }\n\n if(values?.sortOrder){\n updatedURL = updatedURL.replace(regexSortOrder, `sort=${values.sortOrder}`)\n if(!currentURL.includes('sort=')){\n updatedURL += queryExists ? '&' : '?'\n updatedURL += `sort=${values.sortOrder}`;\n queryExists = true\n }\n }\n \n let newURl = removePageNumberFromURL(updatedURL)\n if(newURl?.modifiedURL && newURl?.pageNumber){\n if(isUpdatingFields){\n updatedURL = newURl?.modifiedURL\n }else{\n updatedURL = newURl?.modifiedURL + `/${newURl?.pageNumber}`\n\n }\n }\n \n return updatedURL ? updatedURL : false;\n};\n\nfunction removePageNumberFromURL(url) {\n // Use a regular expression to match \"/page-{number}\" in the URL path\n const regex = /(\\/page-\\d+)(\\/|$)/;\n\n // Try to match the pattern in the URL\n const match = url.match(regex);\n if (match) {\n // Extract the matched page number\n const pageNumber = match[1];\n\n // Replace the matched pattern with an empty string\n const modifiedURL = url.replace(regex, '$2');\n\n // Return both the modified URL and the extracted page number\n return { modifiedURL, pageNumber };\n } else {\n // Return the original URL if no match is found\n return { modifiedURL: url, pageNumber: null };\n }\n}\n\nexport const calculateDownPayment = (price, percentage) => {\n return parseFloat((price * percentage / 100).toFixed(3));\n};\n\nexport const calculatePercentage = (downPayment, propertyPrice) => {\n return parseFloat(((downPayment / propertyPrice) * 100).toFixed(3));\n};\n\nconst encodeURL = (url) => {\n return url\n .replace(/&/g, '&')\n .replace(/\"/g, '"')\n .replace(/'/g, ''')\n .replace(//g, '>');\n};\n\nexport const sitemapUrlGenerator = (value) => {\n let url = \"\";\n if (value.type === \"OFFPLAN\") {\n \n if(value.slug === 'cove') return\n // if(value.slug === 'project-name-1') return\n url = `offplan/${value.emirate_name}/${value.community_slug}/property/${value.slug}`;\n } else if (value.type === \"BLOG\") {\n url = `blog/${value.slug}`;\n }else if (value.type === \"SECONDARY\") {\n \n if(value.slug === 'villa-for-sale-dubai-tilal-al-ghaf-stage-8032972') return\n if(value.slug === 'villa-for-sale-dubai-tilal-al-ghaf-stage-8033232') return\n if(value.slug === 'townhouse-for-sale-dubai-damac-hills-2-stage-9431476') return\n\n let offeringType = value?.offering_type === \"Sale\"?\"buy\":\"rent\"\n url = `${offeringType}/${value.slug}`;\n } \n else if(value.type === 'DEVELOPER') {\n\n if(value.slug === 'treppan-living') return\n if(value.slug === null) return\n if(value.slug === 'east-and-west-properties') return\n if(value.slug === 'lincoln-star-developments-1') return\n\n url = encodeURL('developers/' + value.slug)\n }\n else if(value.type === 'COMMUNITY') { \n url = encodeURL('areas-and-communities/' + value.slug)\n }\n return url;\n};\n\nexport const secondaryURLGenerator = (values, currentPathname) => {\n let regexPropertiesForSale = /properties-for-sale/g;\n let regexPropertyType = /^(.+)-for-sale/i;\n let regexBedrooms = /([\\d]+)-bedroom/i;\n let regexStatus = /-status-([^/]+)/;\n let url = currentPathname;\n if (values?.status) {\n if (url.includes(\"-status\")) {\n url = url.replace(regexStatus, (match, group) => {\n return `-status-${values?.status}`;\n });\n } else {\n url += `-status-${values?.status}`;\n }\n }\n if (values?.property_type) {\n if (url.includes(\"properties-for-sale\")) {\n url = url.replace(\n regexPropertiesForSale,\n values?.property_type + \"-for-sale\"\n );\n } else {\n url = url.replace(regexPropertyType, (match, group) => {\n return `${values?.property_type}-for-sale`;\n });\n }\n }\n if (values?.bedroom) {\n if (url.includes(\"-bedroom\")) {\n let valueSplitted = url.split(\"-\");\n\n url = url.replace(regexBedrooms, (match, group) => {\n\n return `-${values?.bedroom}-bedroom`;\n });\n } else {\n url += +\"-\" + values?.bedroom + \"-bedroom\";\n }\n }\n return url;\n};\n\nexport const findOfferingType = (pathname) => {\n let splitted = pathname.split(\"/\");\n if (splitted[2] === \"buy\") {\n return \"BY\";\n } else {\n return \"RT\";\n }\n};\n\nexport const valuesBeforeAKeyword = (url,type) => {\n\nif(type === \"for\"){\n \n return match[1].trim();\n} else {\n return null;\n}\n} \n\nexport const capitalizeWords = (inputString) => {\n // Split the input string into an array of words\n const words = inputString.split(' ');\n\n // Capitalize the first letter of each word\n const capitalizedWords = words.map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase());\n\n // Join the capitalized words back into a string\n const resultString = capitalizedWords.join(' ');\n\n return resultString;\n}\n\nexport const checkIsResidential = (params) => {\n let isResidential = false\n for (let x in params) {\n let str = params[x];\n\n if(str.toLowerCase() === \"residential\"){\n isResidential = true\n break\n }else{\n isResidential = false\n }\n }\n return isResidential\n}\n\nexport const subLinkPathnameActiveFinder = (sublinks,currentPath) => {\n \n if (sublinks?.length) {\n return sublinks.some((subLink) => subLink.path === currentPath);\n }\n return false;\n}\n\nexport const searchInputQueryGenerator = (category,inputValues) => {\n let query = \"\"\n}\n\nexport const addThreeMonthsToDate = (stringDate) => {\n\n // Convert the date string to a Date object\n let date = new Date(stringDate);\n\n // Add 3 months to the date\n date.setMonth(date.getMonth() + 3);\n\n // Format the date back to the desired string format\n let year = date.getFullYear();\n let month = String(date.getMonth() + 1).padStart(2, '0'); // Months are zero-based\n let day = String(date.getDate()).padStart(2, '0');\n\n let newDateString = `${year}-${month}-${day}`;\n return newDateString\n}\n\nexport const isObjectEmpty = (obj) => {\n return Object.keys(obj).length === 0;\n};\n\nexport const strapiRichTextToString = (obj) => {\n if(!obj) return null\n\n function extractTextFromChildren(children) {\n let text = '';\n \n children.forEach(child => {\n if (child.type === 'text') {\n text += child.text; // Concatenate the text content\n } else if (child.type === 'link' && child.children) {\n // Recursively handle links and their children\n text += extractTextFromChildren(child.children);\n } else if (child.type === 'list-item' && child.children) {\n // Concatenate list item text with a space for spacing between items\n text += extractTextFromChildren(child.children) + ' '; \n } else if (child.children) {\n // Handle other nested structures\n text += extractTextFromChildren(child.children);\n }\n });\n \n return text;\n }\n \n function extractTextFromFaqs(obj) {\n let allText = '';\n \n obj.forEach(faq => {\n if (faq.type === 'paragraph' || faq.type === 'heading' || faq.type === 'list' || faq.type === 'quote' || faq.type === 'code') {\n // Add space after paragraphs, headings, and handle list formatting\n allText += extractTextFromChildren(faq.children).trim() + (faq.type === 'list' ? ' ' : ' ');\n }\n });\n \n return allText.trim(); // Ensure no trailing spaces at the end\n }\n\n return extractTextFromFaqs(obj)\n}\nexport const square_feet_to_square_meter = 0.092903;"],"names":["moment","require","calculateMortgage","propertyPrice","annualInterestRate","loanLengthYears","downPayment","principal","monthlyInterestRate","numberOfPayments","Math","pow","calculateTotalLoanAmount","monthly","convertMyCurrency","value","currency","aed_to_usd_exchange_rate","aed_to_eur_exchange_rate","aed_to_gbp_exchange_rate","aed_to_inr_exchange_rate","aed_to_rub_exchange_rate","param","convertMyCurrencyReturnRate","rate","formatNumberToArabic","number","grouping","Intl","NumberFormat","useGrouping","format","fetchAPI","endpoint","cacheType","customConfig","filterHeader","res","fetch","process","concat","json","err","message","type","headers","d_acp","dev_id","cache","next","revalidate","convertPrice","price","isArabic","isNaN","numberFormat","units","unitIndex","length","formattedPrice","round","result","convertToDate","date","locale","num","capitalizeFirstLetters","str","split","map","word","charAt","toUpperCase","slice","join","offplan_queryGeneratorAndWordChecker","params","searchParams","query","hasPage","valuesForInput","minPrice","maxPrice","propertyType","bedrooms","keywords","sort","valueSplitted","i","encodeURIComponent","text","x","bed","indexOf","correctFormat","decodedURI","replace","index","secondary_secondaryQueryGeneratorAndWordChecker","status","bedroom","minArea","maxArea","property_type","offer","secondary_urlRename","currentURL","values","isUpdatingFields","regexInKeywords","updatedURL","regexForSecondaryPropertyType","queryExists","offeringType","containsBuyPath","includes","match","group","replacedValue","toLowerCase","sortOrder","newURl","removePageNumberFromURL","modifiedURL","pageNumber","offplan_urlRename","findoffering","findOfferingType","url","regex","calculateDownPayment","percentage","parseFloat","toFixed","calculatePercentage","splitted","capitalizeWords","words","inputString","capitalizedWords","resultString","checkIsResidential","isResidential","subLinkPathnameActiveFinder","sublinks","currentPath","some","subLink","path","strapiRichTextToString","allText","obj","extractTextFromChildren","children","forEach","child","faq","trim","square_feet_to_square_meter"],"sourceRoot":""}