{"version":3,"sources":["assets/ATT-LOGO-2c-navy.png","assets/search.svg","assets/calendar.png","assets/bedroom.svg","assets/bathroom.svg","assets/arrow-right.svg","assets/footer.png","assets/instagram-square.svg","assets/linkedin-square.svg","assets/youtube-square.svg","assets/facebook-square.svg","assets/twitter-square.svg","assets/teal-map-marker.svg","assets/searchBackground.png","assets/location-dark-icon.svg","assets/page-left.svg","assets/page-right.svg","assets/next.svg","assets/prev.svg","assets/QRCode.png","assets/mobile-app-home.png","assets/location-light-icon.svg","amplifyconfiguration.js","helpers/OutsideClickHandler.js","components/SubMenu.js","components/HeaderLink.js","components/MobileMenu.js","graphql/queries.js","components/DownloadUserReportLink.js","graphql/mutations.js","components/Spinner.js","components/Notifications.js","components/Header.js","Helmet.js","components/Loading.js","components/ClientSelect.js","components/Message.js","notifications/templates.js","notifications/messageBuilder.js","services/notificationService.js","contexts.js","components/AddPropertyButton.js","components/MLSAddForm.js","components/AddToClient.js","helpers/getMediaUrl.js","components/Listing.js","components/PageButton.js","components/Pagination.js","components/filters/shared/Arrow.js","components/filters/shared/FilterHeader.js","components/filters/shared/NumberInput.js","components/filters/Price.js","components/filters/Keyword.js","components/filters/shared/FilterSubHeading.js","components/filters/shared/SortInput.js","components/filters/Sort.js","components/filters/SquareFeet.js","components/filters/shared/FilterRadio.js","components/filters/Bedrooms.js","components/filters/Bathrooms.js","components/filters/shared/FilterCheckbox.js","components/filters/HomeTypes.js","components/filters/Select.js","components/filters/More.js","components/FilterAndSort/MobileFilterAndSort.js","components/FilterAndSort/DesktopFilterAndSort.js","components/FilterAndSort/FilterAndSort.js","components/SearchResults.js","components/SearchListings.js","components/GalleryButton.js","components/GalleryModal.js","components/ListingSourceLink.js","components/ListingDetail.js","components/SignUp/VerifyPhoneNumber.js","services/CancelSubscription.js","components/SignUp/ConfirmCancelSubscription.js","components/Profile.js","pages/admin/agents/AgentsTable.js","pages/admin/agents/SubscriptionCell.js","pages/admin/agents/StatusModal.js","pages/admin/agents/StatusCell.js","services/agentValidationService.js","pages/admin/agents/ManageAgents.js","components/CalendarListing.js","components/CalenderEventTitle.js","components/CalendarEventApprove.js","components/CalendarAutoApprove.js","components/CalendarLASlotOptions.js","components/SuccessPopup.js","components/CalendarLASlotAddUpdatePopup.js","services/SendSMSMessage.js","services/SendEmail.js","components/CalendarDeleteApprovedSlot.js","components/CalendarControl.js","pages/Waitlist.js","App.js","serviceWorker.js","index.js"],"names":["module","exports","amplifyconfiguration","Auth","Cognito","region","userPoolId","userPoolClientId","API","GraphQL","endpoint","defaultAuthMode","Storage","S3","bucket","OutsideClickHandler","children","handlerFunction","conditional","wrapperRef","useRef","ref","handleClickOutside","event","current","contains","target","useEffect","document","addEventListener","removeEventListener","useOutsideClickHandler","className","baseUrl","SubMenu","linkName","isMobile","style","boxShadow","width","borderBottomWidth","href","HeaderLink","linkRoute","setSlideOutMobileMenu","handleLogout","hasSubMenu","useState","exact","to","onClick","MobileMenu","slideOutMobileMenu","toggleSlideOutMenu","isLoggedIn","handleLogin","isAgent","toggleNotifications","notificationBadgeCount","userInfo","isActiveSubscription","setIsOpenSubscription","id","type","tabIndex","onKeyDown","height","isLinkExternal","is_free_version_account","marginLeft","Badge","badgeContent","color","getListingByListingId","getUserByCognitoSub","listPropertyListings","agentTimeSlotDetails","getTourStopIfExists","listUserNotifications","getSubscriptionStatus","getSetting","DownloadUserReportLink","downloadReport","a","graphql","graphqlOperation","data","url","getAdminUserReport","body","createElement","todaysDate","Date","toISOString","download","click","createPropertyRecords","updateUser","deleteTourStop","updateTourStopRequestStatus","createPropertyOfInterest","createMessage","spinner","Notifications","notificationListingsData","setNotificationListingsData","showLoading","setShowLoading","query","variables","recipient_id","listUserNotificationsData","user_id","fetchListing1","CustomTooltip","withStyles","tooltip","fontSize","Tooltip","rows","map","item","container","date","dateFormat","created_at","title","toString","columns","field","headerName","flex","renderCell","props","row","textOverflow","onDeleteClick","updateNotificationInput","is_active","updateData","updateNotification","updatedListData","filter","x","clearAllNotification","textAlign","length","paddingRight","Spinner","border","overflow","rowHeight","pageSize","hideFooterSelectedRowCount","disableColumnMenu","headerHeight","withRouter","isUserMenuOpen","setIsUserMenuOpen","isOpenNotifications","setIsOpenNotifications","setNotificationBadgeCount","fetchCount1","fetchedCount","parseInt","getUserNotificationCount","count","console","log","interval","setInterval","clearInterval","toggleUserMenu","prevIsMenuOpen","prevIsOpen","prevIsOpenNotification","src","logo","alt","first_name","last_name","window","location","pathname","accessGroup","includes","role","validated","locked_out","rel","ReactHelmet","Helmet","Loading","tealMapMarker","withAuthenticator","setSelectedClient","setErrorMessage","userClients","setUserClients","agent_id","fetchedUserClientsResponse","listClients","fetchUserClients","clientSelectOptions","client","key","value","maxWidth","name","onChange","Message","message","duration","setSuccessMessage","successMessage","textStyle","setTimeout","propertyOfInterestAdded","agent","push","sms","email","seller","buyer","approveShowingRequest","subject","rejectShowingRequest","sendShowingRequest","sendShowingRequestAutoApprove","sendShowingRequestAutoApproveToBA","pushToBA","smsToBA","emailToBA","editDeleteLAAvailabilitySlot","cancelShowingRequest","buildPropertyOfInterestAdded","baName","brokerage","address","templates","replaceTokens","buildApproveShowingRequest","laName","timeRange","emailCopy","tokens","buildRejectShowingRequest","buildSendShowingRequest","phone","buildSendShowingRequestAutoApprove","buildSendShowingRequestAutoApproveToBA","buildEditDeleteLAAvailabilitySlot","buildCancelShowingRequest","updatedMessage","token","replace","RegExp","createNotification","userId","pushMessage","currentSession","getIdToken","jwtToken","sessionToken","payload","fetch","process","method","headers","Authorization","JSON","stringify","notificationResponse","ok","json","resultJson","text","resultText","Error","error","UserContext","React","createContext","AddPropertyButton","listing","selectedClient","errorMessage","mlsIds","setPropertyErrors","setPropertySuccesses","useContext","notifyBuyerOfNewProperty","clientId","city","state","zip","formattedAddress","split","warn","isDuplicateProperty","listingKey","client_id","listing_key","existingPropertyOfInterestResponse","getPropertyOfInterestByListingKey","addPropertyForClient","forEach","mlsId","listing_id","then","response","returnedListing","items","createPropertyRecordsInput","fallback_phone_number","prevState","catch","setIsMLSAddOpen","isMLSAddOpen","addMLSTextArea","setAddMLSTextArea","setMlsIds","propertyErrors","propertySuccesses","toggleMLSModal","prevIsMLSAddOpen","e","trim","err","idx","msg","isListingAgent","setIsOpenFreeTrialLimitPopup","propertyListings","isAccess","setIsAccess","margin","calendar","search","CryptoJS","AES","encrypt","getMediaUrl","photo","listingId","source","tempListingId","filePath","URL","MediaURL","path","setIsOpenVisitorSignupMessage","listingPriceString","listing_price","toLocaleString","status","Media","backgroundImage","stopPropagation","preventDefault","bedroom","bedrooms","bathroom","bathrooms","square_feet","PageButton","pageNumber","setPageNumber","pageIndex","isPreviousPageButton","isNextPageButton","pageNumberHistory","setPageNumberHistory","defaultButtonStyling","parse","nextPage","newPageNumber","goToPage","chosenNumber","previousPage","pageLeft","pageRight","Pagination","userFilteredListings","mapMiddlePages","listingsBatch","index","totalPageNumber","mapSmallList","displayBackButton","displayNextButton","handleFirstAndLastPages","pageOrder","inFirstPages","inLastPages","Arrow","rotateArrow","arrowRight","FilterHeader","toggleFilterDropdown","filterTitle","NumberInput","filterField","filterBy","setFilterBy","placeholder","thousandSeparator","prefix","lowPrice","highPrice","lowSquareFeet","highSquareFeet","handleFilterBy","Price","Keyword","autoCapitalize","keyword","FilterSubHeading","setIsHomeTypeOpen","subHeadingName","setIsBathroomsOpen","setIsBedroomsOpen","setIsPriceSortOpen","setIsSquareFeetSortOpen","isSort","setRotateArrow","handleIfChecked","homeTypes","open","htmlFor","checked","SortInput","sortField","sortDirection","priceSort","squarefeetSort","Sort","isPriceSortOpen","isSquareFeetSortOpen","SquareFeet","RadioInput","filterName","filterValue","Select","isBedroomsOpen","isBathroomsOpen","FilterCheckbox","handleTypeChange","fetchedListings","isHomeTypeOpen","homeTypeList","setHomeTypeList","home_type","Set","renderHomeTypes","Bedrooms","Bathrooms","HomeTypes","More","toggleMore","MobileFilterAndSort","setFilterDropdowns","filterDropdowns","isPriceOpen","isSquareFeetOpen","isMoreOpen","DesktopFilterAndSort","isSortOpen","isSelectOpen","isKeywordOpen","sessionStorage","setItem","FilterAndSort","paginateListings","newSearch","getItem","filterHistory","setFilterHistory","Object","values","every","filteredListings","keys","some","k","toLowerCase","sort","b","filterResults","SearchResults","setUserFilteredListings","resultsMessage","setResultsMessage","sendListhubTrackingResults","paginatedData","i","slice","listings","listingKeys","reduce","acc","currentListing","lh","searchingNow","searchTermsHistory","setSearchTermsHistory","userHasSearched","setUserHasSearched","setFetchedListings","loginRoute","searchTerms","setSearchTerms","showSearchDropdown","setSearchDropdown","searchError","setSearchError","currentLocationSelected","setCurrentLocationSelected","setNewSearch","listQuery","fetchedData","prevSearch","queryOptions","and","or","eq","search_address","limit","nextToken","params","authMode","returnKey","test","toUpperCase","handleSearchError","toggleSearchDropdown","prevSearchDropdownOpen","searchByLocation","navigator","geolocation","getCurrentPosition","position","coords","latitude","longitude","results","address_components","types","long_name","searchListings","searchBackground","onKeyPress","onFocus","aria-label","searchImage","locationDarkIcon","locationLightIcon","GalleryButton","nextPhoto","prevPhoto","next","prev","GalleryModal","setGalleryIndex","galleryIndex","galleryLength","toggleGallery","isGalleryOpen","ListingSourceLink","sharedAttributes","match","setIsGalleryOpen","hash","setListingInfo","currentYear","getFullYear","prevIsGalleryOpen","openGalleryModal","fetchListing","fetchedListing","getListing","listingData","lkey","scrollTo","maxHeight","html","description","lot_size","lot_size_units","year_built","county","listing_agent","listing_agent_phone","listing_agent_email","listing_office","VerifyPhoneNumber","setIsVerifyPhoneOpen","setUserInfo","currentUserPhoneVerified","setCurrentUserPhoneVerified","phoneNumber","setPhoneNumber","isOpenEditPhone","setIsOpenEditPhone","confirmationCode","setConfirmationCode","isCodeSent","setIsCodeSent","isVisibleEditIcon","setIsVisibleEditIcon","authUser","setAuthUser","cellPhoneError","setCellPhoneError","codeError","setCodeError","userInfoFromDb","setUserInfoFromDb","currentUserPoolUser","userPoolUser","attributes","phone_number_verified","fetchData","toggleVerifyPhoneModal","prevIsVerifyPhoneOpen","verifyPhoneNumber","verifyUserAttribute","res","cell_phone","verifyCodeClick","verifyUserAttributeSubmit","updatePhoneNumber","cellPhone","updateUserAttributes","phone_number","updateUserInput","dbUser","prevIsOpenEditPhone","disabled","input","evt","ch","String","fromCharCode","which","isInputNumber","CancelSubscription","subscriptionId","subId","handleFetchResult","result","ConfirmCancelSubscription","setIsCancelSubOpen","subscriptionInfo","setIsRecurring","confirmEvent","subscription","original_order_id","padding","setIsLoggedIn","isVerifyPhoneOpen","isCancelSubOpen","invoiceList","isVisibleSubHistory","currentAuthenticatedUser","sub","cognito_sub","is_recurring","editClick","email_address","invoice","period_start","paid","amount_paid","billing_reason","invoice_pdf","AgentsTable","updateAgentApproval","updateSubscriptionStatus","useTable","useSortBy","getTableProps","getTableBodyProps","headerGroups","prepareRow","headerGroup","getHeaderGroupProps","column","getHeaderProps","getSortByToggleProps","scope","render","isSorted","isSortedDesc","ArrowDownIcon","ArrowUpIcon","getRowProps","cells","cell","getCellProps","SubscriptionCell","initialValue","original","setValue","expiration","add","days","is_manual","expires_at","format","formatedExpiresAt","toLocaleDateString","StatusModal","setShowModal","handleConfirmed","pendingValue","cancelButtonRef","Root","show","as","Fragment","initialFocus","onClose","Child","enter","enterFrom","enterTo","leave","leaveFrom","leaveTo","Panel","CheckIcon","aria-hidden","Title","StatusCell","setPendingValue","showModal","lockedOut","newValue","subscription_id","sendValidationEmail","emailAddress","validationEmailResponse","_rowIndex","_columnId","alert","adminGrantSubscriptionInput","platform","operating_system","adminGrantSubscription","Header","accessor","Cell","agents","setAgents","fetchedAgentsResponse","adminListAgents","onboardedAgents","onboarding_complete","fetchAgents","pendingAgents","deniedAgents","approvedAgents","userDetails","isOpenCalendar","propertyListingsData","setPropertyListingsData","countListData","setCountListData","listing_agent_id","getCount","getShowingActionRequiredCount","mlsid","Address","media_url","property_listing_id","sortable","fontWeight","calendarEventTitle","setIsOpenEventTitle","eventTitle","setEventTitle","addEvent","CalendarEventApprove","setIsOpenEventApprove","approveEvent","rejectEvent","isOpenRejectMessage","setIsOpenRejectMessage","CalendarAutoApprove","CalendarLASlotOptions","setIsOpenLASlotOptions","editLASlot","deleteLASlot","createShowingAppointment","isVisibleCreateSlotBtn","successPopup","setIsOpenSuccessPopup","isAlert","isAddedSlotInPast","isNotValidTimeSlot","CalendarLASlotAddUpdatePopup","setIsOpenLASlotAddUpdatePopup","OkClick","newLAAvilabilitySlot","selectedSlotInfo","selectedLAAvilabilitySlot","laSlotEventName","displayMsg","rangeStart","start","rangeEnd","end","slotDate","deleteRangeStart","deleteRangeEnd","deleteSlotDate","addRangeStart","addRangeEnd","addSlotDate","sendSMSMessage","sendEmail","emailResponse","CalendarDeleteApprovedSlot","setIsOpenDeleteApprovedSlot","DeleteClick","localizer","momentLocalizer","moment","DnDCalendar","withDragAndDrop","Calendar","Component","calculateTimeLeft","launchDate","difference","Math","floor","hours","minutes","seconds","MAILERLITE_API_KEY","REACT_APP_SENDGRID_API_KEY","REACT_APP_SENDGRID_LIST_ID","REACT_APP_TWILIO_ACCOUNT_SID","REACT_APP_TWILIO_AUTH_TOKEN","REACT_APP_TWILIO_PHONE_NUMBER","Modal","step","setEmail","handleEmailSubmit","isSubmitting","setPhone","handlePhoneSubmit","onSubmit","required","country","inputProps","containerClass","Waitlist","openSnackbar","setOpenSnackbar","waitlistCount","setWaitlistCount","setPrevCount","setIsGlowing","UTC","timeLeft","setTimeLeft","finalMessage","useHistory","setStep","setIsSubmitting","setError","random","timer","groups","wantsTexts","getSubscriber","subscriberData","fields","features","icon","background","entries","unit","minWidth","minHeight","padStart","mobileAppHome","feature","cloneElement","clipboard","writeText","button","getElementById","originalText","querySelector","textContent","Amplify","configure","App","setIsAgent","setPropertyListings","setIsOpenPhoneNumNotVerified","setUserEmail","setUserId","setIsActiveSubscription","setIsUsedFreeTrial","setSubscriptionInfo","successLogin","authenticatedUser","signInUserSession","accessToken","is_agent","bypassCache","is_used_free_trial","code_name","subscriptionsRequired","subscriptionStatus","Provider","inset","Boolean","hostname","ReactDOM","serviceWorker","ready","registration","unregister"],"mappings":"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","file":"static/js/main.bde18c72.chunk.js","sourcesContent":["module.exports = __webpack_public_path__ + \"static/media/ATT-LOGO-2c-navy.921aa378.png\";","module.exports = __webpack_public_path__ + \"static/media/search.8e011552.svg\";","module.exports = \"data:image/png;base64,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\"","module.exports = __webpack_public_path__ + \"static/media/bedroom.668e687b.svg\";","module.exports = __webpack_public_path__ + \"static/media/bathroom.691caed5.svg\";","module.exports = __webpack_public_path__ + \"static/media/arrow-right.aedb1f1e.svg\";","module.exports = __webpack_public_path__ + \"static/media/footer.dc91b571.png\";","module.exports = __webpack_public_path__ + \"static/media/instagram-square.b8224bd2.svg\";","module.exports = __webpack_public_path__ + \"static/media/linkedin-square.1c911d54.svg\";","module.exports = __webpack_public_path__ + \"static/media/youtube-square.58120536.svg\";","module.exports = __webpack_public_path__ + \"static/media/facebook-square.731f023e.svg\";","module.exports = __webpack_public_path__ + \"static/media/twitter-square.574512b5.svg\";","module.exports = __webpack_public_path__ + \"static/media/teal-map-marker.0dca3aea.svg\";","module.exports = __webpack_public_path__ + \"static/media/searchBackground.e74d7eef.png\";","module.exports = __webpack_public_path__ + \"static/media/location-dark-icon.62a797fe.svg\";","module.exports = __webpack_public_path__ + \"static/media/page-left.de72f09f.svg\";","module.exports = __webpack_public_path__ + \"static/media/page-right.1e5b4e1a.svg\";","module.exports = __webpack_public_path__ + \"static/media/next.06e6c02d.svg\";","module.exports = __webpack_public_path__ + \"static/media/prev.8c309e56.svg\";","module.exports = __webpack_public_path__ + \"static/media/QRCode.dcb4e8a9.png\";","module.exports = __webpack_public_path__ + \"static/media/mobile-app-home.2a0f47e6.png\";","module.exports = __webpack_public_path__ + \"static/media/location-light-icon.2a6600fc.svg\";","const amplifyconfiguration = {\n Auth: {\n Cognito: {\n region: \"us-west-2\", // From your other config files\n userPoolId: \"PLACEHOLDER_USER_POOL_ID\",\n userPoolClientId: \"PLACEHOLDER_USER_POOL_CLIENT_ID\",\n },\n },\n API: {\n GraphQL: {\n endpoint: \"PLACEHOLDER_GRAPHQL_ENDPOINT\",\n region: \"us-west-2\",\n defaultAuthMode: \"userPool\",\n },\n },\n Storage: {\n S3: {\n bucket: \"PLACEHOLDER_BUCKET_NAME\",\n region: \"us-west-2\",\n },\n },\n};\n\nexport default amplifyconfiguration;\n","import React, { useRef, useEffect } from 'react';\nimport PropTypes from 'prop-types';\n\nfunction useOutsideClickHandler(ref, handlerFunction, conditional) {\n function handleClickOutside(event) {\n if (ref.current && !ref.current.contains(event.target) && conditional) {\n handlerFunction();\n }\n }\n // bind and unbind listener on use/cleanup\n useEffect(() => {\n document.addEventListener('mousedown', handleClickOutside);\n\n return () => {\n document.removeEventListener('mousedown', handleClickOutside);\n };\n });\n}\n\n// Wrapper component\nconst OutsideClickHandler = ({ children, handlerFunction, conditional }) => {\n const wrapperRef = useRef(null);\n\n useOutsideClickHandler(wrapperRef, handlerFunction, conditional);\n\n return (\n
\n {children}\n
\n );\n};\n\nexport default OutsideClickHandler;\n\nOutsideClickHandler.propTypes = {\n children: PropTypes.oneOfType([PropTypes.array.isRequired, PropTypes.object.isRequired]),\n handlerFunction: PropTypes.func,\n conditional: PropTypes.bool,\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nconst baseUrl = 'https://abouttimetours.com';\n\nconst SubMenu = ({ linkName, isMobile }) => (\n \n {linkName === 'How It Works' ? (\n \n ) : (\n \n )}\n \n);\n\nexport default SubMenu;\n\nSubMenu.propTypes = {\n linkName: PropTypes.string,\n isMobile: PropTypes.bool,\n};\n","import React, { useState } from \"react\";\nimport PropTypes from \"prop-types\";\nimport { NavLink } from \"react-router-dom\";\nimport SubMenu from \"./SubMenu\";\n\nconst HeaderLink = ({\n isMobile,\n linkName,\n linkRoute,\n setSlideOutMobileMenu,\n handleLogout,\n hasSubMenu,\n}) => {\n const [openSubMenu, setOpenSubMenu] = useState();\n\n return (\n \n {\n if (isMobile) {\n setSlideOutMobileMenu(false);\n }\n if (linkName === \"Logout\") {\n handleLogout();\n }\n }}\n >\n {linkName}\n \n {hasSubMenu && }\n \n );\n};\n\nexport default HeaderLink;\n\nHeaderLink.propTypes = {\n isMobile: PropTypes.bool,\n linkName: PropTypes.string,\n linkRoute: PropTypes.string,\n setSlideOutMobileMenu: PropTypes.func,\n handleLogout: PropTypes.func,\n hasSubMenu: PropTypes.bool,\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport { Badge } from '@material-ui/core';\nimport HeaderLink from './HeaderLink';\n\nconst MobileMenu = ({\n slideOutMobileMenu,\n setSlideOutMobileMenu,\n toggleSlideOutMenu,\n isLoggedIn,\n handleLogin,\n handleLogout,\n isAgent,\n toggleNotifications,\n notificationBadgeCount,\n userInfo,\n isActiveSubscription,\n setIsOpenSubscription,\n}) => (\n \n \n
\n
\n
\n
\n
\n
\n \n
    \n \n\n \n\n \n\n \n\n \n \n {isLoggedIn ? (\n
      \n \n {isAgent && userInfo && !userInfo.is_free_version_account && isActiveSubscription && (\n \n )}\n {userInfo && userInfo.is_free_version_account && !isActiveSubscription && (\n {\n setSlideOutMobileMenu();\n setIsOpenSubscription(true);\n }}\n onKeyDown={() => setIsOpenSubscription(true)}\n tabIndex={0}\n type=\"button\"\n >\n Upgrade\n \n )}\n\n
      \n \n \n Notification\n \n \n
      \n\n \n
    \n ) : (\n
      \n
    • \n {\n handleLogin();\n setSlideOutMobileMenu();\n }}\n >\n Login\n \n
    • \n\n \n
    \n )}\n
\n
\n);\n\nexport default MobileMenu;\n\nMobileMenu.propTypes = {\n slideOutMobileMenu: PropTypes.bool,\n setSlideOutMobileMenu: PropTypes.func,\n toggleSlideOutMenu: PropTypes.func,\n isLoggedIn: PropTypes.bool,\n handleLogin: PropTypes.func,\n handleLogout: PropTypes.func,\n isAgent: PropTypes.bool,\n toggleNotifications: PropTypes.func,\n notificationBadgeCount: PropTypes.number,\n userInfo: PropTypes.object,\n isActiveSubscription: PropTypes.bool,\n setIsOpenSubscription: PropTypes.func,\n};\n","/* eslint-disable */\n\nexport const getListing = /* GraphQL */ `\n query GetListing($id: ID!) {\n getListing(id: $id) {\n id\n listing_key\n listing_id\n address\n full_address\n unit_number\n city\n state\n zip\n country\n county\n latitude\n longitude\n listing_price\n bedrooms\n bathrooms\n square_feet\n lot_size\n lot_size_units\n home_type\n on_market_date\n description\n listing_agent\n listing_agent_id\n listing_agent_email\n listing_agent_phone\n listing_office\n source\n originating_system_id\n status\n modification_timestamp\n Media {\n ListingKey\n LongDescription\n MediaCategory\n MediaKey\n MediaModificationTimestamp\n MediaURL\n ShortDescription\n IsPrimary\n }\n }\n }\n`;\n\nexport const listListings = /* GraphQL */ `\n query ListListings(\n $filter: ModelListingFilterInput\n $limit: Int\n $nextToken: String\n ) {\n listListings(filter: $filter, limit: $limit, nextToken: $nextToken) {\n items {\n id\n listing_key\n listing_id\n address\n full_address\n unit_number\n city\n state\n zip\n country\n county\n latitude\n longitude\n listing_price\n bedrooms\n bathrooms\n square_feet\n lot_size\n lot_size_units\n home_type\n on_market_date\n description\n listing_agent\n listing_agent_id\n listing_agent_email\n listing_agent_phone\n listing_office\n source\n originating_system_id\n status\n Media {\n ListingKey\n LongDescription\n MediaCategory\n MediaKey\n MediaModificationTimestamp\n MediaURL\n ShortDescription\n IsPrimary\n }\n }\n nextToken\n }\n }\n`;\n\nexport const getListingByListingId = /* GraphQL */ `\n query GetListingByListingId(\n $listing_id: String\n $id: ModelIDKeyConditionInput\n $sortDirection: ModelSortDirection\n $filter: ModelListingFilterInput\n $limit: Int\n $nextToken: String\n ) {\n getListingByListingId(\n listing_id: $listing_id\n id: $id\n sortDirection: $sortDirection\n filter: $filter\n limit: $limit\n nextToken: $nextToken\n ) {\n items {\n id\n listing_key\n listing_id\n address\n full_address\n unit_number\n city\n state\n zip\n country\n county\n latitude\n longitude\n listing_price\n bedrooms\n bathrooms\n bathrooms_full\n square_feet\n square_feet_source\n lot_size\n lot_size_units\n garage_yn\n garage_spaces\n home_type\n horse_yn\n new_construction_yn\n on_market_date\n description\n listing_agent\n listing_agent_id\n listing_agent_email\n listing_agent_phone\n listing_office\n rented\n association_yn\n short_term_rental_permit_issued\n elementary_school\n middle_or_junior_school\n high_school\n senior_community_yn\n tax_annual_amount\n tax_year\n tax_lot\n tax_map_number\n potential_tax_liability\n assessment\n appliances\n cooling\n heating\n fireplace_features\n flooring\n interior_features\n rooms\n window_features\n security_features\n architectural_style\n community_features\n lot_features\n parking_features\n road_surface_types\n view\n source\n originating_system_id\n status\n modification_timestamp\n Media {\n ListingKey\n LongDescription\n MediaCategory\n MediaKey\n MediaModificationTimestamp\n MediaURL\n ShortDescription\n IsPrimary\n }\n }\n nextToken\n }\n }\n`;\n\nexport const getPropertyOfInterestByListingKey = /* GraphQL */ `\n query GetPropertyOfInterestByListingKey(\n $client_id: Int!\n $listing_key: String!\n ) {\n getPropertyOfInterestByListingKey(\n client_id: $client_id\n listing_key: $listing_key\n ) {\n id\n property_listing_id\n client_id\n status\n notes\n created_at\n updated_at\n property_listing {\n id\n listing_agent_id\n seller_id\n listing_id\n listing_key\n address\n city\n state\n zip\n latitude\n longitude\n bedrooms\n bathrooms\n square_feet\n listing_price\n last_updated\n created_at\n updated_at\n }\n }\n }\n`;\n\nexport const getPropertyListingByListingKey = /* GraphQL */ `\n query GetPropertyListingByListingKey($listing_key: String!) {\n getPropertyListingByListingKey(listing_key: $listing_key) {\n id\n listing_agent_id\n seller_id\n listing_id\n listing_key\n address\n city\n state\n zip\n latitude\n longitude\n bedrooms\n bathrooms\n square_feet\n listing_price\n last_updated\n created_at\n updated_at\n listing_agent {\n id\n first_name\n last_name\n email_address\n cell_phone\n logo\n brokerage\n realtor_number\n is_agent\n }\n seller {\n id\n first_name\n last_name\n email_address\n cell_phone\n logo\n brokerage\n realtor_number\n is_agent\n }\n }\n }\n`;\n\nexport const getUserByCognitoSub = /* GraphQL */ `\n query GetUserByCognitoSub($cognito_sub: String!) {\n getUserByCognitoSub(cognito_sub: $cognito_sub) {\n id\n first_name\n last_name\n email_address\n address\n city\n state\n zip\n cell_phone\n cognito_sub\n cognito_identity\n time_zone\n title\n logo\n brokerage\n realtor_number\n agent_id\n agent_notes\n is_agent\n onboarding_complete\n created_at\n updated_at\n locked_out\n validated\n is_free_version_account\n is_used_free_trial\n }\n }\n`;\n\nexport const listClients = /* GraphQL */ `\n query ListClients($agent_id: Int!) {\n listClients(agent_id: $agent_id) {\n id\n first_name\n last_name\n email_address\n address\n city\n state\n zip\n cell_phone\n cognito_sub\n cognito_identity\n time_zone\n subscription_id\n title\n logo\n brokerage\n realtor_number\n agent_id\n agent_notes\n is_agent\n onboarding_complete\n }\n }\n`;\n\nexport const listPropertiesOfInterest = /* GraphQL */ `\n query ListPropertiesOfInterest($client_id: Int!) {\n listPropertiesOfInterest(client_id: $client_id) {\n id\n property_listing_id\n client_id\n status\n notes\n created_at\n updated_at\n property_listing {\n id\n listing_agent_id\n seller_id\n listing_id\n listing_key\n address\n city\n state\n zip\n latitude\n longitude\n bedrooms\n bathrooms\n square_feet\n listing_price\n last_updated\n created_at\n updated_at\n listing_agent {\n id\n first_name\n last_name\n email_address\n cell_phone\n logo\n brokerage\n realtor_number\n is_agent\n }\n }\n client {\n id\n first_name\n last_name\n email_address\n cell_phone\n logo\n brokerage\n realtor_number\n is_agent\n }\n }\n }\n`;\n\nexport const listAgents = /* GraphQL */ `\n query ListAgents($search_key: String) {\n listAgents(search_key: $search_key) {\n id\n first_name\n last_name\n email_address\n address\n city\n state\n zip\n cell_phone\n cognito_sub\n cognito_identity\n time_zone\n subscription_id\n title\n logo\n brokerage\n realtor_number\n agent_id\n agent_notes\n is_agent\n validated\n onboarding_complete\n created_at\n updated_at\n push_token\n operating_system\n os_version\n insert_uuid\n is_test_account\n locked_out\n active_tour {\n id\n name\n status\n start_time\n end_time\n custom_start_name\n address_str\n latitude\n longitude\n client_id\n agent_id\n current_tour_stop_id\n current_tour_stop {\n id\n order\n duration\n notify_before\n notify_listing_agent\n notify_seller\n notify_after\n request_sent\n showing_request_required\n next_up_sent\n next_up_sent_by\n have_left_sent\n have_left_sent_by\n est_drive_duration\n est_drive_str\n comments\n client_interested\n start_time\n status\n tour_id\n property_of_interest_id\n last_request_sent_by_user_id\n insert_uuid\n property_of_interest {\n id\n property_listing_id\n client_id\n status\n notes\n created_at\n updated_at\n property_listing {\n id\n listing_agent_id\n seller_id\n created_by_user_id\n listing_id\n listing_key\n address\n city\n state\n zip\n latitude\n longitude\n is_custom_listing\n bedrooms\n bathrooms\n square_feet\n listing_price\n last_updated\n created_at\n updated_at\n insert_uuid\n }\n client {\n id\n first_name\n last_name\n email_address\n cell_phone\n logo\n brokerage\n realtor_number\n is_agent\n is_test_account\n validated\n }\n seen_by_client\n insert_uuid\n }\n }\n created_at\n updated_at\n insert_uuid\n client {\n id\n first_name\n last_name\n email_address\n cell_phone\n logo\n brokerage\n realtor_number\n is_agent\n is_test_account\n validated\n }\n stops {\n id\n order\n duration\n notify_before\n notify_listing_agent\n notify_seller\n notify_after\n request_sent\n showing_request_required\n next_up_sent\n next_up_sent_by\n have_left_sent\n have_left_sent_by\n est_drive_duration\n est_drive_str\n comments\n client_interested\n start_time\n status\n tour_id\n property_of_interest_id\n last_request_sent_by_user_id\n insert_uuid\n property_of_interest {\n id\n property_listing_id\n client_id\n status\n notes\n created_at\n updated_at\n property_listing {\n id\n listing_agent_id\n seller_id\n created_by_user_id\n listing_id\n listing_key\n address\n city\n state\n zip\n latitude\n longitude\n is_custom_listing\n bedrooms\n bathrooms\n square_feet\n listing_price\n last_updated\n created_at\n updated_at\n insert_uuid\n }\n client {\n id\n first_name\n last_name\n email_address\n cell_phone\n logo\n brokerage\n realtor_number\n is_agent\n is_test_account\n validated\n }\n seen_by_client\n insert_uuid\n }\n }\n seen_by_client\n }\n }\n }\n`;\n\nexport const getAdminUserReport = /* GraphQL */ `\n query GetAdminUserReport {\n getAdminUserReport {\n status\n body\n }\n }\n`;\n\nexport const adminListAgents = /* GraphQL */ `\n query AdminListAgents {\n adminListAgents {\n id\n first_name\n last_name\n email_address\n address\n city\n state\n zip\n cell_phone\n cognito_sub\n cognito_identity\n time_zone\n subscription_id\n title\n logo\n brokerage\n realtor_number\n agent_id\n agent_notes\n is_agent\n validated\n onboarding_complete\n created_at\n updated_at\n push_token\n operating_system\n os_version\n insert_uuid\n is_test_account\n locked_out\n active_tour {\n id\n name\n status\n start_time\n end_time\n custom_start_name\n address_str\n latitude\n longitude\n client_id\n agent_id\n current_tour_stop_id\n current_tour_stop {\n id\n order\n duration\n notify_before\n notify_listing_agent\n notify_seller\n notify_after\n request_sent\n showing_request_required\n next_up_sent\n next_up_sent_by\n have_left_sent\n have_left_sent_by\n est_drive_duration\n est_drive_str\n comments\n client_interested\n start_time\n status\n tour_id\n property_of_interest_id\n last_request_sent_by_user_id\n insert_uuid\n property_of_interest {\n id\n property_listing_id\n client_id\n status\n notes\n created_at\n updated_at\n property_listing {\n id\n listing_agent_id\n seller_id\n created_by_user_id\n listing_id\n listing_key\n address\n city\n state\n zip\n latitude\n longitude\n is_custom_listing\n bedrooms\n bathrooms\n square_feet\n listing_price\n last_updated\n created_at\n updated_at\n insert_uuid\n }\n client {\n id\n first_name\n last_name\n email_address\n cell_phone\n logo\n brokerage\n realtor_number\n is_agent\n is_test_account\n validated\n }\n seen_by_client\n insert_uuid\n }\n }\n created_at\n updated_at\n insert_uuid\n client {\n id\n first_name\n last_name\n email_address\n cell_phone\n logo\n brokerage\n realtor_number\n is_agent\n is_test_account\n validated\n }\n stops {\n id\n order\n duration\n notify_before\n notify_listing_agent\n notify_seller\n notify_after\n request_sent\n showing_request_required\n next_up_sent\n next_up_sent_by\n have_left_sent\n have_left_sent_by\n est_drive_duration\n est_drive_str\n comments\n client_interested\n start_time\n status\n tour_id\n property_of_interest_id\n last_request_sent_by_user_id\n insert_uuid\n property_of_interest {\n id\n property_listing_id\n client_id\n status\n notes\n created_at\n updated_at\n property_listing {\n id\n listing_agent_id\n seller_id\n created_by_user_id\n listing_id\n listing_key\n address\n city\n state\n zip\n latitude\n longitude\n is_custom_listing\n bedrooms\n bathrooms\n square_feet\n listing_price\n last_updated\n created_at\n updated_at\n insert_uuid\n }\n client {\n id\n first_name\n last_name\n email_address\n cell_phone\n logo\n brokerage\n realtor_number\n is_agent\n is_test_account\n validated\n }\n seen_by_client\n insert_uuid\n }\n }\n seen_by_client\n }\n agent_subscription {\n is_active\n is_manual\n original_order_id\n purchase_state\n expires_at\n canceled_at\n }\n }\n }\n`;\n\n\nexport const listPropertyListings = /* GraphQL */ `\n query ListPropertyListings($listing_agent_id: Int, $seller_id: Int) {\n listPropertyListings(\n listing_agent_id: $listing_agent_id\n seller_id: $seller_id\n ) {\n id\n listing_agent_id\n seller_id\n created_by_user_id\n listing_id\n listing_key\n address\n city\n county\n state\n zip\n subdivision_name\n zoning\n latitude\n longitude\n parcel_number\n additional_parcels\n is_custom_listing\n listing_price\n association_fee\n association_fee_frequency\n on_market_date\n bedrooms\n bathrooms\n bathrooms_full\n square_feet\n square_feet_source\n lot_size\n year_built\n property_sub_type\n status\n description\n rented\n in_association\n community_features\n short_term_rental_permit_issued\n elementary_school\n middle_or_junior_school\n high_school\n tax_annual_amount\n tax_year\n tax_lot\n tax_map_number\n potential_tax_liability\n assessment\n senior_community\n appliances\n cooling\n heating\n fireplace_features\n flooring\n interior_features\n rooms\n window_features\n security_features\n architectural_style\n lot_features\n garage\n garage_spaces\n parking_features\n road_surface_types\n view\n horse_property\n new_construction\n last_updated\n source\n originating_system\n accessory_dwelling_unit\n levels\n common_walls\n construction_materials\n basement\n foundation_details\n power_production_type\n roof\n sewer\n water_source\n irrigation_water_rights\n media_url\n is_auto_approve\n showing_request_deadline\n deadline_start_time\n created_at\n updated_at\n insert_uuid\n listing_agent {\n id\n first_name\n last_name\n email_address\n cell_phone\n logo\n brokerage\n realtor_number\n is_agent\n is_test_account\n validated\n }\n seller {\n id\n first_name\n last_name\n email_address\n cell_phone\n logo\n brokerage\n realtor_number\n is_agent\n is_test_account\n validated\n }\n }\n }\n`;\n\n\nexport const agentTimeSlotDetails = /* GraphQL */ `\n query AgentTimeSlotDetails(\n $listing_id: String!\n $start_time: Int\n $end_datetime: Int\n ) {\n agentTimeSlotDetails(\n listing_id: $listing_id\n start_time: $start_time\n end_datetime: $end_datetime\n ) {\n\n tourstop_id\n availbility_id\n listing_id\n start_time\n duration\n end_datetime\n STATUS\n tour_id\n listing_agent_id\n address\n is_auto_approve\n listingAgent_first_name\n listingAgent_last_name\n listingAgent_email_address\n listingAgent_cell_phone\n listingAgent_brokerage\n buyingAgent_first_name\n buyingAgent_last_name\n buyingAgent_email_address\n buyingAgent_brokerage\n buyingAgent_cell_phone\n property_listing_id\n home_of_interest_id\n client_id\n tour_name\n is_behalf_of_buying_agent\n }\n }\n`;\n\nexport const getPropertyListing = /* GraphQL */ `\n query GetPropertyListing($id: Int!) {\n getPropertyListing(id: $id) {\n id\n listing_agent_id\n seller_id\n created_by_user_id\n listing_id\n listing_key\n address\n city\n county\n state\n zip\n subdivision_name\n zoning\n latitude\n longitude\n parcel_number\n additional_parcels\n is_custom_listing\n listing_price\n association_fee\n association_fee_frequency\n on_market_date\n bedrooms\n bathrooms\n bathrooms_full\n square_feet\n square_feet_source\n lot_size\n year_built\n property_sub_type\n status\n description\n rented\n in_association\n community_features\n short_term_rental_permit_issued\n elementary_school\n middle_or_junior_school\n high_school\n tax_annual_amount\n tax_year\n tax_lot\n tax_map_number\n potential_tax_liability\n assessment\n senior_community\n appliances\n cooling\n heating\n fireplace_features\n flooring\n interior_features\n rooms\n window_features\n security_features\n architectural_style\n lot_features\n garage\n garage_spaces\n parking_features\n road_surface_types\n view\n horse_property\n new_construction\n last_updated\n source\n originating_system\n accessory_dwelling_unit\n levels\n common_walls\n construction_materials\n basement\n foundation_details\n power_production_type\n roof\n sewer\n water_source\n irrigation_water_rights\n media_url\n is_auto_approve\n showing_request_deadline\n deadline_start_time\n created_at\n updated_at\n insert_uuid\n listing_agent {\n id\n first_name\n last_name\n email_address\n cell_phone\n logo\n brokerage\n realtor_number\n is_agent\n is_test_account\n validated\n }\n seller {\n id\n first_name\n last_name\n email_address\n cell_phone\n logo\n brokerage\n realtor_number\n is_agent\n is_test_account\n validated\n }\n }\n }\n`;\n\n\nexport const getTourStopIfExists = /* GraphQL */ `\n query GetTourStopIfExists(\n $property_listing_id: Int!\n $start_time: Int!\n $end_time: Int!\n ) {\n getTourStopIfExists(\n property_listing_id: $property_listing_id\n start_time: $start_time\n end_time: $end_time\n ) {\n id\n order\n duration\n notify_before\n notify_listing_agent\n notify_seller\n notify_after\n request_sent\n showing_request_required\n next_up_sent\n next_up_sent_by\n have_left_sent\n have_left_sent_by\n est_drive_duration\n est_drive_str\n comments\n client_interested\n start_time\n status\n tour_id\n property_of_interest_id\n last_request_sent_by_user_id\n created_at\n updated_at\n insert_uuid\n is_active\n property_of_interest {\n id\n property_listing_id\n client_id\n status\n notes\n created_at\n updated_at\n property_listing {\n id\n listing_agent_id\n seller_id\n created_by_user_id\n listing_id\n listing_key\n address\n city\n county\n state\n zip\n subdivision_name\n zoning\n latitude\n longitude\n parcel_number\n additional_parcels\n is_custom_listing\n listing_price\n association_fee\n association_fee_frequency\n on_market_date\n bedrooms\n bathrooms\n bathrooms_full\n square_feet\n square_feet_source\n lot_size\n year_built\n property_sub_type\n status\n description\n rented\n in_association\n community_features\n short_term_rental_permit_issued\n elementary_school\n middle_or_junior_school\n high_school\n tax_annual_amount\n tax_year\n tax_lot\n tax_map_number\n potential_tax_liability\n assessment\n senior_community\n appliances\n cooling\n heating\n fireplace_features\n flooring\n interior_features\n rooms\n window_features\n security_features\n architectural_style\n lot_features\n garage\n garage_spaces\n parking_features\n road_surface_types\n view\n horse_property\n new_construction\n last_updated\n source\n originating_system\n accessory_dwelling_unit\n levels\n common_walls\n construction_materials\n basement\n foundation_details\n power_production_type\n roof\n sewer\n water_source\n irrigation_water_rights\n media_url\n is_auto_approve\n created_at\n updated_at\n insert_uuid\n listing_agent {\n id\n first_name\n last_name\n email_address\n cell_phone\n logo\n brokerage\n realtor_number\n is_agent\n is_test_account\n validated\n }\n seller {\n id\n first_name\n last_name\n email_address\n cell_phone\n logo\n brokerage\n realtor_number\n is_agent\n is_test_account\n validated\n }\n }\n client {\n id\n first_name\n last_name\n email_address\n cell_phone\n logo\n brokerage\n realtor_number\n is_agent\n is_test_account\n validated\n }\n seen_by_client\n insert_uuid\n }\n }\n }\n`;\n\n\nexport const listUserNotifications = /* GraphQL */ `\n query ListUserNotifications($recipient_id: Int!) {\n listUserNotifications(recipient_id: $recipient_id) {\n id\n title\n body\n recipient_id\n ticket_id\n ticket_status\n ticket_message\n ticket_details\n sent_sms\n route_info\n was_read\n created_at\n updated_at\n is_active\n insert_uuid\n }\n }\n`;\n\nexport const getPropertyListingAutoApprove = /* GraphQL */ `\n query GetPropertyListing($id: Int!) {\n getPropertyListing(id: $id) {\n is_auto_approve\n showing_request_deadline\n deadline_start_time\n }\n }\n`;\n\nexport const getUserNotificationCount = /* GraphQL */ `\n query GetUserNotificationCount($user_id: Int) {\n getUserNotificationCount(user_id: $user_id) {\n count\n }\n }\n`;\n\nexport const getShowingActionRequiredCount = /* GraphQL */ `\n query GetShowingActionRequiredCount($agent_id: Int!) {\n getShowingActionRequiredCount(agent_id: $agent_id) {\n count\n property_listing_id\n }\n }\n`;\n\nexport const getPropertyListingByListingId = /* GraphQL */ `\n query GetPropertyListingByListingId($listing_id: String!) {\n getPropertyListingByListingId(listing_id: $listing_id) {\n id\n listing_agent_id\n seller_id\n created_by_user_id\n listing_id\n listing_key\n address\n city\n county\n state\n zip\n is_auto_approve\n showing_request_deadline\n deadline_start_time\n created_at\n updated_at\n insert_uuid\n listing_agent {\n id\n first_name\n last_name\n email_address\n cell_phone\n logo\n brokerage\n realtor_number\n is_agent\n is_test_account\n validated\n }\n }\n }\n`;\n\nexport const getSubscriptionStatus = /* GraphQL */ `\n query GetSubscriptionStatus($user_id: Int!) {\n getSubscriptionStatus(user_id: $user_id) {\n user_id\n is_active\n is_recurring\n is_trial\n subscription {\n id\n user_id\n original_order_id\n created_at\n updated_at\n insert_uuid\n }\n }\n }\n`;\n\nexport const getSetting = /* GraphQL */ `\n query GetSetting($code_name: String!) {\n getSetting(code_name: $code_name) {\n id\n code_name\n value\n insert_uuid\n }\n }\n`;\n","import React from 'react';\nimport { API, graphqlOperation } from 'aws-amplify';\nimport { getAdminUserReport } from '../graphql/queries';\n\nconst DownloadUserReportLink = () => {\n const downloadReport = async () => {\n const { data } = await API.graphql(graphqlOperation(getAdminUserReport));\n\n const url = data.getAdminUserReport.body;\n\n const a = document.createElement('a');\n const todaysDate = new Date().toISOString();\n\n a.href = url;\n a.download = `${todaysDate}-userReport.json`;\n a.click();\n };\n\n return (\n \n );\n};\n\nexport default DownloadUserReportLink;\n","export const createPropertyRecords = /* GraphQL */ `\n mutation CreatePropertyRecords($createPropertyRecordsInput: CreatePropertyRecordsInput!) {\n createPropertyRecords(createPropertyRecordsInput: $createPropertyRecordsInput) {\n property_listing_id\n property_of_interest_id\n client_id\n }\n }\n`;\n\nexport const createUserIfNotExists = /* GraphQL */ `\n mutation CreateUserIfNotExists($createUserIfNotExistsInput: CreateUserIfNotExistsInput!) {\n createUserIfNotExists(createUserIfNotExistsInput: $createUserIfNotExistsInput) {\n id\n first_name\n last_name\n email_address\n address\n city\n state\n zip\n cell_phone\n cognito_sub\n cognito_identity\n time_zone\n subscription_id\n title\n logo\n brokerage\n realtor_number\n agent_id\n agent_notes\n is_agent\n onboarding_complete\n }\n }\n`;\n\nexport const updateUser = /* GraphQL */ `\n mutation UpdateUser($updateUserInput: UpdateUserInput!) {\n updateUser(updateUserInput: $updateUserInput) {\n id\n first_name\n last_name\n email_address\n address\n city\n state\n zip\n cell_phone\n cognito_sub\n cognito_identity\n time_zone\n subscription_id\n title\n logo\n brokerage\n realtor_number\n agent_id\n agent_notes\n is_agent\n onboarding_complete\n created_at\n updated_at\n push_token\n operating_system\n os_version\n insert_uuid\n is_test_account\n is_free_version_account\n }\n }\n`;\n\nexport const adminApproveAgent = /* GraphQL */ `\n mutation AdminApproveAgent($id: Int) {\n adminApproveAgent(id: $id) {\n id\n }\n }\n`;\n\nexport const adminUpdateUser = /* GraphQL */ `\n mutation AdminUpdateUser($updateUserInput: AdminUpdateUserInput!) {\n adminUpdateUser(updateUserInput: $updateUserInput) {\n id\n first_name\n last_name\n email_address\n address\n city\n state\n zip\n cell_phone\n cognito_sub\n cognito_identity\n time_zone\n subscription_id\n title\n logo\n brokerage\n realtor_number\n agent_id\n agent_notes\n is_agent\n validated\n onboarding_complete\n created_at\n updated_at\n push_token\n operating_system\n os_version\n insert_uuid\n is_test_account\n locked_out\n }\n }\n`;\n\nexport const adminGrantSubscription = /* GraphQL */ `\n mutation AdminGrantSubscription($adminGrantSubscriptionInput: AdminGrantSubscriptionInput) {\n adminGrantSubscription(adminGrantSubscriptionInput: $adminGrantSubscriptionInput) {\n id\n subscription_id\n product_id\n order_id\n purchase_state\n purchased_at\n expires_at\n canceled_at\n expiration_intent\n expected_to_renew\n last_notification_type\n is_trial\n created_at\n receipt\n insert_uuid\n }\n }\n`;\n\nexport const addListingAgentAvailbility = /* GraphQL */ `\n mutation AddListingAgentAvailbility($addListingAgentAvailbilityInput: AddListingAgentAvailbilityInput!) {\n addListingAgentAvailbility(addListingAgentAvailbilityInput: $addListingAgentAvailbilityInput) {\n id\n listing_agent_id\n property_listing_id\n start_datetime\n end_datetime\n insert_uuid\n }\n }\n`;\n\nexport const createTourStop = /* GraphQL */ `\n mutation CreateTourStop($createTourStopInput: CreateTourStopInput!) {\n createTourStop(createTourStopInput: $createTourStopInput) {\n id\n order\n duration\n notify_before\n notify_listing_agent\n notify_seller\n notify_after\n request_sent\n showing_request_required\n next_up_sent\n next_up_sent_by\n have_left_sent\n have_left_sent_by\n est_drive_duration\n est_drive_str\n comments\n client_interested\n start_time\n status\n tour_id\n property_of_interest_id\n last_request_sent_by_user_id\n created_at\n updated_at\n insert_uuid\n is_active\n }\n }\n`;\n\nexport const createTour = /* GraphQL */ `\n mutation CreateTour($createTourInput: CreateTourInput!) {\n createTour(createTourInput: $createTourInput) {\n id\n name\n status\n start_time\n end_time\n custom_start_name\n address_str\n latitude\n longitude\n client_id\n agent_id\n current_tour_stop_id\n created_at\n updated_at\n insert_uuid\n seen_by_client\n manually_ordered_showings\n is_behalf_of_buying_agent\n }\n }\n`;\n\nexport const deleteTourStop = /* GraphQL */ `\n mutation DeleteTourStop($id: Int!) {\n deleteTourStop(id: $id) {\n id\n listing_agent_id\n is_active\n }\n }\n`;\n\nexport const updateTourStopRequestStatus = /* GraphQL */ `\n mutation UpdateTourStopRequestStatus($updateTourStopRequestStatusInput: UpdateTourStopRequestStatusInput!) {\n updateTourStopRequestStatus(updateTourStopRequestStatusInput: $updateTourStopRequestStatusInput) {\n id\n status\n last_request_sent_by_user_id\n showing_request_required\n tour_id\n listing_agent_id\n start_time\n }\n }\n`;\n\nexport const enableDisableAutoApprove = /* GraphQL */ `\n mutation EnableDisableAutoApprove($updatePropertyListingInput: UpdatePropertyListingInput!) {\n enableDisableAutoApprove(updatePropertyListingInput: $updatePropertyListingInput) {\n id\n listing_agent_id\n seller_id\n created_by_user_id\n listing_id\n listing_key\n address\n city\n county\n state\n zip\n subdivision_name\n zoning\n latitude\n longitude\n parcel_number\n additional_parcels\n is_custom_listing\n listing_price\n association_fee\n association_fee_frequency\n on_market_date\n bedrooms\n bathrooms\n bathrooms_full\n square_feet\n square_feet_source\n lot_size\n year_built\n property_sub_type\n status\n description\n rented\n in_association\n community_features\n short_term_rental_permit_issued\n elementary_school\n middle_or_junior_school\n high_school\n tax_annual_amount\n tax_year\n tax_lot\n tax_map_number\n potential_tax_liability\n assessment\n senior_community\n appliances\n cooling\n heating\n fireplace_features\n flooring\n interior_features\n rooms\n window_features\n security_features\n architectural_style\n lot_features\n garage\n garage_spaces\n parking_features\n road_surface_types\n view\n horse_property\n new_construction\n last_updated\n source\n originating_system\n accessory_dwelling_unit\n levels\n common_walls\n construction_materials\n basement\n foundation_details\n power_production_type\n roof\n sewer\n water_source\n irrigation_water_rights\n media_url\n is_auto_approve\n showing_request_deadline\n deadline_start_time\n created_at\n updated_at\n insert_uuid\n listing_agent {\n id\n first_name\n last_name\n email_address\n cell_phone\n logo\n brokerage\n realtor_number\n is_agent\n is_test_account\n validated\n }\n seller {\n id\n first_name\n last_name\n email_address\n cell_phone\n logo\n brokerage\n realtor_number\n is_agent\n is_test_account\n validated\n }\n }\n }\n`;\n\nexport const updateListingAgentAvailbility = /* GraphQL */ `\n mutation UpdateListingAgentAvailbility($updateListingAgentAvailbilityInput: UpdateListingAgentAvailbilityInput!) {\n updateListingAgentAvailbility(updateListingAgentAvailbilityInput: $updateListingAgentAvailbilityInput) {\n id\n listing_agent_id\n property_listing_id\n start_datetime\n end_datetime\n insert_uuid\n }\n }\n`;\n\nexport const createUserNotification = /* GraphQL */ `\n mutation CreateUserNotification($createUserNotificationInput: CreateUserNotificationInput) {\n createUserNotification(createUserNotificationInput: $createUserNotificationInput) {\n id\n title\n body\n recipient_id\n ticket_id\n ticket_status\n ticket_message\n ticket_details\n sent_sms\n sent_email\n route_info\n was_read\n created_at\n updated_at\n is_active\n insert_uuid\n }\n }\n`;\n\nexport const createPropertyOfInterest = /* GraphQL */ `\n mutation CreatePropertyOfInterest($createPropertyOfInterestInput: CreatePropertyOfInterestInput!) {\n createPropertyOfInterest(createPropertyOfInterestInput: $createPropertyOfInterestInput) {\n id\n property_listing_id\n client_id\n status\n notes\n created_at\n updated_at\n property_listing {\n id\n listing_agent_id\n seller_id\n created_by_user_id\n listing_id\n listing_key\n address\n city\n county\n state\n zip\n subdivision_name\n zoning\n latitude\n longitude\n parcel_number\n additional_parcels\n is_custom_listing\n listing_price\n association_fee\n association_fee_frequency\n on_market_date\n bedrooms\n bathrooms\n bathrooms_full\n square_feet\n square_feet_source\n lot_size\n year_built\n property_sub_type\n status\n description\n rented\n in_association\n community_features\n short_term_rental_permit_issued\n elementary_school\n middle_or_junior_school\n high_school\n tax_annual_amount\n tax_year\n tax_lot\n tax_map_number\n potential_tax_liability\n assessment\n senior_community\n appliances\n cooling\n heating\n fireplace_features\n flooring\n interior_features\n rooms\n window_features\n security_features\n architectural_style\n lot_features\n garage\n garage_spaces\n parking_features\n road_surface_types\n view\n horse_property\n new_construction\n last_updated\n source\n originating_system\n accessory_dwelling_unit\n levels\n common_walls\n construction_materials\n basement\n foundation_details\n power_production_type\n roof\n sewer\n water_source\n irrigation_water_rights\n media_url\n created_at\n updated_at\n insert_uuid\n listing_agent {\n id\n first_name\n last_name\n email_address\n cell_phone\n logo\n brokerage\n realtor_number\n is_agent\n is_test_account\n validated\n }\n seller {\n id\n first_name\n last_name\n email_address\n cell_phone\n logo\n brokerage\n realtor_number\n is_agent\n is_test_account\n validated\n }\n }\n client {\n id\n first_name\n last_name\n email_address\n cell_phone\n logo\n brokerage\n realtor_number\n is_agent\n is_test_account\n validated\n }\n media_url\n seen_by_client\n insert_uuid\n }\n }\n`;\n\nexport const clearUserNotificationCount = /* GraphQL */ `\n mutation ClearUserNotificationCount($user_id: Int!) {\n clearUserNotificationCount(user_id: $user_id) {\n count\n }\n }\n`;\n\nexport const updateNotification = /* GraphQL */ `\n mutation UpdateNotification($updateNotificationInput: UpdateNotificationInput!) {\n updateNotification(updateNotificationInput: $updateNotificationInput) {\n id\n title\n body\n recipient_id\n ticket_id\n ticket_status\n ticket_message\n ticket_details\n sent_sms\n route_info\n was_read\n created_at\n updated_at\n is_active\n insert_uuid\n }\n }\n`;\n\nexport const removeNotifications = /* GraphQL */ `\n mutation RemoveNotifications($user_id: Int!) {\n removeNotifications(user_id: $user_id) {\n id\n title\n body\n recipient_id\n ticket_id\n ticket_status\n ticket_message\n ticket_details\n sent_sms\n route_info\n was_read\n created_at\n updated_at\n is_active\n insert_uuid\n }\n }\n`;\n\nexport const createSubscription = /* GraphQL */ `\n mutation CreateSubscription($createSubscriptionInput: CreateSubscriptionInput!) {\n createSubscription(createSubscriptionInput: $createSubscriptionInput) {\n user_id\n is_active\n subscription {\n id\n user_id\n original_order_id\n created_at\n updated_at\n insert_uuid\n }\n }\n }\n`;\n\nexport const deleteSelectedListingAgentAvailbility = /* GraphQL */ `\n mutation DeleteSelectedListingAgentAvailbility(\n $deleteSelectedListingAgentAvailbilityInput: DeleteSelectedListingAgentAvailbilityInput!\n ) {\n deleteSelectedListingAgentAvailbility(\n deleteSelectedListingAgentAvailbilityInput: $deleteSelectedListingAgentAvailbilityInput\n ) {\n id\n listing_agent_id\n property_listing_id\n start_datetime\n end_datetime\n insert_uuid\n }\n }\n`;\n\nexport const createMessage = /* GraphQL */ `\n mutation CreateMessage($createMessageInput: CreateMessageInput!) {\n createMessage(createMessageInput: $createMessageInput) {\n id\n from_user\n to_user\n message\n tour_stop_id\n created_at\n updated_at\n insert_uuid\n recipient {\n id\n first_name\n last_name\n email_address\n cell_phone\n logo\n brokerage\n realtor_number\n is_agent\n is_test_account\n validated\n }\n sender {\n id\n first_name\n last_name\n email_address\n cell_phone\n logo\n brokerage\n realtor_number\n is_agent\n is_test_account\n validated\n }\n }\n }\n`;\n","import React from 'react';\n\nconst spinner = () =>
;\n\nexport default spinner;\n","/* eslint-disable react/display-name */\n/* eslint-disable react/prop-types */\n/* eslint-disable react/destructuring-assignment */\nimport React, { useEffect, useState } from 'react';\nimport PropTypes from 'prop-types';\nimport { API, graphqlOperation } from 'aws-amplify';\nimport { DataGrid } from '@material-ui/data-grid';\nimport dateFormat from 'dateformat';\nimport { Tooltip } from '@material-ui/core';\nimport DeleteIcon from '@material-ui/icons/Delete';\nimport { withStyles } from '@material-ui/core/styles';\nimport { listUserNotifications } from '../graphql/queries';\nimport { clearUserNotificationCount, updateNotification, removeNotifications } from '../graphql/mutations';\nimport Spinner from './Spinner';\n\nconst Notifications = ({ toggleNotifications, userInfo }) => {\n const [notificationListingsData, setNotificationListingsData] = useState([]);\n const [showLoading, setShowLoading] = useState(true);\n\n useEffect(() => {\n const fetchListing1 = async () => {\n try {\n if (userInfo) {\n const listUserNotificationsData = await API.graphql({\n query: listUserNotifications,\n variables: { recipient_id: userInfo.id },\n });\n\n if (listUserNotificationsData) {\n setNotificationListingsData(listUserNotificationsData.data.listUserNotifications);\n\n await API.graphql(graphqlOperation(clearUserNotificationCount, { user_id: userInfo.id }));\n\n setShowLoading(false);\n }\n }\n } catch (error) {\n setShowLoading(false);\n }\n };\n\n fetchListing1();\n }, [userInfo]);\n\n const CustomTooltip = withStyles({\n tooltip: {\n fontSize: '18px',\n },\n })(Tooltip);\n\n const rows = notificationListingsData.map(item => {\n const container = {};\n const date = dateFormat(item.created_at * 1000, 'mm/dd/yyyy h:MM TT');\n\n container.id = item.id;\n container.title = item.title;\n container.body = item.body;\n container.created_at = date.toString();\n\n return container;\n });\n const columns = [\n {\n field: 'created_at',\n headerName: ' ',\n width: 220,\n },\n {\n field: 'body',\n headerName: '',\n flex: 1,\n renderCell: props => (\n \n

\n {props.row.body}\n

\n
\n ),\n },\n {\n field: 'actions',\n headerName: ' ',\n width: 60,\n renderCell: props => {\n const onDeleteClick = async () => {\n setShowLoading(true);\n try {\n const updateNotificationInput = {\n id: props.row.id,\n is_active: false,\n };\n\n const {\n data: { updateNotification: updateData },\n } = await API.graphql(graphqlOperation(updateNotification, { updateNotificationInput }));\n\n const updatedListData = notificationListingsData.filter(x => x.id !== updateData.id);\n\n setNotificationListingsData(updatedListData);\n setShowLoading(false);\n } catch (error) {\n setShowLoading(false);\n }\n };\n\n return (\n \n \n \n );\n },\n },\n ];\n\n const clearAllNotification = async () => {\n try {\n if (userInfo) {\n setShowLoading(true);\n\n await API.graphql(graphqlOperation(removeNotifications, { user_id: userInfo.id }));\n\n const listUserNotificationsData = await API.graphql({\n query: listUserNotifications,\n variables: { recipient_id: userInfo.id },\n });\n\n if (listUserNotificationsData) {\n setNotificationListingsData(listUserNotificationsData.data.listUserNotifications);\n }\n setShowLoading(false);\n }\n } catch (error) {\n setShowLoading(false);\n }\n };\n\n return (\n
\n
\n\n
\n
\n \n
\n \n Notifications\n

\n {notificationListingsData.length > 1 && (\n
\n
\n \n Clear All Notifications\n \n
\n )}\n\n \n
\n
\n
\n
\n \n
\n {showLoading ? (\n
\n \n
\n ) : (\n \n )}\n
\n
\n
\n
\n );\n};\n\nexport default Notifications;\n\nNotifications.propTypes = {\n toggleNotifications: PropTypes.func,\n userInfo: PropTypes.object,\n};\n","import React, { useState, useEffect } from \"react\";\nimport PropTypes from \"prop-types\";\nimport { withRouter, NavLink } from \"react-router-dom\";\n\nimport { Badge } from \"@material-ui/core\";\nimport { API } from \"aws-amplify\";\nimport NotificationsIcon from \"@material-ui/icons/Notifications\";\nimport logo from \"../assets/ATT-LOGO-2c-navy.png\";\nimport OutsideClickHandler from \"../helpers/OutsideClickHandler\";\nimport HeaderLink from \"./HeaderLink\";\nimport MobileMenu from \"./MobileMenu\";\nimport DownloadUserReportLink from \"./DownloadUserReportLink\";\nimport Notifications from \"./Notifications\";\nimport { getUserNotificationCount } from \"../graphql/queries\";\n\nconst Header = ({\n handleLogout,\n handleLogin,\n isLoggedIn,\n userInfo,\n isAgent,\n setIsOpenSubscription,\n isActiveSubscription,\n}) => {\n const [isUserMenuOpen, setIsUserMenuOpen] = useState(false);\n const [slideOutMobileMenu, setSlideOutMobileMenu] = useState(false);\n const [isOpenNotifications, setIsOpenNotifications] = useState(false);\n const [notificationBadgeCount, setNotificationBadgeCount] = useState(0);\n\n useEffect(() => {\n const fetchCount1 = async () => {\n try {\n if (userInfo) {\n const fetchedCount = await API.graphql({\n query: getUserNotificationCount,\n variables: { user_id: userInfo.id },\n });\n\n if (fetchedCount) {\n setNotificationBadgeCount(\n parseInt(fetchedCount.data.getUserNotificationCount.count)\n );\n }\n }\n } catch (error) {\n console.log(error);\n }\n };\n const interval = setInterval(() => {\n fetchCount1();\n }, 1000);\n\n return () => clearInterval(interval);\n }, [userInfo]);\n\n const toggleUserMenu = () => {\n setIsUserMenuOpen((prevIsMenuOpen) => !prevIsMenuOpen);\n };\n\n const toggleSlideOutMenu = () => {\n setSlideOutMobileMenu((prevIsOpen) => !prevIsOpen);\n };\n\n const toggleNotifications = () => {\n setIsOpenNotifications((prevIsOpenNotification) => !prevIsOpenNotification);\n if (slideOutMobileMenu) {\n setSlideOutMobileMenu(false);\n }\n };\n\n return (\n
\n
\n \n
\n
\n \n \n \n
\n \n
\n
\n
\n
\n
\n \n
\n \n \n \n

