{"version":3,"sources":["i18n.js","components/loading-indicator/loading-indicator.jsx","utils/formatTime.js","utils/b64EncodeUnicode.js","utils/isMeasurement.js","theme.js","types.js","config.js","utils/sortObjLocaleBy.js","utils/log.js","pages/booking/api/fetchCitiesAsync.js","pages/booking/api/fetchDistrictsAsync.js","pages/booking/api/fetchStoresAsync.js","pages/booking/address.page.jsx","pages/booking/api/fetchServicesAsync.js","pages/booking/service.page.jsx","pages/booking/api/fetchTimeslotsAsync.js","pages/booking/timeslot.page.jsx","pages/booking/contact.page.jsx","pages/booking/api/createOrderAsync.js","pages/booking/api/redirectToPayfortAsync.js","pages/booking/api/payfortSignatureAsync.js","pages/booking/api/reserveTimeslotAsync.js","pages/booking/api/releaseTimeslotAsync.js","pages/booking/index.page.jsx","App.js","index.js"],"names":["parts","document","location","pathname","split","lang","toLowerCase","i18n","use","Backend","initReactI18next","init","lng","fallbackLng","debug","backend","loadPath","ns","defaultNS","keySeparator","interpolation","escapeValue","formatSeparator","react","useSuspense","LoadingIndicator","props","usePromiseTracker","promiseInProgress","className","type","color","height","width","formatDate","date","day","getDate","month","getMonth","year","getFullYear","getDateRange","actual_date","start","Date","end","addDays","formatTime","timeString","language","hourInt","parseInt","ampm","places","hour","String","padStart","b64EncodeUnicode","str","btoa","encodeURIComponent","replace","match","p1","fromCharCode","isMeasurement","service","Order_Type","theme","createTheme","direction","typography","fontFamily","join","STEPS","SERVICE_TYPE","env","console","log","apimKey","signature_url","signature_key","sortObjLocaleBy","prop","a","b","aa","bb","localeCompare","sensitivity","cookies","Cookies","showlog","get","arguments","baseUrl","fetch","headers","response","status","json","cities","Region_Area","filter","area","Type","sort","Error","cityId","serviceId","Districts","serviceType","Stores","useStyles","makeStyles","spinnerProgress","position","top","left","marginTop","marginLeft","AddressPage","fields","errors","handleChange","useTranslation","t","classes","React","useState","loadingCities","setLoadingCities","loadingDistricts","setLoadingDistricts","loadingStores","setLoadingStores","showNoServicesError","setShowNoServicesError","setCities","districts","setDistricts","stores","setStores","useEffect","fetchCities","city","fetchDistricts","Id","ServiceId","fetchStores","Service_Type","fetchCitiesAsync","then","fetchDistrictsAsync","fetchStoresAsync","length","handleStoreChange","e","store","find","target","value","Typography","variant","gutterBottom","Grid","container","spacing","item","xs","FormControl","fullWidth","error","Autocomplete","options","getOptionLabel","result","LocalizedName","Name","undefined","id","onChange","renderInput","params","TextField","label","margin","CircularProgress","size","FormHelperText","district","InputLabel","Select","labelId","map","MenuItem","key","Services","ServicePage","servicesWithDisclaimer","loadingServices","setLoadingServices","services","setServices","fetchServices","fetchServicesAsync","serviceName","ServiceName_Ar","ServiceName_En","serviceCost","Service_Fee","Box","mt","Service_Desc_Ar","Service_Desc_En","includes","required","component","FormControlLabel","checked","measurementDisclaimer","control","Checkbox","labelPlacement","uuid","agentCode","postCode","dayCount","storeNo","queueId","method","body","JSON","stringify","AgentCode","OrderNumber","PostCode","SlotsToShow","StoreNo","QueueId","timeslots","ResponseCode","counter","forEach","ts","ServiceType","toUpperCase","startLocal","start_time","end_time","endLocal","replaceAll","slotStart","slotEnd","push","slotstart","slotend","message","availableCapacity","available","orderGUID","modal","display","alignItems","justifyContent","paper","backgroundColor","palette","background","border","boxShadow","shadows","padding","TimeslotPage","loadingTimeslots","setLoadingTimeslots","reservingTimeslot","setReservingTimeslot","setTimeslots","filtered","setFiltered","setDate","minDate","setMinDate","maxDate","setMaxDate","open","setOpen","fetchTimeslotsAsync","Code","PostalCode","firstElement","calendarType","locale","ttts","yyyymmdd","tileDisabled","activeStartDate","view","getYear","timeslot","range","showDateRange","Modal","aria-labelledby","aria-describedby","onClose","closeAfterTransition","ContactPage","helperText","inputProps","placeholder","maxLength","inputMode","pattern","Promise","resolve","Number","amount","post","setTimeout","prototype","mm","this","dd","path","form","createElement","action","hasOwnProperty","hiddenField","name","appendChild","submit","command","access_code","merchant_identifier","currency","keys","Object","x","uri","encoded","encodeURI","reserveTimeslotAsync","slotId","startTime","endTime","slotType","SlotId","StartTime","EndTime","SlotType","releaseTimeslotAsync","stepper","buttons","button","marginRight","paymentLogo","textAlign","borderRadius","IndexPage","setErrors","activeStep","setActiveStep","disableNext","setDisableNext","uuidv4","firstName","lastName","email","mobile","setFields","jssRtl","rtl","jss","create","plugins","jssPreset","steps","validate","input","test","doValidation","reserveTimeslot","prevState","constructor","positionId","PositionId","ThemeProvider","StylesProvider","Container","maxWidth","align","Stepper","alternativeLabel","Step","StepLabel","Fragment","getStepContent","Button","onClick","trackPromise","createOrderAsync","First_Name","Last_Name","Post_Code","Mobile_No","Email","TMS_Id","TMS_Date","Customer_Address","CityId","DistrictId","Serivce_ID","Agent_Code","NAV_Item_No","NAVItemNo","TMS_Start_Time","TMS_End_Time","Store_No","NAV_WSURL","ServiceURL","SlotServiceType","order","sigParams","merchant_reference","OrderId","customer_name","customer_email","phone_number","order_description","merchant_extra2","merchant_extra1","merchant_extra3","merchant_extra4","payfortSignatureAsync","redirectToPayfortAsync","disabled","disableNextButton","style","marginBottom","src","alt","App","fallback","BookingPage","ReactDOM","render","basename","CookiesProvider","getElementById"],"mappings":"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","file":"static/js/main.50efef01.chunk.js","sourcesContent":["import i18n from 'i18next';\r\nimport Backend from 'i18next-xhr-backend';\r\nimport { initReactI18next } from 'react-i18next';\r\n\r\n// detect user interface language and load relevant translation\r\nconst parts = document.location.pathname.split('/');\r\nexport const lang = parts[2] ? parts[2].toLowerCase() : 'en';\r\n\r\ni18n\r\n .use(Backend)\r\n .use(initReactI18next)\r\n .init({\r\n lng: lang,\r\n fallbackLng: 'en',\r\n debug: false,\r\n backend: {\r\n /* translation file path */\r\n loadPath: '/sa/ar/booking/assets/i18n/{{ns}}/{{lng}}.json'\r\n },\r\n /* can have multiple namespace, in case you want to divide a huge translation into smaller pieces and load them on demand */\r\n ns: ['translations'],\r\n defaultNS: 'translations',\r\n keySeparator: false,\r\n interpolation: {\r\n escapeValue: false,\r\n formatSeparator: ','\r\n },\r\n react: {\r\n useSuspense: true\r\n }\r\n });\r\n\r\nexport default i18n;\r\n","import React from 'react';\r\nimport { usePromiseTracker } from 'react-promise-tracker';\r\nimport Loader from 'react-loader-spinner';\r\n\r\nimport './loading-indicator.scss';\r\n\r\nconst LoadingIndicator = (props) => {\r\n const { promiseInProgress } = usePromiseTracker();\r\n\r\n return (\r\n promiseInProgress && (\r\n
\r\n \r\n
\r\n )\r\n );\r\n};\r\n\r\nexport default LoadingIndicator;\r\n","import { addDays } from \"date-fns\";\r\n\r\nfunction formatDate(date) {\r\n let day = date.getDate();\r\n let month = date.getMonth() + 1; // starts from 0\r\n const year = date.getFullYear();\r\n\r\n // 01, 02, ..., 09\r\n if (day < 10) day = \"0\" + day;\r\n if (month < 10) month = \"0\" + month;\r\n\r\n return `${day}/${month}/${year}`;\r\n}\r\n\r\nexport function getDateRange(actual_date) {\r\n const start = new Date(actual_date);\r\n const end = addDays(start, 1);\r\n\r\n return [formatDate(start), formatDate(end)];\r\n}\r\n\r\n/**\r\n * Time input ex 13:00:00\r\n * Time output ex 13:00 (01:00 PM)\r\n * @param {string} timeString\r\n * @param {string} language\r\n */\r\nexport function formatTime(timeString, language) {\r\n // internal function to pad with zeros\r\n const zeroPad = (num, places) => String(num).padStart(places, \"0\");\r\n\r\n let parts = timeString.split(\":\");\r\n let hourInt = parseInt(parts[0]);\r\n let ampm = language === \"ar\" ? \"ص\" : \"AM\";\r\n\r\n if (hourInt >= 12) {\r\n ampm = language === \"ar\" ? \"م\" : \"PM\";\r\n hourInt = hourInt > 12 ? hourInt - 12 : hourInt;\r\n } else if (hourInt === 0) {\r\n hourInt = 12;\r\n }\r\n\r\n let hour = zeroPad(hourInt, 2);\r\n\r\n return `${parts[0]}:${parts[1]} (${hour}:${parts[1]} ${ampm})`;\r\n}\r\n","export default function b64EncodeUnicode(str) {\r\n // first we use encodeURIComponent to get percent-encoded UTF-8,\r\n // then we convert the percent encodings into raw bytes which\r\n // can be fed into btoa.\r\n return btoa(\r\n encodeURIComponent(str).replace(\r\n /%([0-9A-F]{2})/g,\r\n function toSolidBytes(match, p1) {\r\n return String.fromCharCode(\"0x\" + p1);\r\n }\r\n )\r\n );\r\n}\r\n","export default function isMeasurement(service) {\r\n return service.Order_Type === \"CO\";\r\n}\r\n","import { createTheme } from \"@material-ui/core/styles\";\r\n//import purple from '@material-ui/core/colors/purple';\r\n//import green from '@material-ui/core/colors/green';\r\n\r\nconst theme = createTheme({\r\n direction: \"rtl\",\r\n typography: {\r\n fontFamily: [\r\n '\"Noto IKEA\"',\r\n '\"Noto IKEA Arabic\"',\r\n \"Roboto\",\r\n '\"Open Sans\"',\r\n \"sans-serif\",\r\n ].join(\",\"),\r\n },\r\n // palette: {\r\n // primary: {\r\n // main: purple[500],\r\n // },\r\n // secondary: {\r\n // main: green[500],\r\n // },\r\n // },\r\n});\r\n\r\nexport default theme;\r\n","export const STEPS = {\r\n SERVICE: 0,\r\n ADDRESS: 1,\r\n TIMESLOT: 2,\r\n CONTACT: 3,\r\n};\r\n\r\nexport const SERVICE_TYPE = {\r\n OMBORI: \"OMBORI\",\r\n IKEA: \"IKEA\",\r\n};\r\n","// switch between development and production automatically\r\n//export const isDev = window.location.href.indexOf(\"https://securema.ikea.com/\") < 0;\r\nexport const isDev = false;\r\n\r\nexport const env = isDev ? \"dev\" : \"prod\";\r\n\r\nconsole.log(\"Env: \", env);\r\n\r\nexport const apimKey = isDev ? \"ecd8fa27001b48389263bf3df09f4b8c\" : \"ecd8fa27001b48389263bf3df09f4b8c\";\r\n\r\nexport const merchant_identifier = isDev ? \"pWGFtSLw\" : \"MjzvVjfH\";\r\nexport const access_code = isDev ? \"iS3ZJIfqSM5XTtnKzFpi\" : \"sYdawdp0GBLINYhIF9nh\";\r\n\r\nexport const signature_url = isDev\r\n ? \"https://dcbookingdev.azurewebsites.net/api/Signature\"\r\n : \"https://dcbooking.azurewebsites.net/api/Signature\";\r\n\r\nexport const signature_key = isDev\r\n ? \"XL9aWJDBc6KTpY/ZN/ITh09yLlW51Jdb523Zb98RrdCake9iwpKe6w==\"\r\n : \"goTdJMYTadhMWiKUIpcPLa96uLHIUcoKWD0Yg2Cz0gcvMvH3BEfnqA==\";\r\n\r\nexport const checkout_free_url = isDev\r\n ? \"https://dcbookingdev.azurewebsites.net/api/Summary\"\r\n : \"https://dcbooking.azurewebsites.net/api/Summary\";\r\n\r\nexport const checkout_paid_url = isDev\r\n ? \"https://sbcheckout.payfort.com/FortAPI/paymentPage\"\r\n : \"https://checkout.payfort.com/FortAPI/paymentPage\";\r\n","export default function sortObjLocaleBy(prop, lang) {\r\n return function (a, b) {\r\n const aa = a[prop];\r\n const bb = b[prop];\r\n\r\n return aa.localeCompare(bb, lang, { sensitivity: \"base\" });\r\n };\r\n}\r\n","import { Cookies } from \"react-cookie\";\r\n//import { isDev } from \"../config\";\r\n\r\nexport default function log() {\r\n const cookies = new Cookies();\r\n const showlog = cookies.get(\"showlog\");\r\n\r\n if (showlog) {\r\n console.log(...arguments);\r\n }\r\n}\r\n","import { env, apimKey } from \"../../../config\";\r\nimport { lang } from \"../../../i18n\";\r\nimport sortObjLocaleBy from \"../../../utils/sortObjLocaleBy\";\r\nimport log from \"../../../utils/log\";\r\n\r\nexport default async function fetchCitiesAsync() {\r\n const baseUrl = `https://apim-ikeasa.azure-api.net/AreaList/${env}/`;\r\n const response = await fetch(baseUrl, {\r\n headers: {\r\n \"Ocp-Apim-Subscription-Key\": apimKey,\r\n },\r\n });\r\n\r\n if (response.status === 200) {\r\n const json = await response.json();\r\n log(\"fetchCitiesAsync\", \"response\", json);\r\n\r\n const cities = json.Region_Area.filter((area) => area.Type === \"City\");\r\n\r\n // alphabitical sort\r\n const prop = lang === \"ar\" ? \"LocalizedName\" : \"Name\";\r\n return cities.sort(sortObjLocaleBy(prop, lang));\r\n }\r\n\r\n throw new Error(response.status);\r\n}\r\n\r\n/*\r\n[\r\n {\r\n \"Id\": \"191\",\r\n \"Code\": \"01061\",\r\n \"Name\": \"Al Kharj\",\r\n \"Type\": \"City\",\r\n \"ParentCode\": \"01\",\r\n \"LocalizedName\": \"الخرج\",\r\n \"CountryId\": 238\r\n },\r\n {\r\n \"Id\": \"202\",\r\n \"Code\": \"00003\",\r\n \"Name\": \"Riyadh\",\r\n \"Type\": \"City\",\r\n \"ParentCode\": \"01\",\r\n \"LocalizedName\": \"الرياض\",\r\n \"CountryId\": 238\r\n },\r\n {\r\n \"Id\": \"213\",\r\n \"Code\": \"00018\",\r\n \"Name\": \"Jeddah\",\r\n \"Type\": \"City\",\r\n \"ParentCode\": \"02\",\r\n \"LocalizedName\": \"جدة\",\r\n \"CountryId\": 238\r\n },\r\n {\r\n \"Id\": \"214\",\r\n \"Code\": \"01105\",\r\n \"Name\": \"Khulais\",\r\n \"Type\": \"City\",\r\n \"ParentCode\": \"02\",\r\n \"LocalizedName\": \"خليص\",\r\n \"CountryId\": 238\r\n },\r\n {\r\n \"Id\": \"215\",\r\n \"Code\": \"03666\",\r\n \"Name\": \"King Abdullah Economic City\",\r\n \"Type\": \"City\",\r\n \"ParentCode\": \"02\",\r\n \"LocalizedName\": \"مدينة الملك عبدالله الاقتصادية\",\r\n \"CountryId\": 238\r\n },\r\n {\r\n \"Id\": \"216\",\r\n \"Code\": \"00006\",\r\n \"Name\": \"Makkah\",\r\n \"Type\": \"City\",\r\n \"ParentCode\": \"02\",\r\n \"LocalizedName\": \"مكة المكرمة\",\r\n \"CountryId\": 238\r\n },\r\n {\r\n \"Id\": \"217\",\r\n \"Code\": \"00377\",\r\n \"Name\": \"Rabigh\",\r\n \"Type\": \"City\",\r\n \"ParentCode\": \"02\",\r\n \"LocalizedName\": \"رابغ\",\r\n \"CountryId\": 238\r\n },\r\n {\r\n \"Id\": \"219\",\r\n \"Code\": \"00005\",\r\n \"Name\": \"Taif\",\r\n \"Type\": \"City\",\r\n \"ParentCode\": \"02\",\r\n \"LocalizedName\": \"الطائف\",\r\n \"CountryId\": 238\r\n },\r\n {\r\n \"Id\": \"220\",\r\n \"Code\": \"01879\",\r\n \"Name\": \"Thuwal\",\r\n \"Type\": \"City\",\r\n \"ParentCode\": \"02\",\r\n \"LocalizedName\": \"ثول\",\r\n \"CountryId\": 238\r\n },\r\n {\r\n \"Id\": \"230\",\r\n \"Code\": \"01053\",\r\n \"Name\": \"Badr\",\r\n \"Type\": \"City\",\r\n \"ParentCode\": \"03\",\r\n \"LocalizedName\": \"بدر\",\r\n \"CountryId\": 238\r\n },\r\n {\r\n \"Id\": \"232\",\r\n \"Code\": \"00014\",\r\n \"Name\": \"Madinah\",\r\n \"Type\": \"City\",\r\n \"ParentCode\": \"03\",\r\n \"LocalizedName\": \"المدينة المنورة\",\r\n \"CountryId\": 238\r\n },\r\n {\r\n \"Id\": \"234\",\r\n \"Code\": \"00483\",\r\n \"Name\": \"Yanbu\",\r\n \"Type\": \"City\",\r\n \"ParentCode\": \"03\",\r\n \"LocalizedName\": \"ينبع\",\r\n \"CountryId\": 238\r\n },\r\n {\r\n \"Id\": \"235\",\r\n \"Code\": \"09605\",\r\n \"Name\": \"Yanbu Al Sinaiyah\",\r\n \"Type\": \"City\",\r\n \"ParentCode\": \"03\",\r\n \"LocalizedName\": \"ينبع الصناعية\",\r\n \"CountryId\": 238\r\n },\r\n {\r\n \"Id\": \"238\",\r\n \"Code\": \"02481\",\r\n \"Name\": \"Al Badayea\",\r\n \"Type\": \"City\",\r\n \"ParentCode\": \"04\",\r\n \"LocalizedName\": \"البدائع\",\r\n \"CountryId\": 238\r\n },\r\n {\r\n \"Id\": \"239\",\r\n \"Code\": \"02630\",\r\n \"Name\": \"Al Bukayriyah\",\r\n \"Type\": \"City\",\r\n \"ParentCode\": \"04\",\r\n \"LocalizedName\": \"البكيرية\",\r\n \"CountryId\": 238\r\n },\r\n {\r\n \"Id\": \"240\",\r\n \"Code\": \"02629\",\r\n \"Name\": \"Al Hilaliyah\",\r\n \"Type\": \"City\",\r\n \"ParentCode\": \"04\",\r\n \"LocalizedName\": \"الهلالية\",\r\n \"CountryId\": 238\r\n },\r\n {\r\n \"Id\": \"242\",\r\n \"Code\": \"02448\",\r\n \"Name\": \"Al Mithnab\",\r\n \"Type\": \"City\",\r\n \"ParentCode\": \"04\",\r\n \"LocalizedName\": \"المذنب\",\r\n \"CountryId\": 238\r\n },\r\n {\r\n \"Id\": \"244\",\r\n \"Code\": \"02421\",\r\n \"Name\": \"Ar Rass\",\r\n \"Type\": \"City\",\r\n \"ParentCode\": \"04\",\r\n \"LocalizedName\": \"الرس\",\r\n \"CountryId\": 238\r\n },\r\n {\r\n \"Id\": \"246\",\r\n \"Code\": \"00011\",\r\n \"Name\": \"Buraydah\",\r\n \"Type\": \"City\",\r\n \"ParentCode\": \"04\",\r\n \"LocalizedName\": \"بريدة\",\r\n \"CountryId\": 238\r\n },\r\n {\r\n \"Id\": \"247\",\r\n \"Code\": \"02467\",\r\n \"Name\": \"Riyadh Al Khabra\",\r\n \"Type\": \"City\",\r\n \"ParentCode\": \"04\",\r\n \"LocalizedName\": \"رياض الخبراء\",\r\n \"CountryId\": 238\r\n },\r\n {\r\n \"Id\": \"248\",\r\n \"Code\": \"00080\",\r\n \"Name\": \"Unayzah\",\r\n \"Type\": \"City\",\r\n \"ParentCode\": \"04\",\r\n \"LocalizedName\": \"عنيزة\",\r\n \"CountryId\": 238\r\n },\r\n {\r\n \"Id\": \"249\",\r\n \"Code\": \"01999\",\r\n \"Name\": \"Uyun Al Jawa\",\r\n \"Type\": \"City\",\r\n \"ParentCode\": \"04\",\r\n \"LocalizedName\": \"عيون الجواء\",\r\n \"CountryId\": 238\r\n },\r\n {\r\n \"Id\": \"251\",\r\n \"Code\": \"00012\",\r\n \"Name\": \"Al Hofuf\",\r\n \"Type\": \"City\",\r\n \"ParentCode\": \"05\",\r\n \"LocalizedName\": \"الهفوف\",\r\n \"CountryId\": 238\r\n },\r\n {\r\n \"Id\": \"253\",\r\n \"Code\": \"00113\",\r\n \"Name\": \"Al Jubail\",\r\n \"Type\": \"City\",\r\n \"ParentCode\": \"05\",\r\n \"LocalizedName\": \"الجبيل\",\r\n \"CountryId\": 238\r\n },\r\n {\r\n \"Id\": \"255\",\r\n \"Code\": \"00031\",\r\n \"Name\": \"Al Khobar\",\r\n \"Type\": \"City\",\r\n \"ParentCode\": \"05\",\r\n \"LocalizedName\": \"الخبر\",\r\n \"CountryId\": 238\r\n },\r\n {\r\n \"Id\": \"257\",\r\n \"Code\": \"00067\",\r\n \"Name\": \"Al Qatif\",\r\n \"Type\": \"City\",\r\n \"ParentCode\": \"05\",\r\n \"LocalizedName\": \"القطيف\",\r\n \"CountryId\": 238\r\n },\r\n {\r\n \"Id\": \"258\",\r\n \"Code\": \"02171\",\r\n \"Name\": \"Anak\",\r\n \"Type\": \"City\",\r\n \"ParentCode\": \"05\",\r\n \"LocalizedName\": \"عنك\",\r\n \"CountryId\": 238\r\n },\r\n {\r\n \"Id\": \"259\",\r\n \"Code\": \"00243\",\r\n \"Name\": \"Buqayq\",\r\n \"Type\": \"City\",\r\n \"ParentCode\": \"05\",\r\n \"LocalizedName\": \"بقيق\",\r\n \"CountryId\": 238\r\n },\r\n {\r\n \"Id\": \"260\",\r\n \"Code\": \"00013\",\r\n \"Name\": \"Dammam\",\r\n \"Type\": \"City\",\r\n \"ParentCode\": \"05\",\r\n \"LocalizedName\": \"الدمام\",\r\n \"CountryId\": 238\r\n },\r\n {\r\n \"Id\": \"261\",\r\n \"Code\": \"00227\",\r\n \"Name\": \"Dhahran\",\r\n \"Type\": \"City\",\r\n \"ParentCode\": \"05\",\r\n \"LocalizedName\": \"الظهران\",\r\n \"CountryId\": 238\r\n },\r\n {\r\n \"Id\": \"262\",\r\n \"Code\": \"00047\",\r\n \"Name\": \"Hafar Al Batin\",\r\n \"Type\": \"City\",\r\n \"ParentCode\": \"05\",\r\n \"LocalizedName\": \"حفر الباطن\",\r\n \"CountryId\": 238\r\n },\r\n {\r\n \"Id\": \"267\",\r\n \"Code\": \"02167\",\r\n \"Name\": \"Safwa\",\r\n \"Type\": \"City\",\r\n \"ParentCode\": \"05\",\r\n \"LocalizedName\": \"صفوى\",\r\n \"CountryId\": 238\r\n },\r\n {\r\n \"Id\": \"268\",\r\n \"Code\": \"02590\",\r\n \"Name\": \"Ras Tanurah\",\r\n \"Type\": \"City\",\r\n \"ParentCode\": \"05\",\r\n \"LocalizedName\": \"راس تنورة\",\r\n \"CountryId\": 238\r\n },\r\n {\r\n \"Id\": \"269\",\r\n \"Code\": \"00454\",\r\n \"Name\": \"Saihat\",\r\n \"Type\": \"City\",\r\n \"ParentCode\": \"05\",\r\n \"LocalizedName\": \"سيهات\",\r\n \"CountryId\": 238\r\n },\r\n {\r\n \"Id\": \"270\",\r\n \"Code\": \"00456\",\r\n \"Name\": \"Tarout\",\r\n \"Type\": \"City\",\r\n \"ParentCode\": \"05\",\r\n \"LocalizedName\": \"تاروت\",\r\n \"CountryId\": 238\r\n },\r\n {\r\n \"Id\": \"271\",\r\n \"Code\": \"00015\",\r\n \"Name\": \"Abha\",\r\n \"Type\": \"City\",\r\n \"ParentCode\": \"06\",\r\n \"LocalizedName\": \"ابها\",\r\n \"CountryId\": 238\r\n },\r\n {\r\n \"Id\": \"272\",\r\n \"Code\": \"02213\",\r\n \"Name\": \"Arar\",\r\n \"Type\": \"City\",\r\n \"ParentCode\": \"09\",\r\n \"LocalizedName\": \"عرعر\",\r\n \"CountryId\": 238\r\n },\r\n {\r\n \"Id\": \"273\",\r\n \"Code\": \"03658\",\r\n \"Name\": \"Baish\",\r\n \"Type\": \"City\",\r\n \"ParentCode\": \"10\",\r\n \"LocalizedName\": \"بيش\",\r\n \"CountryId\": 238\r\n },\r\n {\r\n \"Id\": \"275\",\r\n \"Code\": \"00065\",\r\n \"Name\": \"Ahad Rafidah\",\r\n \"Type\": \"City\",\r\n \"ParentCode\": \"06\",\r\n \"LocalizedName\": \"احد رفيده\",\r\n \"CountryId\": 238\r\n },\r\n {\r\n \"Id\": \"280\",\r\n \"Code\": \"01514\",\r\n \"Name\": \"Bisha\",\r\n \"Type\": \"City\",\r\n \"ParentCode\": \"06\",\r\n \"LocalizedName\": \"بيشة\",\r\n \"CountryId\": 238\r\n },\r\n {\r\n \"Id\": \"282\",\r\n \"Code\": \"00062\",\r\n \"Name\": \"Khamis Mushait\",\r\n \"Type\": \"City\",\r\n \"ParentCode\": \"06\",\r\n \"LocalizedName\": \"خميس مشيط\",\r\n \"CountryId\": 238\r\n },\r\n {\r\n \"Id\": \"285\",\r\n \"Code\": \"03328\",\r\n \"Name\": \"Sarat Abidah\",\r\n \"Type\": \"City\",\r\n \"ParentCode\": \"06\",\r\n \"LocalizedName\": \"سراة عبيدة\",\r\n \"CountryId\": 238\r\n },\r\n {\r\n \"Id\": \"288\",\r\n \"Code\": \"03678\",\r\n \"Name\": \"Tendaha\",\r\n \"Type\": \"City\",\r\n \"ParentCode\": \"06\",\r\n \"LocalizedName\": \"تندحة\",\r\n \"CountryId\": 238\r\n },\r\n {\r\n \"Id\": \"295\",\r\n \"Code\": \"00001\",\r\n \"Name\": \"Tabuk\",\r\n \"Type\": \"City\",\r\n \"ParentCode\": \"07\",\r\n \"LocalizedName\": \"تبوك\",\r\n \"CountryId\": 238\r\n },\r\n {\r\n \"Id\": \"311\",\r\n \"Code\": \"03597\",\r\n \"Name\": \"Al Aridhah\",\r\n \"Type\": \"City\",\r\n \"ParentCode\": \"10\",\r\n \"LocalizedName\": \"العارضة\",\r\n \"CountryId\": 238\r\n },\r\n {\r\n \"Id\": \"312\",\r\n \"Code\": \"03657\",\r\n \"Name\": \"Al Edabi\",\r\n \"Type\": \"City\",\r\n \"ParentCode\": \"10\",\r\n \"LocalizedName\": \"العيدابى\",\r\n \"CountryId\": 238\r\n },\r\n {\r\n \"Id\": \"316\",\r\n \"Code\": \"00017\",\r\n \"Name\": \"Jazan\",\r\n \"Type\": \"City\",\r\n \"ParentCode\": \"10\",\r\n \"LocalizedName\": \"جازان\",\r\n \"CountryId\": 238\r\n },\r\n {\r\n \"Id\": \"318\",\r\n \"Code\": \"03417\",\r\n \"Name\": \"Najran\",\r\n \"Type\": \"City\",\r\n \"ParentCode\": \"11\",\r\n \"LocalizedName\": \"نجران\",\r\n \"CountryId\": 238\r\n },\r\n {\r\n \"Id\": \"322\",\r\n \"Code\": \"03663\",\r\n \"Name\": \"Al Harth\",\r\n \"Type\": \"City\",\r\n \"ParentCode\": \"10\",\r\n \"LocalizedName\": \"الحرث\",\r\n \"CountryId\": 238\r\n },\r\n {\r\n \"Id\": \"323\",\r\n \"Code\": \"03418\",\r\n \"Name\": \"Badr Al Janoub\",\r\n \"Type\": \"City\",\r\n \"ParentCode\": \"11\",\r\n \"LocalizedName\": \"بدر الجنوب\",\r\n \"CountryId\": 238\r\n },\r\n {\r\n \"Id\": \"325\",\r\n \"Code\": \"03420\",\r\n \"Name\": \"Khbash\",\r\n \"Type\": \"City\",\r\n \"ParentCode\": \"11\",\r\n \"LocalizedName\": \"خباش\",\r\n \"CountryId\": 238\r\n },\r\n {\r\n \"Id\": \"327\",\r\n \"Code\": \"02522\",\r\n \"Name\": \"Yadamah\",\r\n \"Type\": \"City\",\r\n \"ParentCode\": \"11\",\r\n \"LocalizedName\": \"يدمة\",\r\n \"CountryId\": 238\r\n },\r\n {\r\n \"Id\": \"328\",\r\n \"Code\": \"03421\",\r\n \"Name\": \"Thar\",\r\n \"Type\": \"City\",\r\n \"ParentCode\": \"11\",\r\n \"LocalizedName\": \"ثار\",\r\n \"CountryId\": 238\r\n },\r\n {\r\n \"Id\": \"330\",\r\n \"Code\": \"01542\",\r\n \"Name\": \"Al Bahah\",\r\n \"Type\": \"City\",\r\n \"ParentCode\": \"12\",\r\n \"LocalizedName\": \"الباحة\",\r\n \"CountryId\": 238\r\n },\r\n {\r\n \"Id\": \"334\",\r\n \"Code\": \"01546\",\r\n \"Name\": \"Baljurashi\",\r\n \"Type\": \"City\",\r\n \"ParentCode\": \"12\",\r\n \"LocalizedName\": \"بلجرشي\",\r\n \"CountryId\": 238\r\n },\r\n {\r\n \"Id\": \"338\",\r\n \"Code\": \"02237\",\r\n \"Name\": \"Sakaka\",\r\n \"Type\": \"City\",\r\n \"ParentCode\": \"13\",\r\n \"LocalizedName\": \"سكاكا\",\r\n \"CountryId\": 238\r\n },\r\n {\r\n \"Id\": \"341\",\r\n \"Code\": \"03422\",\r\n \"Name\": \"Al Kharkhir\",\r\n \"Type\": \"City\",\r\n \"ParentCode\": \"11\",\r\n \"LocalizedName\": \"الخرخير\",\r\n \"CountryId\": 238\r\n },\r\n {\r\n \"Id\": \"42\",\r\n \"Code\": \"0411\",\r\n \"Name\": \"Al Bahah\",\r\n \"Type\": \"City\",\r\n \"ParentCode\": \"94\",\r\n \"LocalizedName\": \"الباحة\",\r\n \"CountryId\": 238\r\n },\r\n {\r\n \"Id\": \"7\",\r\n \"Code\": \"0102\",\r\n \"Name\": \"Makkah\",\r\n \"Type\": \"City\",\r\n \"ParentCode\": \"91\",\r\n \"LocalizedName\": \"مكة المكرمة\",\r\n \"CountryId\": 238\r\n },\r\n {\r\n \"Id\": \"9\",\r\n \"Code\": \"0401\",\r\n \"Name\": \"Madinah\",\r\n \"Type\": \"City\",\r\n \"ParentCode\": \"91\",\r\n \"LocalizedName\": \"المدينة المنورة\",\r\n \"CountryId\": 238\r\n }\r\n]\r\n\r\n*/\r\n","import { env, apimKey } from \"../../../config\";\r\nimport { lang } from \"../../../i18n\";\r\nimport sortObjLocaleBy from \"../../../utils/sortObjLocaleBy\";\r\nimport log from \"../../../utils/log\";\r\n\r\nexport default async function fetchDistrictsAsync(cityId, serviceId) {\r\n log(\"fetchDistrictsAsync\", \"request\", ...arguments);\r\n\r\n const baseUrl = `https://apim-ikeasa.azure-api.net/DistrictList/${env}/`;\r\n const response = await fetch(baseUrl + `${cityId}/${serviceId}`, {\r\n headers: {\r\n \"Ocp-Apim-Subscription-Key\": apimKey,\r\n },\r\n });\r\n\r\n if (response.status === 200) {\r\n const json = await response.json();\r\n log(\"fetchDistrictsAsync\", \"response\", json);\r\n\r\n // alphabitical sort\r\n const prop = lang === \"ar\" ? \"LocalizedName\" : \"Name\";\r\n return json.Districts.sort(sortObjLocaleBy(prop, lang));\r\n }\r\n\r\n throw new Error(response.status);\r\n}\r\n\r\n/*\r\n[\r\n {\r\n \"Id\": \"2944\",\r\n \"Code\": \"10200018019\",\r\n \"Name\": \"Um Hableen\",\r\n \"CenterGeoPoint\": \"21.7124599258625,39.238041561313\",\r\n \"LocalizedName\": \"ام حبلين\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"2932\",\r\n \"Code\": \"10200018007\",\r\n \"Name\": \"Al Ferdous\",\r\n \"CenterGeoPoint\": \"21.7816005392144,39.117766818291\",\r\n \"LocalizedName\": \"الفردوس\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"2945\",\r\n \"Code\": \"10200018020\",\r\n \"Name\": \"Bryman\",\r\n \"CenterGeoPoint\": \"21.6462210886464,39.2454878326963\",\r\n \"LocalizedName\": \"بريمان\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"2964\",\r\n \"Code\": \"10200018039\",\r\n \"Name\": \"Ash Shefaa\",\r\n \"CenterGeoPoint\": \"21.3819764586531,39.3342826948832\",\r\n \"LocalizedName\": \"الشفا\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"2952\",\r\n \"Code\": \"10200018027\",\r\n \"Name\": \"Al Mahjar\",\r\n \"CenterGeoPoint\": \"21.4279286965871,39.2030244092665\",\r\n \"LocalizedName\": \"المحجر\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"2965\",\r\n \"Code\": \"10200018040\",\r\n \"Name\": \"As Sanabel\",\r\n \"CenterGeoPoint\": \"21.3900155116621,39.2729201080632\",\r\n \"LocalizedName\": \"السنابل\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"2972\",\r\n \"Code\": \"10200018046\",\r\n \"Name\": \"Al Masarah\",\r\n \"CenterGeoPoint\": \"21.2648103122679,39.2474057272785\",\r\n \"LocalizedName\": \"المسرة\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"2984\",\r\n \"Code\": \"10200018058\",\r\n \"Name\": \"Al Quraiyat\",\r\n \"CenterGeoPoint\": \"21.4645130032621,39.1987036035485\",\r\n \"LocalizedName\": \"القريات\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"2985\",\r\n \"Code\": \"10200018060\",\r\n \"Name\": \"Al Kandarah\",\r\n \"CenterGeoPoint\": \"21.4929122974213,39.2020506729262\",\r\n \"LocalizedName\": \"الكندرة\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"2992\",\r\n \"Code\": \"10200018067\",\r\n \"Name\": \"Al Rehab\",\r\n \"CenterGeoPoint\": \"21.5522928247545,39.2243996729465\",\r\n \"LocalizedName\": \"الرحاب\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"3005\",\r\n \"Code\": \"10200018080\",\r\n \"Name\": \"Al Basatin\",\r\n \"CenterGeoPoint\": \"21.6845865878758,39.115942196733\",\r\n \"LocalizedName\": \"البساتين\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"3004\",\r\n \"Code\": \"10200018079\",\r\n \"Name\": \"An Naim\",\r\n \"CenterGeoPoint\": \"21.6280198784442,39.1435915897787\",\r\n \"LocalizedName\": \"النعيم\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"3012\",\r\n \"Code\": \"10200018087\",\r\n \"Name\": \"King Abdul Aziz Int Airport\",\r\n \"CenterGeoPoint\": \"21.6936308760548,39.1655614846443\",\r\n \"LocalizedName\": \"مطار الملك عبدالعزيز الدولي\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"3025\",\r\n \"Code\": \"10200018100\",\r\n \"Name\": \"Al Baghdadiyah Al Gharbiyah\",\r\n \"CenterGeoPoint\": \"21.4991423325005,39.1764987282224\",\r\n \"LocalizedName\": \"البغدادية الغربية\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"3032\",\r\n \"Code\": \"10200018107\",\r\n \"Name\": \"As Sororyah\",\r\n \"CenterGeoPoint\": \"21.3915053296784,39.2122241287371\",\r\n \"LocalizedName\": \"السرورية\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"3045\",\r\n \"Code\": \"10200018999\",\r\n \"Name\": \"Other\",\r\n \"CenterGeoPoint\": \"21.485662,39.192148\",\r\n \"LocalizedName\": \"أخرى\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"2933\",\r\n \"Code\": \"10200018008\",\r\n \"Name\": \"Al Falah\",\r\n \"CenterGeoPoint\": \"21.7815724834379,39.1889557867242\",\r\n \"LocalizedName\": \"الفلاح\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"2931\",\r\n \"Code\": \"10200018006\",\r\n \"Name\": \"Ash Sheraa\",\r\n \"CenterGeoPoint\": \"21.7650600061247,39.0945919840849\",\r\n \"LocalizedName\": \"الشراع\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"2953\",\r\n \"Code\": \"10200018028\",\r\n \"Name\": \"An Nahdah\",\r\n \"CenterGeoPoint\": \"21.6198180130083,39.1269375761914\",\r\n \"LocalizedName\": \"النهضة\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"2951\",\r\n \"Code\": \"10200018026\",\r\n \"Name\": \"Al Hindawiyah\",\r\n \"CenterGeoPoint\": \"21.4736300140694,39.1865539170191\",\r\n \"LocalizedName\": \"الهنداوية\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"2973\",\r\n \"Code\": \"10200018049\",\r\n \"Name\": \"Al Wadi\",\r\n \"CenterGeoPoint\": \"21.3082977701055,39.1717694207282\",\r\n \"LocalizedName\": \"الوادي\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"2971\",\r\n \"Code\": \"10200018047\",\r\n \"Name\": \"Al Moulysaa\",\r\n \"CenterGeoPoint\": \"21.2646069893131,39.2124747599598\",\r\n \"LocalizedName\": \"المليساء\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"2993\",\r\n \"Code\": \"10200018068\",\r\n \"Name\": \"Al Aziziyah\",\r\n \"CenterGeoPoint\": \"21.553078773464,39.1943678584605\",\r\n \"LocalizedName\": \"العزيزية\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"2991\",\r\n \"Code\": \"10200018066\",\r\n \"Name\": \"Al Faisaliyah\",\r\n \"CenterGeoPoint\": \"21.5720324943431,39.1834561648973\",\r\n \"LocalizedName\": \"الفيصلية\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"3013\",\r\n \"Code\": \"10200018088\",\r\n \"Name\": \"Al Manar\",\r\n \"CenterGeoPoint\": \"21.6026396312699,39.2354122759905\",\r\n \"LocalizedName\": \"المنار\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"3011\",\r\n \"Code\": \"10200018086\",\r\n \"Name\": \"Al Ajwad\",\r\n \"CenterGeoPoint\": \"21.6034847894209,39.2571923331748\",\r\n \"LocalizedName\": \"الاجواد\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"3033\",\r\n \"Code\": \"10200018109\",\r\n \"Name\": \"Ash Shati\",\r\n \"CenterGeoPoint\": \"21.5998402225926,39.1132970535295\",\r\n \"LocalizedName\": \"الشاطئ\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"3031\",\r\n \"Code\": \"10200018106\",\r\n \"Name\": \"Al Murjan\",\r\n \"CenterGeoPoint\": \"21.6866322962062,39.1001146928765\",\r\n \"LocalizedName\": \"المرجان\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"2930\",\r\n \"Code\": \"10200018005\",\r\n \"Name\": \"Al Amwaj\",\r\n \"CenterGeoPoint\": \"21.7493470665042,39.073315397575\",\r\n \"LocalizedName\": \"الامواج\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"2936\",\r\n \"Code\": \"10200018012\",\r\n \"Name\": \"Al Amir Fawaz Ash Shamaly\",\r\n \"CenterGeoPoint\": \"21.4357205960517,39.3010440120569\",\r\n \"LocalizedName\": \"الامير فواز الشمالى\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"2937\",\r\n \"Code\": \"10200018013\",\r\n \"Name\": \"Ar Riyadh\",\r\n \"CenterGeoPoint\": \"21.8600065089224,39.1799391148828\",\r\n \"LocalizedName\": \"الرياض\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"2950\",\r\n \"Code\": \"10200018025\",\r\n \"Name\": \"Al Adel\",\r\n \"CenterGeoPoint\": \"21.445136348998,39.2921838411938\",\r\n \"LocalizedName\": \"العدل\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"2957\",\r\n \"Code\": \"10200018032\",\r\n \"Name\": \"Al Baghdadiyah Ash Sharqiyah\",\r\n \"CenterGeoPoint\": \"21.4990978909195,39.1919681641867\",\r\n \"LocalizedName\": \"البغدادية الشرقية\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"2956\",\r\n \"Code\": \"10200018031\",\r\n \"Name\": \"An Nakhil\",\r\n \"CenterGeoPoint\": \"21.5304404025144,39.261518085264\",\r\n \"LocalizedName\": \"النخيل\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"2970\",\r\n \"Code\": \"10200018045\",\r\n \"Name\": \"Al Barakah\",\r\n \"CenterGeoPoint\": \"21.2652044251118,39.2794385284438\",\r\n \"LocalizedName\": \"البركة\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"2976\",\r\n \"Code\": \"10200018051\",\r\n \"Name\": \"At Taawon\",\r\n \"CenterGeoPoint\": \"21.3512286509223,39.269584998631\",\r\n \"LocalizedName\": \"التعاون\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"2990\",\r\n \"Code\": \"10200018065\",\r\n \"Name\": \"Bani Malik\",\r\n \"CenterGeoPoint\": \"21.5322369977442,39.2185902790545\",\r\n \"LocalizedName\": \"بنى مالك\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"2996\",\r\n \"Code\": \"10200018071\",\r\n \"Name\": \"Al Wahah\",\r\n \"CenterGeoPoint\": \"21.5565080675684,39.2443758831244\",\r\n \"LocalizedName\": \"الواحة\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"3010\",\r\n \"Code\": \"10200018085\",\r\n \"Name\": \"As Samir\",\r\n \"CenterGeoPoint\": \"21.582158574291,39.2449288122189\",\r\n \"LocalizedName\": \"السامر\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"3016\",\r\n \"Code\": \"10200018091\",\r\n \"Name\": \"Al Waziriyah\",\r\n \"CenterGeoPoint\": \"21.4445429643282,39.2318423593809\",\r\n \"LocalizedName\": \"الوزيريه\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"3024\",\r\n \"Code\": \"10200018099\",\r\n \"Name\": \"King Abdul Aziz Medical City\",\r\n \"CenterGeoPoint\": \"21.4220744912033,39.3636074601697\",\r\n \"LocalizedName\": \"مدينة الملك عبدالعزيز الطبية\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"3030\",\r\n \"Code\": \"10200018104\",\r\n \"Name\": \"Al Andalus\",\r\n \"CenterGeoPoint\": \"21.5386281155146,39.1432111830678\",\r\n \"LocalizedName\": \"الاندلس\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"3036\",\r\n \"Code\": \"10200018111\",\r\n \"Name\": \"Az Zahra\",\r\n \"CenterGeoPoint\": \"21.5920299066392,39.133466926457\",\r\n \"LocalizedName\": \"الزهراء\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"2942\",\r\n \"Code\": \"10200018017\",\r\n \"Name\": \"Al Hamadaniyah\",\r\n \"CenterGeoPoint\": \"21.7551185291762,39.1935594365585\",\r\n \"LocalizedName\": \"الحمدانية\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"3044\",\r\n \"Code\": \"10200018119\",\r\n \"Name\": \"Third Industrial City\",\r\n \"CenterGeoPoint\": \"21.1206332620715,39.3260152268926\",\r\n \"LocalizedName\": \"المدينة الصناعية الثالثة\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"2940\",\r\n \"Code\": \"10200018015\",\r\n \"Name\": \"Ar Rahmanyah\",\r\n \"CenterGeoPoint\": \"21.7928244311671,39.2166615473848\",\r\n \"LocalizedName\": \"الرحمانية\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"2925\",\r\n \"Code\": \"10200018001\",\r\n \"Name\": \"Az Zomorod\",\r\n \"CenterGeoPoint\": \"21.7991708053088,39.056084863044\",\r\n \"LocalizedName\": \"الزمرد\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"2941\",\r\n \"Code\": \"10200018016\",\r\n \"Name\": \"As Salhiyah\",\r\n \"CenterGeoPoint\": \"21.7635018118239,39.2234960013308\",\r\n \"LocalizedName\": \"الصالحية\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"2935\",\r\n \"Code\": \"10200018010\",\r\n \"Name\": \"Mraykh\",\r\n \"CenterGeoPoint\": \"21.5367799576235,39.2974859463706\",\r\n \"LocalizedName\": \"مريخ\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"2962\",\r\n \"Code\": \"10200018037\",\r\n \"Name\": \"Ash Sharafiyah\",\r\n \"CenterGeoPoint\": \"21.5171909346762,39.1869729321856\",\r\n \"LocalizedName\": \"الشرفية\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"2960\",\r\n \"Code\": \"10200018035\",\r\n \"Name\": \"As Salamah\",\r\n \"CenterGeoPoint\": \"21.5939745567124,39.1515896761779\",\r\n \"LocalizedName\": \"السلامة\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"2946\",\r\n \"Code\": \"10200018021\",\r\n \"Name\": \"Al Montazah\",\r\n \"CenterGeoPoint\": \"21.5951269674645,39.2798137608231\",\r\n \"LocalizedName\": \"المنتزة\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"2955\",\r\n \"Code\": \"10200018030\",\r\n \"Name\": \"King Abdul Aziz University\",\r\n \"CenterGeoPoint\": \"21.4937505413853,39.2471878518811\",\r\n \"LocalizedName\": \"جامعة الملك عبدالعزيز\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"2961\",\r\n \"Code\": \"10200018036\",\r\n \"Name\": \"Ath Thaghr\",\r\n \"CenterGeoPoint\": \"21.4802225001498,39.2277464289631\",\r\n \"LocalizedName\": \"الثغر\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"2980\",\r\n \"Code\": \"10200018055\",\r\n \"Name\": \"Al Qryniah\",\r\n \"CenterGeoPoint\": \"21.3069433927492,39.2464754094957\",\r\n \"LocalizedName\": \"القرينية\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"2966\",\r\n \"Code\": \"10200018041\",\r\n \"Name\": \"Al Hada\",\r\n \"CenterGeoPoint\": \"21.3726038264781,39.3030197171447\",\r\n \"LocalizedName\": \"الهدى\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"2975\",\r\n \"Code\": \"10200018050\",\r\n \"Name\": \"Al Fadeylah\",\r\n \"CenterGeoPoint\": \"21.3069814402998,39.2784204157467\",\r\n \"LocalizedName\": \"الفضيلة\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"2981\",\r\n \"Code\": \"10200018057\",\r\n \"Name\": \"An Nasim\",\r\n \"CenterGeoPoint\": \"21.5192434754528,39.2306735212241\",\r\n \"LocalizedName\": \"النسيم\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"2986\",\r\n \"Code\": \"10200018061\",\r\n \"Name\": \"Al Ammariyah\",\r\n \"CenterGeoPoint\": \"21.4920866169752,39.1931057785625\",\r\n \"LocalizedName\": \"العمارية\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"3000\",\r\n \"Code\": \"10200018075\",\r\n \"Name\": \"Al Bashaer\",\r\n \"CenterGeoPoint\": \"21.8043190809502,39.1745319314832\",\r\n \"LocalizedName\": \"البشائر\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"2995\",\r\n \"Code\": \"10200018070\",\r\n \"Name\": \"Al Wurud\",\r\n \"CenterGeoPoint\": \"21.518624443484,39.2031594698275\",\r\n \"LocalizedName\": \"الورود\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"3001\",\r\n \"Code\": \"10200018076\",\r\n \"Name\": \"Al Muhammadiyah\",\r\n \"CenterGeoPoint\": \"21.6494853198729,39.123464900436\",\r\n \"LocalizedName\": \"المحمدية\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"3006\",\r\n \"Code\": \"10200018081\",\r\n \"Name\": \"Ar Rabwah\",\r\n \"CenterGeoPoint\": \"21.6014204823091,39.1818609135655\",\r\n \"LocalizedName\": \"الربوة\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"3020\",\r\n \"Code\": \"10200018095\",\r\n \"Name\": \"Al Jamiah\",\r\n \"CenterGeoPoint\": \"21.4747540015086,39.251747287875\",\r\n \"LocalizedName\": \"الجامعة\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"3026\",\r\n \"Code\": \"10200018102\",\r\n \"Name\": \"Ar Ruwais\",\r\n \"CenterGeoPoint\": \"21.515366876119,39.1711326843226\",\r\n \"LocalizedName\": \"الرويس\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"3040\",\r\n \"Code\": \"10200018115\",\r\n \"Name\": \"Jeddah Eslamic Seaport\",\r\n \"CenterGeoPoint\": \"21.4696072663556,39.1665696452203\",\r\n \"LocalizedName\": \"ميناء جدة الاسلامى\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"2938\",\r\n \"Code\": \"10200018011\",\r\n \"Name\": \"Ash Shrouk\",\r\n \"CenterGeoPoint\": \"21.5639229275622,39.2771984189354\",\r\n \"LocalizedName\": \"الشروق\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"2929\",\r\n \"Code\": \"10200018004\",\r\n \"Name\": \"As Swaryee\",\r\n \"CenterGeoPoint\": \"21.7997932915684,39.1007410920801\",\r\n \"LocalizedName\": \"الصوارى\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"2934\",\r\n \"Code\": \"10200018009\",\r\n \"Name\": \"Al Asalah\",\r\n \"CenterGeoPoint\": \"21.7785951972504,39.1552272375881\",\r\n \"LocalizedName\": \"الاصالة\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"2958\",\r\n \"Code\": \"10200018033\",\r\n \"Name\": \"An Nazlah Ash Sharqiyah\",\r\n \"CenterGeoPoint\": \"21.4730335375218,39.2203327038132\",\r\n \"LocalizedName\": \"النزلة الشرقية\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"2949\",\r\n \"Code\": \"10200018024\",\r\n \"Name\": \"Al Farouk\",\r\n \"CenterGeoPoint\": \"21.4511297174986,39.2689800237665\",\r\n \"LocalizedName\": \"الفاروق\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"2978\",\r\n \"Code\": \"10200018053\",\r\n \"Name\": \"Al Khomrah\",\r\n \"CenterGeoPoint\": \"21.3526702578499,39.2453937408755\",\r\n \"LocalizedName\": \"الخمرة\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"2969\",\r\n \"Code\": \"10200018044\",\r\n \"Name\": \"Ar Rahmah\",\r\n \"CenterGeoPoint\": \"21.2669068746875,39.3082477497123\",\r\n \"LocalizedName\": \"الرحمة\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"2977\",\r\n \"Code\": \"10200018052\",\r\n \"Name\": \"As Sarawat\",\r\n \"CenterGeoPoint\": \"21.3509866743039,39.2126922501462\",\r\n \"LocalizedName\": \"السروات\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"2982\",\r\n \"Code\": \"10200018056\",\r\n \"Name\": \"An Nazlah Al Yamaniyah\",\r\n \"CenterGeoPoint\": \"21.469223454903,39.2100142676191\",\r\n \"LocalizedName\": \"النزلة اليمانية\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"2989\",\r\n \"Code\": \"10200018064\",\r\n \"Name\": \"Ar Rawdah\",\r\n \"CenterGeoPoint\": \"21.5642568316371,39.1561548923714\",\r\n \"LocalizedName\": \"الروضة\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"2998\",\r\n \"Code\": \"10200018073\",\r\n \"Name\": \"As Sulaymaniyah\",\r\n \"CenterGeoPoint\": \"21.5064328086158,39.2481778802731\",\r\n \"LocalizedName\": \"السليمانية\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"3002\",\r\n \"Code\": \"10200018077\",\r\n \"Name\": \"Al Kawthar\",\r\n \"CenterGeoPoint\": \"21.7269581517076,39.2066964410648\",\r\n \"LocalizedName\": \"الكوثر\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"2997\",\r\n \"Code\": \"10200018072\",\r\n \"Name\": \"Abruq Ar Rughamah\",\r\n \"CenterGeoPoint\": \"21.5018377916613,39.2879952164881\",\r\n \"LocalizedName\": \"ابرق الرغامة\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"3009\",\r\n \"Code\": \"10200018084\",\r\n \"Name\": \"Al Marwah\",\r\n \"CenterGeoPoint\": \"21.61864868905,39.2011070645348\",\r\n \"LocalizedName\": \"المروة\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"3015\",\r\n \"Code\": \"10200018090\",\r\n \"Name\": \"Al Amir Abdoulmajed\",\r\n \"CenterGeoPoint\": \"21.4212274805266,39.2737992809379\",\r\n \"LocalizedName\": \"الامير عبدالمجيد\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"3022\",\r\n \"Code\": \"10200018097\",\r\n \"Name\": \"Al Fadel\",\r\n \"CenterGeoPoint\": \"21.4336677178289,39.3267678287265\",\r\n \"LocalizedName\": \"الفضل\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"3018\",\r\n \"Code\": \"10200018093\",\r\n \"Name\": \"Al Amir Fawaz Al Janouby\",\r\n \"CenterGeoPoint\": \"21.4311283021384,39.2927792215279\",\r\n \"LocalizedName\": \"الامير فواز الجنوبى\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"3017\",\r\n \"Code\": \"10200018092\",\r\n \"Name\": \"Al Jawharah\",\r\n \"CenterGeoPoint\": \"21.4319846690575,39.2513370494866\",\r\n \"LocalizedName\": \"الجوهرة\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"3029\",\r\n \"Code\": \"10200018105\",\r\n \"Name\": \"Abhur Al Janubiyah\",\r\n \"CenterGeoPoint\": \"21.7354934911834,39.1304009150986\",\r\n \"LocalizedName\": \"ابحر الجنوبية\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"3021\",\r\n \"Code\": \"10200018096\",\r\n \"Name\": \"Ar Rawabi\",\r\n \"CenterGeoPoint\": \"21.4702649967328,39.2679505694233\",\r\n \"LocalizedName\": \"الروابي\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"3035\",\r\n \"Code\": \"10200018110\",\r\n \"Name\": \"Madain Al Fahd\",\r\n \"CenterGeoPoint\": \"21.4597703239166,39.2384403803596\",\r\n \"LocalizedName\": \"مدائن الفهد\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"3042\",\r\n \"Code\": \"10200018117\",\r\n \"Name\": \"Al Harazat Dist\",\r\n \"CenterGeoPoint\": \"21.491435788704,39.3687058367116\",\r\n \"LocalizedName\": \"حي الحرازات\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"3038\",\r\n \"Code\": \"10200018113\",\r\n \"Name\": \"Al Faiha\",\r\n \"CenterGeoPoint\": \"21.4998907343216,39.2178380088315\",\r\n \"LocalizedName\": \"الفيحاء\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"3037\",\r\n \"Code\": \"10200018112\",\r\n \"Name\": \"Al Hamra\",\r\n \"CenterGeoPoint\": \"21.5276194290346,39.1638569912337\",\r\n \"LocalizedName\": \"الحمراء\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"3041\",\r\n \"Code\": \"10200018116\",\r\n \"Name\": \"Al Wafa Dist\",\r\n \"CenterGeoPoint\": \"21.8431346816833,39.234690242858\",\r\n \"LocalizedName\": \"حي الوفاء\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"2943\",\r\n \"Code\": \"10200018018\",\r\n \"Name\": \"Ar Rayaan\",\r\n \"CenterGeoPoint\": \"21.6856799389948,39.2095079045215\",\r\n \"LocalizedName\": \"الريان\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"2927\",\r\n \"Code\": \"10200018002\",\r\n \"Name\": \"Al Loaloa\",\r\n \"CenterGeoPoint\": \"21.7672676124362,39.0610398095582\",\r\n \"LocalizedName\": \"اللؤلؤ\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"2963\",\r\n \"Code\": \"10200018038\",\r\n \"Name\": \"King Faisal Naval Base\",\r\n \"CenterGeoPoint\": \"21.3591342507103,39.173480118485\",\r\n \"LocalizedName\": \"قاعدة الملك فيصل البحرية\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"2947\",\r\n \"Code\": \"10200018023\",\r\n \"Name\": \"Al Balad\",\r\n \"CenterGeoPoint\": \"21.4830278802907,39.1867183074219\",\r\n \"LocalizedName\": \"البلد\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"2983\",\r\n \"Code\": \"10200018059\",\r\n \"Name\": \"Ghulail\",\r\n \"CenterGeoPoint\": \"21.4532773286518,39.2051102156372\",\r\n \"LocalizedName\": \"غليل\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"2967\",\r\n \"Code\": \"10200018042\",\r\n \"Name\": \"At Tadamon\",\r\n \"CenterGeoPoint\": \"21.3410002686605,39.3044892927943\",\r\n \"LocalizedName\": \"التضامن\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"3003\",\r\n \"Code\": \"10200018078\",\r\n \"Name\": \"Taibah\",\r\n \"CenterGeoPoint\": \"21.8048685118649,39.139343819377\",\r\n \"LocalizedName\": \"طيبة\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"2987\",\r\n \"Code\": \"10200018062\",\r\n \"Name\": \"As Sahifah\",\r\n \"CenterGeoPoint\": \"21.4876919854079,39.1953619276571\",\r\n \"LocalizedName\": \"الصحيفة\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"3023\",\r\n \"Code\": \"10200018098\",\r\n \"Name\": \"Um Asalam\",\r\n \"CenterGeoPoint\": \"21.4555030024394,39.345864082845\",\r\n \"LocalizedName\": \"ام السلم\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"3007\",\r\n \"Code\": \"10200018082\",\r\n \"Name\": \"An Nuzhah\",\r\n \"CenterGeoPoint\": \"21.6253663011391,39.1666401088006\",\r\n \"LocalizedName\": \"النزهة\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"3043\",\r\n \"Code\": \"10200018118\",\r\n \"Name\": \"Al Mahamid Dist\",\r\n \"CenterGeoPoint\": \"21.4505661730799,39.3980734806654\",\r\n \"LocalizedName\": \"حي المحاميد\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"3027\",\r\n \"Code\": \"10200018101\",\r\n \"Name\": \"Abhur Ash Shamaliyah\",\r\n \"CenterGeoPoint\": \"21.7449862799291,39.1045850669009\",\r\n \"LocalizedName\": \"ابحر الشمالية\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"2928\",\r\n \"Code\": \"10200018003\",\r\n \"Name\": \"Al Yaqoot\",\r\n \"CenterGeoPoint\": \"21.7831518978085,39.0795291002573\",\r\n \"LocalizedName\": \"الياقوت\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"2954\",\r\n \"Code\": \"10200018029\",\r\n \"Name\": \"Al Khalidiyah\",\r\n \"CenterGeoPoint\": \"21.5604272731665,39.1342158815598\",\r\n \"LocalizedName\": \"الخالدية\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"2948\",\r\n \"Code\": \"10200018022\",\r\n \"Name\": \"Ath Thaalibah\",\r\n \"CenterGeoPoint\": \"21.4645965773326,39.1858646075276\",\r\n \"LocalizedName\": \"الثعالبة\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"2974\",\r\n \"Code\": \"10200018048\",\r\n \"Name\": \"Al Qouzeen\",\r\n \"CenterGeoPoint\": \"21.2627960862412,39.1700486184117\",\r\n \"LocalizedName\": \"القوزين\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"2968\",\r\n \"Code\": \"10200018043\",\r\n \"Name\": \"Al Karamah\",\r\n \"CenterGeoPoint\": \"21.3044539094277,39.3123608875024\",\r\n \"LocalizedName\": \"الكرامة\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"2988\",\r\n \"Code\": \"10200018063\",\r\n \"Name\": \"As Sabil\",\r\n \"CenterGeoPoint\": \"21.4808314597072,39.2012353527909\",\r\n \"LocalizedName\": \"السبيل\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"3008\",\r\n \"Code\": \"10200018083\",\r\n \"Name\": \"As Safa\",\r\n \"CenterGeoPoint\": \"21.5849673400037,39.2121801899068\",\r\n \"LocalizedName\": \"الصفا\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"3028\",\r\n \"Code\": \"10200018103\",\r\n \"Name\": \"Petromin\",\r\n \"CenterGeoPoint\": \"21.4459152154737,39.1827618473826\",\r\n \"LocalizedName\": \"بترومين\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"2994\",\r\n \"Code\": \"10200018069\",\r\n \"Name\": \"Mishrifah\",\r\n \"CenterGeoPoint\": \"21.5394113954549,39.1969998020665\",\r\n \"LocalizedName\": \"مشرفة\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"3014\",\r\n \"Code\": \"10200018089\",\r\n \"Name\": \"Industrial Area\",\r\n \"CenterGeoPoint\": \"21.4000670222306,39.2385276797543\",\r\n \"LocalizedName\": \"المنطقة الصناعية\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"2939\",\r\n \"Code\": \"10200018014\",\r\n \"Name\": \"Al Frosyah\",\r\n \"CenterGeoPoint\": \"21.8252114290846,39.205522315185\",\r\n \"LocalizedName\": \"الفروسية\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"3034\",\r\n \"Code\": \"10200018108\",\r\n \"Name\": \"Al Ajaweed\",\r\n \"CenterGeoPoint\": \"21.4030231879873,39.3098923363922\",\r\n \"LocalizedName\": \"الاجاويد\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"2959\",\r\n \"Code\": \"10200018034\",\r\n \"Name\": \"Al Bawadi\",\r\n \"CenterGeoPoint\": \"21.5989141681331,39.1656868835651\",\r\n \"LocalizedName\": \"البوادي\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"2979\",\r\n \"Code\": \"10200018054\",\r\n \"Name\": \"Ad Dahiah\",\r\n \"CenterGeoPoint\": \"21.307360182611,39.2112740950127\",\r\n \"LocalizedName\": \"الضاحية\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"2999\",\r\n \"Code\": \"10200018074\",\r\n \"Name\": \"As Sahil\",\r\n \"CenterGeoPoint\": \"21.299414479676,39.1319733737276\",\r\n \"LocalizedName\": \"الساحل\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"3019\",\r\n \"Code\": \"10200018094\",\r\n \"Name\": \"Al Mutanazahat\",\r\n \"CenterGeoPoint\": \"21.468683580239,39.2901957794546\",\r\n \"LocalizedName\": \"المتنزهات\",\r\n \"StoreNo\": \"407\"\r\n },\r\n {\r\n \"Id\": \"3039\",\r\n \"Code\": \"10200018114\",\r\n \"Name\": \"Bahrah\",\r\n \"CenterGeoPoint\": \"21.4104604749936,39.4634089479979\",\r\n \"LocalizedName\": \"بحرة\",\r\n \"StoreNo\": \"407\"\r\n }\r\n]\r\n\r\n*/\r\n","import { env, apimKey } from \"../../../config\";\r\nimport log from \"../../../utils/log\";\r\n\r\nexport default async function fetchStoresAsync(cityId, serviceType, serviceId) {\r\n log(\"fetchStoresAsync\", \"request\", ...arguments);\r\n\r\n const baseUrl = `https://apim-ikeasa.azure-api.net/GetStores/${env}/`;\r\n const response = await fetch(\r\n baseUrl + `${cityId}/${serviceType}/${serviceId}`,\r\n {\r\n headers: {\r\n \"Ocp-Apim-Subscription-Key\": apimKey,\r\n },\r\n }\r\n );\r\n\r\n if (response.status === 200) {\r\n const json = await response.json();\r\n log(\"fetchStoresAsync\", \"response\", json);\r\n\r\n return json.Stores[0];\r\n }\r\n\r\n throw new Error(response.status);\r\n}\r\n\r\n/*\r\n{\r\n \"Stores\": [\r\n [{\r\n \"DisplayAddress\": \"Eastern Ring Rd, Riyadh 12863\",\r\n \"DisplayAddressLocalized\": \"الطريق الدائري الشرقي، الرياض 12863\",\r\n \"DisplayOrder\": \"1\",\r\n \"Id\": \"60295\",\r\n \"LocalizedName\": \"معرض ايكيا - الرياض\",\r\n \"Name\": \"IKEA Planning Store - Riyadh\",\r\n \"PostalCode\": \"25006\",\r\n \"ServiceURL\": \"http://192.168.85.24:7047/DynamicsNAV/WS/IKEA%20Store%20Riyadh%20(New)/Page/OnlineServiceOrders\",\r\n \"StoreNo\": \"197\",\r\n \"Type\": \"Store\",\r\n \"WorkingHour\": \"\",\r\n \"WorkingHourLocalized\": \"\"\r\n }, {\r\n \"DisplayAddress\": \"Eastern Ring Rd, Riyadh 12863\",\r\n \"DisplayAddressLocalized\": \"الطريق الدائري الشرقي، الرياض 12863\",\r\n \"DisplayOrder\": \"2\",\r\n \"Id\": \"60296\",\r\n \"LocalizedName\": \"معرض ايكيا - الرياض\",\r\n \"Name\": \"IKEA Planning Studio - Riyadh\",\r\n \"PostalCode\": \"25005\",\r\n \"ServiceURL\": \"http://192.168.85.24:7047/DynamicsNAV/WS/IKEA%20Store%20Riyadh%20(New)/Page/OnlineServiceOrders\",\r\n \"StoreNo\": \"STUDIO\",\r\n \"Type\": \"Store\",\r\n \"WorkingHour\": \"\",\r\n \"WorkingHourLocalized\": \"\"\r\n }]\r\n ]\r\n}\r\n\r\n*/\r\n","import React, { useState, useEffect } from \"react\";\r\nimport { useTranslation } from \"react-i18next\";\r\n\r\nimport { makeStyles } from \"@material-ui/core/styles\";\r\nimport CircularProgress from \"@material-ui/core/CircularProgress\";\r\nimport Grid from \"@material-ui/core/Grid\";\r\nimport Typography from \"@material-ui/core/Typography\";\r\nimport InputLabel from \"@material-ui/core/InputLabel\";\r\nimport MenuItem from \"@material-ui/core/MenuItem\";\r\nimport FormHelperText from \"@material-ui/core/FormHelperText\";\r\nimport FormControl from \"@material-ui/core/FormControl\";\r\nimport Select from \"@material-ui/core/Select\";\r\nimport TextField from \"@material-ui/core/TextField\";\r\nimport Autocomplete from \"@material-ui/lab/Autocomplete\";\r\n\r\n// API\r\nimport fetchCitiesAsync from \"./api/fetchCitiesAsync\";\r\nimport fetchDistrictsAsync from \"./api/fetchDistrictsAsync\";\r\nimport fetchStoresAsync from \"./api/fetchStoresAsync\";\r\n\r\nimport isMeasurement from \"../../utils/isMeasurement\";\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n spinnerProgress: {\r\n position: \"absolute\",\r\n top: \"50%\",\r\n left: \"90%\",\r\n marginTop: -5,\r\n marginLeft: -5,\r\n },\r\n}));\r\n\r\nexport default function AddressPage({ fields, errors, handleChange }) {\r\n const { t, i18n } = useTranslation();\r\n const classes = useStyles();\r\n\r\n const [loadingCities, setLoadingCities] = React.useState(false);\r\n const [loadingDistricts, setLoadingDistricts] = React.useState(false);\r\n const [loadingStores, setLoadingStores] = React.useState(false);\r\n const [showNoServicesError, setShowNoServicesError] = useState(false);\r\n\r\n const [cities, setCities] = useState([]);\r\n const [districts, setDistricts] = useState([]);\r\n const [stores, setStores] = useState([]);\r\n\r\n // componentDidMount\r\n useEffect(() => {\r\n fetchCities();\r\n\r\n if (fields.city) {\r\n if (isMeasurement(fields.service)) {\r\n fetchDistricts(fields.city.Id, fields.service.ServiceId);\r\n }\r\n\r\n fetchStores(fields.city.Id, fields.service.Service_Type, fields.service.ServiceId);\r\n }\r\n\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n const fetchCities = () => {\r\n if (!loadingCities) {\r\n setLoadingCities(true);\r\n\r\n fetchCitiesAsync().then((cities) => {\r\n setCities(cities);\r\n setLoadingCities(false);\r\n });\r\n }\r\n };\r\n\r\n const fetchDistricts = (cityId, serviceId) => {\r\n if (!loadingDistricts) {\r\n setLoadingDistricts(true);\r\n\r\n fetchDistrictsAsync(cityId, serviceId).then((districts) => {\r\n setDistricts(districts);\r\n setLoadingDistricts(false);\r\n });\r\n }\r\n };\r\n\r\n const fetchStores = (cityId, serviceType, serviceId) => {\r\n if (!loadingStores) {\r\n setLoadingStores(true);\r\n\r\n fetchStoresAsync(cityId, serviceType, serviceId).then((stores) => {\r\n setStores(stores);\r\n setLoadingStores(false);\r\n\r\n // if no stores, show an error message\r\n stores.length === 0 ? setShowNoServicesError(true) : setShowNoServicesError(false);\r\n\r\n // if in measurement and only one store found, select it automatically\r\n if (isMeasurement(fields.service) && stores.length === 1) {\r\n handleChange(\"store\")(stores[0]);\r\n }\r\n });\r\n }\r\n };\r\n\r\n const handleCityChange = (e, city) => {\r\n // get object and store in state\r\n //const city = cities.find((city) => city.Id === e.target.value);\r\n handleChange(\"city\")(city);\r\n\r\n // reset district when city is changed (don't run validation on district doValidation: false)\r\n handleChange(\"district\", false)(\"\");\r\n setDistricts([]);\r\n\r\n // reset store when city is changed\r\n handleChange(\"store\", false)(\"\");\r\n setStores([]);\r\n\r\n // load districts for selected city, if any\r\n if (city) {\r\n if (isMeasurement(fields.service)) {\r\n fetchDistricts(city.Id, fields.service.ServiceId);\r\n }\r\n\r\n fetchStores(city.Id, fields.service.Service_Type, fields.service.ServiceId);\r\n }\r\n };\r\n\r\n const handleDistrictChange = (e, district) => {\r\n // get object\r\n // const district = districts.find(\r\n // (district) => district.Id === e.target.value\r\n // );\r\n\r\n // store in state\r\n handleChange(\"district\")(district);\r\n };\r\n\r\n const handleStoreChange = (e) => {\r\n // get object\r\n const store = stores.find((store) => store.Id === e.target.value);\r\n\r\n // store in state\r\n handleChange(\"store\")(store);\r\n };\r\n\r\n return (\r\n
\r\n \r\n {t(\"Select your city and district\")}:\r\n \r\n\r\n \r\n \r\n \r\n {\r\n let result = i18n.language === \"ar\" ? city.LocalizedName : city.Name;\r\n return result === undefined ? \"\" : result;\r\n }}\r\n id=\"city-select\"\r\n value={fields.city}\r\n onChange={handleCityChange}\r\n renderInput={(params) => (\r\n \r\n )}\r\n />\r\n {loadingCities && }\r\n {!!errors[\"city\"] && {errors[\"city\"]}}\r\n {showNoServicesError && (\r\n {t(\"Sorry, selected service is not available for your city.\")}\r\n )}\r\n \r\n \r\n\r\n {isMeasurement(fields.service) && (\r\n \r\n \r\n {\r\n let result = i18n.language === \"ar\" ? district.LocalizedName : district.Name;\r\n return result === undefined ? \"\" : result;\r\n }}\r\n id=\"district-select\"\r\n value={fields.district}\r\n onChange={handleDistrictChange}\r\n renderInput={(params) => (\r\n \r\n )}\r\n />\r\n {loadingDistricts && }\r\n {errors[\"district\"]}\r\n \r\n \r\n )}\r\n\r\n {isMeasurement(fields.service) ? ( // measurement only\r\n stores.length > 1 && ( // don't show store dropdown only one store provided\r\n \r\n \r\n {t(\"Store\")}\r\n \r\n {stores &&\r\n stores.map((store) => (\r\n \r\n {i18n.language === \"ar\" ? store.LocalizedName : store.Name}\r\n \r\n ))}\r\n \r\n {loadingStores && }\r\n {errors[\"store\"]}\r\n \r\n \r\n )\r\n ) : (\r\n // for planning, always show store dropdown\r\n \r\n \r\n {t(\"Store\")}\r\n \r\n {stores &&\r\n stores.map((store) => (\r\n \r\n {i18n.language === \"ar\" ? store.LocalizedName : store.Name}\r\n \r\n ))}\r\n \r\n {loadingStores && }\r\n {errors[\"store\"]}\r\n \r\n \r\n )}\r\n \r\n
\r\n );\r\n}\r\n","import { env, apimKey } from \"../../../config\";\r\nimport log from \"../../../utils/log\";\r\n\r\nexport default async function fetchServicesAsync() {\r\n const baseUrl = `https://apim-ikeasa.azure-api.net/GetServices/${env}/v2/`;\r\n const response = await fetch(baseUrl, {\r\n headers: {\r\n \"Ocp-Apim-Subscription-Key\": apimKey,\r\n },\r\n });\r\n\r\n if (response.status === 200) {\r\n // QueueId will be empty for measurement\r\n const json = await response.json();\r\n log(\"fetchServicesAsync\", \"response\", json);\r\n\r\n return json.Services;\r\n }\r\n\r\n throw new Error(response.status);\r\n}\r\n\r\n/*\r\n[\r\n {\r\n \"AgentCode\": \"PL-KIT-O\",\r\n \"NAVItemNo\": \"999999991\",\r\n \"ServiceId\": \"1000001\",\r\n \"ServiceName_En\": \"Kitchen planning\\r\\n\",\r\n \"ServiceName_Ar\": \"تخطيط المطبخ\\r\\n\",\r\n \"Service_Desc_En\": \"Plan your dream kitchen online with the help of our team of professionals. Our team will connect remotely with you for the planning. The service fee is refundable after your kitchen purchase.\\r\\n\",\r\n \"Service_Desc_Ar\": \"خطط مطبخ أحلامك على موقعنا بالانترنت بمساعدة من فريقنا المختص. سيقوم فريقنا بالاتصال بك عن بعد للتخطيط. رسوم الخدمة قابلة للاسترداد في حالة شراء المطبخ.\\r\\n\",\r\n \"Service_Fee\": \"150\",\r\n \"Service_Type\": \"Online\",\r\n \"Order_Type\": \"POS\",\r\n \"QueueId\": \"64aa8a7f-a616-44e8-806a-165e08d91192\"\r\n },\r\n {\r\n \"AgentCode\": \"PL-KIT-S\",\r\n \"NAVItemNo\": \"999999992\\r\\n\",\r\n \"ServiceId\": \"1000002\",\r\n \"ServiceName_En\": \"Kitchen planning\\r\\n\",\r\n \"ServiceName_Ar\": \"تخطيط المطبخ\\r\\n\",\r\n \"Service_Desc_En\": \"Plan your dream kitchen in-store with the help of our team of professionals. Our team will help you at IKEA store or Planning Studio. The service fee is refundable after your kitchen purchase.\\r\\n\",\r\n \"Service_Desc_Ar\": \"خطط مطبخ أحلامك في المعرض بمساعدة من فريقنا المختص. سيساعدك فريقنا في معرض ايكيا أو استوديو التخطيط. رسوم الخدمة قابلة للاسترداد في حالة شراء المطبخ.\\r\\n\",\r\n \"Service_Fee\": \"150\",\r\n \"Service_Type\": \"Store\",\r\n \"Order_Type\": \"POS\"\r\n },\r\n {\r\n \"AgentCode\": \"CO-MEA\",\r\n \"NAVItemNo\": \"99999999\",\r\n \"ServiceId\": \"1000003\",\r\n \"ServiceName_En\": \"Kitchen Measurement\",\r\n \"ServiceName_Ar\": \"قياس المطبخ\",\r\n \"Service_Desc_En\": \"Those small details matter. So, we’ll pay you a visit at home or in your office to measure your space before the real planning begins. The service fee is refundable after your kitchen purchase.\\r\\n\",\r\n \"Service_Desc_Ar\": \"هناك بعض التفاصيل الصغيرة التي تعتبر مهمة بالنسبة لنا. لذلك، سنقوم بزيارة منزلك أو مكتبك لقياس مساحتك قبل بدء عملية التخطيط الفعلية. رسوم الخدمة قابلة للاسترداد في حالة شراء المطبخ.\\r\\n\",\r\n \"Service_Fee\": \"150\",\r\n \"Service_Type\": \"Home\",\r\n \"Order_Type\": \"CO\"\r\n },\r\n {\r\n \"AgentCode\": \"PL-BED-O\",\r\n \"NAVItemNo\": \"999999993\",\r\n \"ServiceId\": \"1000004\",\r\n \"ServiceName_En\": \"Wardrobe planning (PAX & PLATSA)\\r\\n\",\r\n \"ServiceName_Ar\": \"تخطيط دولاب الملابس (PAX & PLATSA)\\r\\n\",\r\n \"Service_Desc_En\": \"Plan the best storage solutions for your bedroom online with the help of our team of professionals. Our team will connect remotely with you for the planning.\\r\\n\",\r\n \"Service_Desc_Ar\": \"خطط أفضل حلول التخزين لغرفة نومك على موقعنا بالانترنت بمساعدة من فريقنا المختص. سيقوم فريقنا بالاتصال بك عن بعد للتخطيط.\\r\\n\",\r\n \"Service_Fee\": \"0\",\r\n \"Service_Type\": \"Online\",\r\n \"Order_Type\": \"POS\"\r\n },\r\n {\r\n \"AgentCode\": \"PL-BED-S\",\r\n \"NAVItemNo\": \"999999994\",\r\n \"ServiceId\": \"1000005\",\r\n \"ServiceName_En\": \"Wardrobe planning (PAX & PLATSA)\\r\\n\",\r\n \"ServiceName_Ar\": \"تخطيط دولاب الملابس (PAX & PLATSA)\\r\\n\",\r\n \"Service_Desc_En\": \"Plan the best storage solutions for your bedroom in-store with the help of our team of professionals. Our team will help you at IKEA store or Planning Studio.\\r\\n\",\r\n \"Service_Desc_Ar\": \"خطط أفضل حلول التخزين لغرفة نومك في المعرض بمساعدة من فريقنا المختص. سيساعدك فريقنا في معرض ايكيا أو استوديو التخطيط.\\r\\n\",\r\n \"Service_Fee\": \"0\",\r\n \"Service_Type\": \"Store\",\r\n \"Order_Type\": \"POS\"\r\n },\r\n {\r\n \"AgentCode\": \"PL-BATH-O\",\r\n \"NAVItemNo\": \"999999995\",\r\n \"ServiceId\": \"1000006\",\r\n \"ServiceName_En\": \"Bathroom planning\\r\\n\",\r\n \"ServiceName_Ar\": \"تخطيط الحمام\",\r\n \"Service_Desc_En\": \"Plan your dream Bathroom online with the help of our team of professionals. Our team will connect remotely with you for the planning.\\r\\n\",\r\n \"Service_Desc_Ar\": \"خطط حمام أحلامك على موقعنا بالانترنت بمساعدة من فريقنا المختص. سيقوم فريقنا بالاتصال بك عن بعد للتخطيط.\\r\\n\",\r\n \"Service_Fee\": \"0\",\r\n \"Service_Type\": \"Online\",\r\n \"Order_Type\": \"POS\"\r\n },\r\n {\r\n \"AgentCode\": \"PL-BATH-S\",\r\n \"NAVItemNo\": \"999999996\\r\\n\",\r\n \"ServiceId\": \"1000007\",\r\n \"ServiceName_En\": \"Bathroom planning\\r\\n\",\r\n \"ServiceName_Ar\": \"تخطيط الحمام\",\r\n \"Service_Desc_En\": \"Plan your dream Bathroom in-store with the help of our team of professionals. Our team will help you at IKEA store or Planning Studio.\\r\\n\",\r\n \"Service_Desc_Ar\": \"خطط حمام أحلامك في المعرض بمساعدة من فريقنا المختص. سيساعدك فريقنا في معرض ايكيا أو استوديو التخطيط.\\r\\n\",\r\n \"Service_Fee\": \"0\",\r\n \"Service_Type\": \"Store\",\r\n \"Order_Type\": \"POS\"\r\n },\r\n {\r\n \"AgentCode\": \"PL-LIV-O\",\r\n \"NAVItemNo\": \"999999997\",\r\n \"ServiceId\": \"1000008\",\r\n \"ServiceName_En\": \"Living room storage planning\\r\\n\",\r\n \"ServiceName_Ar\": \"تخطيط تخزين غرفة الجلوس\\r\\n\",\r\n \"Service_Desc_En\": \"Plan the best storage solutions for your living room online with the help of our team of professionals.\\r\\n\",\r\n \"Service_Desc_Ar\": \"خطط أفضل حلول التخزين لغرفة جلوسك على موقعنا بالانترنت بمساعدة من فريقنا المختص.\\r\\n\",\r\n \"Service_Fee\": \"0\",\r\n \"Service_Type\": \"Online\",\r\n \"Order_Type\": \"POS\"\r\n },\r\n {\r\n \"AgentCode\": \"PL-LIV-S\",\r\n \"NAVItemNo\": \"999999998\",\r\n \"ServiceId\": \"1000009\",\r\n \"ServiceName_En\": \"Living room storage planning\\r\\n\",\r\n \"ServiceName_Ar\": \"تخطيط تخزين غرفة الجلوس\\r\\n\",\r\n \"Service_Desc_En\": \"Plan the best storage solutions for your living room in-store with the help of our team of professionals. Our team will help you at IKEA store or Planning Studio.\\r\\n\",\r\n \"Service_Desc_Ar\": \"خطط أفضل حلول التخزين لغرفة جلوسك في المعرض بمساعدة من فريقنا المختص. سيساعدك فريقنا في معرض ايكيا أو استوديو التخطيط. \\r\\n\",\r\n \"Service_Fee\": \"0\",\r\n \"Service_Type\": \"Store\",\r\n \"Order_Type\": \"POS\"\r\n }\r\n]\r\n\r\n*/\r\n","import React, { useState, useEffect } from \"react\";\r\n//import { trackPromise } from \"react-promise-tracker\";\r\nimport { useTranslation } from \"react-i18next\";\r\n\r\nimport { makeStyles } from \"@material-ui/core/styles\";\r\nimport CircularProgress from \"@material-ui/core/CircularProgress\";\r\nimport Grid from \"@material-ui/core/Grid\";\r\nimport Typography from \"@material-ui/core/Typography\";\r\nimport InputLabel from \"@material-ui/core/InputLabel\";\r\nimport MenuItem from \"@material-ui/core/MenuItem\";\r\nimport FormHelperText from \"@material-ui/core/FormHelperText\";\r\nimport FormControl from \"@material-ui/core/FormControl\";\r\nimport Select from \"@material-ui/core/Select\";\r\nimport FormControlLabel from \"@material-ui/core/FormControlLabel\";\r\nimport Checkbox from \"@material-ui/core/Checkbox\";\r\nimport Box from \"@material-ui/core/Box\";\r\n\r\n// API\r\nimport fetchServicesAsync from \"./api/fetchServicesAsync\";\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n spinnerProgress: {\r\n position: \"absolute\",\r\n top: \"50%\",\r\n left: \"90%\",\r\n marginTop: -5,\r\n marginLeft: -5,\r\n },\r\n}));\r\n\r\nexport default function ServicePage({ fields, servicesWithDisclaimer, errors, handleChange }) {\r\n const classes = useStyles();\r\n const [loadingServices, setLoadingServices] = React.useState(false);\r\n\r\n const [services, setServices] = useState([]);\r\n const { t, i18n } = useTranslation();\r\n\r\n // componentDidMount\r\n useEffect(() => {\r\n fetchServices();\r\n\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n const fetchServices = () => {\r\n if (!loadingServices) {\r\n setLoadingServices(true);\r\n\r\n fetchServicesAsync().then((services) => {\r\n setServices(services);\r\n setLoadingServices(false);\r\n });\r\n }\r\n };\r\n\r\n const handleServiceChange = (e) => {\r\n // get object and store it in state\r\n const service = services.find((service) => service.ServiceId === e.target.value);\r\n\r\n handleChange(\"service\")(service);\r\n };\r\n\r\n return (\r\n
\r\n \r\n {t(\"Choose your required service\")}:\r\n \r\n\r\n \r\n \r\n \r\n {t(\"Service\")}\r\n \r\n {services &&\r\n services.map((service) => {\r\n const serviceName = i18n.language === \"ar\" ? service.ServiceName_Ar : service.ServiceName_En;\r\n const serviceType = t(service.Service_Type);\r\n\r\n // multiple condition\r\n const serviceCost =\r\n service.Service_Fee === \"0\" ? t(\"Free\") : i18n.language === \"ar\" ? service.Service_Fee + \" ريال\" : \"SR. \" + service.Service_Fee;\r\n\r\n return (\r\n \r\n {serviceName} ({serviceType}) {serviceCost}\r\n \r\n );\r\n })}\r\n \r\n {loadingServices && }\r\n {errors[\"service\"]}\r\n \r\n\r\n {fields.service !== \"\" ? (\r\n \r\n {i18n.language === \"ar\" ? fields.service.Service_Desc_Ar : fields.service.Service_Desc_En}\r\n \r\n ) : (\r\n \"\"\r\n )}\r\n\r\n {/* Disclaimer displayed only for services requiring it */}\r\n {servicesWithDisclaimer.includes(fields.service.ServiceId) ? (\r\n \r\n \r\n {t(\"Disclaimer\")}\r\n \r\n \r\n }\r\n label={\r\n
\r\n

{t(\"Kitchen measurement is required to be completed by IKEA team before Kitchen planning can be conducted.\")}

\r\n

{t(\"The kitchen planning appointment is appliable for one kitchen plan only.\")}

\r\n
\r\n }\r\n labelPlacement=\"end\"\r\n />\r\n {!!errors[\"measurementDisclaimer\"] ? {errors[\"measurementDisclaimer\"]} : \"\"}\r\n
\r\n
\r\n ) : (\r\n \"\"\r\n )}\r\n
\r\n
\r\n
\r\n );\r\n}\r\n","import { env, apimKey } from \"../../../config\";\r\nimport { SERVICE_TYPE } from \"../../../types\";\r\nimport log from \"../../../utils/log\";\r\n\r\nexport default async function fetchTimeslotsAsync({\r\n uuid,\r\n agentCode,\r\n postCode,\r\n dayCount,\r\n storeNo,\r\n queueId,\r\n}) {\r\n log(\"fetchTimeslotsAsync\", \"request\", ...arguments);\r\n\r\n const baseUrl = `https://apim-ikeasa.azure-api.net/GetTMSSlots/${env}/v2/`;\r\n const response = await fetch(baseUrl, {\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n \"Ocp-Apim-Subscription-Key\": apimKey,\r\n },\r\n method: \"post\",\r\n body: JSON.stringify({\r\n AgentCode: agentCode, //\"PL-KIT-O\",\r\n OrderNumber: uuid, //\"1000000001\",\r\n PostCode: postCode, // \"10100003119\",\r\n SlotsToShow: dayCount, //\"30\",\r\n StoreNo: storeNo, // \"505\",\r\n QueueId: queueId, // \"64aa8a7f-a616-44e8-806a-165e08d91192\"\r\n }),\r\n });\r\n\r\n if (response.status === 200) {\r\n const json = await response.json();\r\n log(\"fetchTimeslotsAsync\", \"response\", json);\r\n const timeslots = [];\r\n\r\n // ResponseCode 421 means no timeslots should be displayed no matter what was returned in Array.\r\n if (\r\n json.timeslots !== undefined &&\r\n json.ResponseCode !== \"421\" &&\r\n json.timeslots.length > 0\r\n ) {\r\n let counter = 0;\r\n json.timeslots.forEach((ts) => {\r\n if (json.ServiceType.toUpperCase() === SERVICE_TYPE.OMBORI) {\r\n // OMBORI\r\n //const actual_date = ts.start.split(\"T\")[0] + \"T00:00:00\";\r\n //const start_time = ts.start.split(\"T\")[1].split(\".\")[0];\r\n //const end_time = ts.end.split(\"T\")[1].split(\".\")[0];\r\n //const date = ts.start.split(\"T\")[0].replaceAll(\"-\", \"\");\r\n\r\n // using startLocal/endLocal instead of start and end\r\n const actual_date = ts.startLocal.split(\"T\")[0] + \"T00:00:00\";\r\n const start_time = ts.startLocal.split(\"T\")[1].split(\"+\")[0];\r\n const end_time = ts.endLocal.split(\"T\")[1].split(\"+\")[0];\r\n const date = ts.startLocal.split(\"T\")[0].replaceAll(\"-\", \"\");\r\n const slotStart = ts.startLocal.split(\"+\")[0];\r\n const slotEnd = ts.endLocal.split(\"+\")[0];\r\n\r\n counter++;\r\n\r\n timeslots.push({\r\n id: date + \"_\" + counter,\r\n date: date,\r\n actual_date: actual_date,\r\n start_time: start_time,\r\n end_time: end_time,\r\n slotstart: slotStart,\r\n slotend: slotEnd,\r\n message: ts.availableCapacity,\r\n status: ts.available,\r\n type: SERVICE_TYPE.OMBORI,\r\n orderGUID: json.orderGUID,\r\n });\r\n } else {\r\n // IKEA\r\n timeslots.push({\r\n id: ts.id,\r\n date: ts.date,\r\n actual_date: ts.actual_date,\r\n start_time: ts.start_time,\r\n slotstart: ts.slotstart,\r\n end_time: ts.end_time,\r\n slotend: ts.slotend,\r\n message: ts.message,\r\n status: ts.status,\r\n type: \"IKEA\",\r\n orderGUID: json.orderGUID,\r\n });\r\n }\r\n });\r\n }\r\n\r\n log(\"fetchTimeslotsAsync\", \"response processed\", timeslots);\r\n return timeslots; //.sort(sortTimeslotsBy(\"start_time\"));\r\n }\r\n\r\n throw new Error(response.status);\r\n}\r\n\r\n// function sortTimeslotsBy(prop) {\r\n// return function (a, b) {\r\n// if (a[prop] > b[prop]) {\r\n// return 1;\r\n// } else if (a[prop] < b[prop]) {\r\n// return -1;\r\n// }\r\n\r\n// return 0;\r\n// };\r\n// }\r\n\r\n/*\r\n{\r\n \"id\": \"225107941_3476935\",\r\n \"date\": \"20200914\",\r\n \"actual_date\": \"2020-09-14T00:00:00\",\r\n \"start_time\": \"14:00:00\",\r\n \"slotstart\": \"2020-09-14T14:00:00\",\r\n \"end_time\": \"21:00:00\",\r\n \"slotend\": \"2020-09-14T21:00:00\",\r\n \"message\": \"\",\r\n \"status\": \"Success\"\r\n}\r\n*/\r\n","import React, { useState, useEffect } from \"react\";\r\nimport { addDays } from \"date-fns\";\r\nimport Calendar from \"react-calendar\";\r\n//import { trackPromise } from \"react-promise-tracker\";\r\nimport { useTranslation } from \"react-i18next\";\r\n\r\nimport { makeStyles } from \"@material-ui/core/styles\";\r\nimport CircularProgress from \"@material-ui/core/CircularProgress\";\r\nimport Grid from \"@material-ui/core/Grid\";\r\nimport Typography from \"@material-ui/core/Typography\";\r\nimport InputLabel from \"@material-ui/core/InputLabel\";\r\nimport MenuItem from \"@material-ui/core/MenuItem\";\r\nimport FormHelperText from \"@material-ui/core/FormHelperText\";\r\nimport FormControl from \"@material-ui/core/FormControl\";\r\nimport Select from \"@material-ui/core/Select\";\r\nimport Modal from \"@material-ui/core/Modal\";\r\n\r\nimport { getDateRange, formatTime } from \"../../utils/formatTime\";\r\nimport isMeasurement from \"../../utils/isMeasurement\";\r\n\r\nimport \"./timeslot.page.scss\";\r\n\r\n// API\r\nimport fetchTimeslotsAsync from \"./api/fetchTimeslotsAsync\";\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n modal: {\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n },\r\n paper: {\r\n backgroundColor: theme.palette.background.paper,\r\n border: \"2px solid #000\",\r\n boxShadow: theme.shadows[5],\r\n padding: theme.spacing(2, 4, 3),\r\n },\r\n spinnerProgress: {\r\n position: \"absolute\",\r\n top: \"60%\",\r\n left: \"50%\",\r\n marginTop: -5,\r\n marginLeft: -5,\r\n },\r\n}));\r\n\r\n// eslint-disable-next-line\r\nDate.prototype.yyyymmdd = function () {\r\n var mm = this.getMonth() + 1; // getMonth() is zero-based\r\n var dd = this.getDate();\r\n\r\n return [this.getFullYear(), (mm > 9 ? \"\" : \"0\") + mm, (dd > 9 ? \"\" : \"0\") + dd].join(\"\");\r\n};\r\n\r\nexport default function TimeslotPage({ fields, errors, handleChange }) {\r\n const { t, i18n } = useTranslation();\r\n const classes = useStyles();\r\n\r\n const [loadingTimeslots, setLoadingTimeslots] = React.useState(false);\r\n const [reservingTimeslot, setReservingTimeslot] = React.useState(false);\r\n\r\n const [timeslots, setTimeslots] = useState([]);\r\n const [filtered, setFiltered] = useState([]);\r\n const [date, setDate] = useState(new Date());\r\n const [minDate, setMinDate] = useState(undefined);\r\n const [maxDate, setMaxDate] = useState(undefined);\r\n\r\n // modal message displayed when no slot found\r\n const [open, setOpen] = useState(false);\r\n\r\n const handleOpen = () => {\r\n setOpen(true);\r\n };\r\n\r\n const handleClose = () => {\r\n setOpen(false);\r\n };\r\n\r\n // componentDidMount\r\n useEffect(() => {\r\n if (!loadingTimeslots) {\r\n setLoadingTimeslots(true);\r\n\r\n fetchTimeslotsAsync({\r\n uuid: fields.uuid,\r\n dayCount: 30,\r\n agentCode: fields.service.AgentCode,\r\n postCode: isMeasurement(fields.service) ? fields.district.Code : fields.store.PostalCode,\r\n storeNo: isMeasurement(fields.service) ? fields.district.StoreNo : fields.store.StoreNo,\r\n queueId: fields.store.QueueId,\r\n }).then((timeslots) => {\r\n //## response update need to be done\r\n const firstElement = timeslots.length ? timeslots[0] : undefined;\r\n\r\n firstElement ? setMinDate(new Date(firstElement.actual_date)) : setMinDate(undefined);\r\n minDate ? setMaxDate(addDays(minDate, 30)) : setMaxDate(undefined);\r\n\r\n // if no timeslots found, show a modal message\r\n if (timeslots.length === 0) {\r\n handleOpen();\r\n }\r\n\r\n setTimeslots(timeslots);\r\n setLoadingTimeslots(false);\r\n });\r\n }\r\n\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n const onChange = (date) => {\r\n if (date) {\r\n const ttts = timeslots.filter((ts) => ts.date === date.yyyymmdd());\r\n setFiltered(ttts);\r\n\r\n if (isMeasurement(fields.service)) {\r\n handleChange(\"timeslot\")(ttts[0]);\r\n }\r\n }\r\n\r\n setDate(date);\r\n };\r\n\r\n const onTimeslotChange = (e) => {\r\n // get object and store it in state\r\n const ts = timeslots.find((ts) => ts.id === e.target.value);\r\n\r\n setReservingTimeslot(true);\r\n handleChange(\"timeslot\")(ts);\r\n setReservingTimeslot(false);\r\n };\r\n\r\n const showDateRange = (actual_date) => {\r\n const range = getDateRange(actual_date);\r\n\r\n return (\r\n \r\n {t(\"Service appointment\") + \" \" + t(\"between\") + \" \"}\r\n {range[0]}\r\n {\" \" + t(\"and\") + \" \"}\r\n {range[1]}\r\n \r\n );\r\n };\r\n\r\n const tileDisabled = ({ activeStartDate, date, view }) => {\r\n if (timeslots && timeslots.length) {\r\n if (view === \"month\") {\r\n const yyyymmdd = date.yyyymmdd();\r\n const found = timeslots.find((ts) => ts.date === yyyymmdd);\r\n\r\n return !found; // don't disable\r\n }\r\n\r\n if (view === \"year\") {\r\n const month = date.getMonth();\r\n const found = timeslots.find((ts) => {\r\n const tsDate = new Date(ts.actual_date);\r\n return tsDate.getMonth() === month;\r\n });\r\n\r\n return !found; // don't disable\r\n }\r\n\r\n if (view === \"decade\") {\r\n const year = date.getYear();\r\n const found = timeslots.find((ts) => {\r\n const tsDate = new Date(ts.actual_date);\r\n return tsDate.getYear() === year;\r\n });\r\n\r\n return !found; // don't disable\r\n }\r\n\r\n if (view === \"century\") {\r\n const year = date.getYear();\r\n return year !== 121; // don't disable\r\n }\r\n }\r\n\r\n return true;\r\n };\r\n\r\n return (\r\n
\r\n \r\n {t(\"Choose date\")}:\r\n \r\n\r\n \r\n \r\n \r\n {loadingTimeslots && }\r\n\r\n
\r\n\r\n \r\n {t(\"Available timeslots\")}:\r\n \r\n\r\n {isMeasurement(fields.service) ? (\r\n
\r\n {!!fields.timeslot ? (\r\n showDateRange(fields.timeslot.actual_date)\r\n ) : (\r\n \r\n {t(\"Please select a date from the above calendar.\")}\r\n \r\n )}\r\n
\r\n ) : (\r\n
\r\n \r\n {t(\"Please be available 10 minutes before the selected time.\")}\r\n \r\n\r\n \r\n {t(\"Timeslot\")}\r\n \r\n {filtered &&\r\n filtered.map((timeslot) => {\r\n return (\r\n \r\n {formatTime(timeslot.start_time, i18n.language)}\r\n \r\n );\r\n })}\r\n \r\n {reservingTimeslot && }\r\n {errors[\"timeslot\"]}\r\n \r\n
\r\n )}\r\n
\r\n
\r\n\r\n \r\n
\r\n \r\n {t(\"No time slot available\")}\r\n \r\n \r\n {t(\"Sorry, No time slot available for the selected service. Please check again later.\")}\r\n \r\n
\r\n \r\n
\r\n );\r\n}\r\n","import React, { useEffect } from \"react\";\r\nimport { useTranslation } from \"react-i18next\";\r\n\r\nimport Grid from \"@material-ui/core/Grid\";\r\nimport Typography from \"@material-ui/core/Typography\";\r\nimport TextField from \"@material-ui/core/TextField\";\r\n\r\nexport default function ContactPage({ fields, errors, handleChange }) {\r\n const { t } = useTranslation();\r\n\r\n // componentDidMount\r\n useEffect(() => {\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n return (\r\n
\r\n \r\n {t(\"Fill your contact information\")}:\r\n \r\n\r\n \r\n \r\n {\r\n handleChange(\"firstName\")(e.target.value);\r\n }}\r\n />\r\n \r\n\r\n \r\n {\r\n handleChange(\"lastName\")(e.target.value);\r\n }}\r\n />\r\n \r\n\r\n \r\n {\r\n handleChange(\"email\")(e.target.value);\r\n }}\r\n />\r\n \r\n\r\n \r\n {\r\n handleChange(\"mobile\")(e.target.value);\r\n }}\r\n />\r\n \r\n \r\n
\r\n );\r\n}\r\n","import { env, apimKey } from \"../../../config\";\r\nimport log from \"../../../utils/log\";\r\n\r\nexport default async function createOrderAsync(params) {\r\n log(\"createOrderAsync\", \"request\", params);\r\n\r\n const baseUrl = `https://apim-ikeasa.azure-api.net/CreateOrder/${env}/v2/`;\r\n const response = await fetch(baseUrl, {\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n \"Ocp-Apim-Subscription-Key\": apimKey,\r\n },\r\n method: \"post\",\r\n body: JSON.stringify(params),\r\n });\r\n\r\n if (response.status === 200) {\r\n const json = await response.json();\r\n log(\"createOrderAsync\", \"response\", json);\r\n\r\n return json;\r\n }\r\n\r\n throw new Error(response.status);\r\n}\r\n\r\n/**\r\n * Sample input:\r\n * {\r\n First_Name: \"Hamed\",\r\n Last_Name: \"Alkaf\",\r\n Post_Code: \"21001\", // district.Code\r\n Mobile_No: \"0567067006\",\r\n Email: \"hamed.alkaf@ikea.com.sa\",\r\n TMS_Id: \"TMS_123_45446\",\r\n TMS_Date: \"2020-05-15T00:00:23.709Z\",\r\n Customer_Address: \"Rehab Jeddah\",\r\n CityId: \"1\",\r\n DistrictId: \"11001\",\r\n Serivce_ID: \"1000001\",\r\n Payment_Brand: \"\",\r\n Card_No: \"\",\r\n Card_Expiry: \"12/20\",\r\n Service_Type: \"Store\", // service.Service_Type\r\n Created_On: \"2020-05-15T00:00:23.709Z\",\r\n Agent_Code: \"CO-MEA\",\r\n NAV_Item_No: \"99999999\", // service.NAV_Item_No\r\n Order_Type: \"CO\", // service.Order_Type\r\n TMS_Start_Time: \"2020-05-15T00:00:23.709Z\",\r\n TMS_End_Time: \"2020-05-15T00:00:23.709Z\",\r\n Store_No: \"197\",\r\n }\r\n\r\n * Sample response:\r\n * {OrderId: \"100000013\", RequestCreatedOn: \"2020-09-09T08:24:05.5130000\", Status: \"Created\"}\r\n*/\r\n","import { checkout_free_url, checkout_paid_url } from \"../../../config\";\r\nimport log from \"../../../utils/log\";\r\n\r\nexport default async function redirectToPayfortAsync(params) {\r\n log(\"redirectToPayfortAsync\", \"request\", params);\r\n\r\n return new Promise((resolve) => {\r\n if (Number(params.amount) === 0) {\r\n post(checkout_free_url, params);\r\n } else {\r\n post(checkout_paid_url, params);\r\n }\r\n\r\n // keep loading-indicator displayed for few seconds\r\n setTimeout(() => resolve(true), 10000);\r\n });\r\n}\r\n\r\nconst post = (path, params, method = \"post\") => {\r\n const form = document.createElement(\"form\");\r\n form.method = method;\r\n form.action = path;\r\n for (const key in params) {\r\n if (params.hasOwnProperty(key)) {\r\n const hiddenField = document.createElement(\"input\");\r\n hiddenField.type = \"hidden\";\r\n hiddenField.name = key;\r\n hiddenField.value = params[key];\r\n\r\n form.appendChild(hiddenField);\r\n }\r\n }\r\n\r\n document.body.appendChild(form);\r\n form.submit();\r\n};\r\n","import {\r\n access_code,\r\n merchant_identifier,\r\n signature_key,\r\n signature_url,\r\n} from \"../../../config\";\r\nimport log from \"../../../utils/log\";\r\n\r\nexport default async function payfortSignatureAsync(params) {\r\n log(\"payfortSignatureAsync\", \"request\", params);\r\n\r\n const baseUrl = signature_url;\r\n\r\n // constant values\r\n params.command = \"PURCHASE\";\r\n params.access_code = access_code;\r\n params.merchant_identifier = merchant_identifier;\r\n params.currency = \"SAR\";\r\n params.amount *= 100;\r\n\r\n const keys = Object.keys(params);\r\n let x = \"\";\r\n keys.forEach((key) => {\r\n if (x.length > 0) x += \"&\";\r\n x += `${key}=${params[key]}`;\r\n });\r\n\r\n const uri = baseUrl + `?${x}`;\r\n const encoded = encodeURI(uri);\r\n\r\n const response = await fetch(encoded, {\r\n headers: {\r\n \"x-functions-key\": signature_key,\r\n },\r\n });\r\n\r\n if (response.status === 200) {\r\n const json = await response.json();\r\n log(\"payfortSignatureAsync\", \"response\", json);\r\n\r\n return json;\r\n }\r\n\r\n throw new Error(response.status);\r\n}\r\n","import { env, apimKey } from \"../../../config\";\r\nimport log from \"../../../utils/log\";\r\n\r\nexport default async function reserveTimeslotAsync({\r\n slotId,\r\n uuid,\r\n startTime,\r\n endTime,\r\n serviceType,\r\n slotType,\r\n}) {\r\n const baseUrl = `https://apim-ikeasa.azure-api.net/TMS_ReserveSlot/${env}/v2/`;\r\n log(\"reserveTimeslotAsync\", \"request\", ...arguments);\r\n\r\n const response = await fetch(baseUrl, {\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n \"Ocp-Apim-Subscription-Key\": apimKey,\r\n },\r\n method: \"post\",\r\n body: JSON.stringify({\r\n SlotId: slotId,\r\n orderGUID: uuid,\r\n StartTime: startTime,\r\n EndTime: endTime,\r\n ServiceType: serviceType, // OMBORI or IKEA timeslots\r\n SlotType: slotType,\r\n }),\r\n });\r\n\r\n if (response.status === 200) {\r\n const json = await response.json();\r\n log(\"reserveTimeslotAsync\", \"response\", json);\r\n\r\n return json;\r\n }\r\n\r\n throw new Error(response.status);\r\n}\r\n","import { env, apimKey } from \"../../../config\";\r\nimport log from \"../../../utils/log\";\r\n\r\nexport default async function releaseTimeslotAsync({\r\n slotId,\r\n queueId,\r\n serviceType,\r\n}) {\r\n log(\"releaseTimeslotAsync\", \"request\", ...arguments);\r\n\r\n const baseUrl = `https://apim-ikeasa.azure-api.net/TMS_ReleaseSlot/${env}/v2/`;\r\n const response = await fetch(baseUrl, {\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n \"Ocp-Apim-Subscription-Key\": apimKey,\r\n },\r\n method: \"post\",\r\n body: JSON.stringify({\r\n SlotId: slotId,\r\n QueueId: queueId,\r\n ServiceType: serviceType,\r\n }),\r\n });\r\n\r\n if (response.status === 200) {\r\n const json = await response.json();\r\n log(\"releaseTimeslotAsync\", \"response\", json);\r\n\r\n return json.timeslots;\r\n }\r\n\r\n throw new Error(response.status);\r\n}\r\n","/**\r\n * IMPORTANT NOTES\r\n *********************************************************\r\n * DEMO:\r\n * Hosting: dcfunction018b46/$web\r\n * Url: https://dcfunction018b46.z6.web.core.windows.net/\r\n * Akamai: https://securema2.ikea.com/sa/ar/booking/\r\n *\r\n * PROD:\r\n * Hosting: dcbooking/$web\r\n * Url: https://dcbooking.z6.web.core.windows.net/\r\n * Akamai: https://securema.ikea.com/sa/en/booking/\r\n *\r\n */\r\n\r\nimport React, { useState } from \"react\";\r\nimport { trackPromise } from \"react-promise-tracker\";\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { v4 as uuidv4 } from \"uuid\";\r\n\r\nimport { create } from \"jss\";\r\nimport rtl from \"jss-rtl\";\r\n\r\nimport {\r\n makeStyles,\r\n StylesProvider,\r\n jssPreset,\r\n} from \"@material-ui/core/styles\";\r\nimport { ThemeProvider } from \"@material-ui/core/styles\";\r\nimport { Container } from \"@material-ui/core\";\r\nimport Typography from \"@material-ui/core/Typography\";\r\nimport Stepper from \"@material-ui/core/Stepper\";\r\nimport Step from \"@material-ui/core/Step\";\r\nimport StepLabel from \"@material-ui/core/StepLabel\";\r\nimport Button from \"@material-ui/core/Button\";\r\n\r\nimport { getDateRange, formatTime } from \"../../utils/formatTime\";\r\nimport b64EncodeUnicode from \"../../utils/b64EncodeUnicode\";\r\nimport isMeasurement from \"../../utils/isMeasurement\";\r\n\r\nimport theme from \"../../theme\";\r\nimport { STEPS, SERVICE_TYPE } from \"../../types\";\r\n\r\nimport AddressPage from \"./address.page\";\r\nimport ServicePage from \"./service.page\";\r\nimport TimeslotPage from \"./timeslot.page\";\r\nimport ContactPage from \"./contact.page\";\r\n\r\n// API\r\nimport createOrderAsync from \"./api/createOrderAsync\";\r\nimport redirectToPayfortAsync from \"./api/redirectToPayfortAsync\";\r\nimport payfortSignatureAsync from \"./api/payfortSignatureAsync\";\r\nimport reserveTimeslotAsync from \"./api/reserveTimeslotAsync\";\r\nimport releaseTimeslotAsync from \"./api/releaseTimeslotAsync\";\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n // formControl: {},\r\n // selectEmpty: {},\r\n\r\n // layout: {\r\n // width: \"auto\",\r\n // marginLeft: theme.spacing(2),\r\n // marginRight: theme.spacing(2),\r\n // [theme.breakpoints.up(600 + theme.spacing(2) * 2)]: {\r\n // width: 600,\r\n // marginLeft: \"auto\",\r\n // marginRight: \"auto\",\r\n // },\r\n // },\r\n // paper: {\r\n // marginTop: theme.spacing(3),\r\n // marginBottom: theme.spacing(3),\r\n // padding: theme.spacing(2),\r\n // [theme.breakpoints.up(600 + theme.spacing(3) * 2)]: {\r\n // marginTop: theme.spacing(6),\r\n // marginBottom: theme.spacing(6),\r\n // padding: theme.spacing(3),\r\n // },\r\n // },\r\n stepper: {\r\n padding: theme.spacing(3, 0, 5),\r\n },\r\n buttons: {\r\n display: \"flex\",\r\n justifyContent: \"flex-end\",\r\n },\r\n button: {\r\n marginTop: theme.spacing(3),\r\n marginLeft: theme.spacing(1),\r\n marginRight: theme.spacing(1),\r\n },\r\n paymentLogo: {\r\n height: \"40px\",\r\n width: \"80px\",\r\n border: \"1px solid #ccc\",\r\n textAlign: \"center\",\r\n borderRadius: \"4px\",\r\n padding: \"5px\",\r\n margin: \"5px\",\r\n },\r\n}));\r\n\r\nexport default function IndexPage(props) {\r\n const { t, i18n } = useTranslation();\r\n const classes = useStyles();\r\n\r\n const [errors, setErrors] = useState([]);\r\n const [activeStep, setActiveStep] = useState(0);\r\n const [disableNext, setDisableNext] = useState(false);\r\n const [fields, setFields] = useState({\r\n uuid: uuidv4().toUpperCase(),\r\n city: \"\",\r\n district: \"\",\r\n store: \"\",\r\n service: \"\",\r\n firstName: \"\",\r\n lastName: \"\",\r\n email: \"\",\r\n mobile: \"\",\r\n timeslot: \"\",\r\n measurementDisclaimer: false,\r\n });\r\n\r\n let jssRtl = null;\r\n if (i18n.language === \"ar\") {\r\n jssRtl = rtl();\r\n }\r\n const jss = create({ plugins: [...jssPreset().plugins, jssRtl] });\r\n\r\n const servicesWithDisclaimer = [\"1000001\", \"1000002\"];\r\n\r\n // steps as translated labels to be displayed\r\n const steps = [t(\"Service\"), t(\"Address\"), t(\"Timeslot\"), t(\"Contact\")];\r\n\r\n const handleNext = () => {\r\n // if user in Address page and moving to timeslot\r\n // remove any already selected timeslot\r\n if (activeStep === STEPS.ADDRESS) {\r\n if (fields.timeslot) {\r\n reserveTimeslot(\"\");\r\n\r\n setFields((prevState) => {\r\n return { ...prevState, timeslot: \"\" };\r\n });\r\n }\r\n }\r\n\r\n // if final step (proceed to checkout is clicked)\r\n if (activeStep === STEPS.CONTACT) {\r\n // disable next button\r\n setDisableNext(true);\r\n\r\n trackPromise(\r\n createOrderAsync({\r\n First_Name: fields.firstName,\r\n Last_Name: fields.lastName,\r\n Post_Code: isMeasurement(fields.service)\r\n ? fields.district.Code\r\n : fields.store.PostalCode,\r\n Mobile_No: fields.mobile,\r\n Email: fields.email,\r\n TMS_Id:\r\n fields.timeslot.type === SERVICE_TYPE.OMBORI\r\n ? fields.timeslot.positionId\r\n : fields.timeslot.id,\r\n TMS_Date: fields.timeslot.actual_date,\r\n Customer_Address: fields.district.Name + \", \" + fields.city.Name,\r\n CityId: fields.city.Id,\r\n DistrictId: fields.district.Id,\r\n Serivce_ID: fields.service.ServiceId,\r\n Service_Type: fields.service.Service_Type,\r\n Agent_Code: fields.service.AgentCode,\r\n NAV_Item_No: fields.service.NAVItemNo,\r\n Order_Type: fields.service.Order_Type,\r\n TMS_Start_Time: fields.timeslot.start_time,\r\n TMS_End_Time: fields.timeslot.end_time,\r\n Store_No: fields.store.StoreNo,\r\n NAV_WSURL: fields.store.ServiceURL,\r\n SlotServiceType: fields.timeslot.type,\r\n QueueId: fields.store.QueueId,\r\n }).then((order) => {\r\n let sigParams = {\r\n //merchant_reference: fields.store.StoreNo + \"-\" + order.OrderId,\r\n merchant_reference: order.OrderId,\r\n language: i18n.language,\r\n amount: fields.service.Service_Fee,\r\n customer_name: fields.firstName + \" \" + fields.lastName,\r\n customer_email: fields.email,\r\n phone_number: fields.mobile,\r\n };\r\n\r\n // encoded parameters\r\n sigParams.order_description = b64EncodeUnicode(\r\n (i18n.language === \"ar\"\r\n ? fields.service.ServiceName_Ar\r\n : fields.service.ServiceName_En) +\r\n \" - \" +\r\n t(fields.service.Service_Type)\r\n ).replaceAll(\"=\", \"-\");\r\n // in case of measurement, send date range\r\n // IMPORTANT\r\n // merchant_extra1 must be null for measurement\r\n if (isMeasurement(fields.service)) {\r\n const range = getDateRange(fields.timeslot.actual_date);\r\n const message =\r\n t(\"between\") + \" \" + range[0] + \" \" + t(\"and\") + \" \" + range[1];\r\n sigParams.merchant_extra2 = b64EncodeUnicode(message).replaceAll(\r\n \"=\",\r\n \"-\"\r\n );\r\n } else {\r\n // for services other than measurement send date and time\r\n sigParams.merchant_extra1 = b64EncodeUnicode(\r\n fields.timeslot.actual_date\r\n ).replaceAll(\"=\", \"-\");\r\n\r\n sigParams.merchant_extra2 = b64EncodeUnicode(\r\n formatTime(fields.timeslot.start_time, i18n.language)\r\n ).replaceAll(\"=\", \"-\");\r\n }\r\n\r\n // pass store only for non-online services\r\n if (fields.service.Service_Type !== \"Online\") {\r\n sigParams.merchant_extra3 = b64EncodeUnicode(\r\n i18n.language === \"ar\"\r\n ? fields.store.LocalizedName\r\n : fields.store.Name\r\n ).replaceAll(\"=\", \"-\");\r\n }\r\n\r\n sigParams.merchant_extra4 = b64EncodeUnicode(\r\n i18n.language === \"ar\"\r\n ? // hide district if not provided\r\n (fields.district.LocalizedName !== undefined\r\n ? fields.district.LocalizedName + \"، \"\r\n : \"\") + fields.city.LocalizedName\r\n : (fields.district.Name !== undefined\r\n ? fields.district.Name + \", \"\r\n : \"\") + fields.city.Name\r\n ).replaceAll(\"=\", \"-\");\r\n\r\n trackPromise(\r\n // Payfort full parameters list:\r\n // https://docs.payfort.com/docs/api/build/index.html#authorization-purchase-request\r\n // some values encoded using b64EncodeUnicode() to base64 to bypass un-allowed characters by Payfort\r\n // since = is not allowed, it is being replaced with -\r\n\r\n payfortSignatureAsync(sigParams).then((params) =>\r\n redirectToPayfortAsync(params)\r\n )\r\n );\r\n })\r\n );\r\n } else {\r\n setActiveStep(activeStep + 1);\r\n }\r\n };\r\n\r\n const handleBack = () => {\r\n setActiveStep(activeStep - 1);\r\n };\r\n\r\n function getStepContent() {\r\n switch (activeStep) {\r\n case STEPS.ADDRESS:\r\n return (\r\n \r\n );\r\n case STEPS.SERVICE:\r\n return (\r\n \r\n );\r\n case STEPS.TIMESLOT:\r\n return (\r\n \r\n );\r\n case STEPS.CONTACT:\r\n return (\r\n \r\n );\r\n default:\r\n throw new Error(\"Unknown step\");\r\n }\r\n }\r\n\r\n const disableNextButton = () => {\r\n switch (activeStep) {\r\n case STEPS.SERVICE:\r\n // disable is default in case no service selected\r\n let disable = true;\r\n\r\n if (servicesWithDisclaimer.includes(fields.service.ServiceId)) {\r\n // selected service requires disclaimer checkbox to checked\r\n disable = !fields.measurementDisclaimer;\r\n } else {\r\n // selected service does not require disclaimer checkbox\r\n // just make sure there is a service selected\r\n disable = !fields.service;\r\n }\r\n\r\n return disable;\r\n case STEPS.ADDRESS:\r\n if (isMeasurement(fields.service)) {\r\n return !(fields.city && fields.district && fields.store);\r\n }\r\n\r\n // districts are not required if not measurement\r\n return !(fields.city && fields.store);\r\n case STEPS.TIMESLOT:\r\n return !fields.timeslot;\r\n case STEPS.CONTACT:\r\n return (\r\n !(\r\n errors[\"firstName\"] === \"\" &&\r\n errors[\"lastName\"] === \"\" &&\r\n errors[\"email\"] === \"\" &&\r\n errors[\"mobile\"] === \"\"\r\n ) || disableNext\r\n );\r\n default:\r\n return true;\r\n }\r\n };\r\n\r\n const validate = (input, value) => {\r\n switch (input) {\r\n case \"city\":\r\n if (!value) {\r\n return t(\"City\") + t(\" is required\");\r\n }\r\n return \"\";\r\n case \"district\":\r\n if (!value) {\r\n return t(\"District\") + t(\" is required\");\r\n }\r\n return \"\";\r\n case \"store\":\r\n if (!value) {\r\n return t(\"Store\") + t(\" is required\");\r\n }\r\n return \"\";\r\n case \"service\":\r\n if (!value) {\r\n return t(\"Service\") + t(\" is required\");\r\n }\r\n return \"\";\r\n case \"firstName\":\r\n if (!value) {\r\n return t(\"First name\") + t(\" is required\");\r\n }\r\n return \"\";\r\n case \"lastName\":\r\n if (!value) {\r\n return t(\"Last name\") + t(\" is required\");\r\n }\r\n return \"\";\r\n case \"email\":\r\n if (!value) {\r\n return t(\"Email\") + t(\" is required\");\r\n }\r\n if (!/^\\w+([.-]?\\w+)*@\\w+([.-]?\\w+)*(\\.\\w{2,3})+$/.test(value)) {\r\n return t(\"Email\") + t(\" is not correct\");\r\n }\r\n return \"\";\r\n case \"mobile\":\r\n if (!value) {\r\n return t(\"Mobile\") + t(\" is required\");\r\n }\r\n if (\r\n !/^(009665|9665|\\+9665|05)(5|0|3|6|4|9|1|8|7)([0-9]{7})$/.test(value)\r\n ) {\r\n return t(\"Mobile\") + t(\" is not correct\");\r\n }\r\n return \"\";\r\n case \"timeslot\":\r\n if (!value) {\r\n return t(\"Timeslot\") + t(\" is required\");\r\n }\r\n return \"\";\r\n case \"measurementDisclaimer\":\r\n if (servicesWithDisclaimer.includes(fields.service.ServiceId)) {\r\n if (!value) {\r\n return t(\r\n \"You must agree that you already had measurements by IKEA team to proceed.\"\r\n );\r\n }\r\n }\r\n return \"\";\r\n default:\r\n break;\r\n }\r\n };\r\n\r\n const handleChange = (input, doValidation = true) => (e) => {\r\n if (!e) {\r\n if (doValidation) {\r\n errors[input] = validate(input, \"\");\r\n setErrors(errors);\r\n }\r\n\r\n // release any previously reserved timeslot before storing empty timeslot in state\r\n if (input === \"timeslot\") {\r\n reserveTimeslot(\"\");\r\n }\r\n\r\n setFields((prevState) => {\r\n return { ...prevState, [input]: \"\" };\r\n });\r\n\r\n return;\r\n }\r\n\r\n // dropdowns: store the e object. input: store the string value\r\n let value = e.constructor.name === \"SyntheticEvent\" ? e.target.value : e;\r\n\r\n // toggle measurement disclaimer checkbox value\r\n if (input === \"measurementDisclaimer\") {\r\n value = !fields.measurementDisclaimer;\r\n }\r\n\r\n if (doValidation) {\r\n errors[input] = validate(input, value);\r\n setErrors(errors);\r\n }\r\n\r\n // release any previously reserved timeslot before storing new timeslot in state\r\n if (input === \"timeslot\") {\r\n // do setFields inside reserveTimeslot\r\n reserveTimeslot(value);\r\n } else {\r\n setFields((prevState) => {\r\n return { ...prevState, [input]: value };\r\n });\r\n }\r\n };\r\n\r\n async function reserveTimeslot(ts) {\r\n const input = \"timeslot\";\r\n // user selected none. release any previously reserved timesolt\r\n // update: none selection is removed but the following is kept in case list is empty\r\n if (ts === \"\") {\r\n if (fields.timeslot) {\r\n releaseTimeslotAsync({\r\n slotId:\r\n ts.type === SERVICE_TYPE.OMBORI\r\n ? fields.timeslot.positionId\r\n : ts.id,\r\n queueId:\r\n ts.type === SERVICE_TYPE.OMBORI ? fields.store.QueueId : ts.id,\r\n serviceType: fields.timeslot.type,\r\n });\r\n\r\n setFields((prevState) => {\r\n return { ...prevState, [input]: ts };\r\n });\r\n }\r\n } else {\r\n // user selected new timeslot\r\n if (fields.timeslot) {\r\n // release old then reserve new\r\n releaseTimeslotAsync({\r\n slotId:\r\n ts.type === SERVICE_TYPE.OMBORI\r\n ? fields.timeslot.positionId\r\n : ts.id,\r\n queueId:\r\n ts.type === SERVICE_TYPE.OMBORI ? fields.store.QueueId : ts.id,\r\n serviceType: fields.timeslot.type,\r\n }).then(() => {\r\n reserveTimeslotAsync({\r\n slotId:\r\n ts.type === SERVICE_TYPE.OMBORI ? fields.store.QueueId : ts.id,\r\n uuid: ts.orderGUID, //fields.uuid,\r\n startTime: ts.slotstart,\r\n endTime: ts.slotend,\r\n serviceType: ts.type,\r\n slotType: fields.service.Service_Type,\r\n }).then((response) => {\r\n ts.positionId = response.PositionId;\r\n \r\n if (response.status.toLowerCase() === \"success\") {\r\n setFields((prevState) => {\r\n return { ...prevState, [input]: ts };\r\n });\r\n }\r\n });\r\n });\r\n } else {\r\n // just reserve, no previous timeslot to release\r\n reserveTimeslotAsync({\r\n slotId:\r\n ts.type === SERVICE_TYPE.OMBORI ? fields.store.QueueId : ts.id,\r\n uuid: ts.orderGUID, //fields.uuid,\r\n startTime: ts.slotstart,\r\n endTime: ts.slotend,\r\n serviceType: ts.type,\r\n slotType: fields.service.Service_Type,\r\n }).then((response) => {\r\n ts.positionId = response.PositionId;\r\n \r\n if (response.status.toLowerCase() === \"success\") {\r\n setFields((prevState) => {\r\n return { ...prevState, [input]: ts };\r\n });\r\n }\r\n \r\n });\r\n }\r\n }\r\n }\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n {t(\"Book your appointment now\")}\r\n \r\n\r\n \r\n {steps.map((label) => (\r\n \r\n {label}\r\n \r\n ))}\r\n \r\n\r\n \r\n {activeStep === steps.length ? (\r\n \r\n \r\n Thank you for your order.\r\n \r\n \r\n ) : (\r\n \r\n {getStepContent()}\r\n
\r\n {activeStep !== 0 && (\r\n \r\n )}\r\n \r\n {activeStep === steps.length - 1\r\n ? t(\"Proceed to checkout\")\r\n : t(\"Next\")}\r\n \r\n
\r\n
\r\n )}\r\n
\r\n \r\n

\r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n );\r\n}\r\n","import React, { Suspense } from \"react\";\r\nimport { Switch, Route } from \"react-router-dom\";\r\n\r\n\r\nimport \"./App.scss\";\r\n\r\nimport BookingPage from \"./pages/booking/index.page\";\r\n\r\nfunction App() {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n );\r\n}\r\n\r\nexport default App;\r\n","import React from \"react\";\nimport ReactDOM from \"react-dom\";\nimport { BrowserRouter } from \"react-router-dom\";\nimport { CookiesProvider } from \"react-cookie\";\n\nimport \"./index.scss\";\n\nimport { lang } from \"./i18n\";\nimport LoadingIndicator from \"./components/loading-indicator/loading-indicator\";\n\nimport App from \"./App\";\n\nReactDOM.render(\n \n \n \n \n \n ,\n document.getElementById(\"root\")\n);\n"],"sourceRoot":""}