\n Manage Agents\n

\n \n
\n \n )}\n {isAgent &&\n !userInfo.is_free_version_account &&\n isActiveSubscription && (\n \n \n

\n Dashboard\n

\n \n
\n )}\n {userInfo.is_free_version_account &&\n !isActiveSubscription && (\n setIsOpenSubscription(true)}\n onKeyDown={() => setIsOpenSubscription(true)}\n tabIndex={0}\n role=\"button\"\n >\n

\n Upgrade\n

\n
\n )}\n {userInfo.validated && !userInfo.locked_out && (\n \n \n

\n FAQ\n

\n \n
\n )}\n \n

\n Log Out\n

\n \n
\n )}\n \n
\n )}\n
\n
\n \n \n {isLoggedIn && isOpenNotifications && (\n \n )}\n \n );\n};\n\nexport default withRouter(Header);\n\nHeader.propTypes = {\n isLoggedIn: PropTypes.bool,\n handleLogout: PropTypes.func,\n handleLogin: PropTypes.func,\n userInfo: PropTypes.object,\n isAgent: PropTypes.bool,\n setIsOpenSubscription: PropTypes.func,\n isActiveSubscription: PropTypes.bool,\n};\n","import React from 'react';\nimport { Helmet } from 'react-helmet';\n\nconst ReactHelmet = () => (\n \n {/* Facebook Pixel code start */}\n \n\n \n {/* End Facebook Pixel Code */}\n \n);\n\nexport default ReactHelmet;\n","import React from 'react';\nimport tealMapMarker from '../assets/teal-map-marker.svg';\n\nconst Loading = () => (\n
\n \"Loading...\"\n
\n);\n\nexport default Loading;\n","import React, { useState, useEffect } from 'react';\nimport PropTypes from 'prop-types';\nimport { withAuthenticator } from 'aws-amplify-react';\nimport { API, graphqlOperation } from 'aws-amplify';\nimport { listClients } from '../graphql/queries';\n\nconst ClientSelect = ({ setSelectedClient, setErrorMessage, isLoggedIn, userInfo }) => {\n const [userClients, setUserClients] = useState([]);\n\n useEffect(() => {\n const fetchUserClients = async () => {\n if (isLoggedIn) {\n try {\n const fetchedUserClientsResponse = await API.graphql(\n graphqlOperation(listClients, { agent_id: userInfo.id })\n );\n\n if (\n fetchedUserClientsResponse &&\n fetchedUserClientsResponse.data &&\n fetchedUserClientsResponse.data.listClients\n ) {\n setUserClients(fetchedUserClientsResponse.data.listClients);\n }\n\n setErrorMessage('');\n } catch (error) {\n setErrorMessage('There has been an error getting client list.');\n }\n }\n };\n\n fetchUserClients();\n }, [userInfo, isLoggedIn, setErrorMessage]);\n\n const clientSelectOptions = userClients.map(client => (\n \n ));\n\n return (\n
\n {\n setSelectedClient(value);\n setErrorMessage('');\n }}\n >\n \n {clientSelectOptions}\n \n
\n
\n
\n
\n );\n};\n\nexport default withAuthenticator(ClientSelect);\n\nClientSelect.propTypes = {\n setSelectedClient: PropTypes.func,\n setErrorMessage: PropTypes.func,\n isLoggedIn: PropTypes.bool,\n userInfo: PropTypes.object,\n};\n","import React, { useEffect } from 'react';\nimport PropTypes from 'prop-types';\n\nconst Message = ({ message, duration = 5000, setSuccessMessage, successMessage, textStyle }) => {\n useEffect(() => {\n if (successMessage) {\n setTimeout(() => {\n setSuccessMessage('');\n }, duration);\n }\n }, [message, duration, setSuccessMessage, successMessage]);\n\n return

{message}

;\n};\n\nexport default Message;\n\nMessage.propTypes = {\n message: PropTypes.string,\n duration: PropTypes.number,\n setSuccessMessage: PropTypes.func,\n successMessage: PropTypes.bool,\n textStyle: PropTypes.string,\n};\n","const propertyOfInterestAdded = {\n agent: {\n push: '',\n sms: '',\n email: '',\n },\n seller: {\n push: '',\n sms: '',\n email: {},\n },\n buyer: {\n push: `{{BA_NAME}} with {{BROKERAGE}} has added {{ADDRESS}} to your homes of interest.`,\n sms: '',\n email: '',\n },\n};\n\nconst approveShowingRequest = {\n agent: {\n push:\n '{{LA_NAME}} with {{BROKERAGE}} has confirmed an appointment to show {{ADDRESS}}, on {{DATE}}, {{TIME_RANGE}}',\n sms:\n 'Hi {{BA_NAME}}, {{LA_NAME}} with {{BROKERAGE}} has confirmed an appointment to show {{ADDRESS}}, on {{DATE}}, {{TIME_RANGE}}. \\n\\nThank you',\n email: {\n subject: 'Approve Showing Request',\n body:\n 'Hi {{BA_NAME}},

{{LA_NAME}} with {{BROKERAGE}} has confirmed an appointment to show {{ADDRESS}}, on {{DATE}}, {{TIME_RANGE}}.

Thank you',\n },\n },\n};\n\nconst rejectShowingRequest = {\n agent: {\n push: '{{LA_NAME}} with {{BROKERAGE}} has rejected an appointment to show {{ADDRESS}}, on {{DATE}}, {{TIME_RANGE}}',\n sms:\n 'Hi {{BA_NAME}}, {{LA_NAME}} with {{BROKERAGE}} has rejected an appointment to show {{ADDRESS}}, on {{DATE}}, {{TIME_RANGE}}. Please select a different time for your showing. \\n\\nThank you',\n email: {\n subject: 'Reject Showing Request',\n body:\n 'Hi {{BA_NAME}},

{{LA_NAME}} with {{BROKERAGE}} has rejected an appointment to show {{ADDRESS}}, on {{DATE}}, {{TIME_RANGE}}. Please select a different time for your showing.

Thank you',\n },\n },\n};\n\nconst sendShowingRequest = {\n agent: {\n push: '{{BA_NAME}} with {{BROKERAGE}} would like to show {{ADDRESS}}, on {{DATE}}, {{TIME_RANGE}}',\n sms: `Hi {{LA_NAME}}, this is {{BA_NAME}} with {{BROKERAGE}}. I would like to show {{ADDRESS}}, on {{DATE}}, from {{TIME_RANGE}}. Please contact me at {{PHONE}} \\n\\nThank you, \\n{{BA_NAME}} \\n`,\n email: {\n subject: `Showing Request for {{ADDRESS}}`,\n body: `Hi {{LA_NAME}},

This is {{BA_NAME}} with {{BROKERAGE}}. I would like to show {{ADDRESS}}, on {{DATE}}, from {{TIME_RANGE}}. Please contact me at {{PHONE}}

Thank you,
{{BA_NAME}}
`,\n },\n },\n};\n\nconst sendShowingRequestAutoApprove = {\n agent: {\n push:\n '{{BA_NAME}} with {{BROKERAGE}} would like to show {{ADDRESS}}, on {{DATE}}, from {{TIME_RANGE}} which is auto approved',\n sms: `Hi {{LA_NAME}}, this is {{BA_NAME}} with {{BROKERAGE}}. I would like to show {{ADDRESS}}, on {{DATE}}, from {{TIME_RANGE}} which is auto approved. Please contact me at {{PHONE}} \\n\\nThank you, \\n{{BA_NAME}} \\n`,\n email: {\n subject: `Showing Request for {{ADDRESS}} Auto approved`,\n body: `Hi {{LA_NAME}},

This is {{BA_NAME}} with {{BROKERAGE}}. I would like to show {{ADDRESS}}, on {{DATE}}, from {{TIME_RANGE}} which is auto approved. Please contact me at {{PHONE}}

Thank you,
{{BA_NAME}}
`,\n },\n },\n};\n\nconst sendShowingRequestAutoApproveToBA = {\n agent: {\n pushToBA: 'Your request to show {{ADDRESS}} on {{DATE}}, from {{TIME_RANGE}} is auto approved',\n smsToBA: `Hi {{BA_NAME}}, this is {{LA_NAME}} with {{BROKERAGE}} .your request to show {{ADDRESS}} on {{DATE}}, from {{TIME_RANGE}} is auto approved. Please contact me at {{PHONE}} \\n\\nThank you, \\n{{LA_NAME}} \\n`,\n emailToBA: {\n subject: `Showing Request for {{ADDRESS}} Auto approved`,\n body: `Hi {{BA_NAME}},

This is {{LA_NAME}} with {{BROKERAGE}}.

your request to show {{ADDRESS}} on {{DATE}}, from {{TIME_RANGE}} is auto approved. Please contact me at {{PHONE}}

Thank you,
{{LA_NAME}}
`,\n },\n },\n};\n\nconst editDeleteLAAvailabilitySlot = {\n agent: {\n push:\n 'Hi {{BA_NAME}}, Due to unforeseen circumstances, we had to cancel your showing at {{ADDRESS}}, on {{DATE}}, from {{TIME_RANGE}}',\n sms: `Hi {{BA_NAME}}, Due to unforeseen circumstances, we had to cancel your showing at {{ADDRESS}}, on {{DATE}}, from {{TIME_RANGE}}. Please check the calendar for other available times. Please contact me with questions. \\n\\nThank you, \\n{{LA_NAME}} \\n`,\n email: {\n subject: `Canceled Showing Request for {{ADDRESS}}`,\n body: `Hi {{BA_NAME}},

Due to unforeseen circumstances, we had to cancel your showing at {{ADDRESS}}, on {{DATE}}, from {{TIME_RANGE}}. Please check the calendar for other available times. Please contact me with questions.

Thank you,
{{LA_NAME}}
`,\n },\n },\n};\n\nconst cancelShowingRequest = {\n agent: {\n push: '{{BA_NAME}} has cancelled an appointment to show {{ADDRESS}}, on {{DATE}}, {{TIME_RANGE}}',\n sms:\n 'Hi {{LA_NAME}}, {{BA_NAME}} has cancelled an appointment to show {{ADDRESS}}, on {{DATE}}, {{TIME_RANGE}}.\\n\\nThank you',\n email: {\n subject: 'Cancelled Showing Request',\n body:\n 'Hi {{LA_NAME}},

{{BA_NAME}} has cancelled an appointment to show {{ADDRESS}}, on {{DATE}}, {{TIME_RANGE}}.

Thank you',\n },\n },\n};\n\nexport default {\n propertyOfInterestAdded,\n approveShowingRequest,\n rejectShowingRequest,\n sendShowingRequest,\n sendShowingRequestAutoApprove,\n sendShowingRequestAutoApproveToBA,\n editDeleteLAAvailabilitySlot,\n cancelShowingRequest,\n};\n","import templates from './templates';\n\nconst BUYER = 'buyer';\nconst AGENT = 'agent';\n\nexport const buildPropertyOfInterestAdded = ({ baName, brokerage, address }) => {\n let { push } = templates.propertyOfInterestAdded[BUYER];\n\n const tokens = [\n { name: 'BA_NAME', value: baName },\n { name: 'BROKERAGE', value: brokerage },\n { name: 'ADDRESS', value: address },\n ];\n\n push = replaceTokens(push, tokens);\n\n return { push };\n};\n\nexport const buildApproveShowingRequest = ({ laName, baName, brokerage, address, date, timeRange }) => {\n let { email, sms, push } = templates.approveShowingRequest[AGENT];\n const emailCopy = { ...email };\n const tokens = [\n { name: 'LA_NAME', value: laName },\n { name: 'BA_NAME', value: baName },\n { name: 'BROKERAGE', value: brokerage },\n { name: 'ADDRESS', value: address },\n { name: 'DATE', value: date },\n { name: 'TIME_RANGE', value: timeRange },\n ];\n\n sms = replaceTokens(sms, tokens);\n emailCopy.subject = replaceTokens(emailCopy.subject, tokens);\n emailCopy.body = replaceTokens(emailCopy.body, tokens);\n push = replaceTokens(push, tokens);\n\n return { sms, email: emailCopy, push };\n};\n\nexport const buildRejectShowingRequest = ({ laName, baName, brokerage, address, date, timeRange }) => {\n let { email, sms, push } = templates.rejectShowingRequest[AGENT];\n const emailCopy = { ...email };\n const tokens = [\n { name: 'LA_NAME', value: laName },\n { name: 'BA_NAME', value: baName },\n { name: 'BROKERAGE', value: brokerage },\n { name: 'ADDRESS', value: address },\n { name: 'DATE', value: date },\n { name: 'TIME_RANGE', value: timeRange },\n ];\n\n sms = replaceTokens(sms, tokens);\n emailCopy.subject = replaceTokens(emailCopy.subject, tokens);\n emailCopy.body = replaceTokens(emailCopy.body, tokens);\n push = replaceTokens(push, tokens);\n\n return { sms, email: emailCopy, push };\n};\n\nexport const buildSendShowingRequest = ({ baName, laName, brokerage, address, date, phone, timeRange }) => {\n let { sms, email, push } = templates.sendShowingRequest[AGENT];\n\n // Need to duplicate because email is an object and objects are passed by reference in JS\n // If updated directly, the template itself will be updated\n // Because push and SMS are primitives, they get passed by value and don't need to be copied\n const emailCopy = { ...email };\n\n const tokens = [\n { name: 'BA_NAME', value: baName },\n { name: 'LA_NAME', value: laName },\n { name: 'BROKERAGE', value: brokerage },\n { name: 'ADDRESS', value: address },\n { name: 'DATE', value: date },\n { name: 'PHONE', value: phone },\n { name: 'TIME_RANGE', value: timeRange },\n ];\n\n sms = replaceTokens(sms, tokens);\n emailCopy.subject = replaceTokens(emailCopy.subject, tokens);\n emailCopy.body = replaceTokens(emailCopy.body, tokens);\n push = replaceTokens(push, tokens);\n\n return { sms, email: emailCopy, push };\n};\n\nexport const buildSendShowingRequestAutoApprove = ({ baName, laName, brokerage, address, date, phone, timeRange }) => {\n let { sms, email, push } = templates.sendShowingRequestAutoApprove[AGENT];\n\n const emailCopy = { ...email };\n\n const tokens = [\n { name: 'BA_NAME', value: baName },\n { name: 'LA_NAME', value: laName },\n { name: 'BROKERAGE', value: brokerage },\n { name: 'ADDRESS', value: address },\n { name: 'DATE', value: date },\n { name: 'PHONE', value: phone },\n { name: 'TIME_RANGE', value: timeRange },\n ];\n\n sms = replaceTokens(sms, tokens);\n emailCopy.subject = replaceTokens(emailCopy.subject, tokens);\n emailCopy.body = replaceTokens(emailCopy.body, tokens);\n push = replaceTokens(push, tokens);\n\n return { sms, email: emailCopy, push };\n};\n\nexport const buildSendShowingRequestAutoApproveToBA = ({\n baName,\n laName,\n brokerage,\n address,\n date,\n phone,\n timeRange,\n}) => {\n let { smsToBA, emailToBA, pushToBA } = templates.sendShowingRequestAutoApproveToBA[AGENT];\n\n const emailCopy = { ...emailToBA };\n\n const tokens = [\n { name: 'BA_NAME', value: baName },\n { name: 'LA_NAME', value: laName },\n { name: 'BROKERAGE', value: brokerage },\n { name: 'ADDRESS', value: address },\n { name: 'DATE', value: date },\n { name: 'PHONE', value: phone },\n { name: 'TIME_RANGE', value: timeRange },\n ];\n\n smsToBA = replaceTokens(smsToBA, tokens);\n emailCopy.subject = replaceTokens(emailCopy.subject, tokens);\n emailCopy.body = replaceTokens(emailCopy.body, tokens);\n pushToBA = replaceTokens(pushToBA, tokens);\n\n return { smsToBA, emailToBA: emailCopy, pushToBA };\n};\n\nexport const buildEditDeleteLAAvailabilitySlot = ({ laName, baName, address, date, timeRange }) => {\n let { email, sms, push } = templates.editDeleteLAAvailabilitySlot[AGENT];\n const emailCopy = { ...email };\n const tokens = [\n { name: 'LA_NAME', value: laName },\n { name: 'BA_NAME', value: baName },\n { name: 'ADDRESS', value: address },\n { name: 'DATE', value: date },\n { name: 'TIME_RANGE', value: timeRange },\n ];\n\n sms = replaceTokens(sms, tokens);\n emailCopy.subject = replaceTokens(emailCopy.subject, tokens);\n emailCopy.body = replaceTokens(emailCopy.body, tokens);\n push = replaceTokens(push, tokens);\n\n return { sms, email: emailCopy, push };\n};\n\nexport const buildCancelShowingRequest = ({ laName, baName, address, date, timeRange }) => {\n let { email, sms, push } = templates.cancelShowingRequest[AGENT];\n const emailCopy = { ...email };\n const tokens = [\n { name: 'LA_NAME', value: laName },\n { name: 'BA_NAME', value: baName },\n { name: 'ADDRESS', value: address },\n { name: 'DATE', value: date },\n { name: 'TIME_RANGE', value: timeRange },\n ];\n\n sms = replaceTokens(sms, tokens);\n emailCopy.subject = replaceTokens(emailCopy.subject, tokens);\n emailCopy.body = replaceTokens(emailCopy.body, tokens);\n push = replaceTokens(push, tokens);\n\n return { sms, email: emailCopy, push };\n};\n\nconst replaceTokens = (message, tokens) => {\n let updatedMessage = message;\n\n for (const token of tokens) {\n updatedMessage = updatedMessage.replace(new RegExp(`{{${token.name}}}`, 'g'), token.value);\n }\n\n return updatedMessage;\n};\n","import { Auth } from 'aws-amplify';\n\nexport const createNotification = async ({ userId, pushMessage }) => {\n try {\n const sessionToken = `Bearer ${(await Auth.currentSession()).getIdToken().jwtToken}`;\n\n const payload = { userId, body: pushMessage, title: null };\n\n const notificationResponse = await fetch(process.env.REACT_APP_NOTIFICATION_ENDPOINT, {\n method: 'post',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: sessionToken,\n },\n body: JSON.stringify({ payload }),\n });\n\n if (notificationResponse.ok) {\n const resultJson = await notificationResponse.json();\n\n return resultJson;\n }\n\n const resultText = await notificationResponse.text();\n\n throw new Error(`Push Notification publish invocation not successful: ${resultText}`);\n } catch (error) {\n console.error('Error sending notification: ', error);\n }\n};\n","import React from 'react';\n\nexport const UserContext = React.createContext({});\n","/* eslint-disable camelcase */\nimport React, { useState, useContext } from 'react';\nimport PropTypes from 'prop-types';\nimport { API, graphqlOperation } from 'aws-amplify';\nimport { createPropertyRecords } from '../graphql/mutations';\n\nimport { getListingByListingId, getPropertyOfInterestByListingKey } from '../graphql/queries';\n\nimport Loading from './Loading';\nimport Message from './Message';\nimport { buildPropertyOfInterestAdded } from '../notifications/messageBuilder';\nimport { createNotification } from '../services/notificationService';\nimport { UserContext } from '../contexts';\n\nexport default function AddPropertyButton({\n listing,\n selectedClient,\n errorMessage,\n setErrorMessage,\n mlsIds,\n setPropertyErrors,\n setPropertySuccesses,\n}) {\n const { userInfo } = useContext(UserContext);\n const [showLoading, setShowLoading] = useState(false);\n const [successMessage, setSuccessMessage] = useState('');\n\n const notifyBuyerOfNewProperty = async ({ clientId, address, city, state, zip }) => {\n try {\n const formattedAddress = `${\n address && address.includes(',') ? address.split(',')[0] : address\n } ${city}, ${state} ${zip}`;\n\n const { push } = buildPropertyOfInterestAdded({\n baName: `${userInfo.first_name} ${userInfo.last_name}`,\n brokerage: `${userInfo.brokerage}`,\n address: formattedAddress,\n });\n\n await createNotification({\n userId: clientId,\n pushMessage: push,\n });\n } catch (error) {\n console.warn('Error notifying buyer of new property of interest: ', error);\n }\n };\n\n const isDuplicateProperty = async (clientId, listingKey) => {\n try {\n const existingPropertyOfInterestResponse = await API.graphql(\n graphqlOperation(getPropertyOfInterestByListingKey, { client_id: clientId, listing_key: listingKey })\n );\n\n if (existingPropertyOfInterestResponse && existingPropertyOfInterestResponse.data) {\n const existingPropertyOfInterest = existingPropertyOfInterestResponse.data.getPropertyOfInterestByListingKey;\n\n if (existingPropertyOfInterest) {\n return true;\n }\n }\n\n return false;\n } catch (error) {\n console.error('Error checking for duplicate property; ', error);\n\n throw error;\n }\n };\n\n const addPropertyForClient = async () => {\n if (selectedClient) {\n setShowLoading(true);\n\n if (mlsIds) {\n setPropertySuccesses([]);\n setPropertyErrors([]);\n\n mlsIds.forEach(async mlsId => {\n if (!mlsId) {\n return;\n }\n\n await API.graphql({ query: getListingByListingId, variables: { listing_id: mlsId } })\n .then(async response => {\n const returnedListing = response.data.getListingByListingId.items[0];\n\n if (returnedListing.listing_id) {\n try {\n if (!(await isDuplicateProperty(selectedClient, returnedListing.listing_key))) {\n await API.graphql({\n query: createPropertyRecords,\n variables: {\n createPropertyRecordsInput: {\n listing_id: mlsId,\n client_id: selectedClient,\n fallback_phone_number:\n process.env.REACT_APP_STAGE !== 'production' &&\n process.env.REACT_APP_LISTING_AGENT_DEFAULT_PHONE\n ? process.env.REACT_APP_LISTING_AGENT_DEFAULT_PHONE\n : null,\n },\n },\n });\n\n setPropertySuccesses(prevState => [...prevState, `Added ${mlsId}`]);\n\n notifyBuyerOfNewProperty({\n clientId: selectedClient,\n address: returnedListing.address,\n city: returnedListing.city,\n state: returnedListing.state,\n zip: returnedListing.zip,\n });\n } else {\n setPropertyErrors(prevState => [...prevState, `Property Already Added`]);\n }\n } catch (error) {\n console.error('Error adding property records: ', error);\n setPropertyErrors(prevState => [...prevState, `Error Adding ${mlsId}`]);\n }\n } else {\n setPropertyErrors(prevState => [...prevState, mlsId]);\n }\n })\n .catch(error => {\n console.error('Error adding homes: ', error);\n setPropertyErrors(prevState => [...prevState, `Error Adding ${mlsId}`]);\n });\n });\n } else {\n if (await isDuplicateProperty(selectedClient, listing.listing_key)) {\n setErrorMessage(`Property already added.`);\n setShowLoading(false);\n\n return;\n }\n\n await API.graphql({\n query: createPropertyRecords,\n variables: {\n createPropertyRecordsInput: {\n listing_id: listing.listing_id,\n client_id: selectedClient,\n fallback_phone_number:\n process.env.REACT_APP_STAGE !== 'production' && process.env.REACT_APP_LISTING_AGENT_DEFAULT_PHONE\n ? process.env.REACT_APP_LISTING_AGENT_DEFAULT_PHONE\n : null,\n },\n },\n });\n\n notifyBuyerOfNewProperty({\n clientId: selectedClient,\n address: listing.address,\n city: listing.city,\n state: listing.state,\n zip: listing.zip,\n });\n\n setSuccessMessage('Property Added');\n setErrorMessage('');\n }\n setShowLoading(false);\n } else {\n setErrorMessage('Please select a client.');\n }\n };\n\n if (showLoading) return ;\n\n return (\n
\n \n ADD TO CLIENT\n \n {successMessage && (\n \n )}\n {errorMessage && }\n
\n );\n}\n\nAddPropertyButton.propTypes = {\n listing: PropTypes.object,\n selectedClient: PropTypes.string,\n errorMessage: PropTypes.string,\n setErrorMessage: PropTypes.func,\n mlsIds: PropTypes.array,\n setPropertyErrors: PropTypes.func,\n setPropertySuccesses: PropTypes.func,\n};\n","import React, { useState, useEffect } from 'react';\nimport PropTypes from 'prop-types';\nimport { withAuthenticator } from 'aws-amplify-react';\nimport OutsideClickHandler from '../helpers/OutsideClickHandler';\nimport Loading from './Loading';\nimport ClientSelect from './ClientSelect';\nimport AddPropertyButton from './AddPropertyButton';\n\nfunction MLSAddForm({ setIsMLSAddOpen, isMLSAddOpen, isLoggedIn, userInfo }) {\n const [addMLSTextArea, setAddMLSTextArea] = useState('');\n const [mlsIds, setMlsIds] = useState([]);\n const [selectedClient, setSelectedClient] = useState('');\n const [errorMessage, setErrorMessage] = useState();\n const [showLoading, setShowLoading] = useState(false);\n const [propertyErrors, setPropertyErrors] = useState([]);\n const [propertySuccesses, setPropertySuccesses] = useState([]);\n\n const toggleMLSModal = () => {\n setIsMLSAddOpen(prevIsMLSAddOpen => !prevIsMLSAddOpen);\n };\n\n useEffect(() => {\n setMlsIds(addMLSTextArea.replace(/ /g, '').split(';'));\n }, [addMLSTextArea]);\n\n if (showLoading) return ;\n\n return (\n
\n
\n
\n
\n
\n \n
\n

SELECT A CLIENT

\n \n

\n PASTE MLS NUMBERS SEPARATED BY SEMICOLON\n

\n setAddMLSTextArea(e.target.value.trim())}\n />\n
\n {propertyErrors.length > 0 && (\n
    \n {propertyErrors.map((err, idx) => (\n
  • \n {err}\n
  • \n ))}\n
\n )}\n {propertySuccesses.length > 0 && (\n
    \n {propertySuccesses.map((msg, idx) => (\n
  • \n {msg}\n
  • \n ))}\n
\n )}\n
\n
\n \n
\n
\n \n
\n
\n
\n
\n \n \n
\n
\n
\n
\n );\n}\n\nexport default withAuthenticator(MLSAddForm);\n\nMLSAddForm.propTypes = {\n setIsMLSAddOpen: PropTypes.func,\n isMLSAddOpen: PropTypes.bool,\n isLoggedIn: PropTypes.bool,\n userInfo: PropTypes.object,\n};\n","import React, { useState, useEffect } from 'react';\nimport { withAuthenticator } from 'aws-amplify-react';\nimport PropTypes from 'prop-types';\nimport { Link } from 'react-router-dom';\nimport CryptoJS from 'crypto-js';\nimport Loading from './Loading';\nimport ClientSelect from './ClientSelect';\nimport AddPropertyButton from './AddPropertyButton';\nimport calendar from '../assets/calendar.png';\n\nfunction AddToClient({\n userInfo,\n isLoggedIn,\n listing,\n isListingAgent,\n setIsOpenFreeTrialLimitPopup,\n propertyListings,\n}) {\n const [selectedClient, setSelectedClient] = useState('');\n const [showLoading] = useState(false);\n const [errorMessage, setErrorMessage] = useState();\n const [isAccess, setIsAccess] = useState(false);\n\n useEffect(() => {\n if (propertyListings && isListingAgent) {\n const propData = propertyListings.filter(item => item.listing_id === listing.listing_id);\n\n if (propData.length === 0) {\n setIsAccess(false);\n } else {\n setIsAccess(true);\n }\n }\n }, []);\n\n if (showLoading) return ;\n\n return (\n
\n
\n \n\n {userInfo && userInfo.is_free_version_account && isAccess ? (\n setIsOpenFreeTrialLimitPopup(true)}\n role=\"button\"\n onKeyDown={() => setIsOpenFreeTrialLimitPopup(true)}\n tabIndex={0}\n >\n \"calendar\"\n
\n ) : (\n \n {' '}\n \"calendar\"\n \n )}\n\n \n
\n
\n );\n}\n\nexport default withAuthenticator(AddToClient);\n\nAddToClient.propTypes = {\n userInfo: PropTypes.object,\n isLoggedIn: PropTypes.bool,\n listing: PropTypes.object,\n isListingAgent: PropTypes.bool,\n setIsOpenFreeTrialLimitPopup: PropTypes.func,\n propertyListings: PropTypes.array,\n};\n","const getMediaUrl = (photo, listingId, source) => {\n if (source === 'Spark') {\n const tempListingId = listingId.replace('#', '_');\n const filePath = new URL(photo.MediaURL).pathname;\n\n return `${process.env.REACT_APP_LISTHUB_INTEGRATION_BUCKET}/SPARK/${tempListingId}${filePath}`;\n }\n\n if (source === 'Bridge') {\n const tempListingId = listingId.replace('#', '_');\n const filePath = new URL(photo.MediaURL).pathname;\n\n return `${process.env.REACT_APP_LISTHUB_INTEGRATION_BUCKET}/BRIDGE/${tempListingId}${filePath}`;\n }\n\n if (source === 'Beaches') {\n const tempListingId = listingId.replace('#', '_');\n\n console.log(photo);\n const filePath = `/${photo.MediaURL}.jpeg`;\n\n console.log(filePath);\n\n return `${process.env.REACT_APP_LISTHUB_INTEGRATION_BUCKET}/BEACHES/${tempListingId}${filePath}`;\n }\n\n if (photo.MediaURL && photo.MediaURL.includes(`listhub-integration-bucket`)) {\n return photo.MediaURL;\n }\n\n const path = new URL(photo.MediaURL).pathname;\n\n return `${process.env.REACT_APP_LISTHUB_INTEGRATION_BUCKET}/media${path}`;\n};\n\nexport default getMediaUrl;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { withRouter, Link } from 'react-router-dom';\nimport bedroom from '../assets/bedroom.svg';\nimport bathroom from '../assets/bathroom.svg';\nimport AddToClient from './AddToClient';\nimport getMediaUrl from '../helpers/getMediaUrl';\nimport calendar from '../assets/calendar.png';\n\nconst Listing = ({\n listing,\n isLoggedIn,\n userInfo,\n isListingAgent,\n setIsOpenFreeTrialLimitPopup,\n propertyListings,\n setIsOpenVisitorSignupMessage,\n}) => {\n const listingPriceString =\n listing && listing.listing_price ? `${parseInt(listing.listing_price).toLocaleString()}` : 'N/A';\n\n return (\n
\n \n
\n

{listing && listing.address ? listing.address : 'N/A'}

\n

\n MLS #{listing.listing_id ? {listing.listing_id} : N/A}\n     •  \n \n {listing && listing.status ? listing.status : 'N/A'}\n \n

\n
\n {listing && listing.Media && listing.Media[0] && listing.Media[0].MediaURL ? (\n \n ) : (\n

No images found.

\n )}\n \n
\n \n
    \n
    \n
  • ${listingPriceString}
  • \n
    \n
    \n {!isLoggedIn && (\n {\n event.stopPropagation();\n event.preventDefault();\n setIsOpenVisitorSignupMessage(true);\n }}\n role=\"button\"\n onKeyDown={event => {\n event.stopPropagation();\n event.preventDefault();\n setIsOpenVisitorSignupMessage(true);\n }}\n tabIndex={0}\n className=\"focus:outline-none\"\n >\n \"calendar\"\n
    \n )}\n \"bed\"\n
  • {listing.bedrooms}
  • \n

    |

    \n \"bed\"\n
  • {listing.bathrooms}
  • \n

    |

    \n
  • \n {listing.square_feet ? {listing.square_feet.toLocaleString()} : N/A}\n sqft\n
  • \n
\n \n \n\n {isLoggedIn && (\n \n )}\n
\n
\n );\n};\n\nListing.propTypes = {\n isLoggedIn: PropTypes.bool,\n listing: PropTypes.object,\n userInfo: PropTypes.object,\n isListingAgent: PropTypes.bool,\n setIsOpenFreeTrialLimitPopup: PropTypes.func,\n propertyListings: PropTypes.array,\n setIsOpenVisitorSignupMessage: PropTypes.func,\n};\n\nexport default withRouter(Listing);\n","/* eslint-disable react-hooks/exhaustive-deps */\nimport React, { useEffect } from 'react';\nimport PropTypes from 'prop-types';\nimport pageLeft from '../assets/page-left.svg';\nimport pageRight from '../assets/page-right.svg';\n\nconst PageButton = ({\n pageNumber,\n setPageNumber,\n pageIndex,\n isPreviousPageButton,\n isNextPageButton,\n pageNumberHistory,\n setPageNumberHistory,\n}) => {\n const defaultButtonStyling =\n 'flex justify-center text-white items-center w-8 h-8 rounded bg-blue-500 active:bg-blue-800 m-1';\n\n const selectedButtonStyling = 'flex justify-center text-white items-center w-8 h-8 rounded bg-blue-800 m-1';\n\n useEffect(() => {\n if (pageNumberHistory) {\n setPageNumber(JSON.parse(pageNumberHistory));\n }\n }, [pageNumberHistory]);\n\n const nextPage = async () => {\n const newPageNumber = pageNumber + 1;\n\n setPageNumberHistory(JSON.stringify(newPageNumber));\n };\n\n const goToPage = chosenNumber => {\n setPageNumberHistory(JSON.stringify(chosenNumber));\n };\n\n const previousPage = async () => {\n if (pageNumber !== 1) {\n const newPageNumber = pageNumber - 1;\n\n setPageNumberHistory(JSON.stringify(newPageNumber));\n }\n };\n\n if (isPreviousPageButton)\n return (\n \n \"<\"\n \n );\n\n if (isNextPageButton)\n return (\n \n );\n\n return (\n goToPage(pageIndex)}\n onClick={() => goToPage(pageIndex)}\n >\n

{pageIndex}

\n \n );\n};\n\nexport default PageButton;\n\nPageButton.propTypes = {\n pageNumber: PropTypes.number,\n setPageNumber: PropTypes.func,\n isPreviousPageButton: PropTypes.bool,\n isNextPageButton: PropTypes.bool,\n pageIndex: PropTypes.number,\n pageNumberHistory: PropTypes.string,\n setPageNumberHistory: PropTypes.func,\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport PageButton from './PageButton';\n\nconst Pagination = ({ pageNumber, setPageNumber, userFilteredListings, pageNumberHistory, setPageNumberHistory }) => {\n const mapMiddlePages = userFilteredListings.map((listingsBatch, index) => {\n const totalPageNumber = userFilteredListings.length;\n const pageIndex = index + 1;\n\n if (\n pageIndex >= 4 &&\n pageIndex <= totalPageNumber - 3 &&\n pageIndex >= pageNumber - 1 &&\n pageIndex <= pageNumber + 1\n ) {\n return (\n \n );\n }\n\n return null;\n });\n\n const mapSmallList = userFilteredListings.map((listingsBatch, index) => {\n const pageIndex = index + 1;\n\n return (\n \n );\n });\n\n const displayBackButton = () => {\n if (pageNumber > 1)\n return (\n \n );\n };\n\n const displayNextButton = () => {\n if (pageNumber < userFilteredListings.length)\n return (\n \n );\n };\n\n const handleFirstAndLastPages = pageOrder => {\n const inFirstPages = pageNumber <= 4;\n const inLastPages = pageNumber >= userFilteredListings.length - 3;\n\n if (pageOrder === 'first') {\n if (inFirstPages) {\n return (\n
\n \n \n
\n );\n }\n\n return ...;\n }\n\n if (pageOrder === 'last') {\n if (inLastPages) {\n return (\n
\n \n \n
\n );\n }\n\n return ...;\n }\n };\n\n if (userFilteredListings.length > 4)\n return (\n
\n {displayBackButton()}\n
\n
\n \n {handleFirstAndLastPages('first')}\n
\n {mapMiddlePages}\n {handleFirstAndLastPages('last')}\n \n {displayNextButton()}\n
\n
\n );\n\n return (\n
\n {displayBackButton()}\n
\n
\n {userFilteredListings.length <= 4 &&
{mapSmallList}
}\n
\n
\n {displayNextButton()}\n
\n );\n};\n\nexport default Pagination;\n\nPagination.propTypes = {\n pageNumber: PropTypes.number,\n userFilteredListings: PropTypes.array,\n setPageNumber: PropTypes.func,\n pageNumberHistory: PropTypes.string,\n setPageNumberHistory: PropTypes.func,\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport arrowRight from '../../../assets/arrow-right.svg';\n\nconst Arrow = ({ rotateArrow }) => (\n \"\"\n);\n\nexport default Arrow;\n\nArrow.propTypes = {\n rotateArrow: PropTypes.bool,\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport Arrow from './Arrow';\n\nconst FilterHeader = ({ toggleFilterDropdown, filterTitle, isMobile, rotateArrow }) => (\n {\n toggleFilterDropdown(filterTitle);\n }}\n onKeyDown={() => {\n toggleFilterDropdown(filterTitle);\n }}\n >\n
\n \n

{filterTitle}

\n
\n
\n);\n\nexport default FilterHeader;\n\nFilterHeader.propTypes = {\n toggleFilterDropdown: PropTypes.func,\n filterTitle: PropTypes.string,\n isMobile: PropTypes.bool,\n rotateArrow: PropTypes.bool,\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport NumberFormat from 'react-number-format';\n\nconst NumberInput = ({ filterField, filterBy, setFilterBy, placeholder }) => {\n const handleFilterBy = value => {\n if (filterField === 'lowPrice') {\n setFilterBy({ ...filterBy, lowPrice: value });\n }\n if (filterField === 'highPrice') {\n setFilterBy({ ...filterBy, highPrice: value });\n }\n if (filterField === 'lowSquareFeet') {\n setFilterBy({ ...filterBy, lowSquareFeet: value });\n }\n if (filterField === 'highSquareFeet') {\n setFilterBy({ ...filterBy, highSquareFeet: value });\n }\n };\n\n return (\n handleFilterBy(value)}\n />\n );\n};\n\nexport default NumberInput;\n\nNumberInput.propTypes = {\n filterBy: PropTypes.object,\n setFilterBy: PropTypes.func,\n placeholder: PropTypes.string,\n filterField: PropTypes.string,\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport NumberInput from './shared/NumberInput';\n\nexport default function Price({ setFilterBy, filterBy }) {\n return (\n
\n \n \n
\n );\n}\n\nPrice.propTypes = {\n filterBy: PropTypes.object,\n setFilterBy: PropTypes.func,\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport search from '../../assets/search.svg';\n\nexport default function Keyword({ filterBy, setFilterBy }) {\n return (\n
\n
\n setFilterBy({ ...filterBy, keyword: value })}\n />\n \"search\n
\n
\n );\n}\n\nKeyword.propTypes = {\n filterBy: PropTypes.object,\n setFilterBy: PropTypes.func,\n};\n","import React, { useState, useEffect } from 'react';\nimport PropTypes from 'prop-types';\nimport Arrow from './Arrow';\n\nconst FilterSubHeading = ({\n setIsHomeTypeOpen,\n subHeadingName,\n setIsBathroomsOpen,\n setIsBedroomsOpen,\n setIsPriceSortOpen,\n setIsSquareFeetSortOpen,\n isSort,\n filterBy,\n}) => {\n const [rotateArrow, setRotateArrow] = useState(false);\n\n const handleSubHeaderToggle = () => {\n setRotateArrow(open => !open);\n\n if (subHeadingName === 'Home Types') {\n setIsHomeTypeOpen(open => !open);\n }\n if (subHeadingName === 'Bathrooms') {\n setIsBathroomsOpen(open => !open);\n }\n if (subHeadingName === 'Bedrooms') {\n setIsBedroomsOpen(open => !open);\n }\n if (subHeadingName === 'Price') {\n setIsPriceSortOpen(open => !open);\n }\n if (subHeadingName === 'Square Feet') {\n setIsSquareFeetSortOpen(open => !open);\n }\n };\n\n useEffect(() => {\n if (filterBy) {\n handleIfChecked();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [filterBy]);\n\n const handleIfChecked = () => {\n if (subHeadingName === 'Bedrooms') {\n return !!filterBy.bedrooms;\n }\n if (subHeadingName === 'Bathrooms') {\n return !!filterBy.bathrooms;\n }\n if (subHeadingName === 'Home Types') {\n return filterBy.homeTypes.length > 0;\n }\n };\n\n return (\n \n );\n};\n\nexport default FilterSubHeading;\n\nFilterSubHeading.propTypes = {\n setIsHomeTypeOpen: PropTypes.func,\n setIsBathroomsOpen: PropTypes.func,\n setIsBedroomsOpen: PropTypes.func,\n subHeadingName: PropTypes.string,\n setIsPriceSortOpen: PropTypes.func,\n setIsSquareFeetSortOpen: PropTypes.func,\n isSort: PropTypes.bool,\n filterBy: PropTypes.object,\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nexport default function SortInput({ filterBy, setFilterBy, sortField, sortDirection }) {\n const { priceSort, squarefeetSort } = filterBy;\n\n const handleSort = () => {\n if (sortField === 'price') {\n if (filterBy.priceSort === `${sortDirection} ${sortField}`) {\n setFilterBy({ ...filterBy, priceSort: '' });\n } else {\n setFilterBy({ ...filterBy, priceSort: `${sortDirection} ${sortField}`, squarefeetSort: '' });\n }\n }\n if (sortField === 'squarefeet') {\n if (filterBy.squarefeetSort === `${sortDirection} ${sortField}`) {\n setFilterBy({ ...filterBy, squarefeetSort: '' });\n } else {\n setFilterBy({ ...filterBy, squarefeetSort: `${sortDirection} ${sortField}`, priceSort: '' });\n }\n }\n };\n\n return (\n
\n \n
\n );\n}\n\nSortInput.propTypes = {\n filterBy: PropTypes.object,\n setFilterBy: PropTypes.func,\n sortField: PropTypes.string,\n sortDirection: PropTypes.string,\n};\n","import React, { useState } from 'react';\nimport PropTypes from 'prop-types';\nimport FilterSubHeader from './shared/FilterSubHeading';\nimport SortInput from './shared/SortInput';\n\nexport default function Sort({ filterBy, setFilterBy }) {\n const [isPriceSortOpen, setIsPriceSortOpen] = useState(false);\n const [isSquareFeetSortOpen, setIsSquareFeetSortOpen] = useState(false);\n\n return (\n
\n
\n \n {isPriceSortOpen && (\n
\n \n \n
\n )}\n
\n
\n \n {isSquareFeetSortOpen && (\n
\n \n \n
\n )}\n
\n
\n );\n}\n\nSort.propTypes = {\n filterBy: PropTypes.object,\n setFilterBy: PropTypes.func,\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport NumberInput from './shared/NumberInput';\n\nconst SquareFeet = ({ filterBy, setFilterBy }) => (\n
\n \n \n
\n);\n\nexport default SquareFeet;\n\nSquareFeet.propTypes = {\n filterBy: PropTypes.object,\n setFilterBy: PropTypes.func,\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nconst RadioInput = ({ filterBy, setFilterBy, filterName, filterValue }) => {\n const changeFilterValue = () => {\n if (filterName === 'bathrooms') {\n if (filterValue === filterBy.bathrooms) {\n setFilterBy({ ...filterBy, bathrooms: '' });\n } else {\n setFilterBy({ ...filterBy, bathrooms: filterValue });\n }\n }\n if (filterName === 'bedrooms') {\n if (filterValue === filterBy.bedrooms) {\n setFilterBy({ ...filterBy, bedrooms: '' });\n } else {\n setFilterBy({ ...filterBy, bedrooms: filterValue });\n }\n }\n };\n\n return (\n
\n \n
\n );\n};\n\nexport default RadioInput;\n\nRadioInput.propTypes = {\n filterBy: PropTypes.object,\n setFilterBy: PropTypes.func,\n filterName: PropTypes.string,\n filterValue: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n};\n","import React, { useState } from 'react';\nimport PropTypes from 'prop-types';\nimport FilterSubHeading from './shared/FilterSubHeading';\nimport RadioInput from './shared/FilterRadio';\n\nconst Select = ({ filterBy, setFilterBy }) => {\n const [isBedroomsOpen, setIsBedroomsOpen] = useState(false);\n\n return (\n
\n \n {isBedroomsOpen && (\n
\n \n \n \n \n \n \n
\n )}\n
\n );\n};\n\nexport default Select;\n\nSelect.propTypes = {\n filterBy: PropTypes.object,\n setFilterBy: PropTypes.func,\n};\n","import React, { useState } from 'react';\nimport PropTypes from 'prop-types';\nimport FilterSubHeading from './shared/FilterSubHeading';\nimport RadioInput from './shared/FilterRadio';\n\nconst Select = ({ filterBy, setFilterBy }) => {\n const [isBathroomsOpen, setIsBathroomsOpen] = useState(false);\n\n return (\n
\n \n {isBathroomsOpen && (\n
\n \n \n \n \n \n \n
\n )}\n
\n );\n};\n\nexport default Select;\n\nSelect.propTypes = {\n filterBy: PropTypes.object,\n setFilterBy: PropTypes.func,\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nconst FilterCheckbox = ({ filterBy, handleTypeChange, filterName }) => (\n
\n \n
\n);\n\nexport default FilterCheckbox;\n\nFilterCheckbox.propTypes = {\n filterBy: PropTypes.object,\n handleTypeChange: PropTypes.func,\n filterName: PropTypes.string,\n};\n","import React, { useState, useEffect } from 'react';\nimport PropTypes from 'prop-types';\nimport FilterCheckbox from './shared/FilterCheckbox';\nimport FilterSubHeading from './shared/FilterSubHeading';\n\nconst Select = ({ filterBy, setFilterBy, fetchedListings }) => {\n const [isHomeTypeOpen, setIsHomeTypeOpen] = useState(false);\n const [homeTypeList, setHomeTypeList] = useState([]);\n\n const handleTypeChange = type => {\n if (filterBy.homeTypes.includes(type)) {\n setFilterBy({ ...filterBy, homeTypes: [...filterBy.homeTypes].filter(item => item !== type) });\n } else {\n setFilterBy({ ...filterBy, homeTypes: [...filterBy.homeTypes, type] });\n }\n };\n\n useEffect(() => {\n if (fetchedListings) {\n fetchedListings.map(item => {\n if (item.home_type) {\n // eslint-disable-next-line no-shadow\n setHomeTypeList(homeTypeList => [...new Set([...homeTypeList, item.home_type])]);\n }\n\n return null;\n });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [fetchedListings]);\n\n const renderHomeTypes = homeTypeList.map(item => (\n \n ));\n\n return (\n
\n \n {isHomeTypeOpen && homeTypeList.length > 0 &&
{renderHomeTypes}
}\n
\n );\n};\n\nexport default Select;\n\nSelect.propTypes = {\n filterBy: PropTypes.object,\n setFilterBy: PropTypes.func,\n fetchedListings: PropTypes.array,\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport Bedrooms from './Bedrooms';\nimport Bathrooms from './Bathrooms';\nimport HomeTypes from './HomeTypes';\n\nconst Select = ({ filterBy, setFilterBy, fetchedListings }) => (\n
\n \n \n \n
\n);\n\nexport default Select;\n\nSelect.propTypes = {\n filterBy: PropTypes.object,\n setFilterBy: PropTypes.func,\n fetchedListings: PropTypes.array,\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport Keyword from './Keyword';\nimport Sort from './Sort';\nimport Select from './Select';\n\nexport default function More({ filterBy, setFilterBy, toggleMore, fetchedListings }) {\n return (\n
\n \n Done\n \n

Sort By

\n \n
\n }\n
\n
\n \n {isKeywordOpen && }\n
\n
\n );\n};\n\nexport default DesktopFilterAndSort;\n\nDesktopFilterAndSort.propTypes = {\n setFilterDropdowns: PropTypes.func,\n filterDropdowns: PropTypes.object,\n filterBy: PropTypes.object,\n setFilterBy: PropTypes.func,\n fetchedListings: PropTypes.array,\n};\n","/* eslint-disable react-hooks/exhaustive-deps */\nimport React, { useState, useEffect } from 'react';\nimport PropTypes from 'prop-types';\nimport MobileFilterAndSort from './MobileFilterAndSort';\nimport DesktopFilterAndSort from './DesktopFilterAndSort';\n\nconst STATE_KEY = 'filterHistory';\n\nsessionStorage.setItem(STATE_KEY, '');\n\nconst FilterAndSort = ({ fetchedListings, setPageNumber, paginateListings, newSearch }) => {\n const [filterBy, setFilterBy] = useState({\n lowPrice: '',\n highPrice: '',\n lowSquareFeet: '',\n highSquareFeet: '',\n bedrooms: '',\n bathrooms: '',\n homeTypes: [],\n keyword: '',\n priceSort: '',\n squarefeetSort: '',\n });\n const [filterDropdowns, setFilterDropdowns] = useState({\n isSortOpen: false,\n isPriceOpen: false,\n isSquareFeetOpen: false,\n isSelectOpen: false,\n isKeywordOpen: false,\n isMoreOpen: false,\n });\n const [filterHistory, setFilterHistory] = useState(sessionStorage.getItem(STATE_KEY));\n const {\n priceSort,\n squarefeetSort,\n lowPrice,\n highPrice,\n lowSquareFeet,\n highSquareFeet,\n bedrooms,\n bathrooms,\n homeTypes,\n keyword,\n } = filterBy;\n\n useEffect(() => {\n sessionStorage.setItem(STATE_KEY, filterHistory);\n if (!Object.values(filterBy).every(item => item === '' || item.length === 0)) {\n setFilterHistory(JSON.stringify(filterBy));\n } else if (filterHistory && !newSearch) {\n setFilterBy(JSON.parse(filterHistory));\n }\n }, [filterBy, filterHistory, newSearch]);\n\n const filterResults = () => {\n let filteredListings = [...fetchedListings];\n\n setPageNumber(1);\n\n if (lowPrice || highPrice) {\n if (!highPrice) {\n filteredListings = [...filteredListings].filter(\n listing => listing.listing_price >= parseInt(lowPrice.replace(/[^0-9]/g, ''))\n );\n } else if (!lowPrice) {\n filteredListings = [...filteredListings].filter(\n listing => listing.listing_price <= parseInt(highPrice.replace(/[^0-9]/g, ''))\n );\n } else if (lowPrice && highPrice) {\n filteredListings = [...filteredListings].filter(\n listing =>\n listing.listing_price >= parseInt(lowPrice.replace(/[^0-9]/g, '')) &&\n listing.listing_price <= parseInt(highPrice.replace(/[^0-9]/g, ''))\n );\n }\n }\n\n if (lowSquareFeet || highSquareFeet) {\n if (!highSquareFeet) {\n filteredListings = [...filteredListings].filter(\n listing => listing.square_feet >= parseInt(lowSquareFeet.replace(/[^0-9]/g, ''))\n );\n } else if (!lowSquareFeet) {\n filteredListings = [...filteredListings].filter(\n listing => listing.square_feet <= parseInt(highSquareFeet.replace(/[^0-9]/g, ''))\n );\n } else if (lowSquareFeet && highSquareFeet) {\n filteredListings = [...filteredListings].filter(\n listing =>\n listing.square_feet >= parseInt(lowSquareFeet.replace(/[^0-9]/g, '')) &&\n listing.square_feet <= parseInt(highSquareFeet.replace(/[^0-9]/g, ''))\n );\n }\n }\n\n if (bedrooms) {\n if (bedrooms === 'Any') {\n filteredListings = [...filteredListings].filter(listing => listing.bedrooms >= 0);\n } else {\n filteredListings = [...filteredListings].filter(listing => listing.bedrooms >= bedrooms);\n }\n }\n\n if (bathrooms) {\n if (bathrooms === 'Any') {\n filteredListings = [...filteredListings].filter(listing => listing.bathrooms >= 0);\n } else {\n filteredListings = [...filteredListings].filter(listing => listing.bathrooms >= bathrooms);\n }\n }\n\n if (homeTypes.length > 0) {\n filteredListings = [...filteredListings].filter(listing => homeTypes.includes(listing.home_type));\n }\n\n if (keyword) {\n filteredListings = [...filteredListings].filter(listing =>\n Object.keys(listing).some(k => {\n if (typeof listing[k] === 'string') {\n return listing[k].toLowerCase().includes(keyword.toLowerCase());\n }\n\n return null;\n })\n );\n }\n\n if (priceSort) {\n const priceField = 'listing_price';\n\n setFilterBy({ ...filterBy, squarefeetSort: '' });\n\n if (priceSort.includes('ascending')) {\n filteredListings.sort((a, b) => a[priceField] - b[priceField]);\n } else {\n filteredListings.sort((a, b) => b[priceField] - a[priceField]);\n }\n }\n\n if (squarefeetSort) {\n const squarefeetField = 'square_feet';\n\n setFilterBy({ ...filterBy, priceSort: '' });\n\n if (squarefeetSort.includes('ascending')) {\n filteredListings.sort((a, b) => a[squarefeetField] - b[squarefeetField]);\n } else {\n filteredListings.sort((a, b) => b[squarefeetField] - a[squarefeetField]);\n }\n }\n\n paginateListings(filteredListings);\n };\n\n const toggleMore = () => {\n const { isMoreOpen } = filterDropdowns;\n\n setFilterDropdowns(\n isMoreOpen\n ? { ...filterDropdowns, isMoreOpen: false }\n : { ...filterDropdowns, isMoreOpen: true, isPriceOpen: false, isSquareFeetOpen: false }\n );\n };\n\n useEffect(() => {\n if (\n priceSort ||\n squarefeetSort ||\n lowPrice ||\n highPrice ||\n lowSquareFeet ||\n highSquareFeet ||\n bedrooms ||\n bathrooms ||\n homeTypes ||\n keyword\n ) {\n filterResults();\n }\n }, [\n priceSort,\n squarefeetSort,\n lowPrice,\n highPrice,\n lowSquareFeet,\n highSquareFeet,\n bedrooms,\n bathrooms,\n homeTypes,\n keyword,\n ]);\n\n return (\n
\n \n \n
\n );\n};\n\nexport default FilterAndSort;\n\nFilterAndSort.propTypes = {\n fetchedListings: PropTypes.array,\n setPageNumber: PropTypes.func,\n paginateListings: PropTypes.func,\n newSearch: PropTypes.bool,\n};\n","/* eslint-disable react-hooks/exhaustive-deps */\nimport React, { useEffect } from 'react';\nimport PropTypes from 'prop-types';\nimport Listing from './Listing';\nimport Pagination from './Pagination';\nimport FilterAndSort from './FilterAndSort/FilterAndSort';\n\nconst SearchResults = ({\n pageNumber,\n setPageNumber,\n userFilteredListings,\n setUserFilteredListings,\n userInfo,\n isLoggedIn,\n fetchedListings,\n resultsMessage,\n setResultsMessage,\n newSearch,\n pageNumberHistory,\n setPageNumberHistory,\n isListingAgent,\n setIsOpenFreeTrialLimitPopup,\n propertyListings,\n setIsOpenVisitorSignupMessage,\n}) => {\n useEffect(() => {\n if (fetchedListings) {\n paginateListings(fetchedListings);\n\n sendListhubTrackingResults(fetchedListings);\n }\n }, [fetchedListings]);\n\n const paginateListings = data => {\n if (data.length > 0) {\n const paginatedData = [];\n\n for (let i = 0; i < data.length; i += 8) {\n paginatedData.push(data.slice(i, i + 8));\n }\n\n setUserFilteredListings(paginatedData);\n } else {\n setUserFilteredListings([]);\n setResultsMessage('No results found.');\n }\n };\n\n const sendListhubTrackingResults = listings => {\n const listingKeys = listings.reduce((acc, currentListing) => {\n if (currentListing.source === 'ListHub') {\n acc.push(currentListing.listing_key);\n }\n\n return acc;\n }, []);\n\n // eslint-disable-next-line no-undef\n lh('submit', 'SEARCH_DISPLAY', listingKeys);\n };\n\n return (\n
\n
\n \n
\n {userFilteredListings.length > 0 ? (\n userFilteredListings[pageNumber - 1].map(listing => (\n \n ))\n ) : (\n

{resultsMessage}

\n )}\n
\n
\n \n
\n );\n};\n\nexport default SearchResults;\n\nSearchResults.propTypes = {\n pageNumber: PropTypes.number,\n setPageNumber: PropTypes.func,\n userFilteredListings: PropTypes.array,\n setUserFilteredListings: PropTypes.func,\n userInfo: PropTypes.object,\n isLoggedIn: PropTypes.bool,\n fetchedListings: PropTypes.array,\n resultsMessage: PropTypes.string,\n setResultsMessage: PropTypes.func,\n newSearch: PropTypes.bool,\n pageNumberHistory: PropTypes.string,\n setPageNumberHistory: PropTypes.func,\n isListingAgent: PropTypes.bool,\n setIsOpenFreeTrialLimitPopup: PropTypes.func,\n propertyListings: PropTypes.array,\n setIsOpenVisitorSignupMessage: PropTypes.func,\n};\n","import React, { useState, useEffect } from 'react';\nimport { API } from 'aws-amplify';\nimport { withRouter, Redirect } from 'react-router-dom';\nimport PropTypes from 'prop-types';\nimport MLSAddForm from './MLSAddForm';\nimport searchBackground from '../assets/searchBackground.png';\nimport searchImage from '../assets/search.svg';\nimport locationLightIcon from '../assets/location-light-icon.svg';\nimport locationDarkIcon from '../assets/location-dark-icon.svg';\nimport OutsideClickHandler from '../helpers/OutsideClickHandler';\nimport { listListings, getListingByListingId } from '../graphql/queries';\nimport Loading from './Loading';\nimport SearchResults from './SearchResults';\n\nlet searchingNow = 0;\n\nconst SearchListings = ({\n isLoggedIn,\n fetchedListings,\n searchTermsHistory,\n setSearchTermsHistory,\n pageNumberHistory,\n setPageNumberHistory,\n userHasSearched,\n setUserHasSearched,\n setFetchedListings,\n handleLogin,\n userInfo,\n loginRoute,\n isListingAgent,\n setIsOpenFreeTrialLimitPopup,\n propertyListings,\n setIsOpenVisitorSignupMessage,\n}) => {\n const [searchTerms, setSearchTerms] = useState(searchTermsHistory || '');\n const [showSearchDropdown, setSearchDropdown] = useState(false);\n const [isMLSAddOpen, setIsMLSAddOpen] = useState(false);\n const [searchError, setSearchError] = useState('');\n const [userFilteredListings, setUserFilteredListings] = useState([]);\n const [resultsMessage, setResultsMessage] = useState();\n const [showLoading, setShowLoading] = useState(false);\n const [currentLocationSelected, setCurrentLocationSelected] = useState(false);\n const [pageNumber, setPageNumber] = useState(pageNumberHistory);\n const [newSearch, setNewSearch] = useState();\n const listQuery = async () => {\n try {\n setShowLoading(true);\n setSearchTermsHistory(searchTerms);\n setUserFilteredListings([]);\n setNewSearch(true);\n setPageNumberHistory('1');\n let nextToken;\n let fetchedData = [];\n const prevSearch = searchingNow;\n\n do {\n if (prevSearch !== searchingNow) {\n fetchedData = [];\n setFetchedListings(fetchedData);\n setShowLoading(true);\n break;\n }\n\n // General Search\n const queryOptions = {\n filter: {\n and: [\n { or: [{ status: { eq: 'Active' } }, { status: { eq: 'Pending' } }, { status: { eq: 'Withdrawn' } }] },\n ],\n or: [{ search_address: { contains: searchTerms.toLowerCase() } }, { zip: { eq: searchTerms } }],\n },\n limit: 10000,\n };\n\n if (nextToken !== null) {\n queryOptions.nextToken = nextToken;\n }\n\n let params = {\n query: listListings,\n variables: queryOptions,\n authMode: 'API_KEY',\n };\n\n let returnKey = 'listListings';\n\n // Query by MLS ID\n const isMLSId = /(^[a-zA-Z]*[0-9]+)\\w+/.test(searchTerms) && searchTerms.length > 5;\n\n if (isMLSId) {\n console.log(`${searchTerms} is an MLS ID`);\n\n params = {\n query: getListingByListingId,\n variables: { listing_id: searchTerms.toUpperCase() },\n authMode: 'API_KEY',\n };\n\n returnKey = 'getListingByListingId';\n }\n\n // Run Query\n const listingsBatch = await API.graphql(params).then(response => response.data[returnKey]);\n\n for (const item of listingsBatch.items) {\n fetchedData.push(item);\n }\n\n if (fetchedData.length > 0) {\n paginateListings(fetchedData);\n setFetchedListings(fetchedData);\n setShowLoading(false);\n }\n\n ({ nextToken } = listingsBatch);\n } while (nextToken);\n\n if (prevSearch === searchingNow) {\n if (fetchedData.length === 0) {\n setResultsMessage('No results found.');\n setFetchedListings([]);\n } else {\n setFetchedListings(fetchedData);\n }\n setSearchDropdown(false);\n setShowLoading(false);\n }\n } catch (error) {\n setShowLoading(false);\n\n handleSearchError('There has been an error. Please check your search terms and try again.');\n }\n };\n\n const toggleSearchDropdown = () => {\n setSearchDropdown(prevSearchDropdownOpen => !prevSearchDropdownOpen);\n };\n\n const paginateListings = data => {\n if (data.length > 0) {\n const paginatedData = [];\n\n for (let i = 0; i < data.length; i += 8) {\n paginatedData.push(data.slice(i, i + 8));\n }\n\n setUserFilteredListings(paginatedData);\n } else {\n setUserFilteredListings([]);\n setResultsMessage('No results found.');\n }\n };\n const handleSearchError = error => {\n setSearchError(error);\n setSearchDropdown(true);\n };\n\n const searchByLocation = async () => {\n if (navigator.geolocation) {\n setSearchError('');\n setSearchDropdown(false);\n navigator.geolocation.getCurrentPosition(position => {\n fetch(\n `https://maps.googleapis.com/maps/api/geocode/json?latlng=${position.coords.latitude},${position.coords.longitude}&key=AIzaSyCn8iRJpewWCvg12KHjOinW05mPDbwF_ik`\n )\n .then(response => response.json())\n .then(response => {\n // Search based on user's zip\n if (response.results[0]) {\n response.results[0].address_components.map(data => {\n if (data.types[0] === 'postal_code') {\n setSearchTermsHistory(data.long_name);\n setSearchTerms(data.long_name);\n setCurrentLocationSelected(true);\n setUserHasSearched(true);\n }\n\n return null;\n });\n } else {\n handleSearchError('There has been an error. Please try again or enter a search term.');\n }\n })\n .catch(error => {\n handleSearchError('There has been an error. Please try again or enter a search term.');\n });\n });\n } else {\n handleSearchError('Geolocation is not supported by this browser.');\n }\n };\n\n const searchListings = () => {\n if (searchTerms) {\n setUserHasSearched(true);\n searchingNow += 1;\n listQuery();\n setSearchError('');\n toggleSearchDropdown();\n }\n };\n\n useEffect(() => {\n if (loginRoute && !isLoggedIn) {\n handleLogin(true);\n }\n if (isLoggedIn) {\n handleLogin(false);\n }\n if (currentLocationSelected) {\n searchingNow += 1;\n listQuery();\n setCurrentLocationSelected(false);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [currentLocationSelected, setCurrentLocationSelected, isLoggedIn, loginRoute]);\n\n if (loginRoute) return ;\n\n return (\n
\n
\n \n
\n
\n
\n

\n Search our listings\n

\n \n
\n
\n {\n if (event.key === 'Enter') {\n if (searchTerms) {\n searchListings();\n } else {\n handleSearchError('Please enter a search term or select your location.');\n }\n }\n }}\n onChange={event => {\n setCurrentLocationSelected(false);\n setSearchTerms(event.target.value);\n setSearchError('');\n }}\n onFocus={() => setSearchDropdown(true)}\n />\n \n \"Search\"\n \n
\n {showSearchDropdown && (\n
    \n
  • \n \n \"\"\n Current Location\n \n
  • \n {searchError && (\n
  • \n

    {searchError}

    \n
  • \n )}\n
\n )}\n
\n
\n\n {isLoggedIn && (\n <>\n
\n
\n

OR

\n
\n
\n {\n if (isLoggedIn) {\n setIsMLSAddOpen(prevIsMLSAddOpen => !prevIsMLSAddOpen);\n } else {\n handleLogin(true);\n }\n }}\n style={{ maxWidth: '37rem' }}\n >\n ADD BY MLS NUMBERS\n \n \n )}\n
\n
\n
\n {userHasSearched && (\n
\n {showLoading ? (\n
\n \n
\n ) : (\n \n )}\n
\n )}\n
\n
\n {isLoggedIn ? (\n
\n

\n DOWNLOAD OUR APP\n

\n \n App Download\n \n
\n ) : (\n
\n

\n AGENT LOGIN\n

\n \n LOGIN\n \n

\n SIGN UP BY DOWNLOADING OUR APP\n

\n \n DOWNLOAD THE APP\n \n
\n )}\n
\n

\n Our Mobile App gives Real Estate Agents the opportunity to simplify and optimize the home\n tour scheduling process...\n

\n
    \n
  • \n \"location\n

    Select the homes you would like to show to your client

    \n
  • \n
  • \n \"location\n

    About Time Tours optimizes the route and creates a schedule

    \n
  • \n
  • \n \"location\n

    Finalize the tour times and send schedule requests to listing agents

    \n
  • \n
\n
\n
\n
\n {isMLSAddOpen && (\n \n )}\n
\n );\n};\n\nexport default withRouter(SearchListings);\n\nSearchListings.propTypes = {\n isLoggedIn: PropTypes.bool,\n handleLogin: PropTypes.func,\n userInfo: PropTypes.object,\n loginRoute: PropTypes.bool,\n fetchedListings: PropTypes.array,\n setFetchedListings: PropTypes.func,\n searchTermsHistory: PropTypes.string,\n setSearchTermsHistory: PropTypes.func,\n pageNumberHistory: PropTypes.string,\n setPageNumberHistory: PropTypes.func,\n userHasSearched: PropTypes.bool,\n setUserHasSearched: PropTypes.func,\n isListingAgent: PropTypes.bool,\n setIsOpenFreeTrialLimitPopup: PropTypes.func,\n propertyListings: PropTypes.array,\n setIsOpenVisitorSignupMessage: PropTypes.func,\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport next from '../assets/next.svg';\nimport prev from '../assets/prev.svg';\n\nconst GalleryButton = ({ nextPhoto, prevPhoto }) => (\n \n \"\"\n \n);\n\nexport default GalleryButton;\n\nGalleryButton.propTypes = {\n nextPhoto: PropTypes.func,\n prevPhoto: PropTypes.func,\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport OutsideClickHandler from '../helpers/OutsideClickHandler';\nimport GalleryButton from './GalleryButton';\n\nconst GalleryModal = ({ source, setGalleryIndex, galleryIndex, galleryLength, toggleGallery, isGalleryOpen }) => {\n const nextPhoto = () => {\n if (galleryIndex < galleryLength - 1) {\n const newIndex = galleryIndex + 1;\n\n setGalleryIndex(newIndex);\n } else {\n setGalleryIndex(0);\n }\n };\n\n const prevPhoto = () => {\n if (galleryIndex > 0) {\n const newIndex = galleryIndex - 1;\n\n setGalleryIndex(newIndex);\n } else {\n setGalleryIndex(0);\n }\n };\n\n return (\n
\n
\n
\n
\n
\n \n
\n \"\"\n \n \n
\n
\n
\n
\n
\n
\n );\n};\n\nexport default GalleryModal;\n\nGalleryModal.propTypes = {\n source: PropTypes.string,\n galleryIndex: PropTypes.number,\n setGalleryIndex: PropTypes.func,\n galleryLength: PropTypes.number,\n toggleGallery: PropTypes.func,\n isGalleryOpen: PropTypes.bool,\n};\n","/* eslint-disable react/jsx-props-no-spreading */\nimport React from 'react';\nimport PropTypes from 'prop-types';\n\nconst ListingSourceLink = ({ source }) => {\n const sharedAttributes = {\n className: 'pb-2 pl-2 text-white underline',\n target: '_blank',\n rel: 'noreferrer noopener',\n };\n\n switch (source) {\n case 'Spark': {\n return (\n \n Spark\n \n );\n }\n case 'Bridge': {\n return (\n \n Bridge\n \n );\n }\n case 'ListHub': {\n return (\n \n Listhub\n \n );\n }\n case 'Beaches': {\n return (\n \n Beaches\n \n );\n }\n default: {\n return ' N/A';\n }\n }\n};\n\nListingSourceLink.propTypes = {\n source: PropTypes.string,\n};\n\nexport default ListingSourceLink;\n","import React, { useState, useEffect } from 'react';\nimport { API } from 'aws-amplify';\nimport PropTypes from 'prop-types';\nimport { withRouter } from 'react-router-dom';\nimport SanitizedHTML from 'react-sanitized-html';\nimport GalleryModal from './GalleryModal';\nimport bedroom from '../assets/bedroom.svg';\nimport bathroom from '../assets/bathroom.svg';\nimport { getListing } from '../graphql/queries';\nimport AddToClient from './AddToClient';\nimport Loading from './Loading';\nimport getMediaUrl from '../helpers/getMediaUrl';\nimport ListingSourceLink from './ListingSourceLink';\n\nconst ListingDetail = ({ match, location, isLoggedIn, userInfo }) => {\n const [isGalleryOpen, setIsGalleryOpen] = useState(false);\n const [galleryIndex, setGalleryIndex] = useState(0);\n\n const { id } = match.params;\n const { hash } = location;\n const [listing, setListingInfo] = useState();\n const [showLoading, setShowLoading] = useState(true);\n const [errorMessage, setErrorMessage] = useState('');\n\n const currentYear = new Date().getFullYear();\n\n const renderImages = () => {\n console.log(listing);\n if (listing && listing.Media && listing.Media.length) {\n return listing.Media.map((photo, index) => {\n if (index > 0 && index < 5) {\n return (\n openGalleryModal(index)}\n >\n \n \n );\n }\n\n return null;\n });\n }\n\n return [];\n };\n\n const toggleGallery = () => {\n setIsGalleryOpen(prevIsGalleryOpen => !prevIsGalleryOpen);\n };\n\n const openGalleryModal = index => {\n setGalleryIndex(index);\n toggleGallery();\n };\n\n const fetchListing = async () => {\n const fetchedListing = await API.graphql({\n query: getListing,\n variables: { id: `${id}${hash || ''}` },\n authMode: 'API_KEY',\n });\n\n if (fetchedListing.data.getListing) {\n const listingData = fetchedListing.data.getListing;\n\n setListingInfo(listingData);\n\n // eslint-disable-next-line no-undef\n if (listingData.source === 'ListHub') lh('submit', 'DETAIL_PAGE_VIEWED', { lkey: listingData.listing_key });\n } else {\n setErrorMessage('Something has gone wrong. Please refresh the page or try another search.');\n }\n setShowLoading(false);\n };\n\n useEffect(() => {\n window.scrollTo(0, 0);\n\n fetchListing();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n if (showLoading)\n return (\n
\n \n
\n );\n\n if (errorMessage)\n return (\n
\n

{errorMessage}

\n
\n );\n\n return (\n
\n {listing && (\n
\n
\n {listing && listing.Media && listing.Media[0] && listing.Media[0].MediaURL ? (\n
\n \n
\n {renderImages()}\n
\n
\n ) : (\n

No images found.

\n )}\n
\n
\n
\n
    \n
  • \n ${parseInt(listing.listing_price).toLocaleString()}\n
  • \n
    \n \"\"\n
  • {listing.bedrooms}
  • \n

    |

    \n \"\"\n
  • {listing.bathrooms}
  • \n

    |

    \n
  • \n {listing.square_feet ? {listing.square_feet.toLocaleString()} : N/A}\n sqft\n
  • \n
    \n
\n
\n
\n

\n {listing.address}\n

\n
\n
\n {isLoggedIn && }\n
\n
\n
\n

Description:

\n \n
\n
\n

Details:

\n
    \n {listing.bedrooms && (\n
  • \n

    \n Bedrooms: {listing.bedrooms}\n

    \n
  • \n )}\n {listing.bathrooms && (\n
  • \n

    \n Bathrooms: {listing.bathrooms}\n

    \n
  • \n )}\n {listing.square_feet && (\n
  • \n

    \n Square Feet: {listing.square_feet}\n

    \n
  • \n )}\n {listing.lot_size && (\n
  • \n

    \n Lot Size:{' '}\n \n {listing.lot_size} {listing.lot_size_units}\n \n

    \n
  • \n )}\n {listing.year_built && (\n
  • \n

    \n Year Built: {listing.year_built}\n

    \n
  • \n )}\n {listing.listing_id && (\n
  • \n

    \n MLS #: {listing.listing_id}\n

    \n
  • \n )}\n {listing.county && (\n
  • \n

    \n County: {listing.county}\n

    \n
  • \n )}\n {listing.status && (\n
  • \n

    \n Status: {listing.status}\n

    \n
  • \n )}\n
\n
\n
\n
\n
\n
\n
\n
    \n
  • \n

    Listing Agent:

    \n
  • \n
  • \n

    {listing.listing_agent}

    \n
  • \n
  • \n

    \n {listing.listing_agent_phone\n ? listing.listing_agent_phone.replace(/(\\d{3})(\\d{3})(\\d{4})/, '$1-$2-$3')\n : ''}\n

    \n
  • \n
  • \n

    {listing.listing_agent_email}

    \n
  • \n
  • \n

    {listing.listing_office}

    \n
  • \n
\n
    \n
  • \n

    \n Source:\n \n

    \n
  • \n
  • \n

    \n Copyright © {currentYear} Listhub. All rights reserved. All information provided by the listing\n agent/broker is deemed reliable but is not guaranteed and should be independently verified.\n

    \n
  • \n
\n
\n
\n
\n {isGalleryOpen && listing.Media.length > 0 && (\n \n )}\n
\n )}\n
\n );\n};\n\nexport default withRouter(ListingDetail);\n\nListingDetail.propTypes = {\n match: PropTypes.object,\n location: PropTypes.object,\n isLoggedIn: PropTypes.bool,\n userInfo: PropTypes.object,\n};\n","import React, { useState, useEffect } from 'react';\nimport PropTypes from 'prop-types';\nimport { Auth, API, graphqlOperation } from 'aws-amplify';\nimport CreateIcon from '@material-ui/icons/Create';\nimport { Tooltip } from '@material-ui/core';\nimport { updateUser } from '../../graphql/mutations';\n\nconst VerifyPhoneNumber = ({ setIsVerifyPhoneOpen, userInfo, setUserInfo }) => {\n const [currentUserPhoneVerified, setCurrentUserPhoneVerified] = useState(false);\n const [phoneNumber, setPhoneNumber] = useState('');\n const [isOpenEditPhone, setIsOpenEditPhone] = useState(false);\n const [confirmationCode, setConfirmationCode] = useState('');\n const [isCodeSent, setIsCodeSent] = useState(false);\n const [isVisibleEditIcon, setIsVisibleEditIcon] = useState(true);\n const [authUser, setAuthUser] = useState(null);\n const [cellPhoneError, setCellPhoneError] = useState('');\n const [codeError, setCodeError] = useState('');\n const [userInfoFromDb, setUserInfoFromDb] = useState();\n\n useEffect(() => {\n const fetchData = async () => {\n try {\n const userPoolUser = await Auth.currentUserPoolUser();\n\n setAuthUser(userPoolUser);\n\n if (userPoolUser && userPoolUser.attributes && userPoolUser.attributes.phone_number_verified) {\n setCurrentUserPhoneVerified(userPoolUser.attributes.phone_number_verified);\n }\n } catch (error) {\n console.log(error);\n }\n };\n\n fetchData();\n }, []);\n\n const toggleVerifyPhoneModal = () => {\n setIsVerifyPhoneOpen(prevIsVerifyPhoneOpen => !prevIsVerifyPhoneOpen);\n };\n\n const verifyPhoneNumber = async () => {\n setIsVisibleEditIcon(false);\n\n Auth.verifyUserAttribute(authUser, 'phone_number')\n .then(res => {\n setIsCodeSent(true);\n })\n .catch(error => {\n console.error(error);\n });\n\n setPhoneNumber(userInfo.cell_phone);\n };\n\n const validateCode = () => {\n if (!confirmationCode) {\n setCodeError('Confirmation code is required to continue');\n\n return false;\n }\n setCodeError('');\n\n return true;\n };\n\n const verifyCodeClick = async () => {\n try {\n if (!validateCode()) {\n return false;\n }\n\n await Auth.verifyUserAttributeSubmit(authUser, 'phone_number', confirmationCode);\n\n setCurrentUserPhoneVerified(true);\n\n if (userInfoFromDb) {\n setUserInfo(userInfoFromDb);\n }\n\n toggleVerifyPhoneModal();\n } catch (error) {\n setCodeError(error.message || 'There was an error confirming your code. Please try again.');\n }\n };\n\n const validateCellPhone = () => {\n if (!phoneNumber) {\n setCellPhoneError('Cell Phone Number is required');\n\n return false;\n }\n\n if (phoneNumber.length !== 12) {\n setCellPhoneError('Please enter phone number in this format: XXX-XXX-XXXX');\n\n return false;\n }\n if (phoneNumber === userInfo.cell_phone) {\n setCellPhoneError('Please enter different phone number to update.');\n\n return false;\n }\n\n setCellPhoneError('');\n\n return true;\n };\n\n const updatePhoneNumber = async () => {\n if (!validateCellPhone()) {\n return false;\n }\n\n const cellPhone = `+1${phoneNumber.replace(/-/g, '')}`;\n\n const res = await Auth.updateUserAttributes(authUser, {\n phone_number: cellPhone,\n });\n\n if (res === 'SUCCESS') {\n const updateUserInput = {\n id: userInfo.id,\n cell_phone: phoneNumber,\n };\n\n const {\n data: { updateUser: dbUser },\n } = await API.graphql(graphqlOperation(updateUser, { updateUserInput }));\n\n setUserInfoFromDb(dbUser);\n\n await Auth.verifyUserAttribute(authUser, 'phone_number')\n .then(response => {\n setIsCodeSent(true);\n })\n .catch(error => {\n console.error(error);\n });\n }\n };\n\n const editPhoneClick = () => {\n setIsOpenEditPhone(prevIsOpenEditPhone => !prevIsOpenEditPhone);\n setIsVisibleEditIcon(false);\n };\n\n const isInputNumber = evt => {\n const ch = String.fromCharCode(evt.which);\n\n if (!(/[0-9]/.test(ch) || /[-]/.test(ch))) {\n evt.preventDefault();\n }\n };\n\n return (\n
\n
\n
\n
\n
\n
\n
\n
\n

\n We need to verify your phone number for app functionality.\n

\n

\n Please press the Verify button and enter your verification code.\n

\n

If you want to edit your phone number, click on edit icon.

\n\n {userInfo && (\n
\n {userInfo.cell_phone}\n {isVisibleEditIcon && (\n \n \n \n \n \n )}\n
\n )}\n\n {!isOpenEditPhone && !isCodeSent && (\n
\n \n Verify\n \n
\n )}\n {currentUserPhoneVerified &&

Your current phone number is verified

}\n {isOpenEditPhone && (\n
\n

\n Update phone number\n

\n
\n setPhoneNumber(e.target.value.trim())}\n disabled={isCodeSent}\n onKeyPress={input => isInputNumber(input)}\n />\n
\n {cellPhoneError &&

{cellPhoneError}

}\n {!isCodeSent && (\n
\n \n Update\n \n
\n )}\n
\n )}\n {isCodeSent && (\n
\n {\n setConfirmationCode(e.target.value.trim());\n }}\n value={confirmationCode}\n />\n\n {codeError &&

{codeError}

}\n\n
\n \n Verify Code\n \n
\n
\n )}\n
\n\n \n
\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n );\n};\n\nexport default VerifyPhoneNumber;\n\nVerifyPhoneNumber.propTypes = {\n setIsVerifyPhoneOpen: PropTypes.func,\n userInfo: PropTypes.object,\n setUserInfo: PropTypes.func,\n};\n","import { Auth } from 'aws-amplify';\n\nexport const CancelSubscription = async subscriptionId => {\n try {\n const sessionToken = `Bearer ${(await Auth.currentSession()).getIdToken().jwtToken}`;\n const payload = { subId: subscriptionId };\n\n return fetch(process.env.REACT_APP_STRIPE_CANCEL_SUBSCRIPTION, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: sessionToken,\n },\n body: JSON.stringify({ payload }),\n }).then(handleFetchResult);\n } catch (error) {\n console.log(error);\n\n return error;\n }\n};\n\nconst handleFetchResult = result => {\n if (!result.ok) {\n console.log(result);\n }\n\n return result.json();\n};\n","import React, { useState } from 'react';\nimport PropTypes from 'prop-types';\nimport { CancelSubscription } from '../../services/CancelSubscription';\n\nconst ConfirmCancelSubscription = ({ setIsCancelSubOpen, subscriptionInfo, setIsRecurring }) => {\n const [errorMessage, setErrorMessage] = useState('');\n\n const confirmEvent = async () => {\n if (subscriptionInfo && subscriptionInfo.subscription && subscriptionInfo.subscription.original_order_id) {\n const deleteData = await CancelSubscription(subscriptionInfo.subscription.original_order_id);\n\n if (deleteData.response === 'deleted') {\n setIsCancelSubOpen(false);\n setIsRecurring(false);\n } else {\n setErrorMessage('Please try again later');\n }\n }\n };\n\n return (\n
\n
\n
\n
\n
\n
\n
\n

\n Are you sure want to cancel your recurring subscription?\n

\n\n
\n
\n
\n \n Confirm\n \n
\n
\n setIsCancelSubOpen(false)}\n >\n Cancel\n \n
\n
\n
\n\n {errorMessage &&

{errorMessage}

}\n
\n
\n
\n
\n
\n
\n );\n};\n\nexport default ConfirmCancelSubscription;\n\nConfirmCancelSubscription.propTypes = {\n setIsCancelSubOpen: PropTypes.func,\n subscriptionInfo: PropTypes.object,\n setIsRecurring: PropTypes.func,\n};\n","/* eslint-disable camelcase */\nimport React, { useEffect, useState } from 'react';\nimport { withAuthenticator } from 'aws-amplify-react';\nimport { Auth, API, graphqlOperation } from 'aws-amplify';\nimport PropTypes from 'prop-types';\nimport dateFormat from 'dateformat';\nimport { getUserByCognitoSub } from '../graphql/queries';\nimport VerifyPhoneNumber from './SignUp/VerifyPhoneNumber';\nimport ConfirmCancelSubscription from './SignUp/ConfirmCancelSubscription';\n\nconst Profile = ({ userInfo, setUserInfo, setIsLoggedIn, subscriptionInfo }) => {\n const [isVerifyPhoneOpen, setIsVerifyPhoneOpen] = useState(false);\n const [isCancelSubOpen, setIsCancelSubOpen] = useState(false);\n const [invoiceList, setInvoiceList] = useState({});\n const [isVisibleSubHistory, setIsVisibleSubHistory] = useState(false);\n const [showLoading, setShowLoading] = useState(false);\n const [isRecurring, setIsRecurring] = useState(false);\n\n useEffect(() => {\n if (!userInfo) {\n Auth.currentAuthenticatedUser()\n .then(({ attributes: { sub } }) =>\n API.graphql(graphqlOperation(getUserByCognitoSub, { cognito_sub: sub }))\n .then(({ data: { getUserByCognitoSub: userByCognitoSub } }) => userByCognitoSub)\n .then(dbUser => {\n setUserInfo(dbUser);\n setIsLoggedIn(true);\n })\n )\n .catch(err => {\n console.error(err);\n });\n }\n if (subscriptionInfo) {\n setIsRecurring(subscriptionInfo.is_recurring);\n }\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const editClick = () => {\n setIsVerifyPhoneOpen(true);\n };\n\n const getInvoiceList = async userId => {\n try {\n const sessionToken = `Bearer ${(await Auth.currentSession()).getIdToken().jwtToken}`;\n\n return fetch(`${process.env.REACT_APP_STRIPE_INVOICE_LIST}/${userId}`, {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: sessionToken,\n },\n }).then(result => result.json());\n } catch (err) {\n console.log(err);\n }\n };\n\n const showSubHistoryClick = async () => {\n if (isVisibleSubHistory) {\n setIsVisibleSubHistory(false);\n } else {\n setShowLoading(true);\n\n if (userInfo) {\n const listData = await getInvoiceList(userInfo.id);\n\n if (listData && listData.response.length > 0) {\n const orderedList = listData.response.sort((a, b) => (a.period_start > b.period_start ? -1 : 1));\n\n setInvoiceList(orderedList);\n }\n setIsVisibleSubHistory(true);\n }\n setShowLoading(false);\n }\n };\n\n return (\n
\n
\n {userInfo && (\n
\n

\n {userInfo.first_name} {userInfo.last_name}\n

\n

{userInfo.cell_phone}

\n

{userInfo.email_address}

\n
\n )}\n\n

\n Want to verify your phone number?{' '}\n \n \n Click here\n \n \n

\n\n {/* stripe related code */}\n {/* {isRecurring && (\n

\n Do you want to cancel your recurring subscription?{' '}\n \n setIsCancelSubOpen(true)}\n onKeyDown={() => setIsCancelSubOpen(true)}\n role=\"button\"\n tabIndex={0}\n className=\"focus:outline-none\"\n >\n Click here\n \n \n

\n )} */}\n\n {/*

\n Want to show your subscription History?{' '}\n \n \n {!isVisibleSubHistory ? 'Show' : 'Hide'}\n \n \n

\n\n {showLoading && (\n
\n
\n
\n )} */}\n {/* stripe related code */}\n\n {isVisibleSubHistory && (\n
\n {invoiceList.length > 0 ? (\n
\n

Subscription history

\n
\n
\n \n \n \n \n \n \n \n \n \n \n \n \n {invoiceList &&\n invoiceList.map(invoice => (\n \n \n \n \n \n {invoice.amount_paid === 0 && invoice.paid\n ? 'Free trial'\n : `${invoice.paid ? `$ ${invoice.amount_paid / 100} (Paid)` : 'Not paid'}`}\n \n \n \n \n ))}\n \n
Order idPurchase DateIntervalAmountBillingInvoice
{invoice.subscription}{`${dateFormat(\n invoice.period_start * 1000,\n 'mm/dd/yyyy h:MMtt'\n )}`}{invoice.interval}\n {invoice.amount_paid === 0\n ? '-'\n : `${invoice.billing_reason === 'subscription_create' ? 'Paid by user' : 'Recurred'}`}\n \n \n \n Download\n \n \n
\n
\n
\n
\n ) : (\n
\n

No Subscription history

\n
\n )}\n
\n )}\n
\n {isVerifyPhoneOpen && (\n \n )}\n\n {isCancelSubOpen && (\n \n )}\n
\n );\n};\n\nexport default withAuthenticator(Profile, false, [
]);\n\nProfile.propTypes = {\n userInfo: PropTypes.object,\n setIsLoggedIn: PropTypes.func,\n setUserInfo: PropTypes.func,\n subscriptionInfo: PropTypes.object,\n};\n","/* eslint-disable react/jsx-props-no-spreading */\n/* eslint-disable react/prop-types */\nimport React from 'react';\nimport { useTable, useSortBy } from 'react-table';\nimport { ArrowUpIcon, ArrowDownIcon } from '@heroicons/react/outline';\n\nconst AgentsTable = ({ columns, data, updateAgentApproval, updateSubscriptionStatus }) => {\n const { getTableProps, getTableBodyProps, headerGroups, rows, prepareRow } = useTable(\n {\n columns,\n data,\n updateAgentApproval,\n updateSubscriptionStatus,\n },\n useSortBy\n );\n\n return (\n \n \n {headerGroups.map(headerGroup => (\n \n {headerGroup.headers.map(column => (\n \n {column.render('Header')}\n \n {/* eslint-disable-next-line no-nested-ternary */}\n {column.isSorted ? (\n column.isSortedDesc ? (\n \n ) : (\n \n )\n ) : (\n ''\n )}\n \n \n ))}\n \n ))}\n \n \n {rows.map(row => {\n prepareRow(row);\n\n return (\n \n {row.cells.map(cell => (\n \n ))}\n \n );\n })}\n \n
\n {cell.render('Cell')}\n \n
\n );\n};\n\nexport default AgentsTable;\n","import React, { useState } from 'react';\nimport PropTypes from 'prop-types';\nimport { add, format } from 'date-fns';\n\nconst SubscriptionCell = ({ value: initialValue, row: { original: agent }, updateSubscriptionStatus }) => {\n const [value, setValue] = useState(initialValue);\n\n const onChange = e => {\n const expiration = add(new Date(), { days: e.target.value });\n\n const subscriptionInfo = {\n is_active: true,\n is_manual: true,\n expires_at: format(expiration, 't'), // format to seconds timestamp\n };\n\n setValue(subscriptionInfo);\n\n updateSubscriptionStatus(agent, subscriptionInfo);\n };\n\n if (!value)\n return (\n \n );\n\n const formatedExpiresAt = value.expires_at ? new Date(value.expires_at * 1000).toLocaleDateString() : '';\n\n console.log(value);\n\n return (\n
\n
\n Active:\n \n {value.is_active ? 'True' : 'False'}\n \n
\n
\n Expires:\n {formatedExpiresAt}\n
\n
\n Type:\n {value.is_manual ? 'Manual' : 'In App'}\n
\n
\n );\n};\n\nSubscriptionCell.propTypes = {\n value: PropTypes.object,\n row: PropTypes.object,\n updateSubscriptionStatus: PropTypes.func,\n};\n\nexport default SubscriptionCell;\n","import React, { Fragment, useRef } from 'react';\nimport PropTypes from 'prop-types';\nimport { Dialog, Transition } from '@headlessui/react';\nimport { CheckIcon } from '@heroicons/react/outline';\n\nconst StatusModal = ({ setShowModal, handleConfirmed, subscriptionId, pendingValue }) => {\n const cancelButtonRef = useRef(null);\n\n return (\n \n \n \n
\n \n\n
\n
\n \n \n
\n
\n \n
\n
\n \n Confirm Agent Status Change\n \n {pendingValue.validated && (\n
\n {!subscriptionId && (\n

\n This agent does not currently have a subscription. If you want to grant them a free\n subscription you need to do that before approving them.\n

\n )}\n
\n )}\n {!pendingValue.validated && (\n
\n {subscriptionId && (\n

\n This agent currently has a subscription. Denying them will not automatically cancel the\n subscription, but they will no longer have access to the app.\n

\n )}\n
\n )}\n
\n
\n
\n {pendingValue.validated && (\n \n Approve\n \n )}\n {!pendingValue.validated && (\n \n Deny\n \n )}\n setShowModal(false)}\n ref={cancelButtonRef}\n >\n Cancel\n \n
\n
\n \n
\n
\n
\n
\n );\n};\n\nStatusModal.propTypes = {\n setShowModal: PropTypes.func,\n handleConfirmed: PropTypes.func,\n subscriptionId: PropTypes.string,\n pendingValue: PropTypes.object,\n};\n\nexport default StatusModal;\n","import React, { useState, useEffect } from 'react';\nimport PropTypes from 'prop-types';\nimport StatusModal from './StatusModal';\n\nconst StatusCell = ({ value: initialValue, row: { index, original }, column: { id }, updateAgentApproval }) => {\n const [value, setValue] = useState(initialValue);\n const [pendingValue, setPendingValue] = useState({});\n const [showModal, setShowModal] = useState(false);\n\n const onChange = e => {\n let newValue = {};\n\n if (e.target.value === 'approved') {\n newValue = { validated: true, lockedOut: false };\n }\n if (e.target.value === 'denied') {\n newValue = { validated: false, lockedOut: true };\n }\n\n setPendingValue(newValue);\n\n setShowModal(true);\n };\n\n const handleConfirmed = () => {\n updateAgentApproval(index, id, pendingValue, original);\n setValue(pendingValue);\n setShowModal(false);\n };\n\n useEffect(() => {\n setValue(initialValue);\n }, [initialValue]);\n\n let status = 'neutral';\n\n if (value.lockedOut) {\n status = 'denied';\n }\n\n if (value.validated) {\n status = 'approved';\n }\n\n return (\n <>\n \n\n {showModal && (\n \n )}\n \n );\n};\n\nStatusCell.propTypes = {\n value: PropTypes.object,\n row: PropTypes.object,\n column: PropTypes.object,\n updateAgentApproval: PropTypes.func,\n};\n\nexport default StatusCell;\n","import { Auth } from 'aws-amplify';\n\nexport const sendValidationEmail = async ({ emailAddress }) => {\n try {\n const sessionToken = `Bearer ${(await Auth.currentSession()).getIdToken().jwtToken}`;\n const payload = { emailAddress };\n const validationEmailResponse = await fetch(process.env.REACT_APP_VALIDATION_ENDPOINT, {\n method: 'post',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: sessionToken,\n },\n body: JSON.stringify(payload),\n });\n\n if (validationEmailResponse.ok) {\n const resultJson = await validationEmailResponse.json();\n\n return resultJson;\n }\n\n const resultText = await validationEmailResponse.text();\n\n throw new Error(`Agent Validation invocation not successful: ${resultText}`);\n } catch (error) {\n console.error('Error sending validation email: ', error);\n }\n};\n","/* eslint-disable react/jsx-props-no-spreading */\nimport React, { useState, useEffect } from 'react';\nimport { withAuthenticator } from 'aws-amplify-react';\nimport { API, graphqlOperation } from 'aws-amplify';\n\nimport AgentsTable from './AgentsTable';\nimport SubscriptionCell from './SubscriptionCell';\nimport StatusCell from './StatusCell';\n\nimport { adminListAgents } from '../../../graphql/queries';\nimport { adminApproveAgent, adminUpdateUser, adminGrantSubscription } from '../../../graphql/mutations';\nimport { sendValidationEmail } from '../../../services/agentValidationService';\n\nconst updateAgentApproval = async (_rowIndex, _columnId, value, agent) => {\n if (value.validated === true) {\n try {\n await API.graphql(graphqlOperation(adminApproveAgent, { id: agent.id }));\n\n await sendValidationEmail({ emailAddress: agent.email_address });\n alert('Agent has been successfully updated and given access.');\n } catch (error) {\n alert(`There was an error updating the agent's status. Please try again.`);\n\n console.error(error);\n }\n }\n\n if (value.lockedOut === true) {\n try {\n await API.graphql(\n graphqlOperation(adminUpdateUser, {\n updateUserInput: { id: agent.id, locked_out: true },\n })\n );\n alert('Agent has been successfully updated and denied access.');\n } catch (error) {\n alert(`There was an error updating the agent's status. Please try again.`);\n\n console.error(error);\n }\n }\n};\n\nconst updateSubscriptionStatus = async (agent, subscriptionInfo) => {\n console.log(agent, subscriptionInfo);\n\n const adminGrantSubscriptionInput = {\n user_id: agent.id,\n platform: agent.operating_system || 'unknown',\n expires_at: subscriptionInfo.expires_at,\n };\n\n try {\n const {\n data: { adminGrantSubscription: subscription },\n } = await API.graphql(graphqlOperation(adminGrantSubscription, { adminGrantSubscriptionInput }));\n\n alert(`Agent has been granted a subscription expiring on ${new Date(subscriptionInfo.expires_at * 1000)}`);\n console.log(subscription);\n\n // setSubscriptionInfo(subscription);\n } catch (error) {\n alert(`There was an error granting the agent's subscription. Please try again.`);\n\n console.error(error);\n }\n};\n\nconst columns = [\n {\n Header: 'First Name',\n accessor: 'first_name',\n },\n {\n Header: 'Last Name',\n accessor: 'last_name',\n },\n {\n Header: 'Email',\n accessor: 'email_address',\n },\n {\n Header: 'Cell Phone',\n accessor: 'cell_phone',\n },\n {\n Header: 'Agency',\n accessor: 'brokerage',\n },\n {\n Header: 'Realtor Number',\n accessor: 'realtor_number',\n },\n {\n Header: 'Registered',\n accessor: 'created_at',\n Cell: ({ value }) => new Date(value * 1000).toLocaleDateString(),\n },\n {\n Header: 'Subscription',\n accessor: 'agent_subscription',\n Cell: SubscriptionCell,\n },\n {\n Header: 'Status',\n accessor: data => ({ validated: data.validated, lockedOut: data.locked_out }),\n Cell: StatusCell,\n },\n];\n\nconst ManageAgents = () => {\n const [agents, setAgents] = useState([]);\n\n useEffect(() => {\n const fetchAgents = async () => {\n try {\n const fetchedAgentsResponse = await API.graphql(graphqlOperation(adminListAgents));\n\n if (fetchedAgentsResponse && fetchedAgentsResponse.data && fetchedAgentsResponse.data.adminListAgents) {\n const onboardedAgents = fetchedAgentsResponse.data.adminListAgents.filter(\n agent => agent.onboarding_complete === true\n );\n\n setAgents(onboardedAgents);\n }\n } catch (error) {\n console.error(error);\n }\n };\n\n fetchAgents();\n }, []);\n\n const pendingAgents = agents.filter(agent => !!(!agent.validated && !agent.locked_out));\n const deniedAgents = agents.filter(agent => !agent.validated && agent.locked_out);\n const approvedAgents = agents.filter(agent => agent.validated && !agent.locked_out);\n\n return (\n <>\n
\n
\n
\n

Pending Agents

\n

A list of the new agents waiting to be verified.

\n
\n
\n
\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n
\n
\n

Denied Agents

\n

A list of denied agents because they could not be verified.

\n
\n
\n
\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n
\n
\n

Approved Agents

\n

A list of the approved agents.

\n
\n
\n
\n
\n
\n
\n \n
\n
\n
\n
\n
\n \n );\n};\n\nexport default withAuthenticator(ManageAgents);\n","/* eslint-disable react/display-name */\n/* eslint-disable jsx-a11y/img-redundant-alt */\n/* eslint-disable react/prop-types */\n/* eslint-disable react/destructuring-assignment */\nimport React, { useState, useEffect } from 'react';\nimport { DataGrid } from '@material-ui/data-grid';\nimport { Redirect, withRouter, Link } from 'react-router-dom';\nimport CryptoJS from 'crypto-js';\nimport { API } from 'aws-amplify';\nimport { Badge } from '@material-ui/core';\nimport { listPropertyListings, getShowingActionRequiredCount } from '../graphql/queries';\nimport Spinner from './Spinner';\n\nconst CalendarListing = ({ userDetails }) => {\n const [isOpenCalendar, setIsOpenCalendar] = useState(false);\n const [propertyListingsData, setPropertyListingsData] = useState([]);\n const [showLoading, setShowLoading] = useState(true);\n const [countListData, setCountListData] = useState([]);\n\n useEffect(() => {\n const fetchListing1 = async () => {\n try {\n if (userDetails) {\n const fetchedListing = await API.graphql({\n query: listPropertyListings,\n variables: { listing_agent_id: userDetails.id },\n });\n\n if (fetchedListing) {\n setPropertyListingsData(fetchedListing.data.listPropertyListings);\n\n setShowLoading(false);\n }\n const getCount = await API.graphql({\n query: getShowingActionRequiredCount,\n variables: { agent_id: userDetails.id },\n });\n\n if (getCount) {\n setCountListData(getCount.data.getShowingActionRequiredCount);\n }\n }\n } catch (error) {\n console.log(error);\n setShowLoading(false);\n }\n };\n\n fetchListing1();\n }, [userDetails]);\n\n const rows = propertyListingsData.map(item => {\n const container = {};\n\n container.id = item.id;\n container.mlsid = item.listing_id;\n container.Address = item.address;\n container.media_url = item.media_url;\n container.listing_agent_id = item.listing_agent_id;\n\n countListData.map(data => {\n if (data.property_listing_id === item.id) {\n container.count = data.count;\n }\n\n return data;\n });\n\n return container;\n });\n const columns = [\n {\n field: 'media_url',\n headerName: ' ',\n width: 160,\n height: 150,\n sortable: false,\n renderCell: props => (\n
\n \n
\n ),\n },\n {\n field: 'mlsid',\n headerName: 'MLS ID',\n width: 200,\n },\n {\n field: 'Address',\n headerName: 'Address',\n flex: 1,\n },\n {\n field: 'count',\n headerName: ' ',\n width: 50,\n renderCell: props => ,\n },\n {\n field: 'actions',\n headerName: ' ',\n width: 150,\n sortable: false,\n renderCell: props =>\n props.row.mlsid && (\n \n Calendar\n \n ),\n },\n ];\n\n if (showLoading)\n return (\n
\n \n
\n );\n\n return (\n
\n
\n

\n My Listings\n

\n
\n \n
\n
\n {isOpenCalendar && }\n
\n );\n};\n\nexport default withRouter(CalendarListing);\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nconst calendarEventTitle = ({ setIsOpenEventTitle, eventTitle, setEventTitle, addEvent, isAgent }) => (\n
\n
\n
\n
\n
\n
\n
\n {isAgent ? (\n

\n Enter Buying Agent Name and Brokerage\n

\n ) : (\n

Enter Tour Title

\n )}\n\n setEventTitle(e.target.value.trim())}\n />\n \n
\n
\n
\n
\n \n
\n
\n
\n \n OK\n \n
\n
\n \n Cancel\n \n
\n
\n
\n
\n
\n
\n
\n
\n
\n);\n\nexport default calendarEventTitle;\n\ncalendarEventTitle.propTypes = {\n setIsOpenEventTitle: PropTypes.func,\n setEventTitle: PropTypes.func,\n addEvent: PropTypes.func,\n isAgent: PropTypes.bool,\n eventTitle: PropTypes.string,\n};\n","import React, { useState } from 'react';\nimport PropTypes from 'prop-types';\n\nconst CalendarEventApprove = ({ setIsOpenEventApprove, approveEvent, rejectEvent }) => {\n const [isOpenRejectMessage, setIsOpenRejectMessage] = useState(false);\n\n return (\n
\n
\n
\n
\n
\n
\n {!isOpenRejectMessage ? (\n
\n

Are you sure want to approve this event?

\n\n \n
\n
\n
\n
\n \n
\n
\n
\n \n Approve\n \n
\n
\n setIsOpenRejectMessage(true)}\n >\n Reject\n \n
\n
\n
\n
\n ) : (\n
\n

\n Are you sure you want to reject this request?{' '}\n

\n\n \n
\n
\n
\n
\n \n
\n
\n
\n \n Yes\n \n
\n
\n \n No\n \n
\n
\n
\n
\n )}\n
\n
\n
\n
\n
\n );\n};\n\nexport default CalendarEventApprove;\n\nCalendarEventApprove.propTypes = {\n setIsOpenEventApprove: PropTypes.func,\n approveEvent: PropTypes.func,\n rejectEvent: PropTypes.func,\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nconst CalendarAutoApprove = ({ approveEvent, rejectEvent }) => (\n
\n
\n
\n
\n
\n
\n
\n

\n Are you sure want to approve all events at once?{' '}\n

\n\n
\n
\n
\n \n Approve\n \n
\n
\n \n Cancel\n \n
\n
\n
\n
\n
\n
\n
\n
\n
\n);\n\nexport default CalendarAutoApprove;\n\nCalendarAutoApprove.propTypes = {\n approveEvent: PropTypes.func,\n rejectEvent: PropTypes.func,\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nconst CalendarLASlotOptions = ({\n setIsOpenLASlotOptions,\n editLASlot,\n deleteLASlot,\n createShowingAppointment,\n isVisibleCreateSlotBtn,\n}) => (\n
\n
\n
\n
\n
\n
\n
\n

\n Please choose an option\n

\n\n \n
\n
\n
\n
\n \n
\n
\n
\n \n Edit\n \n
\n
\n \n Delete\n \n
\n
\n
\n {isVisibleCreateSlotBtn && (\n
\n \n Create showing Appointment\n \n
\n )}\n
\n
\n
\n
\n
\n
\n);\n\nexport default CalendarLASlotOptions;\n\nCalendarLASlotOptions.propTypes = {\n setIsOpenLASlotOptions: PropTypes.func,\n editLASlot: PropTypes.func,\n deleteLASlot: PropTypes.func,\n createShowingAppointment: PropTypes.func,\n isVisibleCreateSlotBtn: PropTypes.bool,\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nconst successPopup = ({ setIsOpenSuccessPopup, isAlert, isAddedSlotInPast, isNotValidTimeSlot }) => (\n
\n
\n
\n
\n
\n
\n
\n {isAlert && (\n

\n Agent is not available for this time\n

\n )}\n {isAddedSlotInPast && (\n \n You can not add this time slot. Your selection is less than current time.\n

\n )}\n {isNotValidTimeSlot && (\n \n You can not add this time slot. Your selection is not valid.\n

\n )}\n
\n
\n
\n \n OK\n \n
\n
\n
\n
\n
\n
\n
\n
\n
\n);\n\nexport default successPopup;\n\nsuccessPopup.propTypes = {\n setIsOpenSuccessPopup: PropTypes.func,\n isAlert: PropTypes.bool,\n isAddedSlotInPast: PropTypes.bool,\n isNotValidTimeSlot: PropTypes.bool,\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport dateFormat from 'dateformat';\n\nconst CalendarLASlotAddUpdatePopup = ({\n setIsOpenLASlotAddUpdatePopup,\n OkClick,\n newLAAvilabilitySlot,\n selectedLAAvilabilitySlot,\n selectedSlotInfo,\n laSlotEventName,\n}) => {\n let displayMsg = null;\n\n if (laSlotEventName === 'edit') {\n const rangeStart = dateFormat(newLAAvilabilitySlot.start, 'h:MMtt');\n const rangeEnd = dateFormat(newLAAvilabilitySlot.end, 'h:MMtt');\n const slotDate = dateFormat(newLAAvilabilitySlot.start, 'mmm dd yyyy');\n\n displayMsg = `Are you sure want to edit available time for ${slotDate} from ${rangeStart} to ${rangeEnd}?`;\n } else if (laSlotEventName === 'delete') {\n const deleteRangeStart = dateFormat(newLAAvilabilitySlot.start, 'h:MMtt');\n const deleteRangeEnd = dateFormat(newLAAvilabilitySlot.end, 'h:MMtt');\n const deleteSlotDate = dateFormat(newLAAvilabilitySlot.start, 'mmm dd yyyy');\n\n displayMsg = `Are you sure want to delete the available showing window for ${deleteRangeStart} - ${deleteRangeEnd} on ${deleteSlotDate}?`;\n } else if (laSlotEventName === 'add') {\n const addRangeStart = dateFormat(selectedSlotInfo.start, 'h:MMtt');\n const addRangeEnd = dateFormat(selectedSlotInfo.end, 'h:MMtt');\n const addSlotDate = dateFormat(selectedSlotInfo.start, 'mmm dd yyyy');\n\n displayMsg = `Are you sure want to add availablity from ${addRangeStart} to ${addRangeEnd} on ${addSlotDate}?`;\n }\n\n return (\n
\n
\n
\n
\n
\n
\n
\n \n {displayMsg}\n

\n\n
\n
\n
\n \n Ok\n \n
\n
\n \n Cancel\n \n
\n
\n
\n
\n
\n
\n
\n
\n
\n );\n};\n\nexport default CalendarLASlotAddUpdatePopup;\n\nCalendarLASlotAddUpdatePopup.propTypes = {\n setIsOpenLASlotAddUpdatePopup: PropTypes.func,\n OkClick: PropTypes.func,\n newLAAvilabilitySlot: PropTypes.object,\n selectedLAAvilabilitySlot: PropTypes.object,\n selectedSlotInfo: PropTypes.object,\n laSlotEventName: PropTypes.string,\n};\n","import { Auth } from 'aws-amplify';\n\nexport const sendSMSMessage = async ({ phoneNumber, message }) => {\n try {\n const sessionToken = `Bearer ${(await Auth.currentSession()).getIdToken().jwtToken}`;\n\n const payload = {\n phoneNumber: phoneNumber.replace(/-/g, ''),\n message,\n };\n\n const smsResponse = await fetch(process.env.REACT_APP_SMS_END_POINT, {\n method: 'post',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: sessionToken,\n },\n body: JSON.stringify({ payload }),\n });\n\n if (smsResponse.ok) {\n return true;\n }\n\n return false;\n } catch (error) {\n console.log(error);\n\n return false;\n }\n};\n","import { Auth } from 'aws-amplify';\n\nexport const sendEmail = async ({ emailAddress, body, subject }) => {\n try {\n const sessionToken = `Bearer ${(await Auth.currentSession()).getIdToken().jwtToken}`;\n\n const payload = {\n emailAddress,\n body,\n subject,\n };\n\n const emailResponse = await fetch(process.env.REACT_APP_EMAIL_END_POINT, {\n method: 'post',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: sessionToken,\n },\n body: JSON.stringify({ payload }),\n });\n\n if (emailResponse.ok) {\n return true;\n }\n\n const resultText = await emailResponse.text();\n\n console.log('resultText', resultText);\n\n return false;\n } catch (error) {\n console.log(error);\n\n return false;\n }\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport dateFormat from 'dateformat';\n\nconst CalendarDeleteApprovedSlot = ({ setIsOpenDeleteApprovedSlot, DeleteClick, selectedSlotInfo }) => {\n const deleteRangeStart = dateFormat(selectedSlotInfo.start, 'h:MMtt');\n const deleteRangeEnd = dateFormat(selectedSlotInfo.end, 'h:MMtt');\n const deleteSlotDate = dateFormat(selectedSlotInfo.start, 'mmm dd yyyy');\n\n return (\n
\n
\n
\n
\n
\n
\n
\n \n Are you sure want to delete the available showing window for {deleteRangeStart} - {deleteRangeEnd} of{' '}\n {deleteSlotDate}?\n

\n\n
\n
\n
\n \n Delete\n \n
\n
\n \n Cancel\n \n
\n
\n
\n
\n
\n
\n
\n
\n
\n );\n};\n\nexport default CalendarDeleteApprovedSlot;\n\nCalendarDeleteApprovedSlot.propTypes = {\n setIsOpenDeleteApprovedSlot: PropTypes.func,\n DeleteClick: PropTypes.func,\n selectedSlotInfo: PropTypes.object,\n};\n","/* eslint-disable react/destructuring-assignment */\n/* eslint-disable react/no-access-state-in-setstate */\nimport React, { Component } from 'react';\nimport { Calendar, momentLocalizer } from 'react-big-calendar';\nimport moment from 'moment';\nimport withDragAndDrop from 'react-big-calendar/lib/addons/dragAndDrop';\nimport 'react-big-calendar/lib/addons/dragAndDrop/styles.css';\nimport 'react-big-calendar/lib/css/react-big-calendar.css';\nimport CryptoJS from 'crypto-js';\nimport dateFormat from 'dateformat';\nimport { API, graphqlOperation } from 'aws-amplify';\nimport PropTypes from 'prop-types';\nimport CalendarEventTitle from './CalenderEventTitle';\nimport CalendarEventApprove from './CalendarEventApprove';\nimport CalendarAutoApprove from './CalendarAutoApprove';\nimport CalendarLASlotOptions from './CalendarLASlotOptions';\nimport {\n addListingAgentAvailbility,\n createTour,\n createPropertyOfInterest,\n createTourStop,\n deleteTourStop,\n updateTourStopRequestStatus,\n enableDisableAutoApprove,\n updateListingAgentAvailbility,\n createUserNotification,\n deleteSelectedListingAgentAvailbility,\n createMessage,\n} from '../graphql/mutations';\nimport {\n agentTimeSlotDetails,\n getPropertyListing,\n getTourStopIfExists,\n getPropertyListingAutoApprove,\n getPropertyListingByListingId,\n getListingByListingId,\n} from '../graphql/queries';\nimport {\n buildApproveShowingRequest,\n buildRejectShowingRequest,\n buildSendShowingRequest,\n buildSendShowingRequestAutoApprove,\n buildSendShowingRequestAutoApproveToBA,\n buildEditDeleteLAAvailabilitySlot,\n buildCancelShowingRequest,\n} from '../notifications/messageBuilder';\nimport Spinner from './Spinner';\nimport SuccessPopup from './SuccessPopup';\nimport CalendarLASlotAddUpdatePopup from './CalendarLASlotAddUpdatePopup';\nimport { sendSMSMessage } from '../services/SendSMSMessage';\nimport { sendEmail } from '../services/SendEmail';\nimport CalendarDeleteApprovedSlot from './CalendarDeleteApprovedSlot';\n\nconst localizer = momentLocalizer(moment);\nconst DnDCalendar = withDragAndDrop(Calendar);\n\nclass CalendarControl extends Component {\n constructor(props) {\n super(props);\n\n this.state = {\n events: [],\n laAvailabilitySlot: [],\n isOpenEventTitle: false,\n newEventTitle: null,\n isOpenEventApprove: false,\n isOpenAutoApprove: false,\n selectedSlotInfo: null,\n isAutoApproved: false,\n propertyListingId: 0,\n listingAgentId: 0,\n listingAgentName: null,\n listingAgentCellPhone: null,\n listingAgentEmail: null,\n buyingAgentName: null,\n buyingAgentCellPhone: null,\n address: null,\n brokerage: null,\n listingAgentDeadlineHrs: 0,\n laDeadlineHrStart: 0,\n remainingLaDeadlineHrs: 0,\n isOpenLASlotOptions: false,\n propertyMLSId: null,\n selectedLAAvailabilitySlot: null,\n newLAAvailabilitySlot: null,\n showLoading: false,\n isOpenSuccessPopup: false,\n isError: false,\n isOpenLASlotAddUpdatePopup: false,\n laSlotEventName: null,\n agentNotAvailableAlert: false,\n isAddedSlotInPast: false,\n isNotValidTimeSlot: false,\n isVisibleCreateSlotBtn: true,\n selectedDate: new Date(),\n isListingAgent: false,\n isOpenDeleteApprovedSlot: false,\n propertyAddress: null,\n };\n }\n\n onEventResize = data => {\n // const { start, end } = data;\n // this.setState(state => {\n // state.events[0].start = start;\n // state.events[0].end = end;\n // return { events: [...state.events] };\n // });\n };\n\n eventStyleGetter = event => {\n const style = {\n backgroundColor: event.hexColor,\n color: event.color,\n };\n\n return {\n style,\n };\n };\n\n onEventClick = slotInfo => {\n if (this.state.isListingAgent) {\n if (slotInfo.isNew) {\n this.setState({ isOpenEventApprove: true, selectedSlotInfo: slotInfo });\n } else {\n this.setState({ isOpenDeleteApprovedSlot: true, selectedSlotInfo: slotInfo });\n }\n } else if (this.props.userDetails != null && slotInfo.buyingAgentEmail === this.props.userDetails.email_address) {\n this.setState({ isOpenDeleteApprovedSlot: true, selectedSlotInfo: slotInfo });\n }\n };\n\n onSelectSlot = async slotInfo => {\n const now = new Date();\n const a = [];\n\n if (this.state.isListingAgent) {\n if (Math.floor(slotInfo.start.getTime() / 1000) < Math.floor(now.getTime() / 1000)) {\n this.setState({ isAddedSlotInPast: true });\n this.setState({ isNotValidTimeSlot: false });\n this.setIsOpenSuccessPopup();\n } else {\n this.setState({ selectedSlotInfo: slotInfo });\n const availableSlot = this.state.laAvailabilitySlot.find(\n p =>\n (p.start <= dateFormat(slotInfo.start, 'ddd mmm dd yyyy HH:MM') &&\n p.end > dateFormat(slotInfo.start, 'ddd mmm dd yyyy HH:MM')) ||\n (p.start < dateFormat(slotInfo.end, 'ddd mmm dd yyyy HH:MM') &&\n p.end >= dateFormat(slotInfo.end, 'ddd mmm dd yyyy HH:MM'))\n );\n\n if (availableSlot != null) {\n const laSlot = this.state.laAvailabilitySlot.find(\n p =>\n p.start <= dateFormat(slotInfo.start, 'ddd mmm dd yyyy HH:MM') &&\n p.end >= dateFormat(slotInfo.end, 'ddd mmm dd yyyy HH:MM')\n );\n\n if (laSlot != null) {\n this.setState({ isVisibleCreateSlotBtn: true });\n } else {\n this.setState({ isVisibleCreateSlotBtn: false });\n }\n\n for (const slot of slotInfo.slots) {\n const findSlot = this.state.laAvailabilitySlot.find(\n p =>\n p.start === dateFormat(slot, 'ddd mmm dd yyyy HH:MM') ||\n p.end === dateFormat(slot, 'ddd mmm dd yyyy HH:MM')\n );\n\n if (findSlot) {\n const filterData = a.filter(item => item === findSlot);\n\n if (filterData.length === 0) {\n a.push(findSlot);\n }\n }\n\n if (a.length > 1) {\n this.setState({ isAddedSlotInPast: false });\n this.setState({ agentNotAvailableAlert: false });\n this.setState({ isNotValidTimeSlot: true });\n this.setIsOpenSuccessPopup();\n break;\n }\n }\n\n if (a.length < 2) {\n const getTourStopIfExistsData = await API.graphql({\n query: getTourStopIfExists,\n variables: {\n property_listing_id: this.state.propertyListingId,\n start_time: Math.floor(slotInfo.start.getTime() / 1000),\n end_time: Math.floor(slotInfo.end.getTime() / 1000),\n },\n });\n\n if (getTourStopIfExistsData.data.getTourStopIfExists.length === 0) {\n this.setState({ selectedLAAvailabilitySlot: availableSlot });\n this.setState({ newLAAvailabilitySlot: slotInfo });\n this.setIsOpenLASlotOptions();\n } else {\n this.setState({ isAddedSlotInPast: false });\n this.setState({ agentNotAvailableAlert: false });\n this.setState({ isNotValidTimeSlot: true });\n this.setIsOpenSuccessPopup();\n }\n }\n } else {\n this.setIsOpenLASlotAddUpdatePopup();\n this.setState({ laSlotEventName: 'add' });\n }\n }\n } else {\n const getTourStopIfExistsData = await API.graphql({\n query: getTourStopIfExists,\n variables: {\n property_listing_id: this.state.propertyListingId,\n start_time: Math.floor(slotInfo.start.getTime() / 1000),\n end_time: Math.floor(slotInfo.end.getTime() / 1000),\n },\n });\n\n if (getTourStopIfExistsData.data.getTourStopIfExists.length === 0) {\n const availableSlotStart = this.state.laAvailabilitySlot.find(\n p =>\n p.start <= dateFormat(slotInfo.start, 'ddd mmm dd yyyy HH:MM') &&\n p.end >= dateFormat(slotInfo.end, 'ddd mmm dd yyyy HH:MM')\n );\n\n if (availableSlotStart != null) {\n if (Math.floor(slotInfo.start.getTime() / 1000) < Math.floor(now.getTime() / 1000)) {\n this.setState({ isAddedSlotInPast: true });\n this.setState({ agentNotAvailableAlert: false });\n this.setState({ isNotValidTimeSlot: false });\n this.setIsOpenSuccessPopup();\n } else {\n this.setIsOpenEventTitle();\n this.setState({ selectedSlotInfo: slotInfo });\n }\n } else {\n this.setState({ agentNotAvailableAlert: true });\n this.setState({ isAddedSlotInPast: false });\n this.setState({ isNotValidTimeSlot: false });\n this.setIsOpenSuccessPopup();\n }\n } else {\n this.setState({ isAddedSlotInPast: false });\n this.setState({ agentNotAvailableAlert: false });\n this.setState({ isNotValidTimeSlot: true });\n this.setIsOpenSuccessPopup();\n }\n }\n };\n\n setIsOpenEventTitle = () => {\n this.setState({ isOpenEventTitle: !this.state.isOpenEventTitle });\n };\n\n setIsOpenEventApprove = () => {\n this.setState({ isOpenEventApprove: !this.state.isOpenEventApprove });\n };\n\n setIsOpenAutoApprove = () => {\n this.setState({ isOpenAutoApprove: !this.state.isOpenAutoApprove });\n };\n\n approveEvent = async () => {\n this.setIsOpenEventApprove();\n this.setState({ showLoading: true });\n const updateTourStopRequestStatusInput = {\n id: this.state.selectedSlotInfo.tourStopId,\n status: 'approved',\n last_request_sent_by_user_id: this.props.userDetails.id,\n };\n const {\n data: { updateTourStopRequestStatus: updateTourStopRequestStatusData },\n } = await API.graphql(graphqlOperation(updateTourStopRequestStatus, { updateTourStopRequestStatusInput }));\n\n await this.getAgentTimeSlotDetails(true);\n\n this.setState({ showLoading: false });\n\n if (updateTourStopRequestStatusData.status === 'approved') {\n this.sendNotificationOnupdateTourStopRequestStatus(this.state.selectedSlotInfo);\n }\n };\n\n rejectEvent = async () => {\n this.setIsOpenEventApprove();\n\n try {\n this.setState({ showLoading: true });\n const data = await API.graphql(graphqlOperation(deleteTourStop, { id: this.state.selectedSlotInfo.tourStopId }));\n\n await this.getAgentTimeSlotDetails(true);\n this.setState({ showLoading: false });\n if (!data.deleteTourStop) {\n const timeRangeStart = dateFormat(this.state.selectedSlotInfo.start, 'h:MMtt');\n const timeRangeEnd = dateFormat(this.state.selectedSlotInfo.end, 'h:MMtt');\n const { email, sms, push } = buildRejectShowingRequest({\n laName: this.state.selectedSlotInfo.listingAgentName,\n baName: this.state.selectedSlotInfo.buyingAgentName,\n brokerage: this.state.selectedSlotInfo.brokerage,\n date: dateFormat(this.state.selectedSlotInfo.start, 'ddd mmm dd yyyy'),\n address: this.state.selectedSlotInfo.address,\n timeRange: `${timeRangeStart} to ${timeRangeEnd}`,\n });\n\n const sendEmailResult = await sendEmail({\n emailAddress: this.state.selectedSlotInfo.buyingAgentEmail,\n body: email.body,\n subject: email.subject,\n });\n\n const sendSMSResult = await sendSMSMessage({\n phoneNumber: this.state.selectedSlotInfo.buyingAgentPhoneNum,\n message: sms,\n });\n\n await this.createNotification(\n email.subject,\n push,\n this.state.selectedSlotInfo.clientId,\n sendSMSResult,\n sendEmailResult\n );\n }\n } catch (error) {\n this.setState({ showLoading: false });\n console.log(error);\n }\n };\n\n setEventTitle = title => {\n this.setState({ newEventTitle: title });\n };\n\n addEvent = async () => {\n this.setIsOpenEventTitle();\n this.setState({ showLoading: true });\n\n const now = new Date();\n let titleInput;\n\n if (this.state.newEventTitle) {\n titleInput = this.state.newEventTitle.replace(/'/g, \"''\");\n }\n\n try {\n const createTourInput = {\n name: titleInput,\n start_time: Math.floor(this.state.selectedSlotInfo.start.getTime() / 1000),\n end_time: Math.floor(this.state.selectedSlotInfo.end.getTime() / 1000),\n client_id: this.props.userDetails.id,\n agent_id: this.props.userDetails.id,\n created_at: Math.floor(now.getTime() / 1000),\n updated_at: Math.floor(now.getTime() / 1000),\n is_behalf_of_buying_agent: false,\n };\n\n if (this.state.isListingAgent) {\n createTourInput.is_behalf_of_buying_agent = true;\n }\n\n const {\n data: { createTour: TourOpData },\n } = await API.graphql(graphqlOperation(createTour, { createTourInput }));\n\n // console.log('opData', TourOpData);\n\n const startTime =\n this.state.selectedSlotInfo.start.getHours() + this.state.selectedSlotInfo.start.getMinutes() / 60;\n const endTime = this.state.selectedSlotInfo.end.getHours() + this.state.selectedSlotInfo.end.getMinutes() / 60;\n let createTourStopInput = null;\n\n if (this.state.events.length === 0) {\n const createPropertyOfInterestInput = {\n client_id: this.props.userDetails.id,\n property_listing_id: this.state.propertyListingId,\n created_at: Math.floor(now.getTime() / 1000),\n updated_at: Math.floor(now.getTime() / 1000),\n };\n const {\n data: { createPropertyOfInterest: POIopData },\n } = await API.graphql(graphqlOperation(createPropertyOfInterest, { createPropertyOfInterestInput }));\n\n // console.log('POIopData', POIopData);\n\n createTourStopInput = {\n order: 1,\n duration: endTime - startTime,\n start_time: Math.floor(this.state.selectedSlotInfo.start.getTime() / 1000),\n status: 'pending',\n tour_id: TourOpData.id,\n property_of_interest_id: POIopData.id,\n created_at: Math.floor(now.getTime() / 1000),\n updated_at: Math.floor(now.getTime() / 1000),\n request_sent: true,\n showing_request_required: false,\n last_request_sent_by_user_id: this.props.userDetails.id,\n };\n } else {\n const userEventData = this.state.events.filter(\n item => item.clientId === this.props.userDetails.id && item.propertyListingId === this.state.propertyListingId\n );\n\n if (userEventData.length === 0) {\n const createPropertyOfInterestInput = {\n client_id: this.props.userDetails.id,\n property_listing_id: this.state.propertyListingId,\n created_at: Math.floor(now.getTime() / 1000),\n updated_at: Math.floor(now.getTime() / 1000),\n };\n const {\n data: { createPropertyOfInterest: POIopData },\n } = await API.graphql(graphqlOperation(createPropertyOfInterest, { createPropertyOfInterestInput }));\n\n // console.log('POIopData', POIopData);\n createTourStopInput = {\n order: 1,\n duration: endTime - startTime,\n start_time: Math.floor(this.state.selectedSlotInfo.start.getTime() / 1000),\n status: 'pending',\n tour_id: TourOpData.id,\n property_of_interest_id: POIopData.id,\n created_at: Math.floor(now.getTime() / 1000),\n updated_at: Math.floor(now.getTime() / 1000),\n request_sent: true,\n showing_request_required: false,\n last_request_sent_by_user_id: this.props.userDetails.id,\n };\n } else {\n createTourStopInput = {\n order: 1,\n duration: endTime - startTime,\n start_time: Math.floor(this.state.selectedSlotInfo.start.getTime() / 1000),\n status: 'pending',\n tour_id: TourOpData.id,\n property_of_interest_id: userEventData[0].homeOfInterestId,\n created_at: Math.floor(now.getTime() / 1000),\n updated_at: Math.floor(now.getTime() / 1000),\n request_sent: true,\n showing_request_required: false,\n last_request_sent_by_user_id: this.props.userDetails.id,\n };\n }\n }\n\n const currentTime = Math.floor(now.getTime() / 1000);\n const deadlineEndTime = this.state.laDeadlineHrStart + this.state.listingAgentDeadlineHrs * 3600;\n const fetchedPropertyListingData = await API.graphql({\n query: getPropertyListingAutoApprove,\n variables: { id: this.state.propertyListingId },\n });\n\n this.setState({ isAutoApproved: fetchedPropertyListingData.data.getPropertyListing.is_auto_approve });\n this.setState({\n listingAgentDeadlineHrs: fetchedPropertyListingData.data.getPropertyListing.showing_request_deadline,\n });\n this.setState({\n laDeadlineHrStart: fetchedPropertyListingData.data.getPropertyListing.deadline_start_time,\n });\n\n if (this.state.isAutoApproved) {\n const slotStart = Math.floor(this.state.selectedSlotInfo.start.getTime() / 1000);\n\n if ((slotStart > this.state.laDeadlineHrStart && slotStart < deadlineEndTime) || slotStart < currentTime) {\n createTourStopInput.status = 'pending';\n } else {\n createTourStopInput.status = 'approved';\n }\n }\n const msgDateStr = dateFormat(new Date(), 'mm/dd/yy');\n const msgTimeStr = dateFormat(new Date(), 'h:MMtt');\n const showingDate = dateFormat(this.state.selectedSlotInfo.start, 'mm/dd/yy');\n const showingTime = dateFormat(this.state.selectedSlotInfo.start, 'h:MMtt');\n const endTourTime = dateFormat(this.state.selectedSlotInfo.end, 'h:MMtt');\n\n const messageStr = `Showing request sent on ${msgDateStr} at ${msgTimeStr} for ${showingDate} from ${showingTime}-${endTourTime}`;\n const createMessageInput = {\n from_user: this.props.userDetails.id,\n to_user: this.state.listingAgentId,\n message: messageStr,\n };\n\n if (this.state.isListingAgent) {\n createTourStopInput.status = 'approved';\n createMessageInput.from_user = this.state.listingAgentId;\n }\n\n const {\n data: { createTourStop: TourStopOpData },\n } = await API.graphql(graphqlOperation(createTourStop, { createTourStopInput }));\n\n // console.log('TourStopOpData', TourStopOpData);\n if (TourStopOpData) {\n createMessageInput.tour_stop_id = TourStopOpData.id;\n }\n const {\n data: { createMessage: createMessageOp },\n } = await API.graphql(graphqlOperation(createMessage, { createMessageInput }));\n\n this.setState({ showLoading: false });\n\n this.getAgentTimeSlotDetails(true);\n if (TourStopOpData != null && !this.state.isListingAgent) {\n let sendEmailResult = null;\n let sendSMSResult = null;\n\n if (TourStopOpData.status === 'pending') {\n const timeRangeStart = dateFormat(this.state.selectedSlotInfo.start, 'h:MMtt');\n const timeRangeEnd = dateFormat(this.state.selectedSlotInfo.end, 'h:MMtt');\n\n const { email, sms, push } = buildSendShowingRequest({\n baName: this.state.buyingAgentName,\n laName: this.state.listingAgentName,\n brokerage: this.props.userDetails.brokerage,\n address: this.state.address,\n date: dateFormat(this.state.selectedSlotInfo.start, 'ddd mmm dd yyyy'),\n phone: this.state.buyingAgentCellPhone,\n timeRange: `${timeRangeStart} to ${timeRangeEnd}`,\n });\n\n sendEmailResult = await sendEmail({\n emailAddress: this.state.listingAgentEmail,\n body: email.body,\n subject: email.subject,\n });\n\n sendSMSResult = await sendSMSMessage({\n phoneNumber: this.state.listingAgentCellPhone,\n message: sms,\n });\n\n await this.createNotification(email.subject, push, this.state.listingAgentId, sendSMSResult, sendEmailResult);\n } else if (TourStopOpData.status === 'approved') {\n let sendEmailResultToBA = null;\n let sendSMSResultToBA = null;\n const timeRangeStart = dateFormat(this.state.selectedSlotInfo.start, 'h:MMtt');\n const timeRangeEnd = dateFormat(this.state.selectedSlotInfo.end, 'h:MMtt');\n\n const { emailToBA, smsToBA, pushToBA } = buildSendShowingRequestAutoApproveToBA({\n baName: this.state.buyingAgentName,\n laName: this.state.listingAgentName,\n brokerage: this.state.brokerage,\n address: this.state.address,\n date: dateFormat(this.state.selectedSlotInfo.start, 'ddd mmm dd yyyy'),\n phone: this.state.listingAgentCellPhone,\n timeRange: `${timeRangeStart} to ${timeRangeEnd}`,\n });\n\n sendEmailResultToBA = await sendEmail({\n emailAddress: this.props.userDetails.email_address,\n body: emailToBA.body,\n subject: emailToBA.subject,\n });\n\n sendSMSResultToBA = await sendSMSMessage({\n phoneNumber: this.props.userDetails.cell_phone,\n message: smsToBA,\n });\n\n await this.createNotification(\n emailToBA.subject,\n pushToBA,\n this.props.userDetails.id,\n sendSMSResultToBA,\n sendEmailResultToBA\n );\n\n const { email, sms, push } = buildSendShowingRequestAutoApprove({\n baName: this.state.buyingAgentName,\n laName: this.state.listingAgentName,\n brokerage: this.props.userDetails.brokerage,\n address: this.state.address,\n date: dateFormat(this.state.selectedSlotInfo.start, 'ddd mmm dd yyyy'),\n phone: this.state.buyingAgentCellPhone,\n timeRange: `${timeRangeStart} to ${timeRangeEnd}`,\n });\n\n sendEmailResult = await sendEmail({\n emailAddress: this.state.listingAgentEmail,\n body: email.body,\n subject: email.subject,\n });\n\n sendSMSResult = await sendSMSMessage({\n phoneNumber: this.state.listingAgentCellPhone,\n message: sms,\n });\n\n await this.createNotification(email.subject, push, this.state.listingAgentId, sendSMSResult, sendEmailResult);\n }\n }\n } catch (error) {\n this.setState({ showLoading: false });\n console.log(error);\n }\n };\n\n createNotification = async (title, body, recipientId, sentSms, sentEmail) => {\n const createUserNotificationInput = {\n title,\n body,\n recipient_id: recipientId,\n sent_sms: sentSms,\n sent_email: sentEmail,\n };\n\n const {\n data: { createUserNotification: userNotificationOpData },\n } = await API.graphql(graphqlOperation(createUserNotification, { createUserNotificationInput }));\n\n // console.log('userNotificationOpData', userNotificationOpData);\n };\n\n getAgentTimeSlotDetails = async isRefresh => {\n const userId = this.props.history.location.search;\n const trimmed = userId.substring(1);\n const bytes = CryptoJS.AES.decrypt(trimmed, 'my-secret-key@123');\n const decryptedData = bytes.toString(CryptoJS.enc.Utf8);\n\n const arrayData = decryptedData.split('-');\n\n this.setState({ propertyMLSId: arrayData[0] }, () => {\n const propData = this.props.propertyListings.filter(item => item.listing_id === this.state.propertyMLSId);\n\n if (this.props.userDetails != null && this.props.userDetails.is_agent) {\n if (propData.length === 0) {\n this.setState({ isListingAgent: false });\n } else {\n this.setState({ isListingAgent: true });\n if (!this.props.isActiveSubscription) {\n window.location.replace('/');\n }\n this.setState({ propertyListingId: propData[0].id }, () => {});\n this.setState({ listingAgentId: propData[0].listing_agent_id }, () => {});\n }\n }\n });\n\n if (this.props.userDetails != null) {\n this.setState({ showLoading: true });\n\n const propertyDetails = await API.graphql({\n query: getPropertyListingByListingId,\n variables: { listing_id: arrayData[0] },\n });\n const details = propertyDetails.data.getPropertyListingByListingId;\n\n if (details) {\n this.setState({ propertyAddress: details.address });\n this.setState({ listingAgentName: `${details.listing_agent.first_name} ${details.listing_agent.last_name}` });\n } else {\n const propertyDynamoDetails = await API.graphql({\n query: getListingByListingId,\n variables: { listing_id: arrayData[0] },\n });\n\n const dynamoDetails = propertyDynamoDetails.data.getListingByListingId.items[0];\n\n this.setState({ propertyAddress: dynamoDetails.address });\n this.setState({ listingAgentName: dynamoDetails.listing_agent });\n }\n\n const timeSlotDetails = await API.graphql({\n query: agentTimeSlotDetails,\n variables: { listing_id: arrayData[0] },\n });\n\n if (timeSlotDetails.data.agentTimeSlotDetails.length > 0) {\n if (isRefresh) {\n this.setState({ events: [], laAvailabilitySlot: [] });\n }\n\n if (!this.state.isListingAgent) {\n this.setState(\n { buyingAgentName: `${this.props.userDetails.first_name} ${this.props.userDetails.last_name}` },\n () => {}\n );\n }\n\n timeSlotDetails.data.agentTimeSlotDetails.forEach(element => {\n this.setState({ propertyListingId: element.property_listing_id }, () => {});\n this.setState({ listingAgentId: element.listing_agent_id }, () => {});\n this.setState(\n { listingAgentName: `${element.listingAgent_first_name} ${element.listingAgent_last_name}` },\n () => {}\n );\n\n this.setState({ address: element.address }, () => {});\n this.setState({ brokerage: element.listingAgent_brokerage }, () => {});\n\n if (element.STATUS === 'available') {\n const startDate = element.start_time;\n const endDate = element.end_datetime;\n const newSlotData = {\n id: element.availbility_id,\n start: dateFormat(startDate * 1000, 'ddd mmm dd yyyy HH:MM'),\n end: dateFormat(endDate * 1000, 'ddd mmm dd yyyy HH:MM'),\n };\n\n this.setState({\n laAvailabilitySlot: [...this.state.laAvailabilitySlot, newSlotData],\n });\n }\n\n if (element.STATUS === 'pending' || element.STATUS === 'approved') {\n this.setState({ buyingAgentCellPhone: element.buyingAgent_cell_phone });\n\n const endDate = element.start_time + element.duration * 60 * 60;\n const st = new Date(dateFormat(element.start_time * 1000, 'ddd mmm dd yyyy HH:MM'));\n const et = new Date(dateFormat(endDate * 1000, 'ddd mmm dd yyyy HH:MM'));\n const newEventData = {\n start: st,\n end: et,\n title: `${element.buyingAgent_first_name} ${element.buyingAgent_last_name} - ${element.buyingAgent_brokerage}`,\n hexColor: '#fef200',\n isNew: true,\n isApproved: false,\n isRejected: false,\n color: '#000000',\n status: element.STATUS,\n tourStopId: element.tourstop_id,\n buyingAgentEmail: element.buyingAgent_email_address,\n listingAgentEmail: element.listingAgent_email_address,\n buyingAgentPhoneNum: element.buyingAgent_cell_phone,\n listingAgentPhoneNum: element.listingAgent_cell_phone,\n listingAgentName: `${element.listingAgent_first_name} ${element.listingAgent_last_name}`,\n buyingAgentName: `${element.buyingAgent_first_name} ${element.buyingAgent_last_name}`,\n brokerage: element.listingAgent_brokerage,\n address: element.address,\n propertyListingId: element.property_listing_id,\n homeOfInterestId: element.home_of_interest_id,\n clientId: element.client_id,\n tourName: element.tour_name,\n listingAgentId: element.listing_agent_id,\n isBehalfOfBuyingAgent: element.is_behalf_of_buying_agent,\n };\n\n if (!this.state.isListingAgent) {\n newEventData.title = `${newEventData.title} - ${element.tour_name}`;\n }\n\n if (element.STATUS === 'approved') {\n newEventData.hexColor = '#435B77';\n newEventData.color = 'white';\n newEventData.isNew = false;\n newEventData.isApproved = true;\n }\n\n this.setState({\n events: [...this.state.events, newEventData],\n });\n }\n });\n }\n\n const fetchedPropertyListingData = await API.graphql({\n query: getPropertyListing,\n variables: { id: this.state.propertyListingId },\n });\n\n if (fetchedPropertyListingData.data.getPropertyListing) {\n this.setState({\n listingAgentEmail: fetchedPropertyListingData.data.getPropertyListing.listing_agent.email_address,\n });\n this.setState({\n listingAgentCellPhone: fetchedPropertyListingData.data.getPropertyListing.listing_agent.cell_phone,\n });\n\n this.setState({\n listingAgentDeadlineHrs: fetchedPropertyListingData.data.getPropertyListing.showing_request_deadline,\n });\n this.setState({\n laDeadlineHrStart: fetchedPropertyListingData.data.getPropertyListing.deadline_start_time,\n });\n const endtime = this.state.laDeadlineHrStart + this.state.listingAgentDeadlineHrs * 3600;\n const currentTime = Math.floor(new Date().getTime() / 1000);\n\n const current1 = new Date(dateFormat(currentTime * 1000, 'ddd mmm dd yyyy HH:MM:ss'));\n const end1 = new Date(dateFormat(endtime * 1000, 'ddd mmm dd yyyy HH:MM:ss'));\n\n const diff = (end1.getTime() - current1.getTime()) / 1000;\n\n if (currentTime > this.state.laDeadlineHrStart && currentTime < endtime) {\n this.setState({\n remainingLaDeadlineHrs: Math.abs(Math.round(diff / 3600)),\n });\n } else {\n this.setState({ remainingLaDeadlineHrs: 0 });\n }\n\n this.setState({ isAutoApproved: fetchedPropertyListingData.data.getPropertyListing.is_auto_approve });\n\n if (!this.state.isAutoApproved) {\n this.setState({ remainingLaDeadlineHrs: 0 });\n }\n }\n\n if (!this.state.isListingAgent) {\n for (const item of this.state.events) {\n if (this.props.userDetails != null) {\n if (item.buyingAgentEmail !== this.props.userDetails.email_address) {\n item.title = null;\n }\n }\n }\n }\n }\n\n for (const item of this.state.events) {\n if (this.props.userDetails != null) {\n if (!this.state.isListingAgent && item.buyingAgentEmail !== this.props.userDetails.email_address) {\n item.title = null;\n }\n if (this.state.isListingAgent && item.isBehalfOfBuyingAgent) {\n item.title = `\\n ${item.tourName}`;\n }\n }\n }\n\n this.setState({ showLoading: false });\n };\n\n componentDidMount = async () => {\n this.setState({ isListingAgent: this.props.isAgent }, () => {});\n\n await this.getAgentTimeSlotDetails();\n };\n\n onSelecting = slot => {\n if (!this.state.isListingAgent) {\n const availabeSlotStart = this.state.laAvailabilitySlot.find(\n p =>\n p.start <= dateFormat(slot.start, 'ddd mmm dd yyyy HH:MM') &&\n p.end >= dateFormat(slot.end, 'ddd mmm dd yyyy HH:MM')\n );\n\n if (availabeSlotStart != null) {\n return true;\n }\n\n return true;\n }\n };\n\n slotPropGetter = slot => {\n const availableSlotStart = this.state.laAvailabilitySlot.find(\n p => p.start <= dateFormat(slot, 'ddd mmm dd yyyy HH:MM') && p.end > dateFormat(slot, 'ddd mmm dd yyyy HH:MM')\n );\n\n if (availableSlotStart != null) {\n return { className: 'laAvailabeSlot' };\n }\n };\n\n PromptAutoApprove = () => {\n this.setState({ isAutoApproved: !this.state.isAutoApproved }, () => {\n if (!this.state.isAutoApproved) {\n this.setState({ remainingLaDeadlineHrs: 0 });\n }\n });\n };\n\n RejectAutoApprove = () => {\n this.setIsOpenAutoApprove();\n this.setState({ isAutoApproved: !this.state.isAutoApproved });\n this.getAgentTimeSlotDetails(true);\n };\n\n ChangeStatusOfApprove = async () => {\n this.enableDisableAutoApprove(true);\n\n this.setIsOpenAutoApprove();\n\n this.setState({ showLoading: true });\n const pendingApproveData = this.state.events.filter(item => item.status === 'pending');\n\n for (const element of pendingApproveData) {\n const updateTourStopRequestStatusInput = {\n id: element.tourStopId,\n status: 'approved',\n last_request_sent_by_user_id: this.props.userDetails.id,\n };\n\n const {\n data: { updateTourStopRequestStatus: updateTourStopRequestStatusData },\n } = await API.graphql(graphqlOperation(updateTourStopRequestStatus, { updateTourStopRequestStatusInput }));\n\n // console.log('updateTourStopRequestStatusData', updateTourStopRequestStatusData);\n if (updateTourStopRequestStatusData.status === 'approved') {\n this.sendNotificationOnupdateTourStopRequestStatus(element);\n }\n }\n this.setState({ showLoading: false });\n this.getAgentTimeSlotDetails(true);\n };\n\n sendNotificationOnupdateTourStopRequestStatus = async slotInfo => {\n const timeRangeStart = dateFormat(slotInfo.start, 'h:MMtt');\n const timeRangeEnd = dateFormat(slotInfo.end, 'h:MMtt');\n const { email, sms, push } = buildApproveShowingRequest({\n laName: slotInfo.listingAgentName,\n baName: slotInfo.buyingAgentName,\n brokerage: slotInfo.brokerage,\n date: dateFormat(slotInfo.start, 'ddd mmm dd yyyy'),\n address: slotInfo.address,\n timeRange: `${timeRangeStart} to ${timeRangeEnd}`,\n });\n\n const sendEmailResult = await sendEmail({\n emailAddress: slotInfo.buyingAgentEmail,\n body: email.body,\n subject: email.subject,\n });\n\n const sendSMSResult = await sendSMSMessage({\n phoneNumber: slotInfo.buyingAgentPhoneNum,\n message: sms,\n });\n\n await this.createNotification(email.subject, push, slotInfo.clientId, sendSMSResult, sendEmailResult);\n\n const messageStr = 'This time has been approved.';\n const createMessageInput = {\n from_user: this.state.listingAgentId,\n to_user: slotInfo.clientId,\n message: messageStr,\n tour_stop_id: slotInfo.tourStopId,\n };\n\n const {\n data: { createMessage: createMessageOp },\n } = await API.graphql(graphqlOperation(createMessage, { createMessageInput }));\n };\n\n enableDisableAutoApprove = async isAutoApproved => {\n try {\n this.setState({ showLoading: true });\n\n const updatePropertyListingInput = {\n id: this.state.propertyListingId,\n is_auto_approve: isAutoApproved,\n showing_request_deadline: this.state.remainingLaDeadlineHrs,\n deadline_start_time: Math.floor(new Date().getTime() / 1000),\n };\n const {\n data: { enableDisableAutoApprove: autoApproveData },\n } = await API.graphql(graphqlOperation(enableDisableAutoApprove, { updatePropertyListingInput }));\n\n console.log('autoApproveData', autoApproveData);\n } catch (error) {\n this.setState({ showLoading: false });\n this.setState({ isError: true });\n }\n if (!isAutoApproved) {\n this.setState({ showLoading: false });\n }\n };\n\n isInputNumber = evt => {\n const ch = String.fromCharCode(evt.which);\n\n if (!/[0-9]/.test(ch)) {\n evt.preventDefault();\n }\n };\n\n savePropertySetting = async () => {\n if (this.state.isAutoApproved) {\n this.setIsOpenAutoApprove();\n } else {\n this.enableDisableAutoApprove(false);\n }\n };\n\n setIsOpenLASlotOptions = () => {\n this.setState({ isOpenLASlotOptions: !this.state.isOpenLASlotOptions });\n };\n\n LASlotAddUpdate = async () => {\n this.setIsOpenLASlotAddUpdatePopup();\n this.setState({ showLoading: true });\n if (this.state.laSlotEventName === 'edit') {\n const updateListingAgentAvailbilityInput = {\n id: parseInt(this.state.selectedLAAvailabilitySlot.id),\n start_datetime: Math.floor(this.state.newLAAvailabilitySlot.start.getTime() / 1000),\n end_datetime: Math.floor(this.state.newLAAvailabilitySlot.end.getTime() / 1000),\n };\n\n const {\n data: { updateListingAgentAvailbility: updateData },\n } = await API.graphql(graphqlOperation(updateListingAgentAvailbility, { updateListingAgentAvailbilityInput }));\n\n console.log('updateData', updateData);\n\n this.getSlotsAndNotifyForEdit();\n } else if (this.state.laSlotEventName === 'delete') {\n const deleteSelectedListingAgentAvailbilityInput = {\n slot_id: parseInt(this.state.selectedLAAvailabilitySlot.id),\n listing_agent_id: this.state.listingAgentId,\n property_listing_id: this.state.propertyListingId,\n selected_slot_start_time: Math.floor(this.state.newLAAvailabilitySlot.start.getTime() / 1000),\n selected_slot_end_time: Math.floor(this.state.newLAAvailabilitySlot.end.getTime() / 1000),\n start_datetime: Math.floor(new Date(this.state.selectedLAAvailabilitySlot.start).getTime() / 1000),\n end_datetime: Math.floor(new Date(this.state.selectedLAAvailabilitySlot.end).getTime() / 1000),\n };\n const {\n data: { deleteSelectedListingAgentAvailbility: deleteData },\n } = await API.graphql(\n graphqlOperation(deleteSelectedListingAgentAvailbility, { deleteSelectedListingAgentAvailbilityInput })\n );\n\n // console.log('deleteData', deleteData);\n\n this.getSlotsAndNotify();\n } else if (this.state.laSlotEventName === 'add') {\n try {\n const firstSlot = this.state.laAvailabilitySlot.filter(\n item => item.end === dateFormat(this.state.selectedSlotInfo.start, 'ddd mmm dd yyyy HH:MM')\n );\n const secondSlot = this.state.laAvailabilitySlot.filter(\n item => item.start === dateFormat(this.state.selectedSlotInfo.end, 'ddd mmm dd yyyy HH:MM')\n );\n\n const addListingAgentAvailbilityInput = {\n listing_agent_id: this.props.userDetails.id,\n property_listing_id: this.state.propertyListingId,\n start_datetime: Math.floor(this.state.selectedSlotInfo.start.getTime() / 1000),\n end_datetime: Math.floor(this.state.selectedSlotInfo.end.getTime() / 1000),\n first_slot_id: firstSlot.length > 0 ? firstSlot[0].id : null,\n second_slot_id: secondSlot.length > 0 ? secondSlot[0].id : null,\n first_slot_start_time:\n firstSlot.length > 0 ? Math.floor(new Date(firstSlot[0].start).getTime() / 1000) : null,\n second_slot_end_time: secondSlot.length > 0 ? Math.floor(new Date(secondSlot[0].end).getTime() / 1000) : null,\n };\n const {\n data: { addListingAgentAvailbility: addLAOpData },\n } = await API.graphql(graphqlOperation(addListingAgentAvailbility, { addListingAgentAvailbilityInput }));\n\n console.log('AddLAOpData', addLAOpData);\n this.setState({ showLoading: false });\n this.getAgentTimeSlotDetails(true);\n } catch (error) {\n this.setState({ showLoading: false });\n console.log('error', error);\n }\n }\n };\n\n editLASlot = async () => {\n this.setIsOpenLASlotOptions();\n this.setIsOpenLASlotAddUpdatePopup();\n this.setState({ laSlotEventName: 'edit' });\n };\n\n getSlotsAndNotifyForEdit = async () => {\n const timeSlotDetails = await API.graphql({\n query: agentTimeSlotDetails,\n variables: {\n listing_id: this.state.propertyMLSId,\n start_time: Math.floor(new Date(this.state.selectedLAAvailabilitySlot.start).getTime() / 1000),\n end_datetime: Math.floor(new Date(this.state.selectedLAAvailabilitySlot.end).getTime() / 1000),\n },\n });\n\n const newTimeSlotDetails = await API.graphql({\n query: agentTimeSlotDetails,\n variables: {\n listing_id: this.state.propertyMLSId,\n start_time: Math.floor(new Date(this.state.newLAAvailabilitySlot.start).getTime() / 1000),\n end_datetime: Math.floor(new Date(this.state.newLAAvailabilitySlot.end).getTime() / 1000),\n },\n });\n\n for (const element of timeSlotDetails.data.agentTimeSlotDetails) {\n const slotData = newTimeSlotDetails.data.agentTimeSlotDetails.find(p => p.tourstop_id === element.tourstop_id);\n\n if (slotData == null || slotData === undefined) {\n const data = await API.graphql(graphqlOperation(deleteTourStop, { id: element.tourstop_id }));\n\n console.log('deleteTourStopData', data);\n this.sendNotificationOnEditDeleteLASlot(element);\n }\n }\n this.setState({ showLoading: false });\n this.getAgentTimeSlotDetails(true);\n };\n\n deleteLASlot = async () => {\n this.setIsOpenLASlotOptions();\n this.setIsOpenLASlotAddUpdatePopup();\n this.setState({ laSlotEventName: 'delete' });\n };\n\n getSlotsAndNotify = async () => {\n const timeSlotDetails = await API.graphql({\n query: agentTimeSlotDetails,\n variables: {\n listing_id: this.state.propertyMLSId,\n start_time: Math.floor(this.state.newLAAvailabilitySlot.start.getTime() / 1000),\n end_datetime: Math.floor(this.state.newLAAvailabilitySlot.end.getTime() / 1000) - 1,\n },\n });\n\n for (const element of timeSlotDetails.data.agentTimeSlotDetails) {\n if (element.STATUS === 'pending' || element.STATUS === 'approved') {\n const data = await API.graphql(graphqlOperation(deleteTourStop, { id: element.tourstop_id }));\n\n console.log('deleteTourStopData', data);\n this.sendNotificationOnEditDeleteLASlot(element);\n }\n }\n\n this.setState({ showLoading: false });\n this.getAgentTimeSlotDetails(true);\n };\n\n sendNotificationOnEditDeleteLASlot = async element => {\n const laEmailId = element.listingAgent_email_address;\n const baEmailId = element.buyingAgent_email_address;\n const baCellPhone = element.buyingAgent_cell_phone;\n const laCellPhone = element.listingAgent_cell_phone;\n\n if (baEmailId !== laEmailId) {\n const timeRangeStart = dateFormat(element.start_time * 1000, 'h:MMtt');\n const timeRangeEnd = dateFormat((element.start_time + element.duration * 3600) * 1000, 'h:MMtt');\n const { email, sms, push } = buildEditDeleteLAAvailabilitySlot({\n laName: `${element.listingAgent_first_name} ${element.listingAgent_last_name}`,\n baName: `${element.buyingAgent_first_name} ${element.buyingAgent_last_name}`,\n date: dateFormat(element.start_time * 1000, 'ddd mmm dd yyyy'),\n address: element.address,\n timeRange: `${timeRangeStart} to ${timeRangeEnd}`,\n });\n\n const sendEmailResult = await sendEmail({\n emailAddress: baEmailId,\n body: email.body,\n subject: email.subject,\n });\n\n const sendSMSResult = await sendSMSMessage({\n phoneNumber: baCellPhone,\n message: sms,\n });\n\n await this.createNotification(email.subject, push, element.client_id, sendSMSResult, sendEmailResult);\n }\n };\n\n createShowingAppointment = () => {\n this.setIsOpenEventTitle();\n this.setIsOpenLASlotOptions();\n };\n\n setIsOpenSuccessPopup = () => {\n this.setState({ isOpenSuccessPopup: !this.state.isOpenSuccessPopup });\n };\n\n setIsOpenLASlotAddUpdatePopup = () => {\n this.setState({ isOpenLASlotAddUpdatePopup: !this.state.isOpenLASlotAddUpdatePopup });\n };\n\n deadlineHrsChange = event => {\n this.setState({ remainingLaDeadlineHrs: event.target.value });\n this.setState({ listingAgentDeadlineHrs: event.target.value });\n };\n\n setIsOpenDeleteApprovedSlot = () => {\n this.setState({ isOpenDeleteApprovedSlot: !this.state.isOpenDeleteApprovedSlot });\n };\n\n deleteApprovedSlot = async () => {\n this.setIsOpenDeleteApprovedSlot();\n\n try {\n this.setState({ showLoading: true });\n const data = await API.graphql(graphqlOperation(deleteTourStop, { id: this.state.selectedSlotInfo.tourStopId }));\n\n await this.getAgentTimeSlotDetails(true);\n this.setState({ showLoading: false });\n if (!data.deleteTourStop) {\n const timeRangeStart = dateFormat(this.state.selectedSlotInfo.start, 'h:MMtt');\n const timeRangeEnd = dateFormat(this.state.selectedSlotInfo.end, 'h:MMtt');\n\n if (!this.state.isListingAgent) {\n const { email, sms, push } = buildCancelShowingRequest({\n laName: this.state.selectedSlotInfo.listingAgentName,\n baName: this.state.selectedSlotInfo.buyingAgentName,\n date: dateFormat(this.state.selectedSlotInfo.start, 'ddd mmm dd yyyy'),\n address: this.state.selectedSlotInfo.address,\n timeRange: `${timeRangeStart} to ${timeRangeEnd}`,\n });\n\n const sendEmailResult = await sendEmail({\n emailAddress: this.state.selectedSlotInfo.listingAgentEmail,\n body: email.body,\n subject: email.subject,\n });\n\n const sendSMSResult = await sendSMSMessage({\n phoneNumber: this.state.selectedSlotInfo.listingAgentPhoneNum,\n message: sms,\n });\n\n await this.createNotification(\n email.subject,\n push,\n this.state.selectedSlotInfo.listingAgentId,\n sendSMSResult,\n sendEmailResult\n );\n } else {\n const { email, sms, push } = buildCancelShowingRequest({\n laName: this.state.selectedSlotInfo.buyingAgentName,\n baName: this.state.selectedSlotInfo.listingAgentName,\n date: dateFormat(this.state.selectedSlotInfo.start, 'ddd mmm dd yyyy'),\n address: this.state.selectedSlotInfo.address,\n timeRange: `${timeRangeStart} to ${timeRangeEnd}`,\n });\n\n const sendEmailResult = await sendEmail({\n emailAddress: this.state.selectedSlotInfo.buyingAgentEmail,\n body: email.body,\n subject: email.subject,\n });\n\n const sendSMSResult = await sendSMSMessage({\n phoneNumber: this.state.selectedSlotInfo.buyingAgentPhoneNum,\n message: sms,\n });\n\n await this.createNotification(\n email.subject,\n push,\n this.state.selectedSlotInfo.clientId,\n sendSMSResult,\n sendEmailResult\n );\n }\n }\n } catch (error) {\n this.setState({ showLoading: false });\n }\n };\n\n render() {\n if (this.state.showLoading)\n return (\n
\n \n
\n );\n\n return (\n
\n
\n
\n MLS Id: {this.state.propertyMLSId}\n
\n
\n Address: {this.state.propertyAddress}\n
\n
\n Listing Agent : {this.state.listingAgentName}\n
\n
\n\n
\n
\n Pending Slots\n
\n Approved Slots\n
\n Available Slots\n
\n\n {this.state.isListingAgent && (\n
\n Auto-Approve{' '}\n {' '}\n Cutoff Hours{' '}\n this.isInputNumber(input)}\n value={this.state.remainingLaDeadlineHrs}\n onChange={e => this.deadlineHrsChange(e)}\n name=\"Hours\"\n maxLength=\"2\"\n disabled={!this.state.isAutoApproved}\n />\n \n Save\n \n
\n )}\n\n {\n this.setState({ selectedDate: date });\n }}\n events={this.state.events}\n localizer={localizer}\n onEventResize={this.onEventResize}\n resizable\n style={{ height: '100vh', padding: '15px' }}\n timeslots={4}\n step={15}\n views={['week']}\n eventPropGetter={this.eventStyleGetter}\n onSelecting={slotInfo => this.onSelecting(slotInfo)}\n slotPropGetter={this.slotPropGetter}\n selectable\n onSelectEvent={slotInfo => this.onEventClick(slotInfo)}\n onSelectSlot={slotInfo => this.onSelectSlot(slotInfo)}\n min={new Date(1999, 0, 1, 8, 0)}\n max={new Date(2999, 0, 1, 22, 0)}\n messages={{\n previous: '<',\n today: 'Today',\n next: '>',\n }}\n draggableAccessor={event => false}\n />\n\n {this.state.isOpenEventTitle && (\n \n )}\n\n {this.state.isOpenEventApprove && (\n \n )}\n\n {this.state.isOpenAutoApprove && (\n \n )}\n\n {this.state.isOpenLASlotOptions && (\n \n )}\n {this.state.isOpenSuccessPopup && (\n \n )}\n {this.state.isOpenLASlotAddUpdatePopup && (\n \n )}\n\n {this.state.isOpenDeleteApprovedSlot && (\n \n )}\n
\n );\n }\n}\n\nexport default CalendarControl;\n\nCalendarControl.propTypes = {\n isAgent: PropTypes.bool,\n userDetails: PropTypes.object,\n history: PropTypes.object,\n propertyListings: PropTypes.array,\n isActiveSubscription: PropTypes.bool,\n};\n","import React, { useState, useEffect } from \"react\";\n\nimport logo from \"../assets/ATT-LOGO-2c-navy.png\";\nimport { useHistory } from \"react-router-dom\";\nimport PhoneInput from \"react-phone-input-2\";\nimport \"react-phone-input-2/lib/style.css\";\n\nimport {\n HiCalendar,\n HiLocationMarker,\n HiBell,\n HiChartBar,\n HiX,\n HiMail,\n HiShare,\n} from \"react-icons/hi\";\nimport mobileAppHome from \"../assets/mobile-app-home.png\";\n\n// Add this CSS at the top of your file or in a separate CSS file\nconst glowStyles = {\n transition: \"all 0.5s ease-in-out, box-shadow 1.5s ease-out\",\n boxShadow:\n \"0 0 25px 15px rgba(59, 130, 246, 0.3), 0 0 2px rgba(255, 255, 255, 0.8)\",\n transform: \"scale(1.02)\",\n};\n\nconst calculateTimeLeft = (launchDate) => {\n const difference = launchDate - new Date();\n const days = Math.floor(difference / (1000 * 60 * 60 * 24));\n const hours = Math.floor((difference / (1000 * 60 * 60)) % 24);\n const minutes = Math.floor((difference / 1000 / 60) % 60);\n const seconds = Math.floor((difference / 1000) % 60);\n\n return { days, hours, minutes, seconds };\n};\n\nconst SENDGRID_API_KEY = process.env.REACT_APP_SENDGRID_API_KEY;\nconst SENDGRID_LIST_ID = process.env.REACT_APP_SENDGRID_LIST_ID;\nconst TWILIO_ACCOUNT_SID = process.env.REACT_APP_TWILIO_ACCOUNT_SID;\nconst TWILIO_AUTH_TOKEN = process.env.REACT_APP_TWILIO_AUTH_TOKEN;\nconst TWILIO_PHONE_NUMBER = process.env.REACT_APP_TWILIO_PHONE_NUMBER;\n\nconst MAILERLITE_API_KEY = process.env.REACT_APP_MAILERLITE_API_KEY;\nconst MAILERLITE_GROUP_ID = \"142476718776517700\";\n\n// Move Modal outside of Waitlist component\nconst Modal = ({\n showModal,\n setShowModal,\n step,\n email,\n setEmail,\n handleEmailSubmit,\n isSubmitting,\n error,\n phone,\n setPhone,\n handlePhoneSubmit,\n}) => (\n
\n setShowModal(false)}\n />\n
\n
\n setShowModal(false)}\n className=\"p-2 hover:bg-gray-100 rounded-full transition-colors duration-200\"\n aria-label=\"Close modal\"\n >\n \n \n
\n\n
\n
\n \"About\n \n {step === 3 ? \"🎉\" : step === 1 ? \"👋\" : \"📱\"}\n \n
\n\n {step === 1 ? (\n <>\n

\n Join Our Exclusive Waitlist\n

\n

\n Be the first to know when we launch!\n

\n
\n
\n \n Email Address\n \n setEmail(e.target.value)}\n placeholder=\"you@example.com\"\n className=\"w-full px-4 py-3 text-lg text-blue-900 bg-white rounded-lg border border-gray-300 focus:border-blue-500 focus:ring-2 focus:ring-blue-200 outline-none transition-all\"\n required\n />\n
\n {error &&

{error}

}\n \n {isSubmitting ? \"Joining...\" : \"Join Waitlist\"}\n \n \n \n ) : step === 2 ? (\n <>\n

\n Thanks for joining our waitlist!\n

\n

\n Would you like to receive text message updates also?\n

\n
\n
\n \n Phone Number\n \n \n
\n
\n handlePhoneSubmit(false)}\n className=\"flex-1 py-4 px-6 text-lg font-medium text-white bg-gray-500 rounded-lg hover:bg-gray-600 transition-colors\"\n >\n No thanks\n \n handlePhoneSubmit(true)}\n disabled={!phone || phone.length < 10 || isSubmitting}\n className=\"flex-1 py-4 px-6 text-lg font-medium text-white bg-blue-500 rounded-lg hover:bg-blue-600 transition-colors disabled:opacity-50\"\n >\n {isSubmitting ? \"Updating...\" : \"Yes! Please text me\"}\n \n
\n
\n \n ) : (\n <>\n

\n You're all set!\n

\n

\n Thanks for joining our waitlist. We'll keep you updated on our\n progress!\n

\n setShowModal(false)}\n className=\"w-full py-4 px-6 text-lg font-medium text-white bg-blue-500 rounded-lg hover:bg-blue-600 transition-colors\"\n >\n Close\n \n \n )}\n
\n
\n
\n);\n\nconst Waitlist = () => {\n const [openSnackbar, setOpenSnackbar] = useState(false);\n const [waitlistCount, setWaitlistCount] = useState(2481);\n const [prevCount, setPrevCount] = useState(2481);\n const [isGlowing, setIsGlowing] = useState(false);\n const launchDate = new Date(Date.UTC(2025, 3, 1)); // Month is 0-based, so 3 = April\n const [timeLeft, setTimeLeft] = useState(() => calculateTimeLeft(launchDate));\n const [showPhonePrompt, setShowPhonePrompt] = useState(false);\n const [phone, setPhone] = useState(\"\");\n const [finalMessage, setFinalMessage] = useState(\"\");\n const history = useHistory();\n const [showModal, setShowModal] = useState(false);\n const [step, setStep] = useState(1);\n const [email, setEmail] = useState(\"\");\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [error, setError] = useState(\"\");\n\n const pageTitle = \"Get the app and streamline your home tours\";\n const pageSubtitle =\n \"Save hours of scheduling time, optimize your routes, and deliver a premium showing experience that impresses both buyers and sellers\";\n\n useEffect(() => {\n const interval = setInterval(() => {\n setPrevCount(waitlistCount);\n setWaitlistCount((current) => {\n const increment = Math.floor(Math.random() * 3) + 1;\n return current + increment;\n });\n // Longer glow duration\n setIsGlowing(true);\n setTimeout(() => setIsGlowing(false), 1500); // Increased to 1.5 seconds\n }, Math.random() * (8000 - 3000) + 3000); // More frequent: 3-8 seconds between updates\n\n return () => clearInterval(interval);\n }, [waitlistCount]);\n\n useEffect(() => {\n const timer = setInterval(() => {\n setTimeLeft(calculateTimeLeft(launchDate));\n }, 1000);\n\n return () => clearInterval(timer);\n }, [launchDate]);\n\n const handleWaitlistClick = () => {\n setShowModal(true);\n setStep(1);\n setError(\"\");\n };\n\n const handleEmailSubmit = async (e) => {\n e.preventDefault();\n setIsSubmitting(true);\n setError(\"\");\n\n try {\n const response = await fetch(\n \"https://connect.mailerlite.com/api/subscribers\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${MAILERLITE_API_KEY}`,\n },\n body: JSON.stringify({\n email: email,\n groups: [MAILERLITE_GROUP_ID],\n status: \"active\",\n }),\n }\n );\n\n const data = await response.json();\n console.log(\"MailerLite API Response:\", data);\n\n if (response.ok) {\n setStep(2);\n setWaitlistCount((prev) => prev + 1);\n } else {\n setError(data.message || \"Failed to join waitlist\");\n }\n } catch (error) {\n console.error(\"MailerLite API Exception:\", error);\n setError(\"Failed to join waitlist. Please try again.\");\n } finally {\n setIsSubmitting(false);\n }\n };\n\n const handlePhoneSubmit = async (wantsTexts) => {\n console.log(\"handlePhoneSubmit called with wantsTexts:\", wantsTexts);\n console.log(\"Current step:\", step);\n\n if (!wantsTexts) {\n console.log(\"No thanks clicked, setting step to 3\");\n setStep(3);\n return;\n }\n\n if (!phone || phone.length < 10) {\n console.log(\"Invalid phone number:\", phone);\n return;\n }\n\n setIsSubmitting(true);\n try {\n console.log(\"Fetching subscriber data for email:\", email);\n const getSubscriber = await fetch(\n `https://connect.mailerlite.com/api/subscribers/${email}`,\n {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${MAILERLITE_API_KEY}`,\n },\n }\n );\n\n const subscriberData = await getSubscriber.json();\n console.log(\"Subscriber data received:\", subscriberData);\n\n if (subscriberData.data && subscriberData.data.id) {\n console.log(\"Updating subscriber with phone:\", phone);\n const response = await fetch(\n `https://connect.mailerlite.com/api/subscribers/${subscriberData.data.id}`,\n {\n method: \"PUT\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${MAILERLITE_API_KEY}`,\n },\n body: JSON.stringify({\n fields: {\n phone: phone,\n },\n }),\n }\n );\n\n const data = await response.json();\n console.log(\"Update response:\", data);\n\n if (response.ok) {\n console.log(\"Setting step to 3\");\n setStep(3);\n } else {\n console.error(\"Failed to update phone number:\", data);\n }\n }\n } catch (error) {\n console.error(\"Error updating phone:\", error);\n } finally {\n setIsSubmitting(false);\n }\n };\n\n const copyInviteLink = () => {\n navigator.clipboard.writeText(window.location.href);\n alert(\"Invite link copied to clipboard!\");\n };\n\n const features = [\n {\n icon: ,\n title: \"Smart Scheduling\",\n description: \"Create and customize home tours with automated scheduling\",\n },\n {\n icon: ,\n title: \"Route Optimization\",\n description: \"Optimized routes with real-time navigation\",\n },\n {\n icon: ,\n title: \"Smart Notifications\",\n description: \"Automated 'You're next on tour' alerts to sellers\",\n },\n {\n icon: ,\n title: \"Tour Analytics\",\n description: \"Track and analyze tour performance and feedback\",\n },\n ];\n\n return (\n
\n
\n
\n {/* Left Column - Content & Form */}\n
\n {/* Logo centered */}\n
\n \"About\n
\n\n {/* Main content */}\n
\n

\n {pageTitle}\n

\n

\n {pageSubtitle}\n

\n\n {/* Waitlist Counter and Form */}\n
\n
\n
\n\n \n
\n
\n Join the Waitlist\n \n
\n
\n
\n
\n\n {/* Right Column - Mobile App Preview */}\n
\n
\n {/* Countdown Timer */}\n
\n {Object.entries(timeLeft).map(([unit, value]) => (\n \n \n {String(value).padStart(2, \"0\")}\n \n \n {unit}\n \n
\n ))}\n
\n\n {/* Added subtext */}\n

\n We are hard at work building the mobile app for you\n

\n \n
\n
\n
\n\n {/* Features Section */}\n
\n
\n

\n Powerful Features for Real Estate Professionals\n

\n
\n {features.map((feature, index) => (\n \n
\n {React.cloneElement(feature.icon, {\n className: \"w-8 h-8 text-teal-500\",\n })}\n
\n

\n {feature.title}\n

\n

\n {feature.description}\n

\n
\n ))}\n
\n
\n \n\n {/* Contact Section */}\n
\n
\n
\n {/* Email Button */}\n {\n navigator.clipboard.writeText(\"hello@abouttimetours.com\");\n // Add a temporary success message\n const button = document.getElementById(\"email-button\");\n const originalText = button.querySelector(\"p\").textContent;\n button.querySelector(\"p\").textContent = \"Email copied!\";\n setTimeout(() => {\n button.querySelector(\"p\").textContent = originalText;\n }, 2000);\n }}\n id=\"email-button\"\n className=\"group flex items-center justify-center gap-4 p-6 bg-white/10 backdrop-blur-sm rounded-xl hover:bg-white/20 transition-all duration-300\"\n >\n
\n \n
\n
\n

\n Email Us\n

\n

hello@abouttimetours.com

\n
\n \n\n {/* Share Button */}\n {\n navigator.clipboard.writeText(\"https://abouttimetours.com\");\n // Add a temporary success message\n const button = document.getElementById(\"share-button\");\n const originalText = button.querySelector(\"p\").textContent;\n button.querySelector(\"p\").textContent = \"Link copied!\";\n setTimeout(() => {\n button.querySelector(\"p\").textContent = originalText;\n }, 2000);\n }}\n id=\"share-button\"\n className=\"group flex items-center justify-center gap-4 p-6 bg-white/10 backdrop-blur-sm rounded-xl hover:bg-white/20 transition-all duration-300\"\n >\n
\n \n
\n
\n

\n Share With Friends\n

\n

Copy invite link

\n
\n \n
\n
\n
\n
\n\n {/* Phone Number Modal */}\n {openSnackbar && (\n
\n setOpenSnackbar(false)}\n />\n
\n
\n
\n \"About\n \n 👍\n \n
\n\n {!finalMessage && (\n <>\n

\n Thanks for joining our waitlist!\n

\n

\n Would you like to receive text message updates also?\n

\n
\n \n
\n
\n handlePhoneSubmit(false)}\n className=\"flex-1 py-4 px-6 text-lg font-medium text-white bg-gray-500 rounded-lg hover:bg-gray-600 transition-colors\"\n >\n No thanks\n \n handlePhoneSubmit(true)}\n disabled={!phone || phone.length < 10 || isSubmitting}\n className=\"flex-1 py-4 px-6 text-lg font-medium text-white bg-blue-500 rounded-lg hover:bg-blue-600 transition-colors disabled:opacity-50\"\n >\n {isSubmitting ? \"Updating...\" : \"Yes! Please text me\"}\n \n
\n \n )}\n\n {finalMessage && (\n <>\n

All set!

\n

{finalMessage}

\n \n )}\n
\n
\n
\n )}\n\n {showModal && (\n \n )}\n
\n );\n};\n\n// Add these keyframes to your global CSS or a styled-components definition\nconst styles = `\n@keyframes wave {\n 0% { transform: rotate(0deg); }\n 25% { transform: rotate(-20deg); }\n 75% { transform: rotate(20deg); }\n 100% { transform: rotate(0deg); }\n}\n\n@keyframes slideIn {\n from {\n opacity: 0;\n transform: translateY(-20px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n`;\n\nexport default Waitlist;\n","/* eslint-disable react/jsx-props-no-spreading */\nimport React, { useState, useEffect } from \"react\";\nimport { BrowserRouter, Switch, Route, Redirect } from \"react-router-dom\";\nimport Amplify, { Auth, API, graphqlOperation } from \"aws-amplify\";\nimport amplifyconfiguration from \"./amplifyconfiguration\";\nimport Header from \"./components/Header\";\nimport Helmet from \"./Helmet\";\nimport Footer from \"./components/Footer\";\nimport SearchListings from \"./components/SearchListings\";\nimport ListingDetail from \"./components/ListingDetail\";\nimport Profile from \"./components/Profile\";\nimport CustomSignIn from \"./components/CustomSignIn\";\nimport FreeTrialButton from \"./components/FreeTrialButton\";\nimport ManageAgents from \"./pages/admin/agents/ManageAgents\";\nimport PrivateRoute from \"./components/PrivateRoute\";\nimport CalendarListing from \"./components/CalendarListing\";\nimport CalenderControl from \"./components/CalendarControl\";\nimport CustomForgotPassword from \"./components/CustomForgotPassword\";\nimport CustomSignUp from \"./components/SignUp/CustomSignUp\";\nimport CustomConfirmSignUp from \"./components/SignUp/CustomConfirmSignUp\";\nimport AgentBuyerSelect from \"./components/SignUp/AgentBuyerSelect\";\nimport SubscriptionOptions from \"./components/SignUp/SubscriptionOptions\";\nimport PhoneNumberNotVerifiedPopup from \"./components/SignUp/PhoneNumberNotVerifiedPopup\";\nimport SuccessSubscription from \"./components/SignUp/SuccessSubsciption\";\nimport CanceledSubscription from \"./components/SignUp/CanceledSubsciption\";\nimport ValidatingCredentialsPopup from \"./components/SignUp/ValidatingCredentialsPopup\";\nimport FreeTrialLimitationPopup from \"./components/SignUp/FreeTrialLimitationPopup\";\nimport ThankYouForSignupPopup from \"./components/SignUp/ThankYouForSignupPopup\";\nimport VisitorSignupMessagePopup from \"./components/SignUp/VisitorSignupMessagePopup\";\nimport CoverageMap from \"./pages/CoverageMap\";\nimport HowItWorks from \"./pages/HowItWorks\";\nimport About from \"./pages/About\";\nimport Waitlist from \"./pages/Waitlist\";\n\nimport {\n getUserByCognitoSub,\n listPropertyListings,\n getSetting,\n getSubscriptionStatus,\n} from \"./graphql/queries\";\nimport { UserContext } from \"./contexts\";\n\nAmplify.configure(amplifyconfiguration);\nAuth.configure(amplifyconfiguration);\n\nconst App = () => {\n const [isLoggedIn, setIsLoggedIn] = useState(false);\n const [renderLoginComponent, setRenderLoginComponent] = useState(false);\n const [userInfo, setUserInfo] = useState();\n const [fetchedListings, setFetchedListings] = useState([]);\n const [userHasSearched, setUserHasSearched] = useState(false);\n const [pageNumberHistory, setPageNumberHistory] = useState(\"1\");\n const [searchTermsHistory, setSearchTermsHistory] = useState();\n const [isAgent, setIsAgent] = useState(false);\n const [propertyListings, setPropertyListings] = useState([]);\n const [renderForgotPassword, setRenderForgotPassword] = useState(false);\n const [isRedirectToConfirmSignup, setIsRedirectToConfirmSignup] = useState(\n false\n );\n const [isOpenPhoneNumNotVerified, setIsOpenPhoneNumNotVerified] = useState(\n false\n );\n const [\n openStringPhoneNumNotVerified,\n setOpenStringPhoneNumNotVerified,\n ] = useState(\"opened\");\n const [\n isOpenValidatingCredentialsPopup,\n setIsOpenValidatingCredentialsPopup,\n ] = useState(false);\n const [\n isOpenThankYouForSignupPopup,\n setIsOpenThankYouForSignupPopup,\n ] = useState(false);\n const [isOpenSubscription, setIsOpenSubscription] = useState(false);\n const [userEmail, setUserEmail] = useState(\"\");\n const [userId, setUserId] = useState(0);\n const [isOpenFreeTrialLimitPopup, setIsOpenFreeTrialLimitPopup] = useState(\n false\n );\n const [isActiveSubscription, setIsActiveSubscription] = useState(false);\n const [isUsedFreeTrial, setIsUsedFreeTrial] = useState(false);\n const [subscriptionInfo, setSubscriptionInfo] = useState();\n const [isOpenVisitorSignupMessage, setIsOpenVisitorSignupMessage] = useState(\n false\n );\n\n const handleLogout = () => {\n Auth.signOut().then(() => {\n setUserInfo(null);\n setIsLoggedIn(false);\n setIsAgent(false);\n window.location.replace(\"/\");\n });\n };\n\n const handleLogin = (shouldLogin) => {\n window.scrollTo(0, 0);\n setRenderLoginComponent(shouldLogin);\n };\n\n const handleForgotPassword = (shouldOpen) => {\n window.scrollTo(0, 0);\n setRenderForgotPassword(shouldOpen);\n if (shouldOpen) {\n setRenderLoginComponent(!shouldOpen);\n }\n };\n\n const fetchUser = () =>\n Auth.currentAuthenticatedUser({ bypassCache: true })\n .then(({ attributes: { sub } }) =>\n API.graphql(graphqlOperation(getUserByCognitoSub, { cognito_sub: sub }))\n .then(\n ({ data: { getUserByCognitoSub: userByCognitoSub } }) =>\n userByCognitoSub\n )\n .then(async (dbUser) => {\n setUserEmail(dbUser.email_address);\n setUserId(dbUser.id);\n setIsUsedFreeTrial(dbUser.is_used_free_trial);\n const isValidAgent = dbUser.validated && !dbUser.locked_out;\n\n if (isValidAgent) {\n if (dbUser.is_free_version_account) {\n if (\n !(\n window.location.href.includes(\"/signup\") ||\n window.location.href.includes(\"/subscription\")\n )\n ) {\n successLogin(dbUser);\n }\n } else {\n const subscriptionsRequired = await API.graphql({\n query: getSetting,\n variables: {\n code_name: \"Subscriptions.SubscriptionsRequired\",\n },\n });\n\n if (\n subscriptionsRequired.data.getSetting &&\n subscriptionsRequired.data.getSetting.value &&\n subscriptionsRequired.data.getSetting.value.toLowerCase() ===\n \"true\"\n ) {\n const subscriptionStatus = await API.graphql({\n query: getSubscriptionStatus,\n variables: { user_id: dbUser.id },\n });\n\n setSubscriptionInfo(\n subscriptionStatus.data.getSubscriptionStatus\n );\n\n if (\n subscriptionStatus &&\n subscriptionStatus.data &&\n subscriptionStatus.data.getSubscriptionStatus.is_active\n ) {\n setIsActiveSubscription(true);\n\n if (\n !(\n window.location.href.includes(\"/signup\") ||\n window.location.href.includes(\"/subscription\")\n )\n ) {\n successLogin(dbUser);\n }\n // stripe related code\n // } else if (\n // !(window.location.href.includes('/signup') || window.location.href.includes('/subscription'))\n // ) {\n // if (\n // subscriptionStatus.data.getSubscriptionStatus.is_recurring &&\n // !subscriptionStatus.data.getSubscriptionStatus.is_trial\n // ) {\n // Auth.signOut().then(() => {\n // setUserInfo(null);\n // setIsLoggedIn(false);\n // setIsAgent(false);\n // window.location.replace('/');\n // });\n // }\n else {\n setIsOpenSubscription(true);\n }\n }\n } else if (\n !(\n window.location.href.includes(\"/signup\") ||\n window.location.href.includes(\"/subscription\")\n )\n ) {\n successLogin(dbUser);\n }\n }\n }\n })\n )\n .catch((err) => {\n console.error(err);\n });\n\n const successLogin = async (dbUser) => {\n const authenticatedUser = await Auth.currentAuthenticatedUser();\n\n dbUser.accessGroup =\n authenticatedUser.signInUserSession.accessToken.payload[\n \"cognito:groups\"\n ] || [];\n setUserInfo(dbUser);\n setIsLoggedIn(true);\n\n if (!authenticatedUser.attributes.phone_number_verified) {\n setIsOpenPhoneNumNotVerified(true);\n }\n\n const fetchedListing = await API.graphql({\n query: listPropertyListings,\n variables: { listing_agent_id: dbUser.id },\n });\n\n if (dbUser.is_agent) {\n if (fetchedListing.data.listPropertyListings.length > 0) {\n setIsAgent(true);\n setPropertyListings(fetchedListing.data.listPropertyListings);\n } else {\n setIsAgent(false);\n }\n }\n };\n\n useEffect(() => {\n fetchUser();\n }, []);\n\n const renderMainLayout = (children) => (\n
\n {\n if (!renderLoginComponent) {\n handleLogin(true);\n }\n }}\n isAgent={isAgent}\n setIsOpenSubscription={setIsOpenSubscription}\n isActiveSubscription={isActiveSubscription}\n />\n \n
{children}
\n {!isLoggedIn && }\n
\n
\n
\n );\n\n return (\n \n {process.env.REACT_APP_STAGE === \"production\" && }\n \n \n \n
\n \n
\n
\n \n \n \n {/* Temporarily disabled routes - START */}\n {/*\n \n \n \n \n \n \n */}\n {/* Temporarily disabled routes - END */}\n
\n
\n
\n );\n};\n\nexport default App;\n","// This optional code is used to register a service worker.\n// register() is not called by default.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on subsequent visits to a page, after all the\n// existing tabs open on the page have been closed, since previously cached\n// resources are updated in the background.\n\n// To learn more about the benefits of this model and instructions on how to\n// opt-in, read https://bit.ly/CRA-PWA\n\nconst isLocalhost = Boolean(\n window.location.hostname === 'localhost' ||\n // [::1] is the IPv6 localhost address.\n window.location.hostname === '[::1]' ||\n // 127.0.0.1/8 is considered localhost for IPv4.\n window.location.hostname.match(/^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/)\n);\n\nexport function register(config) {\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\n // The URL constructor is available in all browsers that support SW.\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);\n\n if (publicUrl.origin !== window.location.origin) {\n // Our service worker won't work if PUBLIC_URL is on a different origin\n // from what our page is served on. This might happen if a CDN is used to\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\n return;\n }\n\n window.addEventListener('load', () => {\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\n\n if (isLocalhost) {\n // This is running on localhost. Let's check if a service worker still exists or not.\n checkValidServiceWorker(swUrl, config);\n\n // Add some additional logging to localhost, pointing developers to the\n // service worker/PWA documentation.\n navigator.serviceWorker.ready.then(() => {\n console.log(\n 'This web app is being served cache-first by a service ' +\n 'worker. To learn more, visit https://bit.ly/CRA-PWA'\n );\n });\n } else {\n // Is not localhost. Just register service worker\n registerValidSW(swUrl, config);\n }\n });\n }\n}\n\nfunction registerValidSW(swUrl, config) {\n navigator.serviceWorker\n .register(swUrl)\n .then(registration => {\n registration.onupdatefound = () => {\n const installingWorker = registration.installing;\n\n if (installingWorker == null) {\n return;\n }\n installingWorker.onstatechange = () => {\n if (installingWorker.state === 'installed') {\n if (navigator.serviceWorker.controller) {\n // At this point, the updated precached content has been fetched,\n // but the previous service worker will still serve the older\n // content until all client tabs are closed.\n console.log(\n 'New content is available and will be used when all ' +\n 'tabs for this page are closed. See https://bit.ly/CRA-PWA.'\n );\n\n // Execute callback\n if (config && config.onUpdate) {\n config.onUpdate(registration);\n }\n } else {\n // At this point, everything has been precached.\n // It's the perfect time to display a\n // \"Content is cached for offline use.\" message.\n console.log('Content is cached for offline use.');\n\n // Execute callback\n if (config && config.onSuccess) {\n config.onSuccess(registration);\n }\n }\n }\n };\n };\n })\n .catch(error => {\n console.error('Error during service worker registration:', error);\n });\n}\n\nfunction checkValidServiceWorker(swUrl, config) {\n // Check if the service worker can be found. If it can't reload the page.\n fetch(swUrl)\n .then(response => {\n // Ensure service worker exists, and that we really are getting a JS file.\n const contentType = response.headers.get('content-type');\n\n if (response.status === 404 || (contentType != null && contentType.indexOf('javascript') === -1)) {\n // No service worker found. Probably a different app. Reload the page.\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister().then(() => {\n window.location.reload();\n });\n });\n } else {\n // Service worker found. Proceed as normal.\n registerValidSW(swUrl, config);\n }\n })\n .catch(() => {\n console.log('No internet connection found. App is running in offline mode.');\n });\n}\n\nexport function unregister() {\n if ('serviceWorker' in navigator) {\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister();\n });\n }\n}\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport './styles/index.css';\nimport App from './App';\nimport * as serviceWorker from './serviceWorker';\n\nReactDOM.render(, document.getElementById('root'));\n\n// If you want your app to work offline and load faster, you can change\n// unregister() to register() below. Note this comes with some pitfalls.\n// Learn more about service workers: https://bit.ly/CRA-PWA\nserviceWorker.unregister();\n"],"sourceRoot":""}