{"version":3,"sources":["assets/assets-colors.tsx","assets/LOCKETGO_LOGO_RVB-Blanc.svg","assets/LOCKETGO_LOGO_RVB-Noir.svg","assets/LOCKETGO_LOGO_RVB-Bleu.svg","services/services-api-base-service.tsx","services/member/member-service.tsx","services/member/member.tsx","services/auth/authConfig.ts","services/auth/msal-instance.tsx","services/auth/msal-service.tsx","services/auth/login-response.tsx","services/core/string-helpers.ts","services/auth/auth-service.tsx","services/member/organization-service.tsx","components/header.tsx","pages/account/signup-page.tsx","services/hub/hub.tsx","services/core/address.tsx","services/hub/flow-configs.tsx","services/order/order-service.tsx","services/hub/hub-service.tsx","services/core/language-service.tsx","services/core/notification-level.tsx","services/order/customer.tsx","services/order/order.tsx","services/order/ReservationState.tsx","services/order/order-helpers.tsx","components/paging-component.tsx","services/core/toast-helpers.ts","components/button-component.tsx","components/dateRangeComponent.tsx","services/core/date-helpers.tsx","components/globalfilter-component.jsx","components/hub-location-component.tsx","components/loading-component.tsx","components/notify-level-icon-component.tsx","components/state-badge-component.tsx","components/orders-page-components/orders-table-component.tsx","pages/orders/orders-page.tsx","pages/admin/memberRoleTable.tsx","components/input.tsx","components/customer-information-components/phone-component.tsx","pages/admin/hub-permission-table.tsx","pages/admin/editMember.tsx","components/autocompleteSearch.tsx","pages/admin/database-admin-page.tsx","services/member/customers-service.tsx","pages/customers/customers-page.tsx","services/hub/compartment.tsx","services/hub/hub-helper.tsx","services/hub/compartmentSize-service.tsx","services/hub/packagingOption-service.tsx","components/yesno-component.tsx","components/cancel-reservation-msg-component.tsx","services/payment/payment-state.tsx","services/payment/payment-service.tsx","pages/orders/order-details/order-history.tsx","pages/orders/order-details/order-payment-information.tsx","pages/orders/order-details/order-general.tsx","pages/orders/order-details/order-customer.tsx","components/order-page-components.tsx","pages/orders/order-details/order-reservation.tsx","pages/orders/order-modals/order-request-organization-address-modal.tsx","pages/orders/order-page.tsx","pages/account/organizations-page.tsx","components/waiting-component.tsx","pages/account/organization-page.tsx","components/customer-information-components/firstname-component.tsx","components/customer-information-components/lastname-components.tsx","pages/account/member-page.tsx","pages/orders/create-order-page.tsx","pages/home/no-connection-page.tsx","components/delay-component.tsx","pages/customers/create-customer-page.tsx","pages/customers/edit-customer-page.tsx","services/micro-site/microsite-helpers.tsx","services/micro-site/microsite-service.tsx","assets/meta-table-keys.tsx","pages/micro-site/event-card.tsx","pages/micro-site/micro-site-page.tsx","components/timerComponent.tsx","components/payment-forms/charge-state.tsx","services/payment/payment-request.tsx","components/payment-forms/payment-form-square.tsx","components/payment-forms/payment-form-stripe.tsx","components/payment-forms/payment-form.tsx","pages/micro-site/reserve-locker.tsx","components/placerholder-component.tsx","services/core/request-state.tsx","services/hub/useMyHubs.tsx","pages/hubs/hubs-page.tsx","services/hub/useMyHub.tsx","pages/hubs/hub-details/hub-open-all-door.tsx","pages/hubs/hub-compartment-detail.tsx","pages/hubs/hub-details/hub-legend.tsx","components/address-detail-component.tsx","pages/hubs/hub-details/hub-state-information.tsx","components/hub/rider-lockers/dropdown-side-component.tsx","components/lock-component.tsx","components/hub/locker-component.tsx","services/hub/useCompartmentSizes.tsx","pages/hubs/hub-page.tsx","components/locker-single-reservation-message-component.tsx","components/locker-multiple-reservations-message-component.tsx","pages/reservations/my-reservations-page.tsx","pages/micro-site/order-expired-page.tsx","services/analytic/analytic-service.tsx","pages/dashboard/hub-stats-component.tsx","components/chart-line.tsx","pages/dashboard/order-stats-component.tsx","pages/dashboard/event-stats-component.tsx","pages/dashboard/dashboard-page.tsx","pages/events/microsites-page.tsx","components/useEffect/useHubs.tsx","services/member/member-extensions.tsx","pages/events/events-table.tsx","pages/events/microsite-zones.tsx","pages/events/events-page.tsx","components/micrositeDropDown.tsx","pages/events/event-page.tsx","components/NumberDropdown.tsx","components/customer-information-components/email-component.tsx","pages/micro-site/contributor-reserve-locker-page.tsx","pages/orders/relocate-page.tsx","pages/events/event-settlement-report.tsx","components/useEffect/useMicrosite.tsx","pages/hubs/hub-activities-page.tsx","pages/micro-site/reserve-locker-signin.tsx","components/email-link-component.tsx","pages/home/home-not-registered-page.tsx","services/admin/admin-service.tsx","pages/admin/microsite-cms/hub-inclusion-table.tsx","pages/admin/microsite-cms/microsite-admin.tsx","services/organization/organization.tsx","pages/account/create-organization.tsx","App.tsx","reportWebVitals.ts","i18n.ts","index.tsx"],"names":["AssetColors","GetLocketgoLogoSource","assetColor","color","undefined","Black","blackLogo","White","whiteLogo","Blue","blueLogo","ServicesApiBaseService","apiUrl","process","url","axios","this","getHttpConfig","responseType","get","catch","error","handleError","response","data","post","delete","put","authService","getAccessToken","Authorization","headers","method","status","console","statusText","message","MemberService","getObject","organizationId","members","member","postObject","putObject","email","entityId","permission","entityType","res","Active","Email","EntityId","Permission","EntityType","i","associatedHubs","length","roles","includes","isLocketgoAdmin","organisation","associatedOrganizations","find","org","entity","id","some","role","associated","hubId","isLocketgoHubAdmin","token","memberService","Member","type","referenceId","firstname","lastname","streetNumber","street","city","state","country","postalCode","unit","phone","phoneExtension","externalId","active","features","Array","AzureActiveDirectoryScopes","msalConfig","auth","clientId","authority","knownAuthorities","split","redirectUri","postLogoutRedirectUri","cache","cacheLocation","storeAuthStateInCookie","system","loggerOptions","loggerCallback","level","containsPii","LogLevel","Error","Info","info","Verbose","debug","Warning","warn","loginRequest","scopes","acquireTokenRequest","msalInstance","PublicClientApplication","MsalService","callback","addEventCallback","eventType","EventType","LOGIN_SUCCESS","ACQUIRE_TOKEN_SUCCESS","interactionType","InteractionType","Redirect","account","getAccount","request","acquireTokenSilent","acquireTokenRedirect","accounts","getAllAccounts","loginType","loginPopup","e","loginRedirect","logoutType","logoutPopup","logoutRedirect","msalService","LoginResponse","StringHelpers","count","textSingular","stringToVerify","RegExp","test","value","digits","toLocaleString","minimumFractionDigits","maximumFractionDigits","useGrouping","amount","AuthService","tokenExpiresOn","registerCallback","msalAccount","log","getToken","tokenResult","accessToken","getMemberMe","username","createMember","localAccountId","getFullName","login","REACT_APP_ADB2C_LOGIN_TYPE","autoLogin","logout","getTime","Date","now","expiresOn","accountToCreate","OrganizationService","organization","Organization","microsites","filter","microsite","forEach","name","Map","Object","entries","organizationService","HeaderNavbar","props","activeOrganization","changeLanguage","changeMember","useState","isNavCollapsed","setIsNavCollapsed","micrositesLength","setMicrositesLength","t","useTranslation","orgContributor","isOrganizationContributor","collapseClasses","onItemClick","loginResponse","accountDisplay","useEffect","getAllMicrositesOfOrganization","then","className","HeaderIcon","logo","onClick","icon","to","toUpperCase","imgSource","src","alt","SignUpPage","history","useHistory","push","HubStates","Address","lat","lng","FlowConfigs","personalStorageEnabled","parcelEnabled","customerSelectionEnabled","rfidEnabled","orderLookupEnabled","isRiderLocker","hasObjectDetection","OrderState","Hub","zoneName","description","flowConfigs","private","address","model","groups","carriers","version","MyHub","computerMetrics","lastSynchronization","reservationDenies","reservations","kiosk","activities","HubService","hub","ids","hubs","sort","a","b","localeCompare","groupId","compartmentNumber","side","hubIid","activitiesMultiplier","hubService","languageService","language","localStorage","getItem","window","navigator","setItem","NotifyLevel","OrderService","start","end","orders","tokenTmp","order","orderFlow","sizeIds","orderId","assetId","getFile","label","phoneNumber","packagingOptionId","carrierId","flow","referenceNumber","firstName","lastName","getLanguage","sizeId","height","width","depth","weight","orderItemId","reservationStart","reservationEnd","reason","requestingFrom","trackingNumbers","deleteTrackingNumber","deleteObject","orderService","OrderFlow","OrderFlowStringValue","ReservationState","OrderHelpers","lockers","items","orderItem","reservation","isPersonalStorage","getPersonalStorageOrderStateBadgeStyle","getBopilOrderStateBadgeStyle","activity","item","payments","toString","deleted","every","p","carrierSubmissionReferenceNumber","New","PersonalStorage","Completed","Canceled","hasNonNewOrderItem","PagingComponent","countTextResource","pageLength","pageIndex","canPreviousPage","canNextPage","previousPage","nextPage","pluralize","ToastHelpers","toast","success","DeleteButtonComponent","disabled","title","AddButtonComponent","SyncButtonComponent","EditButtonComponent","ActionButtonComponent","InfoCirleButton","textInfo","tabIndex","ExportButton","enclosingCharacter","filename","fileName","defaultProps","DateRangeOptions","DateHelpers","date","timeZone","moment","tz","format","DefaultTimeZone","fromNow","nbOfSeconds","days","Math","trunc","NB_OF_SECONDS_IN_A_DAY","hours","NB_OF_SECONDS_IN_AN_HOUR","minutes","NB_OF_SECONDS_IN_A_MINUTE","seconds","dateTime","max","i18next","padStart","duration","val","trim","toLocaleDateString","month","day","time","isBefore","add","toDate","hourCycle","Intl","Locale","region","utc","DateRangeComponent","isCustom","setIsCustom","currentOption","setCurrentOption","startDate","setStartDate","endDate","setEndDate","onStartDateChange","useCallback","event","target","onEndDateChange","selectionOptions","useMemo","option","default","setDataBySelectedIndex","substring","style","map","Custom","setMinMax","onChange","min","areDateValid","onDateChange","selectedCustom","setStartEndOnClick","values","dateOption","startDateStr","setDate","getDate","Week","Month","setMonth","getMonth","toDateString","daysAdded","minEndDate","getFullYear","GlobalFilter","preGlobalFilteredRows","globalFilter","setGlobalFilter","setValue","useAsyncDebounce","placeholder","HubLocationComponent","formatToFit","online","locationStyle","formatStringToFit","minWidth","nbExtraLetterCanFit","floor","innerWidth","substr","trimEnd","LoadingComponent","loading","spin","size","NotifyLevelComponent","notifyLevel","StateBadgeComponent","getOrderStateStyle","UserTimeZone","DateTimeFormat","resolvedOptions","OrderIdColumnIndex","BadgeColumnIndex","CustomerInfoColumIndex","CustomerEmailColumnIndex","CustomerPhoneColumnIndex","HubColumnIndex","LockersColumnIndex","CreationDateColumnIndex","ReservationBlockNameColumnIndex","ReferenceNumberColumnIndex","TrackingNumbersColumnIndex","OrdersTableComponent","isLoading","tableProps","tableBodyProps","headerGroups","page","prepareRow","headerGroup","getHeaderGroupProps","column","getHeaderProps","render","key","colSpan","row","cells","h","findHub","original","customerInfo","stringIsNullOrEmpty","getRowProps","getCellProps","formatDateTime","trackingNumber","index","Fragment","DropdownState","setState","dropdown","setDropdown","ddRef","useRef","Dropdown","current","newState","hide","ref","show","OrdersPage","setLoading","setOrders","setHubs","roundAt5","getMinutes","setMinutes","startInit","endInit","currentStart","currentEnd","currentStartEnd","setCurrentStartEnd","currentState","setCurrentState","setPageSize","getHubs","refreshOrders","tableDataCSV","columnsTemp","Header","accessor","useTable","columns","tableData","orderLockers","getOrderLockers","flatMap","customer","creationDate","orderDate","reservationBlockName","tmp","HubName","OrderId","ReferenceNumber","CreationDate","State","FirstName","LastName","Phone","SiteId","micrositeId","Locker","updateTableOrdersData","initialState","useGlobalFilter","usePagination","getTableProps","getTableBodyProps","rows","pageOptions","orgId","getOrders","finally","MemberRoleTable","setEditMember","setMemberEdited","setIsNewUser","setMembers","filteredMembers","setFilteredMembers","refresh","unique","updateTableCustomersData","filterMembers","list","editMember","isNewUser","getMembers","InputComponent","labelText","getPlaceHolder","ev","regExp","onMsgErrorChanged","getMsgError","validate","required","autoFocus","autofocus","msgError","RegExPhone1","RegExPhone2","PhoneFormComponent","disable","valid","isValid","HubPermissionTable","setMember","setOrganization","element","updateHubsRoleData","changeMemberPermissions","currentPermission","mem","addMemberRole","err","updateMemberRole","getOrganizationById","checked","EditMember","editedMember","setEditingMember","chosenOrgId","setEmail","setFirstName","setLastName","setPermission","setPhoneNumber","newStatus","setNewStatus","exlanationHidden","setExlanationHidden","handleSelect","setFunc","display","Toggle","variant","Menu","Item","marginBottom","document","getElementById","requestMember","ourOrg","arr","createContributor","AutocompleteSearch","currSelection","setCurrSelection","onSelect","objId","marginTop","justifyContent","setter","AdminPage","editingMember","memberEdited","orgsItems","setOrgsItems","setChosenOrgId","orgsStringList","CustomersService","customerId","customersService","CustomersPage","customers","setCustomers","filteredCustomers","setFilteredCustomers","getCustomers","filterCustomers","CompartmentStates","HubHelpers","group","findGroup","compartments","c","number","nbCompartements","Set","compartment","packagingOptionsIds","hubState","isHubOnline","text","has","j","compartmentHasReservation","r","isOpened","Opened","isDeactivated","CompartmentSizeService","compartmentSizes","cs","compartmentSize","compartmentSizeService","PackagingOptionService","packagingOptions","packagingOption","packagingOptionService","YesNoComponent","yesButtonClass","isDangerousChoice","headerMsg","children","onYesClick","onNoClick","CancelReservationMsgomponent","PaymentState","PaymentService","cardPaymentRequest","idempotencyKey","uuidv4","timeoutId","setTimeout","getOrderById","orderToken","Success","Timeout","clearTimeout","pricing","payment","paymentId","paymentService","OrderHistory","createdOn","createBy","getActivityDescription","OrderPaymentInformation","cost","formatPrice","saleTaxTotal","currency","isRefundedOrder","canRefundOrder","cardLastFour","cardBrand","cardExpirationMonth","cardExpirationYear","String","OrderGeneral","isOrgContributor","carrierName","toLowerCase","OrderCustomer","customerInfoHtml","hasCustomerContactInformation","canSendNotification","isFirstTimeNotification","onSendNotification","dangerouslySetInnerHTML","__html","DoorOpeningGifComponent","DoorOpenedComponent","OpenDoorComponent","displayIcon","NoReservationComponent","textAlign","canCreateReservation","itemIdInOpening","isOneGroupsOnline","editable","canCancelReservation","hasOpening","isAnyReservationOpened","isReturn","ReadyForPickUp","isGroupOnline","showAddOrderItemTrackingNumberInput","inputContainer","btn","hidden","input","getElementsByTagName","focus","OrderReservation","isAdmin","isCarriedByCarrier","onRefresh","onTrackingNumberDelete","onCreateReservation","onOrderItemDelete","openDoor","oi","inOpenedState","isCarrierOrder","sliceReservationDatesNumber","codeToDisplay","pickupCode","dropoffCode","notifyText","dropOffTime","since","timeSince","inOpening","isTrackingNumberDisabled","trackingNumbersEditable","openAvailable","PackagingReadyForPickUp","opened","lockernumb","maxWidth","track","onSubmit","preventDefault","currentTarget","addTrackingNumber","onBlur","onKeyDown","trackingNumberInput","onTabKeyDownToAddTrackingNumber","slice","currentOrder","match","updateOrderItem","OrderRequestOrganizationAddressModal","onRequiredAddressMessageChange","requestCarrierPickup","setStreetNumber","setStreet","setCity","setPostalCode","updateOrganization","saveAddressAndSend","OrderPage","useParams","setOrder","setHub","setCompatmentSizes","isEdit","setIsEdit","selectSizeDisabled","setSelectSizeDisabled","msgEditError","setMsgEditError","setPackagingOption","isCancelOrder","setIsCancelOrder","isCancelReservation","setIsCancelReservation","setItemIdInOpening","setIsCarriedByCarrier","isRequestingCarrierPickup","setIsRequestingCarrierPickup","isCancellingCarrierPickup","setIsCancellingCarrierPickup","isCarrierPickupRequested","setIsCarrierPickupRequested","setCanSendNotification","isSendingNotification","setIsSendingNotification","setIsReturn","labelBlob","setLabelBlob","isRequiresAddressMessage","setIsRequiresAddressMessage","isDeleteTrackingNumber","setIsDeleteTrackingNumber","isCompleteOrder","setIsCompleteOrder","setIsPersonalStorage","isRequestingRefund","setIsRequestingRefund","setPayment","itemHeight","setItemHeight","itemWidth","setItemWidth","itemDepth","setItemDepth","itemWeight","setItemWeight","setOrderItemId","setTrackingNumber","setIsAdmin","setIsOrgContributor","isOrganizationAdmin","getPackagingOptions","getHubById","getCompartmentSizes","compartmentSizeIdsOfHub","getCompartmentSizeIds","compartmentSizesOfHub","po","refreshInterval","setInterval","clearInterval","canRequestCarrierPickup","requiresAddress","listInfo","refId","join","canCompleteOrder","Boolean","reservationState","deletOrderItem","canCancelCarrierPickup","download","URL","createObjectURL","link","createElement","href","setAttribute","body","appendChild","click","parentNode","removeChild","getAsset","downloadLabelPdf","canDeleteOrder","cancelEdit","createReservation","addItem","cancelOrder","CompleteOrder","removeTrackingNumber","refundOrder","cancelCarrierPickup","sendReadyForPickupNotification","sendNotification","openDoorForCancellation","createOrderItem","completeBopilOrder","getOrderItem","tracking","refundPayment","Number","parseFloat","valueOf","cSize","cancelOrderItem","deleteOrderItem","OrganizationsPage","changeActiveOrganization","associatedOrganization","stopPropagation","WaitingComponent","ApprobationComponent","OrganizationPage","setActiveOrganization","organizationName","setOrganizationName","streetNumberError","setStreetNumberError","setCountry","isStringOnlyNumbers","associatedHub","FirstNameComponent","maxLength","LastNameComponent","MemberPage","setFirstname","setLastname","setPhone","setPhoneExtension","phoneError","setPhoneError","firstnameError","setFirstnameError","lastnameError","setLastnameError","newMember","updateMemberMe","refreshMe","save","isValidPhone","me","CreateOrderPage","searchResultCount","setCarriers","setPackagingOptions","packagingOptionsAvailable","setPackagingOptionsAvailable","customerSearchText","setCustomerSearchText","customerSelectedEmail","setCustomerSelectedEmail","setReferenceId","step","setStep","selectExistingCustomer","setSelectExistingCustomer","setHubId","setFistname","emailError","setEmailError","isCreating","setIsCreating","setPackagingOptionId","setCarrierId","nocarrier","hubAssociations","o","hubsFiltered","ha","onHubSelected","onCustomerSearchTextChanged","onSelectCustomerSelected","htmlFor","getEmailRegExp","onPackagingOptionSelected","onCarrierSelected","carrier","packagingId","newCarrierId","tmpFirstname","tmpLastname","tmpEmail","tmpPhoneNumber","customerSelected","Return","Deliver","createOrder","persist","listFiltered","searchMatch","search","startsWith","from","getPackagingOptiponIds","options","NoConnectionPage","location","reload","DelayCompoment","waitBeforeShow","isShown","setIsShown","CreateCustomerPage","setUnit","createCustomer","lowerCaseEmail","EditCustomerPage","user","setCustomer","isDeletedCustomer","setIsDeletedCustomer","getCustomer","deleteCustomer","canEdit","editCustomer","membersService","newCustomer","updateCustomer","MicrositeHelpers","rb","dateNow","availableStart","availableEnd","rb1","rb2","reservationBlockIsPassed","reservationBlockIsAvailable","startOn","MicrositeService","reservationBlocks","reservationBlock","result","reservationBlockId","MicrositeId","Id","createPayment","code","allowOffline","hubIds","eventId","micrositeService","PricePerHour","PricePerMinute","MinimalPrice","CodeType","ResetTime","EventCard","reserve","canShowCreateReservation","until","priceFormatted","price","saleTaxRate","showCreateReservation","pricePerHour","meta","pricePerMinute","resetTime","resetTimeDate","getNextDayWithTime","isSwych","logoUrl","Trans","i18nKey","getDay","formatTime","formatDuration","minimalPrice","minimalPriceFormatted","MicroSitePage","setNoConnection","setMicrosite","setReservationBlocks","getMicrosite","reserveUrl","TimerComponent","timeInSeconds","onTimerEnds","counter","setCounter","timer","formatNumberToTimeLeftString","dateTimeFormat","ChargeState","CardPaymentRequest","PayNow","PaymentFormSquare","locationId","paynow","minPrice","card","setCard","EnteringData","Square","ChargeTimeout","initializeCard","ChargeInProgress","pay","statusContainer","visibility","_card","container","innerHTML","attach","clearPaymentResults","classList","remove","tokenize","displayPaymentResultsSquare","ChargeError","paymentMethod","CARD_ELEMENT_OPTIONS","base","fontFamily","fontSmoothing","fontSize","invalid","iconColor","PaymentFormStripe","stripe","useStripe","elements","useElements","setMessage","errorMessage","createPaymentMethod","getElement","CardElement","PaymentForm","paymentIntent","hasPayment","stripePromise","setStripePromise","providerType","loadStripe","stripeOptions","appearance","theme","ReserveLockerPage","setReservationBlock","timeUntilExpired","setTimeUntilExpired","setPaymentIntent","createPaymentIntent","getTimeUntilExpired","parseInt","formatNumber","reservationBlockIsFree","untilStart","rel","PlacerholderComponent","ready","RequestState","useMyHubs","onErrorNotificationMessage","Loading","requestState","setRequestState","setError","getMyHubs","Failure","HubsPage","GetCompartmentCount","useMyHub","OpeningAllDoorsState","getMyHubById","HubCompartmentDetail","onClose","setInOpening","setIsLocketgoHubAdmin","isHubAdmin","setIsHubAdmin","g","doornumber","isHubContributor","activateLockerReservation","deactivateLockerReservation","toggleDoor","HubLegend","HubOpenAllDoor","Question","Opening","Finished","openAllDoors","delayReset","Promise","AddressDetailComponent","intialDetail","detail","setDetail","curValue","HubStateInformation","roundValue","cpuTemperature","cpuPercentage","round","memUsed","memTotal","memUsedPercentage","diskUsed","diskTotal","diskUsedPercentage","numberOfDigits","toFixed","Side","DropdownSide","Front","newSide","LockComponent","onCompartmentSelected","parse","compartmentName","compartmentHeight","kioskSize","position","kioskHeight","showObjectDetected","opacity","isObjectDetected","useCompartmentSizes","HubPage","selectedGroupId","setSelectedGroupId","selectedCompartmentNumber","setSelectedCompartmentNumber","selectedSide","setSelectedSide","showOpenAllDoors","setShowOpenAllDoors","isActivateAllDoors","setIsActivateAllDoors","isDeactivateAllDoors","setIsDeactivateAllDoors","selectedReservation","activateAllDoors","deactivateAllDoors","activateAllLockers","deactivateAllLockers","LockerSingleReservationMessageComponent","firstOrder","firstReservation","firstHub","askOpenDoor","startTime","endTime","isCompleted","isNotStarted","reservationTimeLeftBeforeStart","LockerMultipleReservationsMessageComponent","reservationInOpening","reservationIsActive","compartmentSizeName","helpLink","hubName","reservationTimeLeft","MyReservationsPage","setIsLoading","myReservations","setMyReservations","setReservationInOpening","setCompartmentSizes","setFirstOrder","setFirstReservation","isFirstReservationStarted","setIsFirstReservationStarted","setReservationTimeLeft","isAskingReservationEnd","setIsAskingReservationEnd","endPricing","setEndPricing","setPayments","getEndNowPricing","getMyReservations","getPayment","firstOrderTmp","setMyReservationState","isStarted","milisecondsLeft","setValues","isSingleReservation","firstReservationBlock","firstCurrency","payed","isCompartmentOnline","onYesClickOpenDoor","endReservation","en","fr","getAddress","toHourString","myReservation","curReservations","micrositeLogoUrl","endOrder","endReservationEarly","firstReservationTmp","OrderExpiredPage","AnalyticService","dashboard","analyticService","HubStatsComponent","hubUsages","hubCount","groupCount","reduce","prev","next","used","total","hubUsage","percentage","progressStyle","ChartLine","labels","datasets","fill","backgroundColor","borderColor","borderWidth","tension","plugins","legend","point","radius","interaction","intersect","scales","x","grid","drawTicks","y","beginAtZero","OrderStatsTable","resSum","confirmedSum","totalCadSum","totalUSSum","elem","countPaid","amountGross","Name","Reservations","Confirmed","dif","exportFileName","kpi","EventStatsTable","datas","m","dataA","d","dataB","startOnA","startOnB","translatedName","DashboardPage","setModel","refreshOn","dateStringExport","formatDateEightChar","hasEvents","events","hasOrgs","organizations","hasHubs","timeline","getDashboard","MicrositesPage","setMicrosites","currentOrganization","setCurrentOrganization","useHubs","isHubsLoading","MemberExtensions","EventsTable","isOrgAdmin","MicrositeZones","matchingHubs","EventsPage","setIsOrgAdmin","refreshEvents","getMemberRoleOrganization","compareReservationBlocks","MicrositeDropdown","setTargetMicrosite","micrositesList","targetMicrosite","selectedMicrosite","selected","NumberDropDown","onchange","EventPage","micrositeCompartmentSizes","setMicrositeCompartmentSizes","setCurrency","currEventId","setCurrEventId","isDeleteReservationBlock","setIsDeleteReservationBlock","eventAlreadyStarted","setEventAlreadyStarted","nameFrError","setNameFrError","nameEnError","setNameEnError","priceError","setPriceError","saleTaxRateError","setSaleTaxError","availableStartError","setAvailableStartError","availableEndError","setAvailableEndError","endOnError","setEndOnError","startOnError","setStartOnError","nameFr","setNameFr","nameEn","setNameEn","descriptionFr","setDescriptionFr","descriptionEn","setDescriptionEn","setLogoUrl","setPrice","setPricePerHour","setPricePerMinute","setMinimalPrice","setSaleTaxRate","setStartOn","setAvailableStart","setAvailableEnd","endOn","setEndOn","setSizeId","codeType","setCodeType","setResetTime","Duration","setEventType","durationError","setDurationError","durationDays","setDurationDays","durationHours","setDurationHours","durationMinutes","setDurationMinutes","isPricedPerHour","setIsPricedPerHour","isPricedPerMinute","setIsPricedPerMinute","isFixedPeriod","setIsFixedPeriod","dateTimeNow","getMicrositeSizesIds","tmpCompartmentSizes","Hours_Minutes","StartEnd","deleteReservationBlock","onNameChange","parsedValue","isValidSaleTax","onSaleTaxChange","onEventTypeChange","onChangeIsPricedPerHour","onChangeIsPricedPerMinute","onPriceChange","onDurationChange","onFixedPeriod","onAvailableStartChange","onAvailableEndChange","availableEndValue","availableStartValue","startOnValue","lockerSize","isCodeSpecified","durationInMilisec","toApiDate","Description","LogoUrl","Price","SaleTaxRate","StartOn","AvailableStart","AvailableEnd","SizeId","CodeSpecified","Meta","createReservationBlock","createEvent","updateReservationBlock","updateEvent","createOrUpdateReservationBlock","isNaN","isDurationValid","isValidData","flexDirection","marginRight","marginLeft","prefix","select","selectedIndex","EmailFormComponent","ContributorReserveLockerPage","organisationId","setOrganisationId","setReferenceNumber","setCode","codeError","setCodeError","codeSpecified","CreateOrder","RelocatePage","itemId","currentCompartmentSize","setCurrentCompartmentSize","compartmentState","setCompartmentState","setReservation","availableSizeIds","setAvailableSizeIds","isUpdating","setIsUpdating","currentCompartment","findCompartment","getAvailableCompartmentSizeIds","compartmentSizeIds","compartmentSizeIdsOfHubsCandidates","compartmentSizesOfHubs","relocateLocker","relocateReservation","EventSalesReport","nbLockers","nbLockersSold","grossRevenue","fees","EventSettlementReportPage","isMicrositeLoading","useMicrosite","salesReport","setSalesReport","lockerSold","setLockerSold","netRevenue","setNetRevenue","feesPerOrder","setFeesPerOrder","getEventOrders","micrositeHubs","sr","array","indexOf","generateSalesFromOrders","feesOrder","paymentOrder","order_date","locker_price","locker","sale_tax_rate","Fees","generateSalesReportData","HubActivitiesPage","setActivities","setActivitiesMutiplier","pagingIndex","setPagingIndex","hubActivity","createdBy","updateTableActivitiesData","multiplier","getHubActivities","ReserveLockerSignInPage","isEmail","setIsEmail","setOrderId","linkSent","setLinkSent","resendNotificationTimeout","getReservationBlockById","resendNotification","newEmail","newPhone","EmailLink","subject","mailtoLink","encodeURIComponent","HomeNotRegisteredPage","components","AdminService","micrositeIdState","countryCode","adminService","HubInclusionTable","setHubsIds","currentHubs","selectedOptions","setSelectedOptions","initialSelections","newHubs","handleOptionChange","MicrositeAdminPage","chosenOrg","setMicrositeIdState","setCountryCode","micrositeData","nameMap","fetchMicrosite","handleSubmit","createMicrosite","updateMicrosite","handleDelete","deleteMicrosite","CreateOrganizationPage","phoneExtentionError","setPhoneExtensionError","orgName","setOrgName","orgAddressStreetNumber","setOrgAddressStreetNumber","orgAddressStreet","setOrgAddressStreet","orgAddressCity","setOrgAddressCity","orgAddressPostalCode","setOrgAddressPostalCode","orgAddressState","setOrgAddressState","orgAddressCountry","setOrgAddressCountry","orgAssociatedHubs","setOrgAssociatedHubs","optsNextMarchantOrg","optsNextMarchantMember","onPreviousStep","onNextStep","onHubSelectionChange","createOrganization","newLocations","findIndex","splice","browserHistory","createBrowserHistory","basename","reactPlugin","ReactPlugin","ApplicationInsights","config","instrumentationKey","extensions","extensionConfig","identifier","loadAppInsights","withRouter","isSquareLoaded","setSquareLoaded","setLanguage","delayExpired","setDelayExpired","noConnection","i18n","isMicrosite","pathname","autologinRedirectUri","removeItem","interval","sqPaymentScript","async","onload","isConcierge","exact","path","newLanguage","temp","newActiveOrganization","reportWebVitals","onPerfEntry","Function","getCLS","getFID","getFCP","getLCP","getTTFB","use","Backend","initReactI18next","init","fallbackLng","interpolation","escapeValue","AppLoadingComponent","library","faBox","faUser","faUsers","faPlus","faMapMarkerAlt","faPen","faTrashAlt","faAngleDown","faAngleUp","faCircle","faLock","faLockOpen","faCog","faSearch","faSpinner","faAngleLeft","faAngleRight","faAngleDoubleLeft","faAngleDoubleRight","faCheckCircle","faClock","faMinusCircle","faInfo","faExclamationTriangle","faBars","faSync","faSquare","faSquareRegular","faGlobe","faInfoCircle","faEdit","faUserLock","faPaperPlane","faBan","faBell","faFileExport","faCreditCard","faTag","faFileInvoiceDollar","faExternalLinkSquareAlt","faArrowLeft","faCube","locale","months","monthsShort","monthsParseExact","weekdays","weekdaysShort","weekdaysMin","weekdaysParseExact","longDateFormat","LT","LTS","L","LL","LLL","LLLL","calendar","sameDay","nextDay","nextWeek","lastDay","lastWeek","sameElse","relativeTime","future","past","s","mm","hh","dd","M","MM","yy","dayOfMonthOrdinalParse","ordinal","meridiemParse","isPM","charAt","meridiem","isLower","week","dow","doy","createRoot","fallback","StrictMode","instance"],"mappings":"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","file":"static/js/main.ac225658.chunk.js","sourcesContent":["import whiteLogo from \"./LOCKETGO_LOGO_RVB-Blanc.svg\";\r\nimport blackLogo from \"./LOCKETGO_LOGO_RVB-Noir.svg\";\r\nimport blueLogo from \"./LOCKETGO_LOGO_RVB-Bleu.svg\";\r\n\r\nexport enum AssetColors {\r\n Blue,\r\n Black,\r\n White,\r\n}\r\n\r\nexport default function GetLocketgoLogoSource(assetColor: AssetColors): string | undefined {\r\n let color = undefined;\r\n switch (assetColor) {\r\n case AssetColors.Black:\r\n color = blackLogo;\r\n break;\r\n case AssetColors.White:\r\n color = whiteLogo;\r\n break;\r\n case AssetColors.Blue:\r\n color = blueLogo;\r\n break;\r\n }\r\n return color;\r\n}\r\n","export default __webpack_public_path__ + \"static/media/LOCKETGO_LOGO_RVB-Blanc.c45760c3.svg\";","export default __webpack_public_path__ + \"static/media/LOCKETGO_LOGO_RVB-Noir.ecef7a0e.svg\";","export default __webpack_public_path__ + \"static/media/LOCKETGO_LOGO_RVB-Bleu.6dde3a9e.svg\";","import axios from \"axios\";\r\nimport authService from \"./auth/auth-service\";\r\n\r\nexport default class ServicesApiBaseService {\r\n apiUrl: string | undefined = process.env.REACT_APP_SERVICESAPI_URL;\r\n\r\n async getFile(url: string): Promise<Blob | undefined> {\r\n const response = await axios.get<Blob>(url, { ...(await this.getHttpConfig()), responseType: \"blob\" }).catch((error) => {\r\n return this.handleError(\"GET\", url, error);\r\n });\r\n return response?.data;\r\n }\r\n\r\n async getObject<T>(url: string): Promise<T | undefined> {\r\n const response = await axios.get<T>(url, await this.getHttpConfig()).catch((error) => {\r\n return this.handleError(\"GET\", url, error);\r\n });\r\n return response?.data;\r\n }\r\n\r\n async postObject<Tin, Tout>(url: string, data: Tin): Promise<Tout | undefined> {\r\n const response = await axios.post<Tout>(url, data, await this.getHttpConfig()).catch((error) => {\r\n return this.handleError(\"POST\", url, error);\r\n });\r\n return response?.data;\r\n }\r\n\r\n async deleteObject<Tout>(url: string): Promise<Tout | undefined> {\r\n const response = await axios.delete<Tout>(url, await this.getHttpConfig()).catch((error) => {\r\n return this.handleError(\"DELETE\", url, error);\r\n });\r\n return response?.data;\r\n }\r\n\r\n async putObject<Tin>(url: string, data: Tin): Promise<void> {\r\n await axios.put<Tin>(url, data, await this.getHttpConfig()).catch((error) => {\r\n return this.handleError(\"PUT\", url, error);\r\n });\r\n }\r\n\r\n protected async getHttpConfig() {\r\n return {\r\n headers: { Authorization: `Bearer ${await authService.getAccessToken()}` },\r\n };\r\n }\r\n\r\n private handleError(method: string, url: string, error: any) {\r\n if (error.response) {\r\n if (error.response.status === 404) {\r\n return undefined;\r\n }\r\n\r\n console.error(`${method} ${url} error ${error.response.status} : '${error.response.statusText}'`);\r\n } else if (error.message) {\r\n console.error(`${method} ${url} error ${error.message}`);\r\n } else {\r\n console.error(`${method} ${url} unkown error`, error);\r\n }\r\n\r\n throw error;\r\n }\r\n}\r\n","import ServicesApiBaseService from \"../services-api-base-service\";\r\nimport Member from \"./member\";\r\nimport { MyReservations } from \"./my-reservations\";\r\n\r\nclass MemberService extends ServicesApiBaseService {\r\n async getMemberMe(): Promise<Member | undefined> {\r\n return await this.getObject<Member>(`${this.apiUrl}/members/me`);\r\n }\r\n\r\n async getMembers(organizationId: String): Promise<Array<Member>> {\r\n const members = await this.getObject<Array<Member>>(`${this.apiUrl}/admin/get-all-members?organizationId=${organizationId}`);\r\n return members || [];\r\n }\r\n\r\n async createMember(member: Member): Promise<Member | undefined> {\r\n return await this.postObject<Member, Member>(`${this.apiUrl}/members/me`, member);\r\n }\r\n\r\n async createContributor(member: Member): Promise<Member | undefined> {\r\n return await this.postObject<Member, Member>(`${this.apiUrl}/admin/create-member`, member);\r\n }\r\n\r\n async updateMemberMe(member: Member): Promise<void> {\r\n await this.putObject<Member>(`${this.apiUrl}/members/me`, member);\r\n }\r\n\r\n async addMemberRole(email: String, entityId: String, permission: String, entityType: String): Promise<any> {\r\n var res = await this.postObject<any, any>(`${this.apiUrl}/admin/add-member-role`, {\r\n status: \"Active\",\r\n email: email,\r\n entityId: entityId,\r\n permission: permission,\r\n entityType: entityType,\r\n });\r\n return res;\r\n }\r\n\r\n async updateMemberRole(email: String, entityId: String, permission: String, entityType: String, status: String): Promise<any> {\r\n var res = await this.postObject<any, any>(`${this.apiUrl}/admin/change-member-role`, {\r\n Active: status === \"Active\",\r\n Email: email,\r\n EntityId: entityId,\r\n Permission: permission,\r\n EntityType: entityType,\r\n });\r\n return res;\r\n }\r\n\r\n isLocketgoAdmin(member: Member | null): boolean {\r\n if (!member) {\r\n return false;\r\n }\r\n\r\n for (let i = 0; i < member.associatedHubs?.length; i++) {\r\n if (member.associatedHubs[i].roles.includes(\"LocketgoAdmin\")) {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n isLocketgoHubAdmin(member: Member | null): boolean {\r\n if (!member) {\r\n return false;\r\n }\r\n\r\n for (let i = 0; i < member.associatedHubs?.length; i++) {\r\n if (member.associatedHubs[i].roles.includes(\"LocketgoHubAdmin\") || member.associatedHubs[i].roles.includes(\"LocketgoAdmin\")) {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n isOrganizationAdmin(member: Member | null, organizationId: string | undefined): boolean {\r\n if (this.isLocketgoAdmin(member)) {\r\n return true;\r\n }\r\n\r\n if (!member || !organizationId || organizationId === undefined) {\r\n return false;\r\n }\r\n\r\n const organisation = member.associatedOrganizations.find((org) => org.entity?.id === organizationId);\r\n\r\n if (organisation) {\r\n if (organisation.roles.includes(\"Admin\") && organisation.entity?.id === organizationId) {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n isOrganizationContributor(member: Member | null, organizationId?: string | undefined): boolean {\r\n if (this.isLocketgoAdmin(member)) {\r\n return true;\r\n }\r\n\r\n if (!member) {\r\n return false;\r\n }\r\n\r\n if (!organizationId || organizationId === undefined) {\r\n for (let i = 0; i < member.associatedOrganizations?.length; i++) {\r\n if (member.associatedOrganizations[i].roles.some((role) => role === \"Contributor\" || role === \"Admin\")) {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n for (let i = 0; i < member.associatedOrganizations?.length; i++) {\r\n const associated = member.associatedOrganizations[i];\r\n\r\n if (associated.entity?.id !== organizationId) {\r\n continue;\r\n }\r\n\r\n if (associated.roles.includes(\"Admin\") || associated.roles.includes(\"Contributor\")) {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n isConcierge(member: Member | null): boolean {\r\n if (!member) return false;\r\n\r\n for (let i = 0; i < member.associatedHubs?.length; i++) {\r\n if (member.associatedHubs[i].roles.includes(\"Concierge\")) {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n isHubContributor(member: Member | null, hubId?: string | undefined): boolean {\r\n if (this.isLocketgoAdmin(member) || this.isLocketgoHubAdmin(member)) {\r\n return true;\r\n }\r\n\r\n if (!member) {\r\n return false;\r\n }\r\n\r\n if (!hubId || hubId === undefined) {\r\n for (let i = 0; i < member.associatedHubs?.length; i++) {\r\n if (\r\n member.associatedHubs[i].roles.some(\r\n (role) => role === \"Contributor\" || role === \"Admin\" || role === \"LocketgoAdmin\" || role === \"LocketgoHubAdmin\"\r\n )\r\n ) {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n for (let i = 0; i < member.associatedHubs?.length; i++) {\r\n if (member.associatedHubs[i].entity?.id !== hubId) {\r\n continue;\r\n }\r\n\r\n if (\r\n member.associatedHubs[i].roles.some(\r\n (role) => role === \"Contributor\" || role === \"Admin\" || role === \"LocketgoAdmin\" || role === \"LocketgoHubAdmin\"\r\n )\r\n ) {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n async getMyReservations(token: string | null): Promise<MyReservations | undefined> {\r\n if (token) {\r\n return await this.getObject<MyReservations>(`${this.apiUrl}/members/me/my-reservations?token=${token}`);\r\n }\r\n\r\n return await this.getObject<MyReservations>(`${this.apiUrl}/members/me/my-reservations`);\r\n }\r\n}\r\n\r\nconst memberService = new MemberService();\r\nexport default memberService;\r\n","import StringHelpers from \"../core/string-helpers\";\r\nimport MemberRoleHub from \"./member-role-hub\";\r\nimport MemberRoleOrganization from \"./member-role-organization\";\r\n\r\nexport default class Member {\r\n id: string = \"\";\r\n type: string = \"User\";\r\n referenceId: string = \"\";\r\n firstname: string = \"\";\r\n lastname: string = \"\";\r\n\r\n streetNumber: string = \"\";\r\n street: string = \"\";\r\n city: string = \"\";\r\n state: string = \"\";\r\n country: string = \"\";\r\n postalCode: string = \"\";\r\n unit: string = \"\";\r\n\r\n phone: string = \"\";\r\n phoneExtension: number | undefined;\r\n email: string = \"\";\r\n\r\n externalId: string = \"\";\r\n active: boolean = true;\r\n\r\n features: Array<string> = new Array<string>();\r\n\r\n associatedOrganizations: Array<MemberRoleOrganization> = [];\r\n associatedHubs: Array<MemberRoleHub> = [];\r\n}\r\n","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n\r\nimport { Configuration, LogLevel } from \"@azure/msal-browser\";\r\n\r\nconst AzureActiveDirectoryAppClientId: any = process.env.REACT_APP_ADB2C_CLIENT_ID;\r\n\r\nconst AzureActiveDirectoryKnownAuthorities: any = process.env.REACT_APP_ADB2C_KNOWN_AUTHORITIES;\r\n\r\nconst AzureActiveDirectoryScopes: any = process.env.REACT_APP_ADB2C_LOGIN_SCOPES;\r\n\r\n/**\r\n * Configuration object to be passed to MSAL instance on creation.\r\n * For a full list of MSAL.js configuration parameters, visit:\r\n * https://github.com/AzureAD/microsoft-authentication-library-for-js/blob/dev/lib/msal-browser/docs/configuration.md\r\n */\r\nexport const msalConfig: Configuration = {\r\n auth: {\r\n clientId: AzureActiveDirectoryAppClientId,\r\n authority: process.env.REACT_APP_ADB2C_AUTHORITY,\r\n knownAuthorities: AzureActiveDirectoryKnownAuthorities.split(\",\"),\r\n redirectUri: process.env.REACT_APP_ADB2C_REDIRECT_URI,\r\n postLogoutRedirectUri: process.env.REACT_APP_ADB2C_POST_LOGOUT_REDIRECT_URI,\r\n },\r\n cache: {\r\n cacheLocation: \"sessionStorage\", // This configures where your cache will be stored\r\n storeAuthStateInCookie: false, // Set this to \"true\" if you are having issues on IE11 or Edge\r\n },\r\n system: {\r\n loggerOptions: {\r\n loggerCallback: (level, message, containsPii) => {\r\n if (containsPii) {\r\n return;\r\n }\r\n switch (level) {\r\n case LogLevel.Error:\r\n console.error(message);\r\n return;\r\n case LogLevel.Info:\r\n console.info(message);\r\n return;\r\n case LogLevel.Verbose:\r\n console.debug(message);\r\n return;\r\n case LogLevel.Warning:\r\n console.warn(message);\r\n return;\r\n }\r\n },\r\n },\r\n },\r\n};\r\n\r\n/**\r\n * Scopes you add here will be prompted for user consent during sign-in.\r\n * By default, MSAL.js will add OIDC scopes (openid, profile, email) to any login request.\r\n * For more information about OIDC scopes, visit:\r\n * https://docs.microsoft.com/en-us/azure/active-directory/develop/v2-permissions-and-consent#openid-connect-scopes\r\n */\r\nexport const loginRequest = {\r\n scopes: AzureActiveDirectoryScopes.split(\",\"),\r\n};\r\n\r\nexport const policyNames = {\r\n signUpSignIn: process.env.REACT_APP_ADB2C_SIGNUP_SIGNIN_POLICY,\r\n};\r\n\r\nexport const acquireTokenRequest = {\r\n scopes: AzureActiveDirectoryScopes.split(\",\"),\r\n};\r\n","import { PublicClientApplication } from \"@azure/msal-browser\";\r\nimport { msalConfig } from \"./authConfig\";\r\n\r\n/**\r\n * Initialize a PublicClientApplication instance which is provided to the MsalProvider component\r\n * We recommend initializing this outside of your root component to ensure it is not re-initialized on re-renders\r\n */\r\nconst msalInstance = new PublicClientApplication(msalConfig);\r\nexport default msalInstance;\r\n","import { AccountInfo, AuthenticationResult, EventType, InteractionType } from \"@azure/msal-browser\";\r\nimport { acquireTokenRequest, loginRequest } from \"./authConfig\";\r\nimport msalInstance from \"./msal-instance\";\r\n\r\nclass MsalService {\r\n public registerCallback(callback: any) {\r\n msalInstance.addEventCallback((message) => {\r\n if (message.eventType === EventType.LOGIN_SUCCESS || message.eventType === EventType.ACQUIRE_TOKEN_SUCCESS) {\r\n if (message.interactionType === InteractionType.Redirect) {\r\n callback();\r\n }\r\n }\r\n });\r\n }\r\n\r\n public async getToken(): Promise<AuthenticationResult | null> {\r\n const account = this.getAccount();\r\n if (!account) {\r\n return null;\r\n }\r\n\r\n const request = {\r\n ...acquireTokenRequest,\r\n account: account,\r\n };\r\n try {\r\n return await msalInstance.acquireTokenSilent(request);\r\n } catch (error) {\r\n console.error(`Error while acquiring token: ${error}`);\r\n msalInstance.acquireTokenRedirect(request);\r\n return null;\r\n }\r\n }\r\n\r\n public getAccount(): AccountInfo | null {\r\n const accounts = msalInstance.getAllAccounts();\r\n if (accounts && accounts.length > 0) {\r\n return accounts[0];\r\n }\r\n return null;\r\n }\r\n\r\n public async login(loginType: string) {\r\n if (loginType === \"popup\") {\r\n await msalInstance.loginPopup(loginRequest).catch((e) => {\r\n console.error(e);\r\n });\r\n } else if (loginType === \"redirect\") {\r\n await msalInstance.loginRedirect(loginRequest).catch((e) => {\r\n console.error(e);\r\n });\r\n }\r\n }\r\n\r\n public async logout(logoutType: string): Promise<void> {\r\n if (logoutType === \"popup\") {\r\n await msalInstance.logoutPopup({\r\n postLogoutRedirectUri: \"/\",\r\n });\r\n } else if (logoutType === \"redirect\") {\r\n await msalInstance.logoutRedirect({\r\n postLogoutRedirectUri: \"/\",\r\n });\r\n }\r\n }\r\n}\r\n\r\nconst msalService = new MsalService();\r\nexport default msalService;\r\n","import Member from \"../member/member\";\r\n\r\nexport default class LoginResponse {\r\n member: Member | null = null;\r\n error: boolean = false;\r\n}\r\n","export default class StringHelpers {\r\n static pluralize(count: number, textSingular: string): string {\r\n return textSingular + (count > 1 ? \"s\" : \"\");\r\n }\r\n\r\n static getFullName(firstname: string | undefined, lastname: string | undefined): string {\r\n if (firstname && lastname) {\r\n return firstname + \" \" + lastname;\r\n }\r\n\r\n if (firstname) {\r\n return firstname;\r\n }\r\n\r\n if (lastname) {\r\n return lastname;\r\n }\r\n return \"\";\r\n }\r\n\r\n static isStringOnlyNumbers(stringToVerify: string): boolean {\r\n let regexp = new RegExp(\"^[0-9]*$\"),\r\n test = regexp.test(stringToVerify);\r\n \r\n return test;\r\n } \r\n\r\n static getEmailRegExp(): RegExp {\r\n // eslint-disable-next-line\r\n return /^(?:[a-zA-Z0-9.!#$%&'*+\\=?^_`{|}~-]+)(?:[\\.a-zA-Z0-9!#$%&'*+\\=?^_`{|}~-]*)@(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?\\.)+[a-zA-Z0-9]+$/;\r\n }\r\n\r\n static formatNumber(value: number, digits: number): string {\r\n return value.toLocaleString(\"en-US\", {\r\n minimumFractionDigits: 0,\r\n maximumFractionDigits: digits,\r\n useGrouping: false,\r\n });\r\n }\r\n\r\n static formatPrice(amount: number, digits: number = 2): string {\r\n return amount.toLocaleString(\"en-US\", {\r\n minimumFractionDigits: digits,\r\n maximumFractionDigits: digits,\r\n useGrouping: true,\r\n });\r\n }\r\n}\r\n","import memberService from \"../member/member-service\";\r\nimport Member from \"../member/member\";\r\nimport msalService from \"./msal-service\";\r\nimport LoginResponse from \"./login-response\";\r\nimport StringHelpers from \"../core/string-helpers\";\r\n\r\nclass AuthService {\r\n token: string | null = null;\r\n tokenExpiresOn: Date | null = null;\r\n\r\n public registerCallback(callback: any) {\r\n msalService.registerCallback(callback);\r\n }\r\n\r\n public async autoLogin(): Promise<LoginResponse> {\r\n var response = new LoginResponse();\r\n\r\n const msalAccount = msalService.getAccount();\r\n if (!msalAccount) {\r\n console.log(\"autoLogin() --> No MSAL Account\");\r\n return response;\r\n }\r\n // console.log(\"AuthService.autoLogin msalAccount\", msalAccount);\r\n\r\n const tokenResult = await msalService.getToken();\r\n // console.log(\"tokenResult\", tokenResult);\r\n if (!tokenResult || !tokenResult.accessToken) {\r\n console.log(\"AuthService.autoLogin() --> No token\");\r\n return response;\r\n }\r\n\r\n try {\r\n let account = await memberService.getMemberMe();\r\n //console.log(\"AuthService.autoLogin() --> Account\", account);\r\n if (!account) {\r\n account = new Member();\r\n account.email = msalAccount.username;\r\n account = await this.createMember(msalAccount.username);\r\n }\r\n\r\n if (account) {\r\n account.externalId = msalAccount.localAccountId;\r\n console.log(\r\n `AuthService.autoLogin() --> ${account.email}/${account.externalId} [${StringHelpers.getFullName(\r\n account.firstname,\r\n account.lastname\r\n )}]}`\r\n );\r\n }\r\n\r\n response.member = account || null;\r\n } catch (error) {\r\n console.error(\"autoLogin error\", error);\r\n response.error = true;\r\n }\r\n\r\n return response;\r\n }\r\n\r\n public async login(): Promise<LoginResponse> {\r\n await msalService.login(process.env.REACT_APP_ADB2C_LOGIN_TYPE || \"redirect\");\r\n\r\n return await this.autoLogin();\r\n }\r\n\r\n public async logout(): Promise<void> {\r\n await msalService.logout(process.env.REACT_APP_ADB2C_LOGIN_TYPE || \"redirect\");\r\n }\r\n\r\n public async getAccessToken(): Promise<string | null> {\r\n if (!this.tokenExpiresOn || this.tokenExpiresOn.getTime() < Date.now()) {\r\n const tokenResult = await msalService.getToken();\r\n // console.info(\"tokenResult\", tokenResult);\r\n if (!tokenResult || !tokenResult.accessToken) {\r\n return null;\r\n }\r\n\r\n this.token = tokenResult.accessToken;\r\n this.tokenExpiresOn = tokenResult.expiresOn;\r\n }\r\n\r\n return this.token;\r\n }\r\n\r\n private async createMember(email: string): Promise<Member | undefined> {\r\n let accountToCreate = new Member();\r\n accountToCreate.email = email;\r\n\r\n try {\r\n const account = await memberService.createMember(accountToCreate);\r\n if (!account) {\r\n console.error(\"AuthService.Unable to create the Member Account\", email);\r\n return undefined;\r\n }\r\n\r\n console.log(\"AuthService.Account(Me) created.\", account);\r\n return account;\r\n } catch (error) {\r\n return undefined;\r\n }\r\n }\r\n}\r\n\r\nconst authService = new AuthService();\r\nexport default authService;\r\n","import ServicesApiBaseService from \"../services-api-base-service\";\r\nimport Organization from \"../organization/organization\";\r\nimport Microsite from \"../micro-site/microsite\";\r\n\r\nclass OrganizationService extends ServicesApiBaseService {\r\n async createOrganization(organization: Organization): Promise<Organization | undefined> {\r\n return await this.postObject<Organization, Organization>(`${this.apiUrl}/organizations`, organization);\r\n }\r\n\r\n async updateOrganization(\r\n organizationId: string,\r\n streetNumber: string,\r\n street: string,\r\n city: string,\r\n postalCode: string,\r\n state: string,\r\n country: string,\r\n active?: boolean\r\n ) {\r\n await this.putObject<any>(`${this.apiUrl}/organizations/${organizationId}`, {\r\n organizationId,\r\n streetNumber,\r\n street,\r\n city,\r\n postalCode,\r\n state,\r\n country,\r\n active: active ?? true,\r\n });\r\n }\r\n async getOrganizationById(organizationId: string): Promise<Organization | null> {\r\n const Organization = await this.getObject<Organization>(`${this.apiUrl}/organizations/${organizationId}`);\r\n return Organization || null;\r\n }\r\n\r\n async getAllMicrositesOfOrganization(organizationId: string): Promise<Array<Microsite>> {\r\n var microsites = await this.getObject<Array<Microsite>>(`${this.apiUrl}/organizations/${organizationId}/microsites`);\r\n if (microsites) {\r\n microsites = microsites.filter(function (microsite) {\r\n return microsite.active;\r\n });\r\n microsites.forEach((microsite) => {\r\n if (microsite) {\r\n if (microsite.name) {\r\n microsite.name = new Map(Object.entries(microsite?.name));\r\n }\r\n }\r\n });\r\n }\r\n\r\n return microsites || [];\r\n }\r\n}\r\n\r\nconst organizationService = new OrganizationService();\r\nexport default organizationService;\r\n","import { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\r\nimport { useEffect, useState } from \"react\";\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { Link } from \"react-router-dom\";\r\nimport authService from \"../services/auth/auth-service\";\r\nimport Member from \"../services/member/member\";\r\nimport MemberRoleOrganization from \"../services/member/member-role-organization\";\r\nimport memberService from \"../services/member/member-service\";\r\nimport organizationService from \"../services/member/organization-service\";\r\nimport GetLocketgoLogoSource, { AssetColors } from \"../assets/assets-colors\";\r\n\r\ninterface IHeaderNavBarProps {\r\n member: Member;\r\n activeOrganization: MemberRoleOrganization | null;\r\n changeLanguage: any;\r\n changeMember: any;\r\n}\r\n\r\nfunction HeaderNavbar(props: IHeaderNavBarProps) {\r\n const { member, activeOrganization, changeLanguage, changeMember } = props;\r\n const [isNavCollapsed, setIsNavCollapsed] = useState(true);\r\n\r\n const [micrositesLength, setMicrositesLength] = useState<number>(0);\r\n\r\n const { t } = useTranslation();\r\n const orgContributor = memberService.isOrganizationContributor(member, activeOrganization?.entity?.id);\r\n\r\n const collapseClasses = `${isNavCollapsed ? \"collapse\" : \"\"} navbar-collapse`;\r\n\r\n const onItemClick = () => {\r\n setIsNavCollapsed(true);\r\n };\r\n\r\n async function login(): Promise<void> {\r\n const loginResponse = await authService.login();\r\n changeMember(loginResponse.member);\r\n }\r\n\r\n let accountDisplay = \"<unkown>\";\r\n if (member) {\r\n accountDisplay = member.firstname;\r\n if (!accountDisplay && member.email) {\r\n accountDisplay = member.email;\r\n }\r\n }\r\n\r\n useEffect(\r\n () => {\r\n if (member) {\r\n let organizationId = activeOrganization?.entity?.id;\r\n if (organizationId) {\r\n let organization = member.associatedOrganizations.find((organization) => organization.entity?.id == organizationId);\r\n if (member && organization && memberService.isOrganizationContributor(member, organizationId)) {\r\n organizationService.getAllMicrositesOfOrganization(organizationId).then((microsites) => {\r\n setMicrositesLength(microsites.length);\r\n });\r\n }\r\n }\r\n }\r\n },\r\n // eslint-disable-next-line\r\n [activeOrganization]\r\n );\r\n\r\n return (\r\n <nav className=\"navbar navbar-expand-lg fixed-top shadow\">\r\n <div className=\"container\">\r\n <HeaderIcon logo={AssetColors.White} />\r\n\r\n <button\r\n className=\"navbar-toggler\"\r\n type=\"button\"\r\n data-bs-toggle=\"collapse\"\r\n data-bs-target=\"#navbarCollapse\"\r\n aria-controls=\"navbarCollapse\"\r\n aria-expanded={!isNavCollapsed}\r\n aria-label=\"Toggle navigation\"\r\n onClick={() => setIsNavCollapsed(!isNavCollapsed)}\r\n >\r\n <span>\r\n <FontAwesomeIcon color=\"white\" icon={[\"fas\", \"bars\"]} />\r\n </span>\r\n </button>\r\n\r\n <div className={collapseClasses} id=\"navbarCollapse\">\r\n <ul className=\"navbar-nav me-auto mb-2 mb-md-0\">\r\n {member && (\r\n <>\r\n {orgContributor && (\r\n <>\r\n <li className=\"nav-item\">\r\n <Link className=\"nav-link\" to=\"/orders\" onClick={onItemClick}>\r\n {t(\"common.locker-orders\")}\r\n </Link>\r\n </li>\r\n <li className=\"nav-item\">\r\n <Link className=\"nav-link\" to=\"/customers\" onClick={onItemClick}>\r\n {t(\"common.customers\")}\r\n </Link>\r\n </li>\r\n\r\n {memberService.isLocketgoAdmin(member) && (\r\n <li className=\"nav-item\">\r\n <Link className=\"nav-link\" to=\"/database-admin\" onClick={onItemClick}>\r\n {t(\"common.adminPage\")}\r\n </Link>\r\n </li>\r\n )}\r\n\r\n {(micrositesLength > 0 || memberService.isLocketgoAdmin(member)) && (\r\n <li className=\"nav-item\">\r\n <Link className=\"nav-link\" to={`/organizations/${activeOrganization?.entity?.id}/microsites`} onClick={onItemClick}>\r\n {t(\"common.microsites\")}\r\n </Link>\r\n </li>\r\n )}\r\n </>\r\n )}\r\n\r\n {member.associatedHubs?.length > 0 && (\r\n <li className=\"nav-item\">\r\n <Link className=\"nav-link\" to=\"/hubs\" onClick={onItemClick}>\r\n {t(\"common.hubs\")}\r\n </Link>\r\n </li>\r\n )}\r\n </>\r\n )}\r\n </ul>\r\n\r\n <ul className=\"navbar-nav mr-auto align-items-center\">\r\n {member && member.associatedOrganizations?.length > 0 && (\r\n <>\r\n <li className=\"nav-item nav-item-space-right\">\r\n <Link className=\"nav-link\" to=\"/organizations\" onClick={onItemClick}>\r\n {activeOrganization?.entity?.name.toUpperCase()}\r\n </Link>\r\n </li>\r\n </>\r\n )}\r\n\r\n {member && (\r\n <>\r\n <li className=\"nav-item nav-item-space-right nav-item-user\">\r\n <Link className=\"nav-link\" to=\"/member-profile\" onClick={onItemClick}>\r\n <FontAwesomeIcon icon={[\"fas\", \"user\"]} />\r\n <span>{accountDisplay.toUpperCase()}</span>\r\n </Link>\r\n </li>\r\n </>\r\n )}\r\n {!member && (\r\n <li className=\"nav-item nav-item-space-right\">\r\n <button\r\n className=\"nav-link\"\r\n onClick={async () => {\r\n onItemClick();\r\n await login();\r\n }}\r\n >\r\n {t(\"account.login\")}\r\n </button>\r\n </li>\r\n )}\r\n <li className=\"nav-item\">\r\n <button\r\n className=\"nav-link\"\r\n onClick={() => {\r\n onItemClick();\r\n changeLanguage();\r\n }}\r\n >\r\n {t(\"language.display\")}\r\n </button>\r\n </li>\r\n </ul>\r\n </div>\r\n </div>\r\n </nav>\r\n );\r\n}\r\n\r\ninterface IHeaderIconProps {\r\n logo: AssetColors;\r\n}\r\n\r\nfunction HeaderIcon(props: IHeaderIconProps) {\r\n let imgSource = GetLocketgoLogoSource(props.logo);\r\n return (\r\n <Link className=\"navbar-brand\" to=\"/\">\r\n <img src={imgSource} alt=\"logo\" className=\"app-logo\" />\r\n </Link>\r\n );\r\n}\r\n\r\nexport { HeaderNavbar, HeaderIcon };\r\n","import { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { useHistory } from \"react-router-dom\";\r\nimport { AssetColors } from \"../../assets/assets-colors\";\r\nimport { HeaderIcon } from \"../../components/header\";\r\nimport authService from \"../../services/auth/auth-service\";\r\nimport \"./signup-page.scss\";\r\n\r\ntype Props = {\r\n changeMember: any;\r\n changeLanguage: any;\r\n};\r\n\r\nexport default function SignUpPage(props: Props) {\r\n const { changeMember, changeLanguage } = props;\r\n const { t } = useTranslation();\r\n const history = useHistory();\r\n\r\n return (\r\n <>\r\n <header>\r\n <div className=\"container page sign-up-page\">\r\n <div className=\"row\">\r\n <div className=\"col-12 col-md-10 col-lg-8 offset-md-1 offset-lg-2\">\r\n <nav className=\"navbar reset\">\r\n <ul className=\"navbar-nav align-items-center ms-auto\">\r\n <li className=\"nav-item\">\r\n <button className=\"nav-link\" onClick={changeLanguage}>\r\n <FontAwesomeIcon className=\"me-2\" icon={[\"fas\", \"globe\"]} />\r\n {t(\"language.display-long\")}\r\n </button>\r\n </li>\r\n </ul>\r\n </nav>\r\n </div>\r\n </div>\r\n </div>\r\n </header>\r\n\r\n <div className=\"container page sign-up-page\">\r\n <div className=\"row\">\r\n <div className=\"col-12 col-md-10 col-lg-8 offset-md-1 offset-lg-2\">\r\n <div className=\"card card-rounded card-full\">\r\n <div className=\"row\">\r\n <div className=\"col col-xl-8\">\r\n <div className=\"logo\">\r\n <HeaderIcon logo={AssetColors.Blue} />\r\n </div>\r\n\r\n <div className=\"card-left\">\r\n <div className=\"card-body\">\r\n <h5>{t(\"home-not-signed.title\")}</h5>\r\n <h6>{t(\"home-not-signed.subtitle\")}</h6>\r\n\r\n <div>\r\n <button id=\"sign-up-btn\" className=\"btn btn-lg btn-primary\" onClick={async () => await login()}>\r\n {t(\"home-not-signed.sign-up\")}\r\n </button>\r\n </div>\r\n\r\n <div className=\"section-login\">\r\n <label>{t(\"home-not-signed.already-have-account\")}</label>\r\n <button className=\"nav-link btn-login\" onClick={async () => await login()}>\r\n {t(\"home-not-signed.login\")}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div className=\"card-right d-none d-xl-inline-block col-4 gx-0\">\r\n <img className=\"img-fluid\" src=\"/images/sign-up.jpg\" alt=\"\" />\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </>\r\n );\r\n\r\n async function login(): Promise<void> {\r\n const loginResponse = await authService.login();\r\n\r\n let response = await changeMember(loginResponse.member);\r\n if (response) {\r\n history.push(\"/\");\r\n }\r\n }\r\n}\r\n","import { Carrier } from \"../carrier/carrier\";\r\nimport { Address } from \"../core/address\";\r\nimport { Reservation } from \"../order/reservation\";\r\nimport { FlowConfigs } from \"./flow-configs\";\r\nimport { Group } from \"./group\";\r\nimport { HubActivity } from \"./hub-activity\";\r\nimport { ReservationDeny } from \"./reservation-deny\";\r\n\r\nexport enum HubStates {\r\n Unknown = 0,\r\n Online = 1,\r\n Offline = 2,\r\n}\r\n\r\nexport class Hub {\r\n id: string = \"\";\r\n name: string = \"\";\r\n zoneName: string = \"\";\r\n description: string = \"\";\r\n flowConfigs: FlowConfigs = new FlowConfigs();\r\n private: boolean = false;\r\n address: Address = new Address();\r\n model: string = \"\";\r\n state: string = \"\";\r\n groups: Array<Group> = [];\r\n lat: number = 0;\r\n lng: number = 0;\r\n carriers: Array<Carrier> = [];\r\n version: string = \"\";\r\n active: boolean = true;\r\n}\r\n\r\nexport class Kiosk {\r\n position: string = \"\";\r\n sizeId: string = \"\";\r\n}\r\n\r\nexport class MyHub {\r\n id: string = \"\";\r\n name: string = \"\";\r\n zoneName: string = \"\";\r\n description: string = \"\";\r\n flowConfigs: FlowConfigs = new FlowConfigs();\r\n version: string = \"\";\r\n computerMetrics: any;\r\n lastSynchronization: string = \"\";\r\n private: boolean = false;\r\n active: boolean = true;\r\n address: Address = new Address();\r\n model: string = \"\";\r\n state: string = \"\";\r\n groups: Array<Group> = [];\r\n lat: number = 0;\r\n lng: number = 0;\r\n\r\n carriers: Array<Carrier> = [];\r\n reservationDenies: Array<ReservationDeny> = [];\r\n reservations: Array<Reservation> = [];\r\n kiosk: Kiosk | null = null;\r\n\r\n activities: Array<HubActivity> = [];\r\n}\r\n","export class Address {\r\n streetNumber: string = \"\";\r\n street: string = \"\";\r\n city: string = \"\";\r\n postalCode: string = \"\";\r\n state: string = \"\";\r\n country: string = \"\";\r\n lat: string = \"\";\r\n lng: string = \"\";\r\n}\r\n","export class FlowConfigs {\r\n organizationId: string = \"\";\r\n personalStorageEnabled: boolean = false;\r\n parcelEnabled: boolean = false;\r\n customerSelectionEnabled: boolean = false;\r\n rfidEnabled: boolean = false;\r\n orderLookupEnabled: boolean = false;\r\n isRiderLocker: boolean = false;\r\n hasObjectDetection: boolean = false;\r\n}\r\n","import languageService from \"../core/language-service\";\r\nimport ServicesApiBaseService from \"../services-api-base-service\";\r\nimport { Order, OrderFlow } from \"./order\";\r\n\r\nexport enum OrderState {\r\n Active = \"Active\",\r\n Cancelled = \"Cancelled\",\r\n Completed = \"Completed\",\r\n}\r\n\r\nclass OrderService extends ServicesApiBaseService {\r\n // GET\r\n async getOrders(organizationId: string, state: string, start?: string, end?: string): Promise<Array<Order>> {\r\n const orders = await this.getObject<Array<Order>>(\r\n `${this.apiUrl}/organizations/${organizationId}/orders?state=${state}${start ? `&start=${start}` : \"\"}${end ? `&end=${end}` : \"\"}`\r\n );\r\n return orders || [];\r\n }\r\n\r\n async getOrderById(organizationId: string, id: string, token: string | null = null): Promise<Order | null> {\r\n let tokenTmp = token !== null ? `?token=${token}` : \"\";\r\n const order = await this.getObject<Order>(`${this.apiUrl}/organizations/${organizationId}/orders/${id + tokenTmp}`);\r\n return order || null;\r\n }\r\n\r\n async getAvailableCompartmentSizeIds(\r\n organizationId: string,\r\n hubId: string,\r\n orderFlow: OrderFlow,\r\n start?: string,\r\n end?: string\r\n ): Promise<Array<string>> {\r\n const sizeIds = await this.postObject<any, Array<string>>(\r\n `${this.apiUrl}/organizations/${organizationId}/orders/actions/availablesizes`,\r\n { hubId: hubId, orderFlow: orderFlow, start: start, end: end }\r\n );\r\n return sizeIds || [];\r\n }\r\n\r\n async getAsset(organizationId: string, orderId: string, assetId: string): Promise<Blob | null> {\r\n let label = await this.getFile(`${this.apiUrl}/organizations/${organizationId}/orders/${orderId}/assets/${assetId}`);\r\n return label || null;\r\n }\r\n\r\n // POST\r\n async createOrder(\r\n hubId: string,\r\n organizationId: string,\r\n phoneNumber: string,\r\n email: string,\r\n firstname: string | undefined,\r\n lastname: string | undefined,\r\n language: string | undefined,\r\n packagingOptionId: string | undefined,\r\n carrierId: string | undefined,\r\n flow: OrderFlow,\r\n referenceNumber: string | undefined\r\n ): Promise<number | undefined> {\r\n return await this.postObject<any, number>(`${this.apiUrl}/organizations/${organizationId}/orders`, {\r\n firstName: firstname,\r\n lastName: lastname,\r\n email: email,\r\n phone: phoneNumber,\r\n language: language || languageService.getLanguage(),\r\n hubId: hubId,\r\n packagingOptionId: packagingOptionId,\r\n flow: flow,\r\n carrierId: carrierId,\r\n referenceNumber: referenceNumber,\r\n });\r\n }\r\n\r\n async createOrderItem(\r\n organizationId: string,\r\n orderId: string,\r\n sizeId: string,\r\n height?: number,\r\n width?: number,\r\n depth?: number,\r\n weight?: number\r\n ): Promise<number | undefined> {\r\n return await this.postObject<any, number>(`${this.apiUrl}/organizations/${organizationId}/orders/${orderId}/items?reserve=true`, {\r\n description: \"\",\r\n height: height,\r\n width: width,\r\n depth: depth,\r\n weight: weight,\r\n sizeId: sizeId,\r\n });\r\n }\r\n\r\n async relocateReservation(\r\n organizationId: string,\r\n orderId: string,\r\n orderItemId: string,\r\n sizeId?: string,\r\n reservationStart?: string,\r\n reservationEnd?: string\r\n ): Promise<number | undefined> {\r\n return await this.postObject<any, number>(\r\n `${this.apiUrl}/organizations/${organizationId}/orders/${orderId}/items/${orderItemId}/relocate`,\r\n { sizeId: sizeId, reservationStart: reservationStart, reservationEnd: reservationEnd }\r\n );\r\n }\r\n\r\n async openDoor(organizationId: string, orderId: string, orderItemId: string, reason: string, token: string | null): Promise<void> {\r\n let url = `${this.apiUrl}/organizations/${organizationId}/orders/${orderId}/items/${orderItemId}/actions/opendoor`;\r\n if (token) {\r\n url += `?token=${token}`;\r\n }\r\n\r\n await this.postObject(url, {\r\n requestingFrom: \"portal\",\r\n reason: reason,\r\n });\r\n }\r\n\r\n async sendReadyForPickupNotification(organizationId: string, orderId: string) {\r\n await this.postObject(`${this.apiUrl}/organizations/${organizationId}/orders/${orderId}/notify`, null);\r\n }\r\n\r\n async requestCarrierPickup(organizationId: string, orderId: string): Promise<Order | null> {\r\n let order = await this.postObject<any, Order>(\r\n `${this.apiUrl}/organizations/${organizationId}/orders/${orderId}/actions/requestcarrierpickup`,\r\n null\r\n );\r\n return order || null;\r\n }\r\n\r\n async cancelCarrierPickup(organizationId: string, orderId: string): Promise<Order | null> {\r\n let order = await this.postObject<any, Order>(\r\n `${this.apiUrl}/organizations/${organizationId}/orders/${orderId}/actions/cancelcarrierpickup`,\r\n null\r\n );\r\n return order || null;\r\n }\r\n\r\n async completeBopilOrder(organizationId: string, orderId: string): Promise<any> {\r\n return await this.postObject(`${this.apiUrl}/organizations/${organizationId}/orders/${orderId}/complete`, null);\r\n }\r\n\r\n async endOrder(organizationId: string, orderId: string, token: string) {\r\n return await this.postObject(\r\n `${this.apiUrl}/organizations/${organizationId}/orders/${orderId}/end${token ? `?token=${token}` : \"\"}`,\r\n null\r\n );\r\n }\r\n\r\n // PUT\r\n async updateOrderItem(\r\n organizationId: string,\r\n orderId: string,\r\n orderItemId: string,\r\n trackingNumbers: Array<string>,\r\n deleteTrackingNumber?: boolean\r\n ): Promise<any> {\r\n let url = `${this.apiUrl}/organizations/${organizationId}/orders/${orderId}/items/${orderItemId}`;\r\n return await this.putObject(url, { trackingNumbers, deleteTrackingNumber });\r\n }\r\n\r\n // DELETE\r\n\r\n async cancelOrder(organizationId: string, orderId: string): Promise<void> {\r\n await this.deleteObject(`${this.apiUrl}/organizations/${organizationId}/orders/${orderId}`);\r\n }\r\n\r\n async deleteOrderItem(organizationId: string, orderId: string, orderItemId: string) {\r\n return await this.deleteObject(`${this.apiUrl}/organizations/${organizationId}/orders/${orderId}/items/${orderItemId}`);\r\n }\r\n\r\n async cancelOrderItem(organizationId: string, orderId: string, orderItemId: string): Promise<void> {\r\n await this.deleteObject(`${this.apiUrl}/organizations/${organizationId}/orders/${orderId}/items/${orderItemId}`);\r\n }\r\n}\r\n\r\nconst orderService = new OrderService();\r\nexport default orderService;\r\n","import ServicesApiBaseService from \"../services-api-base-service\";\r\nimport { Hub, MyHub } from \"./hub\";\r\nimport { HubActivity } from \"./hub-activity\";\r\n\r\nexport class HubService extends ServicesApiBaseService {\r\n async getHubById(id: string): Promise<Hub> {\r\n const hub = await this.getObject<Hub>(`${this.apiUrl}/hubs/${id}?details=true`);\r\n return hub || new Hub();\r\n }\r\n\r\n async getHubsByIds(ids: Array<string>): Promise<Array<Hub>> {\r\n const hubs = await this.postObject<Array<string>, Array<Hub>>(`${this.apiUrl}/hubs/with-ids?details=true`, ids);\r\n hubs?.sort((a, b) => a.name.localeCompare(b.name));\r\n return hubs || [];\r\n }\r\n\r\n async getHubs(): Promise<Array<Hub>> {\r\n const hubs = await this.getObject<Array<Hub>>(`${this.apiUrl}/hubs?details=true`);\r\n hubs?.sort((a, b) => a.name.localeCompare(b.name));\r\n return hubs || [];\r\n }\r\n\r\n async getMyHubs(): Promise<Array<Hub>> {\r\n const hubs = await this.getObject<Array<Hub>>(`${this.apiUrl}/myhubs`);\r\n hubs?.sort((a, b) => a.name.localeCompare(b.name));\r\n return hubs || [];\r\n }\r\n\r\n async getMyHubById(id: string): Promise<MyHub> {\r\n const hub = await this.getObject<MyHub>(`${this.apiUrl}/myhubs/${id}`);\r\n return hub || new MyHub();\r\n }\r\n\r\n async activateLockerReservation(hubId: string, groupId: string, compartmentNumber: string): Promise<boolean> {\r\n try {\r\n await this.postObject(`${this.apiUrl}/hubs/${hubId}/groups/${groupId}/compartments/${compartmentNumber}/actions/activate`, {});\r\n return true;\r\n } catch (e) {\r\n return false;\r\n }\r\n }\r\n\r\n async deactivateLockerReservation(hubId: string, groupId: string, compartmentNumber: string): Promise<boolean> {\r\n try {\r\n await this.postObject(`${this.apiUrl}/hubs/${hubId}/groups/${groupId}/compartments/${compartmentNumber}/actions/deactivate`, {});\r\n return true;\r\n } catch (e) {\r\n return false;\r\n }\r\n }\r\n\r\n async activateAllLockers(hubId: string): Promise<boolean> {\r\n try {\r\n await this.postObject(`${this.apiUrl}/hubs/${hubId}/actions/activatealldoors`, {});\r\n return true;\r\n } catch (e) {\r\n return false;\r\n }\r\n }\r\n\r\n async deactivateAllLockers(hubId: string): Promise<boolean> {\r\n try {\r\n await this.postObject(`${this.apiUrl}/hubs/${hubId}/actions/deactivatealldoors`, {});\r\n return true;\r\n } catch (e) {\r\n return false;\r\n }\r\n }\r\n\r\n async openDoor(hubId: string, groupId: string, compartmentNumber: string, side: string): Promise<boolean> {\r\n try {\r\n await this.postObject(\r\n `${this.apiUrl}/hubs/${hubId}/groups/${groupId}/compartments/${compartmentNumber}/actions/opendoor?side=${side}`,\r\n {}\r\n );\r\n return true;\r\n } catch (e) {\r\n return false;\r\n }\r\n }\r\n\r\n async openAllDoors(hubIid: string): Promise<void> {\r\n try {\r\n await this.postObject<any, any>(`${this.apiUrl}/hubs/${hubIid}/actions/openalldoors?requestedfrom=portal`, {});\r\n } catch (e) {}\r\n }\r\n\r\n async toggleDoor(hubIid: string, groupId: string, compartmentNumber: string): Promise<boolean> {\r\n try {\r\n await this.postObject(`${this.apiUrl}/hubs/${hubIid}/groups/${groupId}/compartments/${compartmentNumber}/actions/toggledoor`, {});\r\n return true;\r\n } catch (e) {\r\n return false;\r\n }\r\n }\r\n\r\n async getHubActivities(hubId: string, activitiesMultiplier: number): Promise<Array<HubActivity>> {\r\n try {\r\n let activities = await this.getObject<Array<HubActivity>>(\r\n `${this.apiUrl}/hubs/${hubId}/activities?activitiesMultiplier=${activitiesMultiplier}`\r\n );\r\n return activities || [];\r\n } catch (e) {\r\n return [];\r\n }\r\n }\r\n}\r\n\r\nconst hubService = new HubService();\r\nexport default hubService;\r\n","class LanguageService {\r\n language: string = \"en\";\r\n\r\n constructor() {\r\n this.language = localStorage.getItem(\"language\") || (window.navigator.language.includes(\"fr\") ? \"fr\" : \"en\");\r\n }\r\n\r\n getLanguage(): string {\r\n return this.language;\r\n }\r\n\r\n changeLanguage(): string {\r\n if (this.language === \"fr\") {\r\n this.language = \"en\";\r\n } else {\r\n this.language = \"fr\";\r\n }\r\n localStorage.setItem(\"language\", this.language);\r\n\r\n // console.log(`languageService.changeLanguage --> ${this.language}`);\r\n return this.language;\r\n }\r\n}\r\n\r\nconst languageService = new LanguageService();\r\nexport default languageService;\r\n","export enum NotifyLevel {\r\n None = \"None\",\r\n Medium = \"Medium\",\r\n High = \"High\",\r\n}\r\n","export class Customer {\r\n id: string = \"\";\r\n firstname: string = \"\";\r\n lastname: string = \"\";\r\n phone: string = \"\";\r\n email: string = \"\";\r\n referenceId: string = \"\";\r\n unit: string = \"\";\r\n}\r\n","import { NotifyLevel } from \"../core/notification-level\";\r\nimport { Payment } from \"../payment/payment\";\r\nimport { Customer } from \"./customer\";\r\nimport { OrderActivity } from \"./order-activity\";\r\nimport { OrderItem } from \"./order-item\";\r\n\r\nexport enum OrderFlow {\r\n Deliver = 0,\r\n Return = 2,\r\n PersonalStorage = 3,\r\n}\r\n\r\nexport enum OrderFlowStringValue {\r\n Deliver = \"Deliver\",\r\n Return = \"Return\",\r\n PersonalStorage = \"PersonalStorage\",\r\n}\r\n\r\nexport class Order {\r\n id: string = \"\";\r\n customer: Customer = new Customer();\r\n payments: Array<Payment> | undefined = undefined;\r\n organizationId: string = \"\";\r\n orderDate: string = \"\";\r\n referenceNumber: string = \"\";\r\n hubId: string = \"\";\r\n state: string = \"\";\r\n flow: OrderFlow = OrderFlow.Deliver;\r\n deleted: number = 0;\r\n packagingOptionId: string = \"\";\r\n carrierId: string | undefined = undefined;\r\n carrierSubmissionReferenceNumber: string = \"\";\r\n\r\n items: Array<OrderItem> = [];\r\n activities: Array<OrderActivity> = [];\r\n\r\n notifyLevel: NotifyLevel = NotifyLevel.None;\r\n}\r\n","export enum ReservationState {\r\n New = \"New\",\r\n ReadyForPickUp = \"ReadyForPickUp\",\r\n PackagingReadyForPickUp = \"PackagingReadyForPickUp\",\r\n Completed = \"Completed\",\r\n Canceled = \"Canceled\",\r\n}\r\n","import { Order, OrderFlowStringValue } from \"./order\";\r\nimport { OrderActivity } from \"./order-activity\";\r\nimport { OrderItem } from \"./order-item\";\r\nimport { ReservationState } from \"./ReservationState\";\r\n\r\nexport class OrderHelpers {\r\n static getOrderLockers(order: Order): string {\r\n let lockers = \"\";\r\n order.items.forEach((orderItem) => {\r\n if (orderItem?.reservation) {\r\n let groupId = orderItem?.reservation?.groupId;\r\n let compartmentNumber = orderItem?.reservation?.compartmentNumber;\r\n\r\n if (groupId || compartmentNumber) {\r\n if (lockers.length > 0) {\r\n lockers += \", \";\r\n }\r\n lockers += /^\\d+$/.test(compartmentNumber) ? compartmentNumber : groupId + compartmentNumber;\r\n }\r\n }\r\n });\r\n //console.log(lockers);\r\n return lockers;\r\n }\r\n\r\n static getOrderStateStyle(state: string, isPersonalStorage: boolean): string {\r\n if (isPersonalStorage) {\r\n return this.getPersonalStorageOrderStateBadgeStyle(state);\r\n } else {\r\n return this.getBopilOrderStateBadgeStyle(state);\r\n }\r\n }\r\n\r\n static getBopilOrderStateBadgeStyle(state: string): string {\r\n switch (state) {\r\n case \"LoadingStarted\":\r\n case \"ReadyForPickUp\":\r\n case \"PackagingReadyForPickUp\":\r\n case \"PackagingPickUpStarted\":\r\n case \"PickUpStarted\":\r\n case \"PartiallyCompleted\":\r\n return \"badge badge-outline text-warning\";\r\n case \"Completed\":\r\n return \"badge badge-outline text-muted\";\r\n case \"NoReservation\":\r\n return \"badge badge-outline text-dark\";\r\n case \"Cancelled\":\r\n return \"badge badge-outline text-danger\";\r\n default:\r\n return \"badge badge-outline text-info\";\r\n }\r\n }\r\n\r\n static getPersonalStorageOrderStateBadgeStyle(state: string): string {\r\n switch (state) {\r\n case \"LoadingStarted\":\r\n case \"ReadyForPickUp\":\r\n return \"badge badge-outline text-warning\";\r\n case \"Completed\":\r\n return \"badge badge-outline text-muted\";\r\n case \"Cancelled\":\r\n return \"badge badge-outline text-danger\";\r\n default:\r\n return \"badge badge-outline text-success\";\r\n }\r\n }\r\n\r\n static getActivityDescription(activity: OrderActivity, language: string): string {\r\n if (!activity.description) {\r\n return \"\";\r\n }\r\n const value = activity.description[language];\r\n if (!value) {\r\n return \"\";\r\n }\r\n return value;\r\n }\r\n\r\n static getOrderItem(order: Order, orderItemId: string): OrderItem | undefined {\r\n return order.items.find((item) => item.id === orderItemId);\r\n }\r\n\r\n static canEditReservation(state: string): boolean {\r\n return state === \"New\" || state === null;\r\n }\r\n\r\n static canRefundOrder(order: Order): boolean {\r\n if (\r\n !order ||\r\n !order.payments ||\r\n order.flow.toString() !== \"PersonalStorage\" ||\r\n order.deleted ||\r\n order.payments.every((p) => p.state === \"Completed\")\r\n ) {\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n static isRefundedOrder(order: Order): boolean {\r\n if (!order || !order.deleted || !order.payments || !order.payments.length) {\r\n return false;\r\n }\r\n\r\n for (let i = 0; i < order.payments.length; i++) {\r\n if (order.payments[i].state !== \"Refunded\") {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n static canDeleteOrder(order: Order): boolean {\r\n if (!order) {\r\n return false;\r\n }\r\n\r\n if (order.carrierSubmissionReferenceNumber || order?.deleted || (order.state !== \"New\" && order.state !== \"NoReservation\")) {\r\n return false;\r\n }\r\n\r\n let data = order.items.find((orderItem) => orderItem.reservation.state !== ReservationState.New);\r\n return data === null || data === undefined;\r\n }\r\n\r\n static canCompleteOrder(order: Order): boolean {\r\n if (!order) {\r\n return false;\r\n }\r\n\r\n return order.deleted != 1 && order.flow.toString() === \"Deliver\" && order.state !== \"Completed\" && order.items.length !== 0;\r\n }\r\n\r\n static inOpenedState(state: string): boolean {\r\n return state === \"LoadingStarted\" || state === \"PickUpStarted\" || state === \"PackagingPickUpStarted\";\r\n }\r\n\r\n static trackingNumbersEditable(order: Order | null): boolean {\r\n if (!order || order.carrierSubmissionReferenceNumber || order.deleted) {\r\n return false;\r\n }\r\n\r\n if (order.flow.toString() === OrderFlowStringValue.PersonalStorage) {\r\n return order.items.some(\r\n (orderItem: OrderItem) =>\r\n orderItem.reservation &&\r\n orderItem.reservation.state !== ReservationState.Completed &&\r\n orderItem.reservation.state !== ReservationState.Canceled\r\n );\r\n } else {\r\n if (order.state && order.state !== \"NoReservation\" && order.state !== \"New\") {\r\n return false;\r\n }\r\n return order.items.some((orderItem: OrderItem) => orderItem.reservation && orderItem.reservation.state === ReservationState.New);\r\n }\r\n }\r\n\r\n static editable(order: Order | null): boolean {\r\n if (!order) {\r\n return false;\r\n }\r\n\r\n if (\r\n order.carrierSubmissionReferenceNumber ||\r\n (order.state && order.state !== \"NoReservation\" && order.state !== \"New\") ||\r\n order.deleted\r\n ) {\r\n return false;\r\n }\r\n\r\n let data = order.items.find((orderItem: OrderItem) => orderItem.reservation && orderItem.reservation.state !== ReservationState.New);\r\n return data === null || data === undefined;\r\n }\r\n\r\n static canRequestCarrierPickup(order: Order | null): boolean {\r\n if (!order || order.carrierSubmissionReferenceNumber || order.state !== \"New\" || order.deleted) {\r\n return false;\r\n }\r\n\r\n return !this.hasNonNewOrderItem(order);\r\n }\r\n\r\n static canCancelCarrierPickup(order: Order | null): boolean {\r\n if (!order || !order.carrierSubmissionReferenceNumber || (order.state !== \"New\" && order.state !== \"NoReservation\")) {\r\n return false;\r\n }\r\n\r\n return !this.hasNonNewOrderItem(order);\r\n }\r\n\r\n static hasNonNewOrderItem(order: Order | null): boolean {\r\n let data = order?.items.find((orderItem: OrderItem) => orderItem.reservation && orderItem.reservation.state !== ReservationState.New);\r\n return data !== null && data !== undefined;\r\n }\r\n}\r\n","import { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\r\nimport { useTranslation } from \"react-i18next\";\r\nimport StringHelpers from \"../services/core/string-helpers\";\r\n\r\ninterface PagingProps {\r\n countTextResource: string;\r\n\r\n count: number;\r\n pageLength: number;\r\n pageIndex: number;\r\n\r\n canPreviousPage: boolean;\r\n canNextPage: boolean;\r\n previousPage: () => void;\r\n nextPage: () => void;\r\n}\r\n\r\nexport default function PagingComponent(props: PagingProps) {\r\n const { countTextResource, count, pageLength, pageIndex, canPreviousPage, canNextPage, previousPage, nextPage } = props;\r\n\r\n const { t } = useTranslation();\r\n\r\n return (\r\n <nav>\r\n <span>{t(StringHelpers.pluralize(count, countTextResource), { count: count })}</span>\r\n\r\n {count > 0 && (\r\n <ul className=\"pagination float-end\">\r\n <li className={\"page-item\" + (!canPreviousPage ? \" disabled\" : \"\")}>\r\n <button className=\"page-link\" aria-label=\"Previous\" onClick={() => previousPage()}>\r\n <FontAwesomeIcon icon={[\"fas\", \"angle-left\"]} />\r\n </button>\r\n </li>\r\n <li className=\"page-item disabled page-index\">\r\n <button className=\"page-link\" aria-label=\"Previous\" onClick={() => previousPage()}>\r\n {pageIndex + 1} {t(\"common.of\")} {pageLength}\r\n </button>\r\n </li>\r\n <li className={\"page-item\" + (!canNextPage ? \" disabled\" : \"\")}>\r\n <button className=\"page-link\" aria-label=\"Next\" onClick={() => nextPage()}>\r\n <FontAwesomeIcon icon={[\"fas\", \"angle-right\"]} />\r\n </button>\r\n </li>\r\n </ul>\r\n )}\r\n </nav>\r\n );\r\n}\r\n","import toast from \"react-hot-toast\";\r\n\r\nexport default class ToastHelpers {\r\n static success(message: string) {\r\n toast.success(message);\r\n }\r\n\r\n static error(message: string) {\r\n toast.error(message);\r\n }\r\n}\r\n","import { IconProp } from \"@fortawesome/fontawesome-svg-core\";\r\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\r\nimport { CSVLink } from \"react-csv\";\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { useHistory } from \"react-router-dom\";\r\n\r\ninterface DeleteButtonProps {\r\n title: string | undefined;\r\n onClick: Function;\r\n disabled: boolean;\r\n}\r\n\r\nexport function DeleteButtonComponent(props: DeleteButtonProps) {\r\n return (\r\n <>\r\n <button className={`btn btn-outline-primary`} onClick={() => props.onClick()} disabled={props.disabled}>\r\n <FontAwesomeIcon icon={[\"fas\", \"trash-alt\"]} /> {props.title && \" \" + props.title}\r\n </button>\r\n </>\r\n );\r\n}\r\n\r\ninterface AddButtonProps {\r\n title?: string | undefined;\r\n className?: string | undefined;\r\n onClick: Function;\r\n}\r\n\r\nexport function AddButtonComponent(props: AddButtonProps) {\r\n return (\r\n <button className={props.className ? props.className : \"btn btn-primary\"} onClick={() => props.onClick()}>\r\n <FontAwesomeIcon className={props.title && \"me-2\"} icon={[\"fas\", \"plus\"]} />\r\n {props.title && \" \" + props.title}\r\n </button>\r\n );\r\n}\r\n\r\ninterface SyncButtonProps {\r\n onClick: Function;\r\n disabled: boolean;\r\n className?: string;\r\n}\r\nSyncButtonComponent.defaultProps = {\r\n disabled: false,\r\n};\r\nexport function SyncButtonComponent(props: SyncButtonProps) {\r\n return (\r\n <button className={props.className + \" btn btn-outline-primary \"} onClick={() => props.onClick()} disabled={props.disabled}>\r\n <FontAwesomeIcon icon=\"sync\"></FontAwesomeIcon>\r\n </button>\r\n );\r\n}\r\n\r\ninterface EditButtonProps {\r\n url: string;\r\n}\r\n\r\nexport function EditButtonComponent(props: EditButtonProps) {\r\n const history = useHistory();\r\n\r\n return (\r\n <button className=\"btn btn-outline-primary\" onClick={() => history.push(props.url)}>\r\n <FontAwesomeIcon icon={[\"fas\", \"pen\"]} />\r\n </button>\r\n );\r\n}\r\n\r\ninterface ActionButtonProps {\r\n type?: \"button\" | \"submit\" | \"reset\" | undefined;\r\n className?: string | undefined;\r\n onClick: Function;\r\n title?: string | undefined;\r\n icon?: IconProp | undefined;\r\n disabled?: boolean;\r\n}\r\n\r\nexport function ActionButtonComponent(props: ActionButtonProps) {\r\n return (\r\n <button type={props.type} className={props.className} onClick={() => props.onClick()} disabled={props.disabled}>\r\n {props.icon && <FontAwesomeIcon className=\"me-1\" icon={props.icon} />} {props.title && props.title}\r\n </button>\r\n );\r\n}\r\n\r\ninterface InfoCircleProps {\r\n id: string;\r\n title: string;\r\n textInfo: string;\r\n}\r\nexport function InfoCirleButton({ id, title, textInfo }: InfoCircleProps) {\r\n const { t } = useTranslation();\r\n\r\n return (\r\n <>\r\n <button className=\"icon-info-circle primary\" data-bs-target={`#${id}`} data-bs-toggle=\"modal\">\r\n <FontAwesomeIcon className=\"blue-icon\" icon={[\"fas\", \"info-circle\"]} />\r\n </button>\r\n <div className=\"modal\" tabIndex={-1} id={id}>\r\n <div className=\"modal-dialog\">\r\n <div className=\"modal-content\">\r\n <div className=\"modal-header\">\r\n <h5 className=\"modal-title\">{title}</h5>\r\n <button type=\"button\" className=\"btn-close\" data-bs-dismiss=\"modal\" aria-label=\"Close\"></button>\r\n </div>\r\n <div className=\"modal-body\">{textInfo}</div>\r\n <div className=\"modal-footer\">\r\n <button type=\"button\" className=\"btn btn-outline-primary\" data-bs-dismiss=\"modal\">\r\n {t(\"common.close\")}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </>\r\n );\r\n}\r\n\r\ninterface ExportButtonProps {\r\n title?: string;\r\n data: string | Array<any>;\r\n fileName: string;\r\n}\r\n\r\nexport function ExportButton(props: ExportButtonProps) {\r\n const { t } = useTranslation();\r\n let title = props.title ? props.title : t(\"common.export\");\r\n\r\n return (\r\n <CSVLink\r\n className={\"btn btn-outline-primary\"}\r\n title={title}\r\n data={props.data}\r\n enclosingCharacter={`\"`}\r\n filename={props.fileName + \".csv\"}\r\n >\r\n <FontAwesomeIcon icon=\"file-export\"></FontAwesomeIcon>\r\n </CSVLink>\r\n );\r\n}\r\n","import React, { useCallback, useEffect, useMemo, useState } from \"react\";\r\nimport { useTranslation } from \"react-i18next\";\r\nimport languageService from \"../services/core/language-service\";\r\nimport StringHelpers from \"../services/core/string-helpers\";\r\nimport \"./dateRangeComponent.scss\";\r\nimport DateHelpers from \"../services/core/date-helpers\";\r\n\r\ninterface DateRangeComponentProps {\r\n id: string;\r\n default: DateRangeOptions;\r\n disabled?: boolean;\r\n onDateChange: (start: string, end: string) => void;\r\n start: string;\r\n end: string;\r\n}\r\n\r\nexport enum DateRangeOptions {\r\n Today = \"analytic.today\",\r\n Week = \"analytic.7days\",\r\n Month = \"analytic.30days\",\r\n Custom = \"analytic.customize\",\r\n}\r\n\r\nexport default function DateRangeComponent(props: DateRangeComponentProps) {\r\n const { t } = useTranslation();\r\n\r\n const [isCustom, setIsCustom] = useState<boolean>(false);\r\n const [currentOption, setCurrentOption] = useState<string | undefined>();\r\n\r\n const [startDate, setStartDate] = useState<string>(props.start);\r\n const [endDate, setEndDate] = useState<string>(props.end);\r\n\r\n const onStartDateChange = useCallback(\r\n (event: React.ChangeEvent<HTMLInputElement>) => {\r\n setStartDate(event.target.value);\r\n },\r\n [setStartDate]\r\n );\r\n\r\n const onEndDateChange = useCallback(\r\n (event: React.ChangeEvent<HTMLInputElement>) => {\r\n setEndDate(event.target.value);\r\n },\r\n [setEndDate]\r\n );\r\n\r\n const selectionOptions = useMemo(() => {\r\n return [\"analytic.today\", \"analytic.7days\", \"analytic.30days\", \"analytic.customize\"];\r\n }, [t]);\r\n\r\n useEffect(() => {\r\n setCurrentOption(selectionOptions.find((option) => option === props.default.toString()));\r\n setIsCustom(false);\r\n }, [languageService.language]);\r\n\r\n const onItemClick = async (option: string) => {\r\n setCurrentOption(option);\r\n await setDataBySelectedIndex(option);\r\n };\r\n\r\n return (\r\n <div id=\"date-range-component\">\r\n <div className=\"collapse-date-range collapse\">\r\n <a\r\n className=\"close-collapse-toggler collapsed\"\r\n data-bs-toggle=\"collapse\"\r\n data-bs-target=\".collapse-date-range\"\r\n aria-controls=\"collapse-date-range\"\r\n aria-expanded=\"false\"\r\n ></a>\r\n </div>\r\n\r\n <button\r\n className=\"btn btn-outline-primary arrow\"\r\n type=\"button\"\r\n data-bs-toggle=\"collapse\"\r\n data-bs-target=\".collapse-date-range\"\r\n aria-controls=\"collapse-date-range\"\r\n aria-expanded=\"false\"\r\n >\r\n <span>\r\n {props.start && props.end && (\r\n <>\r\n {props.start.substring(0, 4) === props.end.substring(0, 4) ? (\r\n <>\r\n {props.start.substring(5, props.start.length)} {t(\"common.to\")} {props.end.substring(5, props.end.length)}\r\n </>\r\n ) : (\r\n <>\r\n {props.start} {t(\"common.to\")} {props.end}\r\n </>\r\n )}\r\n </>\r\n )}\r\n </span>\r\n </button>\r\n\r\n <div className=\"position-relative mt-2\">\r\n <div style={{ width: \"430px\" }} className={`collapse-date-range position-absolute collapse top-0`}>\r\n <div className=\"card card-body\">\r\n <div className=\"mb-3 btn-group\" role=\"group\">\r\n {selectionOptions.map((option) => {\r\n let active = currentOption && option === currentOption ? \" active\" : \"\";\r\n const isCustom = option === DateRangeOptions.Custom;\r\n return (\r\n <button\r\n key={option}\r\n type=\"button\"\r\n data-bs-toggle={!isCustom ? \"collapse\" : undefined}\r\n data-bs-target={!isCustom ? \".collapse-date-range\" : undefined}\r\n aria-controls={!isCustom ? \"collapse-date-range\" : undefined}\r\n aria-expanded={!isCustom ? \"false\" : undefined}\r\n className={`btn btn-outline-primary ${active}`}\r\n onClick={() => {\r\n onItemClick(option);\r\n }}\r\n >\r\n {t(option)}\r\n </button>\r\n );\r\n })}\r\n </div>\r\n <div>\r\n <div className=\"input-group custom\">\r\n <div>\r\n <input\r\n disabled={!isCustom}\r\n className=\"form-control\"\r\n type=\"date\"\r\n max={setMinMax(endDate, 0)}\r\n value={startDate}\r\n onChange={onStartDateChange}\r\n />\r\n </div>\r\n\r\n <div className=\"textBetween mt-2\">{t(\"common.to\")}</div>\r\n\r\n <div>\r\n <input\r\n disabled={!isCustom}\r\n className=\"form-control\"\r\n type=\"date\"\r\n min={setMinMax(startDate, 2)}\r\n value={endDate}\r\n onChange={onEndDateChange}\r\n />\r\n </div>\r\n </div>\r\n\r\n <div className=\"mt-2 mb-2\">\r\n <button\r\n className=\"btn btn-primary collapsed\"\r\n data-bs-toggle=\"collapse\"\r\n data-bs-target=\".collapse-date-range\"\r\n aria-controls=\"collapse-date-range\"\r\n aria-expanded=\"false\"\r\n disabled={!isCustom || !areDateValid(startDate, endDate)}\r\n onClick={async () => {\r\n await props.onDateChange(startDate, endDate);\r\n }}\r\n >\r\n {t(\"analytic.apply\")}\r\n </button>\r\n <button\r\n className=\"btn btn-outline-secondary collapsed ms-2\"\r\n data-bs-toggle=\"collapse\"\r\n data-bs-target=\".collapse-date-range\"\r\n aria-controls=\"collapse-date-range\"\r\n aria-expanded=\"false\"\r\n >\r\n {t(\"common.cancel\")}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n\r\n async function setDataBySelectedIndex(option: string) {\r\n const selectedCustom = option === DateRangeOptions.Custom;\r\n\r\n setIsCustom(selectedCustom);\r\n if (!selectedCustom) {\r\n await setStartEndOnClick(\r\n Object.values<DateRangeOptions>(DateRangeOptions).find((dateOption) => dateOption === option),\r\n props.onDateChange\r\n );\r\n }\r\n }\r\n}\r\n\r\nasync function setStartEndOnClick(startDateStr: DateRangeOptions | undefined, onDateChange: (start: string, end: string) => void) {\r\n const now = new Date();\r\n let startDate = new Date(now);\r\n let endDate = new Date(now);\r\n endDate.setDate(endDate.getDate() + 1);\r\n\r\n if (startDateStr === DateRangeOptions.Week) {\r\n startDate.setDate(startDate.getDate() - 6);\r\n } else if (startDateStr === DateRangeOptions.Month) {\r\n startDate.setMonth(startDate.getMonth() - 1);\r\n startDate.setDate(startDate.getDate() + 1);\r\n }\r\n\r\n const start = DateHelpers.toDateString(startDate);\r\n const end = DateHelpers.toDateString(endDate);\r\n\r\n if (end && start) {\r\n onDateChange(start, end);\r\n }\r\n}\r\n\r\nfunction setMinMax(value: string | undefined, daysAdded: number) {\r\n if (value) {\r\n if (daysAdded > 0) {\r\n let minEndDate = new Date(value);\r\n minEndDate.setDate(minEndDate.getDate() + daysAdded);\r\n\r\n return DateHelpers.toDateString(minEndDate);\r\n } else return DateHelpers.toDateString(new Date(value));\r\n }\r\n}\r\n\r\nfunction areDateValid(startDate: string, endDate: string) {\r\n return startDate < endDate && new Date(startDate).getFullYear() >= 2020;\r\n}\r\n","import i18next from \"i18next\";\r\nimport moment from \"moment-timezone\";\r\nimport languageService from \"./language-service\";\r\nimport StringHelpers from \"./string-helpers\";\r\n\r\nexport default class DateHelpers {\r\n static readonly DefaultTimeZone: string = \"America/Toronto\";\r\n\r\n static readonly UserTimeZone: string = Intl.DateTimeFormat().resolvedOptions().timeZone;\r\n\r\n static readonly NB_OF_SECONDS_IN_A_DAY = 86400;\r\n static readonly NB_OF_SECONDS_IN_AN_HOUR = 3600;\r\n static readonly NB_OF_SECONDS_IN_A_MINUTE = 60;\r\n\r\n static formatDateEightChar(date: Date, timeZone: string): string {\r\n if (!date) {\r\n return \"\";\r\n }\r\n\r\n var dec = moment(date);\r\n\r\n return dec.tz(timeZone).format(\"YYYYMMDD\");\r\n }\r\n\r\n static toDateString(date: Date, timeZone: string = DateHelpers.DefaultTimeZone) {\r\n return moment(date).tz(timeZone).format(\"YYYY-MM-DD\");\r\n }\r\n\r\n static toHourString(date: Date, timeZone: string = DateHelpers.DefaultTimeZone) {\r\n return moment(date).tz(timeZone).format(\"hh:mm A\");\r\n }\r\n\r\n static timeSince(date: Date): string {\r\n return moment(date, undefined, languageService.language).fromNow();\r\n }\r\n\r\n static formatNumberToTimeLeftString(nbOfSeconds: number): string {\r\n const days = Math.trunc(nbOfSeconds / this.NB_OF_SECONDS_IN_A_DAY);\r\n const hours = Math.trunc((nbOfSeconds % this.NB_OF_SECONDS_IN_A_DAY) / this.NB_OF_SECONDS_IN_AN_HOUR);\r\n const minutes = Math.trunc((nbOfSeconds % this.NB_OF_SECONDS_IN_AN_HOUR) / this.NB_OF_SECONDS_IN_A_MINUTE);\r\n const seconds = Math.trunc(nbOfSeconds % this.NB_OF_SECONDS_IN_A_MINUTE);\r\n\r\n let dateTime = \"\";\r\n\r\n if (days > 0) {\r\n dateTime = `${Math.max(days, 0)}${i18next.t(\"common.day\")}${days > 1 ? \"s\" : \"\"} `;\r\n }\r\n if (hours > 0) {\r\n dateTime += `${Math.max(hours, 0)}${i18next.t(\"common.hour-symbol\")} `;\r\n }\r\n dateTime += `${Math.max(minutes, 0).toString().padStart(2, \"0\")}${i18next.t(\"common.min\")} `;\r\n dateTime += `${Math.max(seconds, 0).toString().padStart(2, \"0\")}${i18next.t(\"common.sec\")}`;\r\n\r\n return dateTime;\r\n }\r\n\r\n static formatDateTime(date: Date, timeZone: string): string | null {\r\n if (!date) {\r\n return \"\";\r\n }\r\n\r\n var dec = moment(date);\r\n const formattedDate = dec.tz(timeZone).format(\"YYYY/MM/DD HH:mm\");\r\n\r\n return formattedDate;\r\n }\r\n\r\n static formatDuration(seconds: number): string {\r\n if (!seconds) {\r\n return \"\";\r\n }\r\n\r\n const duration = moment.duration(seconds, \"seconds\");\r\n const days = duration.days();\r\n const hours = duration.hours();\r\n const minutes = duration.minutes();\r\n let val = \"\";\r\n\r\n if (days > 0) {\r\n val += `${days} ${i18next.t(\"common.day\")}`;\r\n val = `${StringHelpers.pluralize(days, val)} `;\r\n }\r\n\r\n if (hours > 0) {\r\n val += `${hours} ${i18next.t(\"common.hour\")}`;\r\n val = `${StringHelpers.pluralize(hours, val)} `;\r\n }\r\n\r\n if (minutes > 0) {\r\n val += `${minutes}${i18next.t(\"common.min\")}`;\r\n }\r\n\r\n return val.trim();\r\n }\r\n\r\n static getMonth(date: Date): string {\r\n return date.toLocaleDateString(languageService.getLanguage(), { month: \"long\" });\r\n }\r\n\r\n static getDay(date: Date): string {\r\n return date.toLocaleDateString(languageService.getLanguage(), { day: \"numeric\" });\r\n }\r\n\r\n static getNextDayWithTime(time: string, timeZone: string): Date {\r\n const now = moment().tz(timeZone);\r\n return moment(time, \"HH:mm\", \"en\").isBefore(now)\r\n ? moment(time, \"HH:mm\", \"en\").add(1, \"day\").toDate()\r\n : moment(time, \"HH:mm\", \"en\").toDate();\r\n }\r\n\r\n static formatTime(time: string, timeZone: string): string {\r\n const hourCycle = new Intl.Locale(navigator.language, {\r\n region: \"US\",\r\n }).hourCycle;\r\n console.log(hourCycle);\r\n if (hourCycle === \"h24\") {\r\n return time;\r\n } else {\r\n return moment(time, \"HH:mm\", \"en\").format(\"hh:mm A\");\r\n }\r\n }\r\n\r\n static toApiDate(date: Date): string {\r\n return moment.utc(date).format(\"YYYY-MM-DDTHH:mm Z\");\r\n }\r\n}\r\n","import { useCallback, useState } from \"react\";\r\nimport { useAsyncDebounce } from \"react-table\";\r\nimport { useTranslation } from \"react-i18next\";\r\n\r\nexport function GlobalFilter({ preGlobalFilteredRows, globalFilter, setGlobalFilter }) {\r\n const [value, setValue] = useState(globalFilter);\r\n const { t } = useTranslation();\r\n\r\n const onChange = useCallback(useAsyncDebounce((value) => {\r\n setGlobalFilter(value.trim());\r\n }, 200), [setGlobalFilter]);\r\n\r\n return (\r\n <input\r\n className=\"global-filter form-control\"\r\n placeholder={t(\"common.search\")}\r\n value={value || \"\"}\r\n onChange={(e) => {\r\n setValue(e.target.value);\r\n onChange(e.target.value);\r\n }}\r\n />\r\n );\r\n}\r\n","import { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { Hub } from \"../services/hub/hub\";\r\n\r\ninterface HubLocationProps {\r\n hub: Hub | null;\r\n formatToFit?: number | undefined;\r\n}\r\n\r\nexport default function HubLocationComponent(props: HubLocationProps) {\r\n const { hub, formatToFit } = props;\r\n const { t } = useTranslation();\r\n\r\n if (!hub) {\r\n return null;\r\n }\r\n\r\n const online = hub.state === \"Online\";\r\n const locationStyle = `me-2 text-${online ? \"success\" : \"danger\"}`;\r\n const title = t(online ? \"components.location-online\" : \"components.location-offline\");\r\n\r\n return (\r\n <>\r\n <span className={locationStyle} data-bs-toggle=\"tooltip\" data-bs-placement=\"top\" title={title}>\r\n <FontAwesomeIcon icon={[\"fas\", \"circle\"]} />\r\n </span>\r\n {formatToFit && formatStringToFit(hub.name, formatToFit)}\r\n {!formatToFit && hub.name}\r\n </>\r\n );\r\n}\r\n\r\nfunction formatStringToFit(value: String, minWidth: number) {\r\n value = value.trim();\r\n let nbExtraLetterCanFit = Math.floor((window.innerWidth - minWidth) / 16);\r\n let length = 3 + (nbExtraLetterCanFit > 0 ? nbExtraLetterCanFit : 0);\r\n let resString = value.substr(0, length);\r\n\r\n if (resString === value) return value;\r\n\r\n return value.substr(0, length).trimEnd() + \"...\";\r\n}\r\n","import { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\r\n\r\ninterface LoadingProps {\r\n loading: boolean;\r\n}\r\n\r\nexport default function LoadingComponent(props: LoadingProps) {\r\n const { loading } = props;\r\n\r\n return (\r\n <>\r\n {loading && (\r\n <div className=\"loader\">\r\n <div className=\"text-center\">\r\n <FontAwesomeIcon icon=\"spinner\" spin size=\"3x\" />\r\n </div>\r\n </div>\r\n )}\r\n </>\r\n );\r\n}\r\n","import { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\r\n\r\ntype Props = {\r\n notifyLevel: string;\r\n};\r\n\r\nexport function NotifyLevelComponent(props: Props) {\r\n if (props.notifyLevel === \"High\") {\r\n return <FontAwesomeIcon icon={[\"fas\", \"exclamation-triangle\"]} size=\"2x\" className=\"text-danger\" />;\r\n }\r\n\r\n if (props.notifyLevel === \"Medium\") {\r\n return <FontAwesomeIcon icon={[\"fas\", \"info\"]} size=\"2x\" className=\"text-warning\" />;\r\n }\r\n\r\n return null;\r\n}\r\n","import { useTranslation } from \"react-i18next\";\r\nimport { OrderHelpers } from \"../services/order/order-helpers\";\r\n\r\ntype Props = {\r\n state: string;\r\n isPersonalStorage: boolean;\r\n};\r\n\r\nexport function StateBadgeComponent(props: Props) {\r\n const { t } = useTranslation();\r\n const { state, isPersonalStorage } = props;\r\n\r\n return (\r\n <span className={OrderHelpers.getOrderStateStyle(state, isPersonalStorage)}>\r\n {t((isPersonalStorage ? \"ps-\" : \"\") + \"order-state.\" + state)}\r\n </span>\r\n );\r\n}\r\n","import React from \"react\";\r\nimport StringHelpers from \"../../services/core/string-helpers\";\r\nimport { EditButtonComponent } from \"../button-component\";\r\nimport HubLocationComponent from \"../hub-location-component\";\r\nimport LoadingComponent from \"../loading-component\";\r\nimport { NotifyLevelComponent } from \"../notify-level-icon-component\";\r\nimport { StateBadgeComponent } from \"../state-badge-component\";\r\nimport { useHistory } from \"react-router-dom\";\r\nimport { HeaderGroup, Row, TableBodyProps, TableProps } from \"react-table\";\r\nimport { Hub } from \"../../services/hub/hub\";\r\nimport DateHelpers from \"../../services/core/date-helpers\";\r\n\r\ninterface OrdersTableComponentProps {\r\n hubs: Hub[] | null;\r\n isLoading: boolean;\r\n tableProps: TableProps;\r\n tableBodyProps: TableBodyProps;\r\n headerGroups: HeaderGroup<object>[];\r\n page: Row<Object>[];\r\n prepareRow: (row: Row<object>) => void;\r\n}\r\n\r\nconst OrderIdColumnIndex: number = 0;\r\nconst BadgeColumnIndex: number = 1;\r\nconst CustomerInfoColumIndex: number = 2;\r\nconst CustomerEmailColumnIndex: number = 3;\r\nconst CustomerPhoneColumnIndex: number = 4;\r\nconst HubColumnIndex: number = 5;\r\nconst LockersColumnIndex: number = 6;\r\nconst CreationDateColumnIndex: number = 7;\r\nconst ReservationBlockNameColumnIndex: number = 8;\r\nconst ReferenceNumberColumnIndex: number = 9;\r\nconst TrackingNumbersColumnIndex: number = 10;\r\n\r\nexport function OrdersTableComponent(props: OrdersTableComponentProps) {\r\n const { hubs, isLoading, tableProps, tableBodyProps, headerGroups, page, prepareRow } = props;\r\n\r\n const history = useHistory();\r\n\r\n function findHub(hubId: string | null): Hub | undefined {\r\n if (!hubId) {\r\n return undefined;\r\n }\r\n return hubs?.find((h) => h.id === hubId) || undefined;\r\n }\r\n\r\n return (\r\n <div className=\"row mt-3\">\r\n <div className=\"col\">\r\n <div className=\"customer card\">\r\n <div className=\"card-body\">\r\n <table {...tableProps} className=\"table table-sm table-hover row-clikable\">\r\n <thead>\r\n {headerGroups.map((headerGroup) => (\r\n <tr {...headerGroup.getHeaderGroupProps()}>\r\n <th></th>\r\n\r\n {headerGroup.headers.map((column) => {\r\n const { getHeaderProps, render } = column;\r\n const key = getHeaderProps().key;\r\n if (key !== \"header_email\" && key !== \"header_phone\") {\r\n return <th {...getHeaderProps()}>{render(\"Header\")}</th>;\r\n }\r\n })}\r\n <th></th>\r\n </tr>\r\n ))}\r\n </thead>\r\n <tbody {...tableBodyProps}>\r\n {isLoading && (\r\n <tr>\r\n <td colSpan={10} className=\"text-center\">\r\n <LoadingComponent loading={isLoading} />\r\n </td>\r\n </tr>\r\n )}\r\n\r\n {!isLoading &&\r\n page.map((row, i) => {\r\n prepareRow(row);\r\n const hub = row.cells[OrderIdColumnIndex].value && findHub(row.cells[HubColumnIndex].value);\r\n const url = `/orders/${row.cells[OrderIdColumnIndex].value}`;\r\n const order = row.original as any;\r\n\r\n let customerInfo = \"\";\r\n if (!stringIsNullOrEmpty(row.cells[CustomerInfoColumIndex].value)) {\r\n customerInfo = row.cells[CustomerInfoColumIndex].value;\r\n } else if (!stringIsNullOrEmpty(row.cells[CustomerEmailColumnIndex].value)) {\r\n customerInfo = row.cells[CustomerEmailColumnIndex].value;\r\n } else if (!stringIsNullOrEmpty(row.cells[CustomerPhoneColumnIndex].value)) {\r\n customerInfo = row.cells[CustomerPhoneColumnIndex].value;\r\n } else if (!stringIsNullOrEmpty(row.cells[ReferenceNumberColumnIndex].value)) {\r\n customerInfo = row.cells[ReferenceNumberColumnIndex].value;\r\n }\r\n\r\n const isPersonalStorage = !stringIsNullOrEmpty(row.cells[8].value);\r\n\r\n return (\r\n <tr {...row.getRowProps()} onClick={() => history.push(url)}>\r\n <td className=\"text-center\">\r\n <NotifyLevelComponent notifyLevel={order.notifyLevel}></NotifyLevelComponent>\r\n </td>\r\n\r\n {/* OrderID */}\r\n <td {...row.cells[OrderIdColumnIndex].getCellProps()}>{row.cells[OrderIdColumnIndex].render(\"Cell\")}</td>\r\n\r\n {/* Badge */}\r\n <td {...row.cells[BadgeColumnIndex].getCellProps()}>\r\n <StateBadgeComponent\r\n state={row.cells[BadgeColumnIndex].value}\r\n isPersonalStorage={isPersonalStorage}\r\n ></StateBadgeComponent>\r\n </td>\r\n\r\n {/* Customer info */}\r\n <td {...row.cells[CustomerInfoColumIndex].getCellProps()}>{customerInfo}</td>\r\n\r\n {/* Location */}\r\n <td {...row.cells[HubColumnIndex].getCellProps()}>\r\n <HubLocationComponent hub={hub} formatToFit={376} />\r\n </td>\r\n\r\n {/* Lockers */}\r\n <td {...row.cells[LockersColumnIndex].getCellProps()}>{row.cells[LockersColumnIndex].render(\"Cell\")}</td>\r\n\r\n {/* CreationDate */}\r\n <td {...row.cells[CreationDateColumnIndex].getCellProps()}>\r\n {DateHelpers.formatDateTime(new Date(row.cells[CreationDateColumnIndex].value), DateHelpers.UserTimeZone)}\r\n </td>\r\n\r\n {/* ReservationBlockName */}\r\n <td {...row.cells[ReservationBlockNameColumnIndex].getCellProps()} className=\"overflow-ellipsis\">\r\n {row.cells[ReservationBlockNameColumnIndex].render(\"Cell\")}\r\n </td>\r\n\r\n {/* ReferenceNumber */}\r\n <td {...row.cells[ReferenceNumberColumnIndex].getCellProps()} className=\"overflow-ellipsis\">\r\n {row.cells[ReferenceNumberColumnIndex].render(\"Cell\")}\r\n </td>\r\n {/*TrackingNumbers */}\r\n <td {...row.cells[TrackingNumbersColumnIndex].getCellProps()} className=\"overflow-ellipsis\">\r\n {row.cells[TrackingNumbersColumnIndex].value.map((trackingNumber: string, index: number) => (\r\n <React.Fragment key={index}>\r\n {trackingNumber}\r\n <br />\r\n </React.Fragment>\r\n ))}\r\n </td>\r\n\r\n <td>\r\n <EditButtonComponent url={url}></EditButtonComponent>\r\n </td>\r\n </tr>\r\n );\r\n })}\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nfunction stringIsNullOrEmpty(value: String) {\r\n return value === null || value === undefined || value === \"\" || value === \" \" || value.includes(\"undefined\");\r\n}\r\n","import { useEffect, useState, useMemo, useRef } from \"react\";\r\nimport { useHistory } from \"react-router-dom\";\r\nimport \"./orders-page.scss\";\r\nimport { Order } from \"../../services/order/order\";\r\nimport { Hub } from \"../../services/hub/hub\";\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { useGlobalFilter, usePagination, useTable } from \"react-table\";\r\nimport hubService from \"../../services/hub/hub-service\";\r\nimport orderService, { OrderState } from \"../../services/order/order-service\";\r\nimport Dropdown from \"bootstrap/js/dist/dropdown\";\r\nimport StringHelpers from \"../../services/core/string-helpers\";\r\nimport { OrderHelpers } from \"../../services/order/order-helpers\";\r\nimport Member from \"../../services/member/member\";\r\nimport Organization from \"../../services/organization/organization\";\r\nimport PagingComponent from \"../../components/paging-component\";\r\nimport ToastHelpers from \"../../services/core/toast-helpers\";\r\nimport { AddButtonComponent, SyncButtonComponent } from \"../../components/button-component\";\r\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\r\nimport { CSVLink } from \"react-csv\";\r\nimport languageService from \"../../services/core/language-service\";\r\nimport DateRangeComponent, { DateRangeOptions } from \"../../components/dateRangeComponent\";\r\nimport { GlobalFilter } from \"../../components/globalfilter-component\";\r\nimport { OrdersTableComponent } from \"../../components/orders-page-components/orders-table-component\";\r\nimport DateHelpers from \"../../services/core/date-helpers\";\r\n\r\ninterface IDropdownStateProps {\r\n onChange: any;\r\n}\r\n\r\nfunction DropdownState(props: IDropdownStateProps) {\r\n const { onChange } = props;\r\n\r\n const [state, setState] = useState<OrderState>(OrderState.Active);\r\n const [dropdown, setDropdown] = useState<Dropdown | null>(null);\r\n const ddRef = useRef(null);\r\n\r\n const { t } = useTranslation();\r\n\r\n useEffect(() => {\r\n if (!dropdown) {\r\n setDropdown(new Dropdown(ddRef.current || \"\", {}));\r\n }\r\n }, [dropdown]);\r\n\r\n const onDropdownClick = () => {\r\n dropdown?.show();\r\n };\r\n\r\n const onItemClick = (newState: OrderState) => {\r\n if (state !== newState) {\r\n setState(newState);\r\n onChange(newState);\r\n }\r\n\r\n dropdown?.hide();\r\n };\r\n\r\n return (\r\n <div className=\"dropdown ms-2\">\r\n <button\r\n className=\"btn btn-outline-primary dropdown-toggle\"\r\n type=\"button\"\r\n data-bs-toggle=\"dropdown\"\r\n ref={ddRef}\r\n aria-expanded=\"false\"\r\n onClick={onDropdownClick}\r\n >\r\n {t(`orders-page.dropdown-state-${state.toString()}`)}\r\n </button>\r\n <ul className=\"dropdown-menu\" aria-labelledby=\"dropdown1\">\r\n {Object.values(OrderState).map((state: OrderState) => {\r\n return (\r\n <li key={state}>\r\n <button\r\n className=\"dropdown-item\"\r\n onClick={() => {\r\n onItemClick(state);\r\n }}\r\n >\r\n {t(`orders-page.dropdown-state-${state}`)}\r\n </button>\r\n </li>\r\n );\r\n })}\r\n </ul>\r\n </div>\r\n );\r\n}\r\n\r\ninterface onDateProps {\r\n currentStart: string;\r\n currentEnd: string;\r\n}\r\n\r\ninterface OrdersPageProps {\r\n organization: Organization | undefined;\r\n member: Member;\r\n}\r\n\r\nexport default function OrdersPage(props: OrdersPageProps) {\r\n const { organization } = props;\r\n const [loading, setLoading] = useState<boolean>(true);\r\n const [orders, setOrders] = useState<Array<Order>>([]);\r\n const [hubs, setHubs] = useState<Array<Hub> | null>(null);\r\n const history = useHistory();\r\n\r\n let now = new Date();\r\n let roundAt5 = 5 - (now.getMinutes() % 5);\r\n now.setMinutes(now.getMinutes() + roundAt5);\r\n\r\n let startDate = now;\r\n let endDate = new Date(now);\r\n endDate.setDate(endDate.getDate() + 1);\r\n startDate.setMonth(startDate.getMonth() - 1);\r\n startDate.setDate(startDate.getDate() + 1);\r\n let startInit = DateHelpers.toDateString(startDate, DateHelpers.UserTimeZone);\r\n let endInit = DateHelpers.toDateString(endDate, DateHelpers.UserTimeZone);\r\n\r\n const [currentStartEnd, setCurrentStartEnd] = useState<onDateProps>({\r\n currentStart: startInit,\r\n currentEnd: endInit,\r\n });\r\n\r\n const [currentState, setCurrentState] = useState<OrderState>(OrderState.Active);\r\n\r\n const { t } = useTranslation();\r\n\r\n useEffect(() => {\r\n if (organization) {\r\n setPageSize(10);\r\n\r\n hubService\r\n .getHubs()\r\n .then((hubs) => {\r\n setHubs(hubs);\r\n })\r\n .catch(() => {\r\n ToastHelpers.error(t(\"orders-page.error-refresh\"));\r\n });\r\n }\r\n }, [organization, t]);\r\n\r\n useMemo(async () => {\r\n if (currentStartEnd) {\r\n await refreshOrders(currentStartEnd.currentStart, currentStartEnd.currentEnd);\r\n }\r\n }, [currentState, currentStartEnd]);\r\n\r\n const onStateChange = (newState: OrderState) => {\r\n setCurrentState(newState);\r\n };\r\n\r\n //Prepare Table Data\r\n let tableDataCSV: Array<any> = useMemo(() => [], [orders, hubs]);\r\n\r\n //Table configuration\r\n const columnsTemp = [\r\n {\r\n Header: t(\"orders-page-table-header.OrderId\"),\r\n accessor: \"orderId\",\r\n },\r\n {\r\n Header: t(\"orders-page-table-header.State\"),\r\n accessor: \"state\",\r\n },\r\n {\r\n Header: t(\"orders-page-table-header.Customer\"),\r\n accessor: \"customer\",\r\n },\r\n {\r\n Header: t(\"customers-page-table-header.Email\"),\r\n accessor: \"email\",\r\n },\r\n {\r\n Header: t(\"customers-page-table-header.Phone\"),\r\n accessor: \"phone\",\r\n },\r\n {\r\n Header: t(\"orders-page-table-header.Location\"),\r\n accessor: \"hubId\",\r\n },\r\n {\r\n Header: t(\"orders-page-table-header.Lockers\"),\r\n accessor: \"lockers\",\r\n },\r\n {\r\n Header: t(\"orders-page-table-header.CreationDate\"),\r\n accessor: \"creationDate\",\r\n },\r\n {\r\n Header: t(\"orders-page-table-header.reservation-Block-Name\"),\r\n accessor: \"reservationBlockName\",\r\n },\r\n {\r\n Header: t(\"order-page.reference-number\"),\r\n accessor: \"referenceNumber\",\r\n },\r\n {\r\n Header: t(\"common.tracking-numbers\"),\r\n accessor: \"trackingNumbers\",\r\n },\r\n ];\r\n\r\n const {\r\n getTableProps,\r\n getTableBodyProps,\r\n headerGroups,\r\n rows,\r\n prepareRow,\r\n page,\r\n canPreviousPage,\r\n canNextPage,\r\n pageOptions,\r\n nextPage,\r\n previousPage,\r\n setPageSize,\r\n state,\r\n preGlobalFilteredRows,\r\n setGlobalFilter,\r\n state: { pageIndex },\r\n } = useTable(\r\n {\r\n // eslint-disable-next-line\r\n columns: useMemo(() => columnsTemp, [languageService.language]),\r\n // eslint-disable-next-line\r\n data: useMemo(() => updateTableOrdersData(orders, hubs, tableDataCSV), [orders, hubs]),\r\n initialState: { pageIndex: 0 },\r\n },\r\n useGlobalFilter,\r\n usePagination\r\n );\r\n\r\n useEffect(() => {\r\n setGlobalFilter(state.globalFilter);\r\n }, [orders, hubs]);\r\n\r\n return (\r\n <div className=\"container page orders-page\">\r\n <h1>{t(\"orders-page.locker-orders\")}</h1>\r\n\r\n <div className=\"toolbar\">\r\n <AddButtonComponent title={t(\"orders-page.btn-create-order\")} onClick={() => history.push(`/create-order`)}></AddButtonComponent>\r\n\r\n <AddButtonComponent\r\n className=\"btn btn-outline-primary ms-2\"\r\n title={t(\"orders-page.btn-create-return\")}\r\n onClick={() => history.push(`/create-return`)}\r\n ></AddButtonComponent>\r\n\r\n <SyncButtonComponent\r\n className=\"ms-2\"\r\n onClick={async () => await refreshOrders(currentStartEnd?.currentStart, currentStartEnd?.currentEnd)}\r\n ></SyncButtonComponent>\r\n\r\n <DropdownState onChange={onStateChange} />\r\n\r\n <div className=\"ms-1\">\r\n <DateRangeComponent\r\n id={\"ordersDatesFilter\"}\r\n default={DateRangeOptions.Month}\r\n onDateChange={onDateChanged}\r\n start={currentStartEnd?.currentStart}\r\n end={currentStartEnd?.currentEnd}\r\n />\r\n </div>\r\n\r\n <div className=\"line2 ms-2\">\r\n <CSVLink className=\"btn btn-outline-primary\" data={tableDataCSV} enclosingCharacter={`'`} filename=\"ExportOrders.csv\">\r\n <FontAwesomeIcon icon=\"file-export\"></FontAwesomeIcon> {t(\"common.export\")}\r\n </CSVLink>\r\n\r\n <GlobalFilter preGlobalFilteredRows={preGlobalFilteredRows} globalFilter={state.globalFilter} setGlobalFilter={setGlobalFilter} />\r\n </div>\r\n </div>\r\n\r\n <div>\r\n <OrdersTableComponent\r\n hubs={hubs}\r\n isLoading={loading}\r\n tableProps={getTableProps()}\r\n tableBodyProps={getTableBodyProps()}\r\n headerGroups={headerGroups}\r\n page={page}\r\n prepareRow={prepareRow}\r\n />\r\n <PagingComponent\r\n countTextResource={\"orders-page.item-count\"}\r\n count={rows.length}\r\n pageLength={pageOptions.length}\r\n pageIndex={pageIndex}\r\n canPreviousPage={canPreviousPage}\r\n canNextPage={canNextPage}\r\n previousPage={previousPage}\r\n nextPage={nextPage}\r\n />\r\n </div>\r\n </div>\r\n );\r\n\r\n async function refreshOrders(start: string | undefined, end: string | undefined) {\r\n const orgId = organization?.id;\r\n if (orgId) {\r\n setLoading(true);\r\n if (start && end) {\r\n await orderService\r\n .getOrders(orgId, currentState, start, end)\r\n .then((data) => {\r\n setOrders(data);\r\n })\r\n .catch(() => {\r\n ToastHelpers.error(t(\"orders-page.error-refresh\"));\r\n })\r\n .finally(() => {\r\n setLoading(false);\r\n });\r\n } else {\r\n await orderService\r\n .getOrders(orgId, currentState)\r\n .then((data) => {\r\n setOrders(data);\r\n })\r\n .catch(() => {\r\n ToastHelpers.error(t(\"orders-page.error-refresh\"));\r\n })\r\n .finally(() => {\r\n setLoading(false);\r\n });\r\n }\r\n }\r\n }\r\n\r\n function onDateChanged(start: string, end: string) {\r\n setCurrentStartEnd({ currentStart: start, currentEnd: end });\r\n }\r\n}\r\n\r\n//Prepare Table Data\r\nfunction updateTableOrdersData(orders: Array<Order>, hubs: Array<Hub> | null, tableDataCSV: Array<any>): Array<any> {\r\n const tableData: Array<any> = [];\r\n if (orders && hubs) {\r\n orders.forEach((order: Order) => {\r\n const orderLockers = OrderHelpers.getOrderLockers(order).toString();\r\n const trackingNumbers = order?.items?.flatMap((item) => item.reservation.trackingNumbers ?? []);\r\n tableData.push({\r\n orderId: order.id.toString(),\r\n state: order.state.toString(),\r\n customer: `${order.customer?.lastname?.toString()} ${order.customer?.firstname?.toString()}`,\r\n email: order.customer?.email?.toString(),\r\n phone: order.customer?.phone?.toString(),\r\n hubId: order.hubId,\r\n lockers: orderLockers,\r\n creationDate: order.orderDate.toString(),\r\n notifyLevel: order.notifyLevel,\r\n reservationBlockName: order?.items[0]?.reservation?.reservationBlockName,\r\n referenceNumber: order.referenceNumber,\r\n trackingNumbers: trackingNumbers,\r\n });\r\n\r\n const tmp = {\r\n HubName: order.hubId,\r\n OrderId: order.id.toString(),\r\n ReferenceNumber: order.referenceNumber,\r\n CreationDate: order.orderDate.toString(),\r\n State: order.state.toString(),\r\n FirstName: order.customer?.firstname,\r\n LastName: order.customer?.lastname,\r\n Email: order.customer?.email,\r\n Phone: order.customer?.phone,\r\n SiteId: (order?.items && order.items.length > 0 && order.items[0] && order?.items[0]?.reservation?.micrositeId) || \"\",\r\n reservationBlockName:\r\n (order.items && order.items.length > 0 && order.items[0] && order?.items[0]?.reservation?.reservationBlockName) || \"\",\r\n Locker: orderLockers,\r\n };\r\n tableDataCSV.push(tmp);\r\n });\r\n }\r\n return tableData;\r\n}\r\n","import { memo, useEffect, useMemo, useState } from \"react\";\r\nimport { useTranslation } from \"react-i18next\";\r\nimport \"../customers/customers-page.scss\";\r\nimport ToastHelpers from \"../../services/core/toast-helpers\";\r\nimport Member from \"../../services/member/member\";\r\nimport Organization from \"../../services/organization/organization\";\r\nimport { useGlobalFilter, usePagination, useTable } from \"react-table\";\r\nimport { useHistory } from \"react-router-dom\";\r\nimport LoadingComponent from \"../../components/loading-component\";\r\nimport PagingComponent from \"../../components/paging-component\";\r\nimport { Customer } from \"../../services/order/customer\";\r\nimport { AddButtonComponent, EditButtonComponent, SyncButtonComponent } from \"../../components/button-component\";\r\nimport languageService from \"../../services/core/language-service\";\r\nimport { GlobalFilter } from \"../../components/globalfilter-component\";\r\nimport memberService from \"../../services/member/member-service\";\r\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\r\n\r\ninterface IProps {\r\n organizationId: String | undefined;\r\n setEditMember: Function;\r\n setMemberEdited: Function;\r\n setIsNewUser: Function;\r\n}\r\n\r\nexport default function MemberRoleTable(props: IProps) {\r\n const { organizationId, setEditMember, setMemberEdited, setIsNewUser } = props;\r\n const [loading, setLoading] = useState<boolean>(true);\r\n const [members, setMembers] = useState<Array<Member>>([]);\r\n const [filteredMembers, setFilteredMembers] = useState<Array<Member>>([]);\r\n\r\n const { t } = useTranslation();\r\n\r\n useEffect(() => {\r\n if (organizationId) {\r\n refresh();\r\n }\r\n }, []);\r\n\r\n //Table configuration\r\n const columnsTemp = [\r\n {\r\n Header: t(\"customers-page-table-header.FirstName\"),\r\n accessor: \"firstname\",\r\n },\r\n {\r\n Header: t(\"customers-page-table-header.LastName\"),\r\n accessor: \"lastname\",\r\n },\r\n {\r\n Header: t(\"customers-page-table-header.Email\"),\r\n accessor: \"email\",\r\n },\r\n {\r\n Header: \"Role over Organization\",\r\n accessor: \"role\",\r\n },\r\n ];\r\n\r\n const {\r\n getTableProps,\r\n getTableBodyProps,\r\n headerGroups,\r\n rows,\r\n prepareRow,\r\n page,\r\n canPreviousPage,\r\n canNextPage,\r\n pageOptions,\r\n nextPage,\r\n previousPage,\r\n setPageSize,\r\n state,\r\n preGlobalFilteredRows,\r\n setGlobalFilter,\r\n state: { pageIndex },\r\n } = useTable(\r\n {\r\n // eslint-disable-next-line\r\n columns: useMemo(() => columnsTemp, [languageService.language]),\r\n // eslint-disable-next-line\r\n data: useMemo(() => updateTableCustomersData(filteredMembers, organizationId), [filteredMembers]),\r\n initialState: { pageIndex: 0 },\r\n },\r\n useGlobalFilter,\r\n usePagination\r\n );\r\n\r\n const filterMembers = (list: Array<Member>) => {\r\n if (!members) {\r\n setMembers([]);\r\n return;\r\n }\r\n setFilteredMembers(list);\r\n };\r\n\r\n useEffect(() => {\r\n setGlobalFilter(state.globalFilter);\r\n }, [filteredMembers]);\r\n\r\n return (\r\n <div className=\"container page customers-page\">\r\n <h1>Members</h1>\r\n\r\n <div className=\"toolbar\">\r\n <AddButtonComponent title={\"Create Member\"} onClick={() => editMember(new Member(), true)}></AddButtonComponent>\r\n\r\n <SyncButtonComponent className=\"ms-2\" onClick={() => refresh()}></SyncButtonComponent>\r\n\r\n <GlobalFilter preGlobalFilteredRows={preGlobalFilteredRows} globalFilter={state.globalFilter} setGlobalFilter={setGlobalFilter} />\r\n </div>\r\n\r\n <div>\r\n <div className=\"row mt-3\">\r\n <div className=\"col\">\r\n <div className=\"customer card\">\r\n <div className=\"card-body\">\r\n <table {...getTableProps()} className=\"table table-sm table-hover row-clikable\">\r\n <thead>\r\n {headerGroups.map((headerGroup) => (\r\n <tr {...headerGroup.getHeaderGroupProps()}>\r\n {headerGroup.headers.map((column) => {\r\n return <th {...column.getHeaderProps()}>{column.render(\"Header\")}</th>;\r\n })}\r\n\r\n {/* Empty column header for actions */}\r\n <td></td>\r\n </tr>\r\n ))}\r\n </thead>\r\n <tbody {...getTableBodyProps()}>\r\n {loading && (\r\n <tr>\r\n <td colSpan={7} className=\"text-center\">\r\n <LoadingComponent loading={loading} />\r\n </td>\r\n </tr>\r\n )}\r\n\r\n {!loading &&\r\n page.map((row, i) => {\r\n prepareRow(row);\r\n\r\n let customer = row.original as any;\r\n\r\n return (\r\n <tr {...row.getRowProps()} onClick={() => editMember(customer, false)}>\r\n <td {...row.cells[0].getCellProps()}>{customer.firstname}</td>\r\n <td {...row.cells[1].getCellProps()}>{customer.lastname}</td>\r\n <td {...row.cells[2].getCellProps()}>{customer.email}</td>\r\n <td {...row.cells[3].getCellProps()}>{customer.role}</td>\r\n <td>\r\n <button\r\n className=\"btn btn-outline-primary\"\r\n onClick={() => {\r\n editMember(customer, false);\r\n }}\r\n >\r\n <FontAwesomeIcon icon={[\"fas\", \"pen\"]} />\r\n </button>\r\n </td>\r\n </tr>\r\n );\r\n })}\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <PagingComponent\r\n countTextResource={\"customers-page.item-count\"}\r\n count={rows.length}\r\n pageLength={pageOptions.length}\r\n pageIndex={pageIndex}\r\n canPreviousPage={canPreviousPage}\r\n canNextPage={canNextPage}\r\n previousPage={previousPage}\r\n nextPage={nextPage}\r\n />\r\n </div>\r\n </div>\r\n );\r\n\r\n function editMember(member: Member, isNewUser: boolean) {\r\n setMemberEdited(member);\r\n setIsNewUser(isNewUser);\r\n setEditMember(true);\r\n }\r\n\r\n function refresh() {\r\n const orgId = organizationId;\r\n if (orgId) {\r\n setLoading(true);\r\n\r\n memberService\r\n .getMembers(orgId)\r\n .then((data) => {\r\n setMembers(data);\r\n filterMembers(data);\r\n })\r\n .catch(() => {\r\n ToastHelpers.error(t(\"orders-page.error-refresh\"));\r\n })\r\n .finally(() => {\r\n setLoading(false);\r\n });\r\n }\r\n }\r\n}\r\n\r\nfunction updateTableCustomersData(members: Member[], organizationId: String | undefined): Array<any> {\r\n const tableData: Array<any> = [];\r\n if (members) {\r\n members.forEach((member: Member) => {\r\n var unique: Array<String> = [];\r\n\r\n member.associatedOrganizations.forEach((org) => {\r\n if (org) {\r\n if (org.entity) {\r\n if (!unique.includes(org.entity.id) && org.entity.id == organizationId) {\r\n tableData.push({\r\n firstname: member.firstname?.toString() ?? \"\",\r\n lastname: member.lastname?.toString() ?? \"\",\r\n email: member.email.toString() ?? \"\",\r\n entity: \"Organization\",\r\n role: org.roles.toString() ?? \"\",\r\n associatedHubs: member.associatedHubs,\r\n associatedOrganizations: member.associatedOrganizations,\r\n });\r\n unique.push(org.entity.id);\r\n }\r\n }\r\n }\r\n });\r\n });\r\n }\r\n return tableData;\r\n}\r\n\r\n// if (entityType == \"Hub\") {\r\n// requestMember.associatedHubs?.forEach((org) => {\r\n// if (org.entity?.id == chosenOrgId) {\r\n// var arr: Array<string> = org.roles ?? [];\r\n\r\n// (permission + \",\").split(\",\").forEach((role: String) => {\r\n// arr.push(role?.toString());\r\n// });\r\n\r\n// org.roles = arr;\r\n// }\r\n// });\r\n// }\r\n","import { useTranslation } from \"react-i18next\";\r\n\r\ninterface InputProps {\r\n value: string;\r\n setValue: Function;\r\n msgError?: string;\r\n onMsgErrorChanged?: Function;\r\n regExp?: RegExp;\r\n type?: string;\r\n labelText: string;\r\n required?: boolean;\r\n disabled?: boolean;\r\n autofocus?: boolean | undefined;\r\n}\r\n\r\nexport function InputComponent(props: InputProps) {\r\n const { t } = useTranslation();\r\n\r\n return (\r\n <>\r\n <label className=\"form-label\">{props.labelText}</label>\r\n <input\r\n className=\"form-control\"\r\n type={props.type}\r\n value={props.value}\r\n placeholder={getPlaceHolder(props.type)}\r\n onChange={(ev) => validate(ev.target.value)}\r\n required={props.required}\r\n disabled={props.disabled}\r\n autoFocus={props.autofocus}\r\n />\r\n {props.msgError && <label className=\"error-msg\">{props.msgError}</label>}\r\n </>\r\n );\r\n\r\n function getPlaceHolder(type: string | undefined): string {\r\n switch (type) {\r\n case \"tel\":\r\n return \"000-000-0000\";\r\n case \"email\":\r\n return t(\"input-component.placeholder-email\");\r\n case \"code-6digits\":\r\n return \"XXXXXX\";\r\n case \"code-sl5c\": //TODO: get the code format for each Hub Type.\r\n return \"XXXXXX\";\r\n default:\r\n return \"\";\r\n }\r\n }\r\n\r\n function getMsgError(type: string | undefined) {\r\n switch (type) {\r\n case \"tel\":\r\n return t(\"input-component.error-phone\");\r\n case \"email\":\r\n return t(\"input-component.error-email\");\r\n case \"code-6digits\":\r\n return t(\"input-component.error-code-6digits\");\r\n case \"code-sl5c\":\r\n return t(\"input-component.error-code-sl5c\");\r\n case \"extension\":\r\n return t(\"input-component.error-extension\");\r\n default:\r\n return undefined;\r\n }\r\n }\r\n\r\n function validate(value: string) {\r\n props.setValue(value);\r\n if (props.regExp?.test(value)) {\r\n props.onMsgErrorChanged?.(undefined);\r\n } else {\r\n props.onMsgErrorChanged?.(getMsgError(props.type));\r\n }\r\n }\r\n}\r\n","import { useTranslation } from \"react-i18next\";\r\nconst RegExPhone1 = /^[0-9]{3}-[0-9]{3}-[0-9]{4}$/;\r\nconst RegExPhone2 = /^\\d{10}$/;\r\n\r\ntype Props = {\r\n value: string;\r\n setValue: Function;\r\n msgError: string | undefined;\r\n onMsgErrorChanged: Function;\r\n label: string;\r\n required?: boolean | undefined;\r\n disabled?: boolean | undefined;\r\n autofocus?: boolean | undefined;\r\n};\r\n\r\nexport function PhoneFormComponent(props: Props) {\r\n const { t } = useTranslation();\r\n const error = t(\"input-component.error-phone\");\r\n const labelText = props.label || t(\"common.phone\");\r\n\r\n let disable = props.disabled && props?.disabled === true;\r\n\r\n return (\r\n <>\r\n <div className=\"mb-3\">\r\n <label className=\"form-label\">{labelText}</label>\r\n <input\r\n className=\"form-control\"\r\n type=\"tel\"\r\n value={props.value}\r\n placeholder=\"000-000-0000\"\r\n onChange={(ev) => validate(ev.target.value)}\r\n disabled={disable}\r\n autoFocus={props.autofocus}\r\n />\r\n {props.msgError && <label className=\"error-msg\">{props.msgError}</label>}\r\n </div>\r\n </>\r\n );\r\n\r\n function validate(value: string) {\r\n props.setValue(value);\r\n\r\n if (isValid(value)) {\r\n props.msgError && props.onMsgErrorChanged(undefined);\r\n } else {\r\n !props.msgError && props.onMsgErrorChanged(error);\r\n }\r\n }\r\n\r\n function isValid(value: string): boolean {\r\n let valid: boolean = RegExPhone1.test(value) || RegExPhone2.test(value);\r\n\r\n if (props.required && valid) return true;\r\n\r\n if (!props.required && (valid || value.length === 0)) return true;\r\n\r\n return false;\r\n }\r\n}\r\n","import React from \"react\";\r\nimport Member from \"../../services/member/member\";\r\nimport { useEffect, useMemo, useState } from \"react\";\r\nimport { useTranslation } from \"react-i18next\";\r\nimport \"../customers/customers-page.scss\";\r\nimport ToastHelpers from \"../../services/core/toast-helpers\";\r\nimport Organization from \"../../services/organization/organization\";\r\nimport { useGlobalFilter, usePagination, useTable } from \"react-table\";\r\nimport LoadingComponent from \"../../components/loading-component\";\r\nimport languageService from \"../../services/core/language-service\";\r\nimport memberService from \"../../services/member/member-service\";\r\nimport organizationService from \"../../services/member/organization-service\";\r\nimport { Hub } from \"../../services/hub/hub\";\r\nimport \"./hub-permission-table.scss\";\r\n\r\ninterface Iprops {\r\n member: Member | undefined;\r\n organizationId: string;\r\n setMember: Function;\r\n}\r\n\r\nexport default function HubPermissionTable(props: Iprops) {\r\n const { t } = useTranslation();\r\n\r\n const { member, organizationId, setMember } = props;\r\n const [organization, setOrganization] = useState<Organization>();\r\n const [loading, setLoading] = useState<boolean>(true);\r\n const columnsTemp = [\r\n {\r\n Header: \"Hub Id\",\r\n accessor: \"hubId\",\r\n },\r\n {\r\n Header: \"User permission over Hub\",\r\n accessor: \"permission\",\r\n },\r\n ];\r\n\r\n const {\r\n getTableProps,\r\n getTableBodyProps,\r\n headerGroups,\r\n rows,\r\n prepareRow,\r\n page,\r\n canPreviousPage,\r\n canNextPage,\r\n pageOptions,\r\n nextPage,\r\n previousPage,\r\n setPageSize,\r\n state,\r\n preGlobalFilteredRows,\r\n setGlobalFilter,\r\n state: { pageIndex },\r\n } = useTable(\r\n {\r\n columns: useMemo(() => columnsTemp, [languageService.language]),\r\n data: useMemo(() => updateHubsRoleData(organization, member), [organization, member, loading]),\r\n initialState: { pageIndex: 0 },\r\n },\r\n useGlobalFilter,\r\n usePagination\r\n );\r\n\r\n useEffect(() => {\r\n if (organizationId) {\r\n setPageSize(10);\r\n refresh();\r\n }\r\n }, [organizationId]);\r\n\r\n function refresh() {\r\n const orgId = organizationId;\r\n if (orgId) {\r\n setLoading(true);\r\n\r\n memberService.getMembers(orgId);\r\n organizationService\r\n .getOrganizationById(organizationId)\r\n .then((org) => {\r\n if (org) {\r\n setOrganization(org);\r\n }\r\n })\r\n .catch(() => {\r\n ToastHelpers.error(t(\"orders-page.error-refresh\"));\r\n })\r\n .finally(() => {\r\n setLoading(false);\r\n });\r\n }\r\n }\r\n\r\n async function changeMemberPermissions(permission: string, currentPermission: string, hubId: string) {\r\n // Push updated user to DB\r\n if (member?.email) {\r\n setLoading(true);\r\n\r\n permission = permission === \"None\" ? \"\" : permission;\r\n var mem = member;\r\n\r\n if (currentPermission === \"None\") {\r\n await memberService\r\n .addMemberRole(member.email, hubId, permission, \"Hub\")\r\n .then((res) => {\r\n var hub = new Hub();\r\n hub.id = hubId;\r\n\r\n mem.associatedHubs.push({\r\n entity: hub,\r\n roles: [permission],\r\n });\r\n\r\n setMember(mem);\r\n })\r\n .catch((err) => {\r\n ToastHelpers.error(\"Error creating member role\");\r\n });\r\n } else {\r\n await memberService\r\n .updateMemberRole(member.email, hubId, permission, \"Hub\", \"Active\")\r\n .then((res) => {\r\n mem.associatedHubs.forEach((element) => {\r\n if (element.entity?.id === hubId) {\r\n element.roles = permission === \"\" ? [\"None\"] : [permission];\r\n }\r\n });\r\n setMember(mem);\r\n })\r\n .catch((err) => {\r\n ToastHelpers.error(\"Error changing member role\");\r\n });\r\n }\r\n }\r\n setLoading(false);\r\n }\r\n\r\n return (\r\n <div className=\"mt 10\">\r\n <table {...getTableProps()} className=\"table table-sm table-hover row-clikable\">\r\n <thead>\r\n {headerGroups.map((headerGroup) => (\r\n <tr {...headerGroup.getHeaderGroupProps()}>\r\n {headerGroup.headers.map((column) => {\r\n return <th {...column.getHeaderProps()}>{column.render(\"Header\")}</th>;\r\n })}\r\n\r\n {/* Empty column header for actions */}\r\n <td></td>\r\n </tr>\r\n ))}\r\n </thead>\r\n <tbody {...getTableBodyProps()}>\r\n {loading && (\r\n <tr>\r\n <td colSpan={7} className=\"text-center\">\r\n <LoadingComponent loading={loading} />\r\n </td>\r\n </tr>\r\n )}\r\n\r\n {!loading &&\r\n page.map((row, i) => {\r\n prepareRow(row);\r\n\r\n let hub = row.original as any;\r\n\r\n return (\r\n <tr {...row.getRowProps()}>\r\n <td {...row.cells[0].getCellProps()} id={member?.country}>\r\n {hub.hubId}\r\n </td>\r\n <td {...row.cells[1].getCellProps()}>\r\n <div className=\"permission-radio-group\">\r\n <input\r\n type=\"radio\"\r\n value=\"Admin\"\r\n name={`role-${hub.hubId}`}\r\n checked={hub.permission === \"Admin\" || hub.permission === \"admin\"}\r\n onChange={() => changeMemberPermissions(\"Admin\", hub.permission, hub.hubId)}\r\n />{\" \"}\r\n Admin\r\n <input\r\n type=\"radio\"\r\n value=\"Contributor\"\r\n name={`role-${hub.hubId}`}\r\n checked={hub.permission === \"Contributor\"}\r\n onChange={() => changeMemberPermissions(\"Contributor\", hub.permission, hub.hubId)}\r\n />{\" \"}\r\n Contributor\r\n <input\r\n type=\"radio\"\r\n value=\"Concierge\"\r\n name={`role-${hub.hubId}`}\r\n checked={hub.permission === \"Concierge\"}\r\n onChange={() => changeMemberPermissions(\"Concierge\", hub.permission, hub.hubId)}\r\n />{\" \"}\r\n Concierge\r\n <input\r\n type=\"radio\"\r\n value=\"None\"\r\n name={`role-${hub.hubId}`}\r\n checked={hub.permission === \"None\"}\r\n onChange={() => changeMemberPermissions(\"None\", hub.permission, hub.hubId)}\r\n />{\" \"}\r\n None\r\n </div>\r\n </td>\r\n </tr>\r\n );\r\n })}\r\n </tbody>\r\n </table>\r\n </div>\r\n );\r\n}\r\n\r\nfunction updateHubsRoleData(organization: Organization | undefined, member: Member | undefined): Array<any> {\r\n const tableData: Array<any> = [];\r\n\r\n organization?.associatedHubs.forEach((hub) => {\r\n var permission = \"None\";\r\n\r\n if (member?.associatedHubs) {\r\n member.associatedHubs.forEach((element) => {\r\n if (element.entity?.id == hub.hubId) {\r\n permission = element.roles[0];\r\n }\r\n });\r\n }\r\n\r\n if (hub) {\r\n if (hub.state === \"Approved\") {\r\n tableData.push({\r\n hubId: hub.hubId,\r\n permission: permission,\r\n });\r\n }\r\n }\r\n });\r\n\r\n return tableData;\r\n}\r\n","import React, { useState } from \"react\";\r\nimport { Dropdown } from \"react-bootstrap\";\r\nimport memberService from \"../../services/member/member-service\";\r\nimport { InputComponent } from \"../../components/input\";\r\nimport Member from \"../../services/member/member\";\r\nimport Organization from \"../../services/organization/organization\";\r\nimport ToastHelpers from \"../../services/core/toast-helpers\";\r\nimport MemberRoleOrganization from \"../../services/member/member-role-organization\";\r\nimport organizationService from \"../../services/member/organization-service\";\r\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\r\nimport { PhoneFormComponent } from \"../../components/customer-information-components/phone-component\";\r\nimport HubPermissionTable from \"./hub-permission-table\";\r\nimport { request } from \"http\";\r\nimport LoadingComponent from \"../../components/loading-component\";\r\n\r\ninterface IProps {\r\n editedMember: Member | undefined;\r\n setEditingMember: Function;\r\n chosenOrgId: String;\r\n isNewUser: boolean;\r\n setMemberEdited: Function;\r\n}\r\n\r\nexport default function EditMember(props: IProps) {\r\n const { editedMember, setEditingMember, chosenOrgId, isNewUser, setMemberEdited } = props;\r\n\r\n const [email, setEmail] = useState<string | undefined>(editedMember?.email);\r\n const [firstName, setFirstName] = useState<string | undefined>(editedMember?.firstname);\r\n const [lastName, setLastName] = useState<string | undefined>(editedMember?.lastname);\r\n\r\n const [permission, setPermission] = useState<String>(\r\n editedMember?.associatedOrganizations[0] ? editedMember.associatedOrganizations[0].roles[0] : \"\"\r\n );\r\n const [organization, setOrganization] = useState<String>(chosenOrgId);\r\n const [entityType, setEntityType] = useState<String>(\"Organization\");\r\n const [phoneNumber, setPhoneNumber] = useState<string>(\"\");\r\n\r\n const [newStatus, setNewStatus] = useState<string>(\"Active\");\r\n const [isLoading, setLoading] = useState<boolean>(false);\r\n const [exlanationHidden, setExlanationHidden] = useState<boolean>(true);\r\n\r\n const handleSelect = (setFunc: any, id: any) => {\r\n setFunc(id);\r\n };\r\n\r\n if (isLoading) {\r\n return <LoadingComponent loading={isLoading} />;\r\n }\r\n\r\n return (\r\n <div className=\"col-12\">\r\n <button\r\n className=\"btn btn-outline-primary\"\r\n onClick={() => {\r\n setEditingMember(false);\r\n }}\r\n >\r\n <FontAwesomeIcon icon={[\"fas\", \"arrow-left\"]} />\r\n </button>\r\n <br></br>\r\n {exlanationHidden ? (\r\n <button\r\n className=\"btn btn-outline-primary mt-4\"\r\n onClick={() => {\r\n setExlanationHidden(false);\r\n }}\r\n >\r\n Explain Permissions...\r\n </button>\r\n ) : (\r\n <div>\r\n <p>Roles explanation (In most cases, just put Admin): </p>\r\n <li>All have the permissions of lower roles. Eg: Admin is also a contributor that is also a concierge</li>\r\n <li>\r\n LocketgoAdmin (dangerous) {\">\"} Admin {\">\"} Contributor {\">\"} Concierge {\">\"} None{\" \"}\r\n </li>\r\n <li>LocketgoAdmins are Admins of all orgs and hubs. Only give this permission to trusted Locketgo employees</li>\r\n <li>Admins can block doors from being reserved. They can do report exports and modify events</li>\r\n <li>Contributors can see information related to the reservation such as client phone number or bracelet </li>\r\n <li>Contributors can create customers on the portal for the parcel features </li>\r\n <li>\r\n Concierge can open doors as they wish. Concierges cannot see the organization and it's role can only be applied to the hubs{\" \"}\r\n </li>\r\n </div>\r\n )}\r\n\r\n <div className=\"row g-3 mt-3\">\r\n {isNewUser && (\r\n <div className=\"col-md-6\">\r\n <InputComponent\r\n labelText={\"Firstname\"}\r\n value={firstName ?? \"\"}\r\n setValue={(value: string) => setFirstName(value)}\r\n disabled={false}\r\n />\r\n <InputComponent\r\n labelText={\"Lastname\"}\r\n value={lastName ?? \"\"}\r\n setValue={(value: string) => setLastName(value)}\r\n disabled={false}\r\n />\r\n </div>\r\n )}\r\n\r\n <div className=\"col-md-6\">\r\n <InputComponent\r\n labelText={isNewUser ? \"Email to create*\" : \"Email\"}\r\n value={email ?? \"\"}\r\n setValue={(value: string) => setEmail(value)}\r\n disabled={!isNewUser}\r\n />\r\n </div>\r\n <div className=\"col-md-6\">\r\n <div style={{ display: \"flex\" }}>\r\n <div style={{ width: \"70%\" }}>\r\n <InputComponent\r\n labelText={\"OrganizationId\"}\r\n value={organization?.toString()}\r\n setValue={(value: string) => setOrganization(value)}\r\n disabled={false}\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n <div className=\"col-md-6\">\r\n <InputComponent\r\n labelText={\"Role over organization\"}\r\n value={permission?.toString()}\r\n setValue={(value: string) => setPermission(value)}\r\n disabled={true}\r\n />\r\n <Dropdown>\r\n <Dropdown.Toggle variant=\"primary\" id=\"dropdown-basic\">\r\n Permission options\r\n </Dropdown.Toggle>\r\n\r\n <Dropdown.Menu>\r\n <Dropdown.Item onClick={() => handleSelect(setPermission, \"Admin\")}>Admin</Dropdown.Item>\r\n <Dropdown.Item onClick={() => handleSelect(setPermission, \"LocketgoAdmin\")}>LocketgoAdmin</Dropdown.Item>\r\n <Dropdown.Item onClick={() => handleSelect(setPermission, \"Contributor\")}>Contributor</Dropdown.Item>\r\n <Dropdown.Item onClick={() => handleSelect(setPermission, \"\")}>Nothing</Dropdown.Item>\r\n </Dropdown.Menu>\r\n </Dropdown>\r\n </div>\r\n {isNewUser ? (\r\n <div className=\"mb-3\">\r\n <PhoneFormComponent\r\n value={phoneNumber}\r\n setValue={setPhoneNumber}\r\n onMsgErrorChanged={() => {}}\r\n msgError={\"\"}\r\n label={\"Phone Number\"}\r\n />\r\n </div>\r\n ) : (\r\n <></>\r\n )}\r\n {!isNewUser ? (\r\n <div className=\"col-md-6\">\r\n <div style={{ display: \"flex\" }}>\r\n <div style={{ width: \"70%\" }}>\r\n <InputComponent labelText={\"Status\"} value={newStatus} setValue={(value: string) => setNewStatus(value)} disabled={true} />\r\n </div>\r\n </div>\r\n <Dropdown>\r\n <Dropdown.Toggle variant=\"primary\" id=\"dropdown-basic\">\r\n Status options\r\n </Dropdown.Toggle>\r\n\r\n <Dropdown.Menu>\r\n <Dropdown.Item onClick={() => handleSelect(setNewStatus, \"Active\")}>Active</Dropdown.Item>\r\n <Dropdown.Item onClick={() => handleSelect(setNewStatus, \"Disabled\")}>Disabled</Dropdown.Item>\r\n </Dropdown.Menu>\r\n </Dropdown>\r\n </div>\r\n ) : (\r\n <></>\r\n )}\r\n </div>\r\n\r\n <br></br>\r\n <div style={{ marginBottom: \"100px\" }} className=\"mt-10\">\r\n <button\r\n className=\"btn btn-primary\"\r\n onClick={() => {\r\n setLoading(true);\r\n changeMemberPermissions();\r\n }}\r\n >\r\n {isNewUser ? \"Create Member\" : \"Update Member\"}\r\n </button>\r\n </div>\r\n\r\n <h2>Hub permissions for this Member</h2>\r\n\r\n {!isNewUser && <HubPermissionTable member={editedMember} organizationId={organization.toString()} setMember={setMemberEdited} />}\r\n </div>\r\n );\r\n async function changeMemberPermissions() {\r\n var statusText = document.getElementById(\"queryStatus\");\r\n var res;\r\n\r\n // Creation of updated Member\r\n var requestMember: Member = editedMember == undefined ? new Member() : editedMember;\r\n\r\n requestMember.email = email ?? requestMember.email;\r\n\r\n if (isNewUser) {\r\n var ourOrg: any = await organizationService.getOrganizationById(chosenOrgId?.toString());\r\n requestMember.associatedOrganizations = [ourOrg];\r\n requestMember.id = \"\";\r\n requestMember.phone = phoneNumber ?? \"1231231234\";\r\n requestMember.firstname = firstName ?? \"\";\r\n requestMember.lastname = lastName ?? \"\";\r\n requestMember.postalCode = \"\";\r\n requestMember.unit = \"\";\r\n requestMember.active = true;\r\n }\r\n\r\n if (entityType == \"Organization\") {\r\n requestMember.associatedOrganizations?.forEach((org) => {\r\n if (org.entity?.id == chosenOrgId) {\r\n var arr: Array<string> = org.roles ?? [];\r\n\r\n (permission + \",\").split(\",\").forEach((role: String) => {\r\n arr.push(role?.toString());\r\n });\r\n\r\n org.roles = arr;\r\n }\r\n });\r\n }\r\n\r\n requestMember.type = \"0\";\r\n\r\n // Push user to DB\r\n if (isNewUser) {\r\n if (email) {\r\n await memberService\r\n .createContributor(requestMember)\r\n .then((res) => {})\r\n .catch((err) => {\r\n ToastHelpers.error(\"Error creating member\");\r\n });\r\n await memberService\r\n .addMemberRole(email, organization, permission, entityType)\r\n .then((res) => {\r\n if (statusText) {\r\n setLoading(false);\r\n }\r\n setEditingMember(false);\r\n })\r\n .catch((err) => {\r\n ToastHelpers.error(\"Error changing member role\");\r\n });\r\n } else {\r\n ToastHelpers.error(\"Invalid Email\");\r\n }\r\n } else {\r\n if (email) {\r\n await memberService\r\n .updateMemberRole(email, organization, permission, entityType, newStatus)\r\n .then((res) => {\r\n setLoading(false);\r\n setEditingMember(false);\r\n })\r\n .catch((err) => {\r\n ToastHelpers.error(\"Error changing member role\");\r\n });\r\n } else {\r\n ToastHelpers.error(\"Invalid Email\");\r\n }\r\n }\r\n }\r\n}\r\n","import React, { useState } from \"react\";\r\nimport { ReactSearchAutocomplete } from \"react-search-autocomplete\";\r\n\r\ntype Item = {\r\n id: number;\r\n name: string;\r\n objId: string;\r\n};\r\n\r\ninterface AutocompleteSearchProps {\r\n items: Array<Item>;\r\n setter: Function | undefined;\r\n}\r\n\r\nexport default function AutocompleteSearch(props: AutocompleteSearchProps) {\r\n const [currSelection, setCurrSelection] = useState<String>(\"\");\r\n\r\n const handleOnSelect = (item: any) => {\r\n setCurrSelection(item.objId);\r\n };\r\n\r\n const propagateCurrSelection = () => {\r\n if (props.setter) {\r\n props.setter(currSelection);\r\n }\r\n };\r\n\r\n return (\r\n <div>\r\n <ReactSearchAutocomplete<Item> items={props.items} onSelect={handleOnSelect} />\r\n <div\r\n style={{\r\n width: \"100%\",\r\n display: \"flex\",\r\n marginTop: \"5px\",\r\n justifyContent: \"right\",\r\n }}\r\n >\r\n <button\r\n className=\"btn btn-primary\"\r\n style={{ width: \"300px\" }}\r\n onClick={() => {\r\n propagateCurrSelection();\r\n }}\r\n >\r\n Select\r\n </button>\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import Member from \"../../services/member/member\";\r\nimport { useTranslation } from \"react-i18next\";\r\nimport \"../account/member-page.scss\";\r\nimport MemberRoleTable from \"./memberRoleTable\";\r\nimport Organization from \"../../services/organization/organization\";\r\nimport { useEffect, useState } from \"react\";\r\nimport EditMember from \"./editMember\";\r\nimport organizationService from \"../../services/member/organization-service\";\r\nimport ToastHelpers from \"../../services/core/toast-helpers\";\r\nimport AutocompleteSearch from \"../../components/autocompleteSearch\";\r\n\r\ntype Props = {\r\n member: Member;\r\n};\r\ntype Item = {\r\n id: number;\r\n name: string;\r\n objId: string;\r\n};\r\nexport default function AdminPage(props: Props) {\r\n const { member } = props;\r\n\r\n const { t } = useTranslation();\r\n const [editingMember, setEditingMember] = useState<boolean>(false);\r\n const [memberEdited, setMemberEdited] = useState<Member>();\r\n const [orgsItems, setOrgsItems] = useState<Array<Item>>([]);\r\n const [chosenOrgId, setChosenOrgId] = useState<String>(\"\");\r\n const [isNewUser, setIsNewUser] = useState<boolean>(false);\r\n\r\n useEffect(() => {\r\n var orgsStringList: Array<Item> = [];\r\n var count = 0;\r\n member.associatedOrganizations.forEach((org) => {\r\n if (org.entity) {\r\n orgsStringList.push({\r\n id: count,\r\n name: org.entity.name,\r\n objId: org.entity.id,\r\n });\r\n count++;\r\n }\r\n });\r\n\r\n setOrgsItems(orgsStringList);\r\n }, []);\r\n\r\n return (\r\n <div className=\"container page admin-page pt-5\">\r\n <h2> DATABASE MEMBER MANAGEMENT </h2>\r\n\r\n <h5 className=\"mt-4\"> {chosenOrgId == \"\" && \"Enter the Organisation Name of members you want to modify\"}</h5>\r\n {chosenOrgId != \"\" ? (\r\n editingMember ? (\r\n <EditMember\r\n editedMember={memberEdited}\r\n setEditingMember={setEditingMember}\r\n chosenOrgId={chosenOrgId}\r\n isNewUser={isNewUser}\r\n setMemberEdited={setMemberEdited}\r\n />\r\n ) : (\r\n <MemberRoleTable\r\n organizationId={chosenOrgId}\r\n setEditMember={setEditingMember}\r\n setMemberEdited={setMemberEdited}\r\n setIsNewUser={setIsNewUser}\r\n />\r\n )\r\n ) : (\r\n <AutocompleteSearch items={orgsItems} setter={setChosenOrgId} />\r\n )}\r\n\r\n <div className=\"row mt-5\">\r\n {\r\n // <h2>Microsites TBD TODO</h2>\r\n }\r\n\r\n <br></br>\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import languageService from \"../core/language-service\";\r\nimport ServicesApiBaseService from \"../services-api-base-service\";\r\nimport Member from \"./member\";\r\n\r\nclass CustomersService extends ServicesApiBaseService {\r\n async getCustomer(organizationId: string, customerId: string): Promise<any | undefined> {\r\n const customer = await this.getObject<any>(`${this.apiUrl}/organizations/${organizationId}/customers/${customerId}`);\r\n // console.log(customer);\r\n return customer || undefined;\r\n }\r\n\r\n async getCustomers(organizationId: string): Promise<Array<Member>> {\r\n const members = await this.getObject<Array<Member>>(`${this.apiUrl}/organizations/${organizationId}/customers`);\r\n return members || [];\r\n }\r\n\r\n async createCustomer(\r\n organizationId: string,\r\n firstname: string,\r\n lastname: string,\r\n phoneNumber: string,\r\n email: string,\r\n unit: string,\r\n language?: string | undefined\r\n ): Promise<string | undefined> {\r\n return await this.postObject<any, string>(`${this.apiUrl}/organizations/${organizationId}/customers`, {\r\n firstname: firstname,\r\n lastname: lastname,\r\n phone: phoneNumber,\r\n email: email,\r\n language: language || languageService.getLanguage(),\r\n unit: unit,\r\n });\r\n }\r\n\r\n async updateCustomer(organizationId: string, customer: any): Promise<void> {\r\n return await this.putObject<any>(`${this.apiUrl}/organizations/${organizationId}/customers/${customer.id}`, customer);\r\n }\r\n\r\n async deleteCustomer(organizationId: string, customerId: string): Promise<void> {\r\n return await this.deleteObject<any>(`${this.apiUrl}/organizations/${organizationId}/customers/${customerId}`);\r\n }\r\n}\r\n\r\nconst customersService = new CustomersService();\r\nexport default customersService;\r\n","import { useEffect, useMemo, useState } from \"react\";\r\nimport { useTranslation } from \"react-i18next\";\r\nimport \"./customers-page.scss\";\r\nimport ToastHelpers from \"../../services/core/toast-helpers\";\r\nimport customersService from \"../../services/member/customers-service\";\r\nimport Member from \"../../services/member/member\";\r\nimport Organization from \"../../services/organization/organization\";\r\nimport { useGlobalFilter, usePagination, useTable } from \"react-table\";\r\nimport { useHistory } from \"react-router-dom\";\r\nimport LoadingComponent from \"../../components/loading-component\";\r\nimport PagingComponent from \"../../components/paging-component\";\r\nimport { Customer } from \"../../services/order/customer\";\r\nimport { AddButtonComponent, EditButtonComponent, SyncButtonComponent } from \"../../components/button-component\";\r\nimport languageService from \"../../services/core/language-service\";\r\nimport { GlobalFilter } from \"../../components/globalfilter-component\";\r\n\r\ninterface IProps {\r\n organization: Organization | undefined;\r\n}\r\n\r\nexport default function CustomersPage(props: IProps) {\r\n const { organization } = props;\r\n const [loading, setLoading] = useState<boolean>(true);\r\n const [customers, setCustomers] = useState<Array<Member>>([]);\r\n\r\n const [filteredCustomers, setFilteredCustomers] = useState<Array<Customer>>([]);\r\n\r\n const { t } = useTranslation();\r\n const history = useHistory();\r\n\r\n useEffect(() => {\r\n if (organization) {\r\n setPageSize(10);\r\n\r\n customersService\r\n .getCustomers(organization.id)\r\n .then((customers) => {\r\n setCustomers(customers);\r\n refresh();\r\n })\r\n .catch(() => {\r\n ToastHelpers.error(t(\"customers-page.error-refresh\"));\r\n });\r\n }\r\n }, []);\r\n\r\n const filterCustomers = (list: Array<Member>) => {\r\n if (!customers) {\r\n setFilteredCustomers([]);\r\n return;\r\n }\r\n\r\n setFilteredCustomers(list);\r\n };\r\n\r\n //Table configuration\r\n const columnsTemp = [\r\n {\r\n Header: t(\"customers-page-table-header.FirstName\"),\r\n accessor: \"firstname\",\r\n },\r\n {\r\n Header: t(\"customers-page-table-header.LastName\"),\r\n accessor: \"lastname\",\r\n },\r\n {\r\n Header: t(\"customers-page-table-header.Email\"),\r\n accessor: \"email\",\r\n },\r\n {\r\n Header: t(\"customers-page-table-header.Phone\"),\r\n accessor: \"phone\",\r\n },\r\n {\r\n Header: t(\"customers-page-table-header.Unit\"),\r\n accessor: \"unit\",\r\n },\r\n ];\r\n\r\n const {\r\n getTableProps,\r\n getTableBodyProps,\r\n headerGroups,\r\n rows,\r\n prepareRow,\r\n page,\r\n canPreviousPage,\r\n canNextPage,\r\n pageOptions,\r\n nextPage,\r\n previousPage,\r\n setPageSize,\r\n state,\r\n preGlobalFilteredRows,\r\n setGlobalFilter,\r\n state: { pageIndex },\r\n } = useTable(\r\n {\r\n // eslint-disable-next-line\r\n columns: useMemo(() => columnsTemp, [languageService.language]),\r\n // eslint-disable-next-line\r\n data: useMemo(() => updateTableCustomersData(filteredCustomers), [filteredCustomers]),\r\n initialState: { pageIndex: 0 },\r\n },\r\n useGlobalFilter,\r\n usePagination\r\n );\r\n\r\n useEffect(() => {\r\n setGlobalFilter(state.globalFilter);\r\n }, [filteredCustomers]);\r\n\r\n return (\r\n <div className=\"container page customers-page\">\r\n <h1>{t(\"customers-page.title\")}</h1>\r\n\r\n <div className=\"toolbar\">\r\n <AddButtonComponent\r\n title={t(\"customers-page.btn-create-customer\")}\r\n onClick={() => history.push(`/create-customer`)}\r\n ></AddButtonComponent>\r\n\r\n <SyncButtonComponent className=\"ms-2\" onClick={() => refresh()}></SyncButtonComponent>\r\n\r\n <GlobalFilter preGlobalFilteredRows={preGlobalFilteredRows} globalFilter={state.globalFilter} setGlobalFilter={setGlobalFilter} />\r\n </div>\r\n\r\n <div>\r\n <div className=\"row mt-3\">\r\n <div className=\"col\">\r\n <div className=\"customer card\">\r\n <div className=\"card-body\">\r\n <table {...getTableProps()} className=\"table table-sm table-hover row-clikable\">\r\n <thead>\r\n {headerGroups.map((headerGroup) => (\r\n <tr {...headerGroup.getHeaderGroupProps()}>\r\n {headerGroup.headers.map((column) => {\r\n return <th {...column.getHeaderProps()}>{column.render(\"Header\")}</th>;\r\n })}\r\n\r\n {/* Empty column header for actions */}\r\n <td></td>\r\n </tr>\r\n ))}\r\n </thead>\r\n <tbody {...getTableBodyProps()}>\r\n {loading && (\r\n <tr>\r\n <td colSpan={7} className=\"text-center\">\r\n <LoadingComponent loading={loading} />\r\n </td>\r\n </tr>\r\n )}\r\n\r\n {!loading &&\r\n page.map((row, i) => {\r\n prepareRow(row);\r\n\r\n let customer = row.original as any;\r\n let url = `/customers/${customer.id}`;\r\n\r\n return (\r\n <tr {...row.getRowProps()} onClick={() => history.push(url)}>\r\n <td {...row.cells[0].getCellProps()}>{customer.firstname}</td>\r\n <td {...row.cells[1].getCellProps()}>{customer.lastname}</td>\r\n <td {...row.cells[2].getCellProps()}>{customer.email}</td>\r\n <td {...row.cells[3].getCellProps()}>{customer.phone}</td>\r\n <td {...row.cells[4].getCellProps()}>{customer.unit}</td>\r\n <td>\r\n <EditButtonComponent url={url}></EditButtonComponent>\r\n </td>\r\n </tr>\r\n );\r\n })}\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <PagingComponent\r\n countTextResource={\"customers-page.item-count\"}\r\n count={rows.length}\r\n pageLength={pageOptions.length}\r\n pageIndex={pageIndex}\r\n canPreviousPage={canPreviousPage}\r\n canNextPage={canNextPage}\r\n previousPage={previousPage}\r\n nextPage={nextPage}\r\n />\r\n </div>\r\n </div>\r\n );\r\n\r\n function refresh() {\r\n const orgId = organization?.id;\r\n if (orgId) {\r\n setLoading(true);\r\n\r\n customersService\r\n .getCustomers(orgId)\r\n .then((data) => {\r\n setCustomers(data);\r\n filterCustomers(data);\r\n })\r\n .catch(() => {\r\n ToastHelpers.error(t(\"orders-page.error-refresh\"));\r\n })\r\n .finally(() => {\r\n setLoading(false);\r\n });\r\n }\r\n }\r\n}\r\n\r\nfunction updateTableCustomersData(filteredCustomers: Customer[]): Array<any> {\r\n const tableData: Array<any> = [];\r\n if (filteredCustomers) {\r\n filteredCustomers.forEach((customer: Customer) => {\r\n if (customer.id && customer.lastname && customer.firstname && customer.email) {\r\n tableData.push({\r\n id: customer.id,\r\n firstname: customer.firstname.toString() ?? \"\",\r\n lastname: customer.lastname.toString() ?? \"\",\r\n email: customer.email.toString() ?? \"\",\r\n phone: customer.phone?.toString() ?? \"\",\r\n unit: customer.unit?.toString() ?? \"\",\r\n });\r\n }\r\n });\r\n }\r\n return tableData;\r\n}\r\n","export enum CompartmentStates {\r\n Unknown = \"Unknown\",\r\n Closed = \"Closed\",\r\n Opened = \"Opened\",\r\n}\r\n\r\nexport class Compartment {\r\n number: string = \"\";\r\n state: CompartmentStates = CompartmentStates.Unknown;\r\n isObjectDetected: boolean = false;\r\n sizeId: string = \"\";\r\n packagingOptionsIds: string[] = [];\r\n}\r\n","import { Reservation } from \"../order/reservation\";\r\nimport { Compartment, CompartmentStates } from \"./compartment\";\r\nimport { Group } from \"./group\";\r\nimport { Hub, MyHub } from \"./hub\";\r\n\r\nexport class HubHelpers {\r\n static findGroup(hub: Hub, groupId: string): Group | undefined {\r\n let group = undefined;\r\n hub?.groups?.forEach((element: Group) => {\r\n if (element.id === groupId) {\r\n group = element;\r\n }\r\n });\r\n return group;\r\n }\r\n\r\n static findCompartment(hub: Hub, reservation: Reservation): Compartment | undefined {\r\n return HubHelpers.findGroup(hub, reservation.groupId)?.compartments.find((c) => c.number === reservation?.compartmentNumber);\r\n }\r\n\r\n static GetCompartmentCount(hub: Hub): number {\r\n let nbCompartements = 0;\r\n for (let i = 0; i < hub.groups.length; i++) {\r\n nbCompartements += hub.groups[i].compartments.length;\r\n }\r\n return nbCompartements;\r\n }\r\n\r\n static getPackagingOptiponIds(hub: Hub): Set<string> {\r\n let ids: Set<string> = new Set<string>();\r\n\r\n hub.groups?.forEach((group: Group) => {\r\n group.compartments?.forEach((compartment: Compartment) => {\r\n compartment.packagingOptionsIds?.forEach((packagingOptionId: string) => {\r\n ids.add(packagingOptionId);\r\n });\r\n });\r\n });\r\n\r\n return ids;\r\n }\r\n\r\n static isHubOnline(hubState: string | undefined) {\r\n return hubState === \"Online\";\r\n }\r\n\r\n static isOneGroupsOnline(hub: Hub): boolean {\r\n if (!this.isHubOnline(hub.state)) return false;\r\n\r\n let group = hub.groups.find((group) => group.state === \"Online\");\r\n return group !== null || group !== undefined;\r\n }\r\n\r\n static isGroupOnline(hub: Hub, groupId: string): boolean {\r\n if (!this.isHubOnline(hub.state)) return false;\r\n\r\n let group: Group | undefined = hub?.groups.find((group: Group) => group.id === groupId);\r\n\r\n if (!group || !group?.state) return false;\r\n\r\n return group.state === \"Online\";\r\n }\r\n\r\n static isCompartmentOnline(hub: Hub, groupId: string, compartmentNumber: string): boolean {\r\n if (!this.isHubOnline(hub.state)) return false;\r\n\r\n let group: Group | undefined = hub?.groups.find((group: Group) => group.id === groupId);\r\n\r\n if (!group || !group?.state) return false;\r\n\r\n let compartment: Compartment | undefined = group?.compartments.find(\r\n (compartment: Compartment) => compartment.number === compartmentNumber\r\n );\r\n\r\n if (!compartment || !compartment?.state) return false;\r\n\r\n return compartment.state !== \"Unknown\";\r\n }\r\n\r\n static getAddress(hub: Hub): string {\r\n if (!hub || !hub.address) {\r\n return \"\";\r\n }\r\n\r\n let text = \"\";\r\n\r\n if (hub.address.streetNumber) {\r\n text = hub.address.streetNumber;\r\n }\r\n if (hub.address.street) {\r\n text += (text.length > 0 ? \" \" : \"\") + hub.address.street;\r\n }\r\n\r\n if (hub.address.city) {\r\n text += (text.length > 0 ? \", \" : \"\") + hub.address.city;\r\n }\r\n if (hub.address.state) {\r\n text += (text.length > 0 ? \", \" : \"\") + hub.address.state;\r\n }\r\n if (hub.address.postalCode) {\r\n text += (text.length > 0 ? \", \" : \"\") + hub.address.postalCode;\r\n }\r\n\r\n return text;\r\n }\r\n\r\n static getCompartmentSizeIds(hub: Hub): Set<string> {\r\n let sizeIds = new Set<string>();\r\n\r\n if (hub.id && hub.groups.length > 0) {\r\n hub.groups.forEach((group) => {\r\n if (group.compartments.length > 0) {\r\n group.compartments.forEach((compartment) => {\r\n if (!sizeIds.has(compartment.sizeId)) {\r\n sizeIds.add(compartment.sizeId);\r\n }\r\n });\r\n }\r\n });\r\n }\r\n\r\n return sizeIds;\r\n }\r\n\r\n static getAvailableCompartmentSizeIds(hub: MyHub): Array<string> {\r\n let sizeIds = Array<string>();\r\n\r\n for (let i = 0; i < hub.groups.length; i++) {\r\n let group = hub.groups[i];\r\n for (let j = 0; j < group.compartments.length; j++) {\r\n let compartment = group.compartments[j];\r\n const compartmentHasReservation = hub.reservations.find(\r\n (r) => r.groupId === group.id && r.compartmentNumber === compartment.number\r\n );\r\n const isOpened = compartment.state === CompartmentStates.Opened;\r\n const isDeactivated = hub?.reservationDenies?.some(\r\n (r) => r.compartmentNumber === compartment.number && r.groupId === group.id && r.hubId === hub.id\r\n );\r\n\r\n if (!sizeIds.includes(compartment.sizeId) && !compartmentHasReservation && !isOpened && !isDeactivated) {\r\n sizeIds.push(compartment.sizeId);\r\n }\r\n }\r\n }\r\n\r\n return sizeIds;\r\n }\r\n}\r\n","import ServicesApiBaseService from \"../services-api-base-service\";\r\nimport { CompartmentSize } from \"./compartmentSize\";\r\n\r\nclass CompartmentSizeService extends ServicesApiBaseService {\r\n async getCompartmentSizes(token?: string | undefined): Promise<Array<CompartmentSize>> {\r\n const compartmentSizes = await this.getObject<Array<CompartmentSize>>(\r\n `${this.apiUrl}/compartmentSizes${!token ? \"\" : `?token=${token}`}`\r\n );\r\n if (compartmentSizes) {\r\n let cs = compartmentSizes.map((compartmentSize) => {\r\n if (compartmentSize?.description) {\r\n compartmentSize.description = new Map(Object.entries(compartmentSize?.description));\r\n }\r\n if (compartmentSize.name) {\r\n compartmentSize.name = new Map(Object.entries(compartmentSize?.name));\r\n }\r\n return compartmentSize;\r\n });\r\n return cs;\r\n }\r\n\r\n return compartmentSizes || [];\r\n }\r\n}\r\n\r\nconst compartmentSizeService = new CompartmentSizeService();\r\nexport default compartmentSizeService;\r\n","import ServicesApiBaseService from \"../services-api-base-service\";\r\nimport { PackagingOption } from \"./packgingOption\";\r\n\r\nclass PackagingOptionService extends ServicesApiBaseService {\r\n async getPackagingOptions(): Promise<Array<PackagingOption>> {\r\n const packagingOptions = await this.getObject<Array<PackagingOption>>(`${this.apiUrl}/packagingOptions`);\r\n if (packagingOptions) {\r\n let cs = packagingOptions.map((packagingOption) => {\r\n if (packagingOption?.description) {\r\n packagingOption.description = new Map(Object.entries(packagingOption?.description));\r\n }\r\n return packagingOption;\r\n });\r\n return cs;\r\n }\r\n\r\n return packagingOptions || [];\r\n }\r\n}\r\n\r\nconst packagingOptionService = new PackagingOptionService();\r\nexport default packagingOptionService;\r\n","import { useTranslation } from \"react-i18next\";\r\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\r\nimport \"./yesno-component.scss\";\r\n\r\ninterface ValidationProps {\r\n headerMsg: string;\r\n children?: React.ReactNode;\r\n onYesClick: Function;\r\n onNoClick: Function;\r\n isDangerousChoice?: boolean;\r\n}\r\n\r\nexport function YesNoComponent(props: ValidationProps) {\r\n const { t } = useTranslation();\r\n\r\n const yesButtonClass = props.isDangerousChoice ? \"btn btn-risky me-2\" : \"btn btn-outline-primary me-2\";\r\n\r\n return (\r\n <div className=\"container page\">\r\n <div className=\"col-12 col-xl-6 offset-xl-3\">\r\n <div className=\"card\">\r\n <div className=\"card-header align-items-center\">\r\n <div className=\"d-inline-block\">\r\n <h2>{props.headerMsg}</h2>{\" \"}\r\n </div>\r\n </div>\r\n {props.children && <div className=\"card-body\">{props.children}</div>}\r\n <div className=\"card-footer\">\r\n <div className=\"align-items-center\">\r\n <button className={yesButtonClass} onClick={() => props.onYesClick()}>\r\n {props.isDangerousChoice && <FontAwesomeIcon className=\"icon\" icon={[\"fas\", \"exclamation-triangle\"]} />}\r\n {t(\"common.yes\")}\r\n </button>\r\n\r\n <button className=\"btn btn-outline-primary me-2\" onClick={() => props.onNoClick(false)}>\r\n {t(\"common.no\")}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import { useTranslation } from \"react-i18next\";\r\n\r\ninterface Props {\r\n headerMsg: string;\r\n onYesClick: Function;\r\n onNoClick: Function;\r\n}\r\n\r\nexport function CancelReservationMsgomponent(props: Props) {\r\n const { t } = useTranslation();\r\n\r\n return (\r\n <>\r\n <div className=\"container page\">\r\n <div className=\"col-12 col-lg-8 offset-lg-2\">\r\n <div className=\"card\">\r\n <div className=\"card-header align-items-center\">\r\n <div className=\"d-inline-block\">\r\n <h2>{props.headerMsg}</h2>{\" \"}\r\n </div>\r\n </div>\r\n <div className=\"card-body\">\r\n <div className=\"align-items-center\">\r\n <button className=\"btn btn-outline-primary me-2\" onClick={() => props.onYesClick()}>\r\n {t(\"order-page.cancel-reservation.btn-yes\")}\r\n </button>\r\n\r\n <button className=\"btn btn-outline-primary me-2\" onClick={() => props.onNoClick(false)}>\r\n {t(\"order-page.cancel-reservation.btn-no\")}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </>\r\n );\r\n}\r\n","export enum PaymentState {\r\n Timeout = \"Timeout\",\r\n Error = \"Error\",\r\n Success = \"Success\",\r\n}\r\n","import ServicesApiBaseService from \"../services-api-base-service\";\r\nimport { CardPaymentRequest } from \"./payment-request\";\r\nimport { v4 as uuidv4 } from \"uuid\";\r\nimport { CardPaymentIntentResponse } from \"./payment-intent-response\";\r\nimport orderService from \"../order/order-service\";\r\nimport { PaymentState } from \"./payment-state\";\r\nimport { CardPaymentResponse } from \"./payment-response\";\r\nimport { Pricing } from \"./pricing\";\r\nimport { Payment } from \"./payment\";\r\n\r\nclass PaymentService extends ServicesApiBaseService {\r\n async createPaymentIntent(orderId: string): Promise<CardPaymentIntentResponse> {\r\n return await this.postObject<any, any>(`${this.apiUrl}/payments/create-payment-intent/${orderId}`, null);\r\n }\r\n\r\n async pay(cardPaymentRequest: CardPaymentRequest, organizationId: string): Promise<CardPaymentResponse> {\r\n if (!cardPaymentRequest.idempotencyKey) cardPaymentRequest.idempotencyKey = uuidv4();\r\n\r\n let timeoutId = setTimeout(() => {\r\n orderService\r\n .getOrderById(organizationId, cardPaymentRequest.orderToken, cardPaymentRequest.orderToken)\r\n .then((order) => {\r\n if (order && order.payments && order.payments.length > 0) {\r\n console.log(\"Payment charge Success (Timer)\");\r\n return { state: PaymentState.Success };\r\n }\r\n\r\n console.log(\"Payment charge Timeout\");\r\n return { state: PaymentState.Timeout };\r\n })\r\n .catch(() => {\r\n console.log(\"Payment charge Timeout error catched\");\r\n return { state: PaymentState.Timeout };\r\n });\r\n }, 25000);\r\n\r\n try {\r\n const error = await this.postObject<CardPaymentRequest, string>(`${this.apiUrl}/payments`, cardPaymentRequest);\r\n if (error) {\r\n return { state: PaymentState.Error, error: error };\r\n } else {\r\n return { state: PaymentState.Success, error: undefined };\r\n }\r\n } catch (e: any) {\r\n console.log(typeof e);\r\n console.error(e.message);\r\n return { state: PaymentState.Error, error: \"Declined payment\" };\r\n } finally {\r\n clearTimeout(timeoutId);\r\n }\r\n }\r\n\r\n async getEndNowPricing(orderToken: string): Promise<Pricing | undefined> {\r\n let pricing = await this.getObject<Pricing>(`${this.apiUrl}/payments/end-now-pricing?ordertoken=${orderToken}`);\r\n return pricing;\r\n }\r\n\r\n async getPayment(orderToken: string): Promise<Payment[]> {\r\n let payment = await this.getObject<Payment[]>(`${this.apiUrl}/payments?ordertoken=${orderToken}`);\r\n return payment || [];\r\n }\r\n\r\n async endReservationEarly(orderToken: string): Promise<void> {\r\n let idempotencyKey = uuidv4();\r\n await this.postObject<any, any>(`${this.apiUrl}/payments/pay-for-end-of-reservation`, {\r\n orderToken: orderToken,\r\n idempotencyKey: idempotencyKey,\r\n });\r\n }\r\n\r\n async refundPayment(paymentId: string): Promise<void> {\r\n let idempotencyKey = uuidv4();\r\n await this.postObject<any, any>(`${this.apiUrl}/payments/${paymentId}/actions/refund?idempotencyKey=${idempotencyKey}`, null);\r\n }\r\n}\r\n\r\nconst paymentService = new PaymentService();\r\nexport default paymentService;\r\n","import { useTranslation } from \"react-i18next\";\r\nimport { Order } from \"../../../services/order/order\";\r\nimport languageService from \"../../../services/core/language-service\";\r\nimport StringHelpers from \"../../../services/core/string-helpers\";\r\nimport Member from \"../../../services/member/member\";\r\nimport { OrderHelpers } from \"../../../services/order/order-helpers\";\r\nimport DateHelpers from \"../../../services/core/date-helpers\";\r\n\r\ninterface OrderHistoryProps {\r\n order: Order;\r\n member: Member;\r\n}\r\n\r\nexport default function OrderHistory({ order, member }: OrderHistoryProps) {\r\n const language: string = languageService.getLanguage();\r\n const { t } = useTranslation();\r\n\r\n return (\r\n <>\r\n <div className=\"row panel-history-mobile\">\r\n <div className=\"col-12\">\r\n <div className=\"history card\">\r\n <div className=\"card-body\">\r\n <h5 className=\"card-title\">{t(\"order-page.history\")}</h5>\r\n\r\n {order.activities.map((activity) => {\r\n return (\r\n <div className=\"history-item\" key={activity.id}>\r\n <hr />\r\n <div>\r\n <span className=\"creation-date\">\r\n {DateHelpers.formatDateTime(new Date(activity.createdOn), DateHelpers.UserTimeZone)}\r\n </span>\r\n <span className=\"author\">{activity.createBy}</span>\r\n </div>\r\n <div className=\"text\">\r\n <span>{OrderHelpers.getActivityDescription(activity, language)}</span>\r\n </div>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div className=\"row panel-history-desktop\">\r\n <div className=\"col-12\">\r\n <div className=\"customer card\">\r\n <div className=\"card-body\">\r\n <h5 className=\"card-title\">{t(\"order-page.history\")}</h5>\r\n\r\n <table className=\"table table-history\">\r\n <thead>\r\n <tr>\r\n <td>{t(\"order-page-table-header.date\")}</td>\r\n <td>{t(\"order-page-table-header.operation\")}</td>\r\n <td>{t(\"order-page-table-header.author\")}</td>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {order.activities.map((activity) => {\r\n return (\r\n <tr key={activity.id}>\r\n <td>{DateHelpers.formatDateTime(new Date(activity.createdOn), DateHelpers.UserTimeZone)}</td>\r\n <td>{OrderHelpers.getActivityDescription(activity, language)}</td>\r\n <td>{activity.createBy}</td>\r\n </tr>\r\n );\r\n })}\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </>\r\n );\r\n}\r\n","import { useTranslation } from \"react-i18next\";\r\nimport StringHelpers from \"../../../services/core/string-helpers\";\r\nimport { Order } from \"../../../services/order/order\";\r\nimport { OrderHelpers } from \"../../../services/order/order-helpers\";\r\nimport { Payment } from \"../../../services/payment/payment\";\r\nimport DateHelpers from \"../../../services/core/date-helpers\";\r\n\r\ninterface OrderPaymentInformationProps {\r\n order: Order;\r\n payment: Payment | undefined;\r\n isPersonalStorage: boolean;\r\n timeZone: string;\r\n}\r\n\r\nexport default function OrderPaymentInformation(props: OrderPaymentInformationProps) {\r\n const { order, payment, isPersonalStorage, timeZone } = props;\r\n const { t } = useTranslation();\r\n return (\r\n <div className=\"col-12 col-lg-4\">\r\n {payment && (\r\n <div className=\"card\">\r\n <div className=\"card-body\">\r\n <h5 className=\"card-title d-flex justify-content-between\">\r\n <span>{t(\"order-page.reservation-payment-informations\")}</span>\r\n </h5>\r\n <p className=\"card-text\">\r\n {isPersonalStorage && (\r\n <>\r\n {t(\"order-page.paid-date\")}{\" \"}\r\n <strong>\r\n {payment?.creationDate\r\n ? DateHelpers.formatDateTime(new Date(payment?.creationDate), timeZone)\r\n : t(\"order-page.packaging-option-none\")}\r\n </strong>\r\n <br />\r\n {t(\"order-page.paid-amount\")}{\" \"}\r\n <strong>\r\n {t(\"order-page.price\", {\r\n cost: payment ? StringHelpers.formatPrice(payment.amount + payment.saleTaxTotal) : StringHelpers.formatPrice(0),\r\n currency: payment?.currency,\r\n })}\r\n\r\n {OrderHelpers.isRefundedOrder(order) && <span className={\"ms-2 badge bg-danger\"}>{t(\"order-page.refunded\")}</span>}\r\n </strong>\r\n {OrderHelpers.canRefundOrder(order) && (\r\n <>\r\n <br />\r\n {t(\"order-page.card-number\")}{\" \"}\r\n <strong>\r\n {payment?.cardLastFour && payment?.cardBrand\r\n ? `${payment?.cardBrand} •••• •••• •••• ${payment?.cardLastFour}`\r\n : t(\"order-page.packaging-option-none\")}\r\n </strong>\r\n <br />\r\n {t(\"order-page.card-expiration\")}{\" \"}\r\n <strong>\r\n {payment?.cardExpirationMonth && payment?.cardExpirationYear\r\n ? ` ${String(payment?.cardExpirationMonth).padStart(2, \"0\")}/${String(payment?.cardExpirationYear % 100).padStart(\r\n 2,\r\n \"0\"\r\n )}`\r\n : t(\"order-page.packaging-option-none\")}\r\n </strong>\r\n </>\r\n )}\r\n </>\r\n )}\r\n </p>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n","import { useTranslation } from \"react-i18next\";\r\nimport HubLocationComponent from \"../../../components/hub-location-component\";\r\nimport languageService from \"../../../services/core/language-service\";\r\nimport StringHelpers from \"../../../services/core/string-helpers\";\r\nimport { Hub } from \"../../../services/hub/hub\";\r\nimport { PackagingOption } from \"../../../services/hub/packgingOption\";\r\nimport { Order } from \"../../../services/order/order\";\r\nimport DateHelpers from \"../../../services/core/date-helpers\";\r\n\r\ninterface OrderGeneralProps {\r\n order: Order;\r\n hub: Hub;\r\n isOrgContributor: boolean | undefined;\r\n timeZone: string;\r\n packagingOption: PackagingOption | null;\r\n carrierName: string | undefined;\r\n}\r\n\r\nexport default function OrderGeneral(props: OrderGeneralProps) {\r\n const { order, hub, isOrgContributor, timeZone, packagingOption, carrierName } = props;\r\n const { t } = useTranslation();\r\n return (\r\n <div className=\"col-12 col-lg-4\">\r\n <div className=\"card\">\r\n <div className=\"card-body\">\r\n <h5 className=\"card-title d-flex justify-content-between\">\r\n <span>{t(\"order-page.general\")}</span>\r\n </h5>\r\n <p className=\"card-text\">\r\n <span>\r\n {t(\"order-page.location\")}\r\n {\": \"}\r\n <strong>\r\n <HubLocationComponent hub={hub} />\r\n </strong>\r\n <br />\r\n </span>\r\n {isOrgContributor && (\r\n <span>\r\n {t(\"order-page.order-flow\")}{\" \"}\r\n <strong>{order.flow && t(\"order-page.order-flow-\" + order.flow.toString().toLowerCase())}</strong>\r\n </span>\r\n )}\r\n <br />\r\n {t(\"order-page.creation-date\")} <strong>{DateHelpers.formatDateTime(new Date(order?.orderDate), timeZone)}</strong>\r\n {order?.flow.toString() === \"PersonalStorage\" && (\r\n <>\r\n <br />\r\n <span>\r\n {t(\"order-page.reservation-Block-Name\")} <strong>{order?.items[0]?.reservation?.reservationBlockName}</strong>\r\n </span>\r\n </>\r\n )}\r\n {packagingOption && (\r\n <>\r\n <br />\r\n {t(\"order-page.packaging-option\")}:{\" \"}\r\n <strong>{packagingOption && packagingOption.description.get(languageService.language)}</strong>\r\n </>\r\n )}\r\n {carrierName && (\r\n <>\r\n <br />\r\n {t(\"order-page.carrier\")}: <strong>{carrierName}</strong>\r\n </>\r\n )}\r\n {order.referenceNumber && (\r\n <>\r\n <br />\r\n <span className=\"overflow-ellipsis\">\r\n {t(\"order-page.reference-number\")}: <strong>{order.referenceNumber}</strong>\r\n </span>\r\n </>\r\n )}\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\r\nimport { useTranslation } from \"react-i18next\";\r\n\r\ninterface OrderCustomerProps {\r\n customerInfoHtml: string;\r\n hasCustomerContactInformation: boolean;\r\n canSendNotification: boolean;\r\n isFirstTimeNotification: boolean;\r\n onSendNotification: React.MouseEventHandler<HTMLButtonElement>;\r\n}\r\n\r\nexport default function OrderCustomer(props: OrderCustomerProps) {\r\n const { customerInfoHtml, hasCustomerContactInformation, canSendNotification, isFirstTimeNotification, onSendNotification } = props;\r\n const { t } = useTranslation();\r\n return (\r\n <div className=\"col-12 col-lg-4\">\r\n <div className=\"customer card\">\r\n <div className=\"card-body\">\r\n <h5 className=\"card-title\">{t(\"order-page.customer\")}</h5>\r\n <div className=\"row\">\r\n <div className=\"col-12\">\r\n <p dangerouslySetInnerHTML={{ __html: customerInfoHtml }}></p>\r\n </div>\r\n </div>\r\n {hasCustomerContactInformation && (\r\n <div className=\"row\">\r\n <div className=\"col-12\">\r\n <button\r\n className=\"btn btn-sm btn-primary float-end\"\r\n onClick={onSendNotification}\r\n disabled={!canSendNotification}\r\n >\r\n {isFirstTimeNotification ? t(\"order-page.notify\") : t(\"order-page.notify-again\")}\r\n <FontAwesomeIcon className=\"ms-1\" icon={[\"fas\", \"bell\"]} />\r\n </button>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\r\nimport { useTranslation } from \"react-i18next\";\r\n\r\nexport function DoorOpeningGifComponent() {\r\n const { t } = useTranslation();\r\n\r\n return (\r\n <>\r\n <span>\r\n <img className=\"opening-image\" src=\"/locketgo-glyph-spin.gif\" alt=\"\" /> {t(\"order-page.opening\")}\r\n </span>\r\n </>\r\n );\r\n}\r\n\r\nexport function DoorOpenedComponent() {\r\n const { t } = useTranslation();\r\n\r\n return (\r\n <>\r\n <FontAwesomeIcon icon={[\"fas\", \"lock-open\"]} />\r\n <span className=\"ms-2\">{t(\"order-page.opened\")}</span>\r\n </>\r\n );\r\n}\r\n\r\ninterface OpenDoorProps {\r\n onClick: Function;\r\n disabled: boolean;\r\n displayIcon: boolean;\r\n}\r\nOpenDoorComponent.defaultProps = {\r\n disabled: false,\r\n displayIcon: true,\r\n};\r\nexport function OpenDoorComponent(props: OpenDoorProps) {\r\n const { t } = useTranslation();\r\n\r\n return (\r\n <>\r\n <button className=\"btn btn-primary text-nowrap\" onClick={() => props.onClick()} disabled={props.disabled}>\r\n {props.displayIcon && <FontAwesomeIcon icon={[\"fas\", \"lock\"]} />}\r\n <span className=\"ms-2\">{t(\"order-page.btnOpen\")}</span>\r\n </button>\r\n </>\r\n );\r\n}\r\n\r\ninterface CreateReservationProps {\r\n onClick: Function;\r\n title: string;\r\n disabled: boolean;\r\n}\r\n\r\nexport function CreateReservationComponent(props: CreateReservationProps) {\r\n return (\r\n <button className=\"btn-reserve-locker mt-3 mb-3 btn btn-primary\" onClick={() => props.onClick()} disabled={props.disabled}>\r\n <FontAwesomeIcon className=\"me-2\" icon={[\"fas\", \"plus\"]} />\r\n {props.title}\r\n </button>\r\n );\r\n}\r\n\r\ninterface NoReservationComponentProps {\r\n title: string;\r\n}\r\n\r\nexport function NoReservationComponent(props: NoReservationComponentProps) {\r\n return (\r\n <>\r\n <tr key={\"noreservation\"}>\r\n <td colSpan={9} style={{ textAlign: \"center\" }}>\r\n {props.title}\r\n </td>\r\n </tr>\r\n </>\r\n );\r\n}\r\n","import { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\r\nimport moment from \"moment\";\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { useHistory } from \"react-router-dom\";\r\nimport { SyncButtonComponent, DeleteButtonComponent } from \"../../../components/button-component\";\r\nimport { NotifyLevelComponent } from \"../../../components/notify-level-icon-component\";\r\nimport {\r\n NoReservationComponent,\r\n DoorOpeningGifComponent,\r\n OpenDoorComponent,\r\n DoorOpenedComponent,\r\n} from \"../../../components/order-page-components\";\r\nimport { StateBadgeComponent } from \"../../../components/state-badge-component\";\r\nimport languageService from \"../../../services/core/language-service\";\r\nimport StringHelpers from \"../../../services/core/string-helpers\";\r\nimport ToastHelpers from \"../../../services/core/toast-helpers\";\r\nimport { CompartmentSize } from \"../../../services/hub/compartmentSize\";\r\nimport { Hub } from \"../../../services/hub/hub\";\r\nimport { HubHelpers } from \"../../../services/hub/hub-helper\";\r\nimport { Order } from \"../../../services/order/order\";\r\nimport { OrderHelpers } from \"../../../services/order/order-helpers\";\r\nimport { Reservation } from \"../../../services/order/reservation\";\r\nimport Organization from \"../../../services/organization/organization\";\r\nimport orderService from \"../../../services/order/order-service\";\r\nimport { ReservationState } from \"../../../services/order/ReservationState\";\r\nimport { useMemo } from \"react\";\r\nimport DateHelpers from \"../../../services/core/date-helpers\";\r\n\r\ninterface OrderReservationProps {\r\n order: Order;\r\n orderId: string;\r\n organization: Organization;\r\n hub: Hub;\r\n isAdmin: boolean;\r\n isOrgContributor: boolean | undefined;\r\n isCarriedByCarrier: boolean;\r\n isPersonalStorage: boolean;\r\n isReturn: boolean;\r\n itemIdInOpening: string | null;\r\n compartmentSizes: Array<CompartmentSize>;\r\n onCreateReservation(): void;\r\n onRefresh(): Promise<void>;\r\n onTrackingNumberDelete(orderItemId: string, trackingNumber: string): void;\r\n onOrderItemDelete(organizationId: string, orderId: string, orderItemId: string, reservationState: string): void;\r\n openDoor(organizationId: string, orderId: string, orderItemId: string, state: string): Promise<void>;\r\n}\r\n\r\nfunction OrderReservation(props: OrderReservationProps) {\r\n const {\r\n order,\r\n orderId,\r\n organization,\r\n hub,\r\n isAdmin,\r\n isOrgContributor,\r\n isCarriedByCarrier,\r\n isPersonalStorage,\r\n isReturn,\r\n itemIdInOpening,\r\n compartmentSizes,\r\n onRefresh,\r\n onTrackingNumberDelete,\r\n onCreateReservation,\r\n onOrderItemDelete,\r\n openDoor,\r\n } = props;\r\n\r\n const { t } = useTranslation();\r\n const language: string = languageService.getLanguage();\r\n const history = useHistory();\r\n const dateTimeNow = () => moment(new Date()).format(\"YYYY-MM-DDTHH:mm\");\r\n\r\n const isAnyReservationOpened = useMemo(() => {\r\n return order.items?.some((oi) => OrderHelpers.inOpenedState(oi?.reservation?.state));\r\n }, [order]);\r\n\r\n const reservationStart = order.items[0]?.reservation?.start;\r\n const reservationEnd = order.items[0]?.reservation?.end;\r\n const isCarrierOrder = order.carrierId && order.items.length >= 1;\r\n\r\n let sliceReservationDatesNumber: number = 0;\r\n\r\n if (reservationStart && reservationEnd) {\r\n if (reservationStart.substring(0, 10) === reservationEnd.substring(0, 10)) {\r\n sliceReservationDatesNumber = 10;\r\n } else if (reservationStart.substring(0, 5) === reservationEnd.substring(0, 5)) {\r\n sliceReservationDatesNumber = 5;\r\n }\r\n }\r\n\r\n return (\r\n <div className=\"row\">\r\n <div className=\"col\">\r\n <div className=\"customer card\">\r\n <div className=\"card-body\">\r\n <h5 className=\"card-title\">\r\n {t(\"order-page.locker-reservation\")}\r\n {isPersonalStorage && (\r\n <SyncButtonComponent className={!isCarrierOrder ? \"ms-2\" : \"\"} onClick={onRefresh}></SyncButtonComponent>\r\n )}\r\n </h5>\r\n <div>\r\n {compartmentSizes[0] && !isPersonalStorage && (\r\n <>\r\n {!isCarrierOrder && (\r\n <button\r\n className=\"btn-reserve-locker mt-3 mb-3 btn btn-primary\"\r\n onClick={() => onCreateReservation()}\r\n disabled={!canCreateReservation(hub, itemIdInOpening, order)}\r\n >\r\n <FontAwesomeIcon className=\"me-2\" icon={[\"fas\", \"plus\"]} />\r\n {t(\"order-page.btn-add-locker-reservation\")}\r\n </button>\r\n )}\r\n <SyncButtonComponent className={!isCarrierOrder ? \"ms-2\" : \"\"} onClick={onRefresh}></SyncButtonComponent>\r\n </>\r\n )}\r\n </div>\r\n\r\n <table className=\"table table-sm table-order\">\r\n <thead>\r\n <tr>\r\n <th></th>\r\n <th>{t(\"order-page-table-header.locker\")}</th>\r\n <th>{t(\"order-page-table-header.size\")}</th>\r\n <th>{t(\"order-page-table-header.orderItemState\")}</th>\r\n <th>{t(\"order-page-table-header.doorState\")}</th>\r\n {isPersonalStorage && <th>{t(\"order-page-table-header.codes\")}</th>}\r\n {!isPersonalStorage && (\r\n <>\r\n <th>{t(\"common.tracking-numbers\")}</th>\r\n <th>{t(\"order-page-table-header.dropoffCode\")}</th>\r\n </>\r\n )}\r\n\r\n <th></th>\r\n <th></th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {order.items?.length === 0 && <NoReservationComponent title={t(\"order-page.no-reservation\")}></NoReservationComponent>}\r\n\r\n {order.items?.map((orderItem) => {\r\n let reservation = orderItem?.reservation;\r\n const codeToDisplay = isReturn ? orderItem.reservation.pickupCode : orderItem.reservation.dropoffCode;\r\n\r\n if (reservation) {\r\n let sizeId = HubHelpers.findGroup(hub, reservation.groupId)?.compartments.find(\r\n (c) => c.number === reservation.compartmentNumber\r\n )?.sizeId;\r\n\r\n const compartmentSize = compartmentSizes.find((cs) => cs.id === sizeId);\r\n\r\n const notifyLevel = reservation.notifyLevel;\r\n let notifyText = \"\";\r\n if (notifyLevel === \"Medium\" || notifyLevel === \"High\") {\r\n const dropOffTime = new Date(reservation.dropOffTime);\r\n notifyText = t(\"order-page.notifyText\", { since: DateHelpers.timeSince(dropOffTime) });\r\n }\r\n\r\n const hasOpening = itemIdInOpening !== null;\r\n const inOpening = itemIdInOpening == orderItem.id;\r\n const isTrackingNumberDisabled =\r\n !OrderHelpers.trackingNumbersEditable(order) || hasOpening || isAnyReservationOpened || order.carrierId !== null;\r\n let openAvailable = true;\r\n if (isReturn) {\r\n openAvailable = reservation.state === ReservationState.ReadyForPickUp;\r\n } else if (isPersonalStorage) {\r\n openAvailable = false;\r\n } else {\r\n openAvailable =\r\n reservation.state === ReservationState.New || reservation.state === ReservationState.PackagingReadyForPickUp;\r\n }\r\n\r\n openAvailable = openAvailable && dateTimeNow() >= moment(new Date(reservation.start)).format(\"YYYY-MM-DDTHH:mm\");\r\n\r\n const opened = OrderHelpers.inOpenedState(reservation.state);\r\n\r\n const lockernumb = /^\\d+$/.test(reservation.compartmentNumber)\r\n ? reservation.compartmentNumber\r\n : reservation.groupId + reservation.compartmentNumber;\r\n\r\n return (\r\n <tr key={orderItem.id}>\r\n <td title={notifyText}>\r\n <NotifyLevelComponent notifyLevel={order.notifyLevel}></NotifyLevelComponent>\r\n </td>\r\n <td>{lockernumb}</td>\r\n <td>\r\n {isCarriedByCarrier\r\n ? t(\"order-page.item.size\", {\r\n height: orderItem.height,\r\n width: orderItem.width,\r\n depth: orderItem.depth,\r\n })\r\n : compartmentSize?.name.get(language)}\r\n </td>\r\n <td>\r\n <StateBadgeComponent state={reservation.state} isPersonalStorage={isPersonalStorage}></StateBadgeComponent>\r\n </td>\r\n <td>\r\n {inOpening && !isAnyReservationOpened && <DoorOpeningGifComponent />}\r\n {!inOpening && !opened && (\r\n <OpenDoorComponent\r\n onClick={async () => await openDoor(organization.id, orderId, orderItem.id, reservation.state)}\r\n disabled={!openAvailable || hasOpening || isAnyReservationOpened || !HubHelpers.isHubOnline(hub.state)}\r\n ></OpenDoorComponent>\r\n )}\r\n {!inOpening && opened && <DoorOpenedComponent />}\r\n </td>\r\n <td style={{ maxWidth: \"750px\" }}>\r\n {orderItem.reservation.trackingNumbers.map((track) => (\r\n <span className=\"badge rounded-pill bg-dark text-light p-2 me-1\">\r\n {track}\r\n <button\r\n className=\"btn-close btn-close-white float-end ms-1 p-0\"\r\n onClick={() => onTrackingNumberDelete(orderItem.id, track)}\r\n disabled={isTrackingNumberDisabled}\r\n ></button>\r\n </span>\r\n ))}\r\n\r\n <span\r\n id={`tracking-number-adding-${orderItem.id}`}\r\n className=\"badge rounded-pill bg-dark text-light p-2 me-1\"\r\n hidden\r\n >\r\n <form\r\n onSubmit={(ev) => {\r\n ev.preventDefault();\r\n let input = ev.currentTarget.getElementsByTagName(\"input\")[0] as HTMLInputElement;\r\n addTrackingNumber(organization.id, order, orderItem.id, input.value);\r\n showAddOrderItemTrackingNumberInput(orderItem.id, false);\r\n }}\r\n >\r\n <input\r\n id=\"trackingNumberInput\"\r\n onBlur={() => showAddOrderItemTrackingNumberInput(orderItem.id, false)}\r\n onKeyDown={(input: React.KeyboardEvent<any>) =>\r\n onTabKeyDownToAddTrackingNumber(input, order, organization.id, orderItem.id)\r\n }\r\n type=\"text\"\r\n ></input>\r\n </form>\r\n </span>\r\n\r\n <button\r\n type=\"button\"\r\n onClick={() => showAddOrderItemTrackingNumberInput(orderItem.id, true)}\r\n id={`tracking-number-add-btn-${orderItem.id}`}\r\n className=\"badge rounded-pill btn btn-primary p-2 ps-3 pe-3\"\r\n disabled={isTrackingNumberDisabled}\r\n >\r\n <FontAwesomeIcon icon={[\"fas\", \"plus\"]} />\r\n </button>\r\n </td>\r\n\r\n {!isPersonalStorage && <td>{codeToDisplay}</td>}\r\n <td>\r\n <span className=\"justify-content-around d-flex\">\r\n {isOrgContributor && (\r\n <button\r\n className=\"btn btn-primary\"\r\n onClick={() => {\r\n history.push(`${orderId}/items/${orderItem.id}/relocate`);\r\n }}\r\n disabled={\r\n hasOpening ||\r\n isAnyReservationOpened ||\r\n reservation.state === ReservationState.Completed ||\r\n order.deleted === 1\r\n }\r\n >\r\n {t(\"order-page.relocate\")}\r\n </button>\r\n )}\r\n {orderItem.id && reservation.state && !isPersonalStorage && (\r\n <DeleteButtonComponent\r\n title={undefined}\r\n onClick={() => onOrderItemDelete(organization.id, orderId, orderItem.id, reservation.state)}\r\n disabled={!canCancelReservation(hub, order, hasOpening, isAnyReservationOpened, reservation, isReturn)}\r\n ></DeleteButtonComponent>\r\n )}\r\n </span>\r\n </td>\r\n <td>\r\n <button className=\"icon-info-circle primary\" data-bs-target=\"#sizeInfo\" data-bs-toggle=\"modal\">\r\n <FontAwesomeIcon icon={[\"fas\", \"info-circle\"]} />\r\n </button>\r\n <div className=\"modal\" tabIndex={-1} id=\"sizeInfo\">\r\n <div className=\"modal-dialog\">\r\n <div className=\"modal-content\">\r\n <div className=\"modal-header\">\r\n <h5 className=\"modal-title\">{t(\"order-page.reservation-details\")}</h5>\r\n <button type=\"button\" className=\"btn-close\" data-bs-dismiss=\"modal\" aria-label=\"Close\"></button>\r\n </div>\r\n <div className=\"modal-body\">\r\n <div style={{ textAlign: \"left\" }}>\r\n <h6>{t(\"order-page.size-details\") + \":\"}</h6>\r\n {compartmentSizes.map((compartmentSize: CompartmentSize) => {\r\n return (\r\n <div>\r\n {compartmentSize?.name.get(language)}: {compartmentSize?.description.get(language)}\r\n </div>\r\n );\r\n })}\r\n {order?.flow.toString() === \"PersonalStorage\" && isAdmin && reservationStart && reservationEnd && (\r\n <div>\r\n <hr></hr>\r\n {t(\"order-page.reservationDate\")}\r\n {\": \"}\r\n {DateHelpers.formatDateTime(new Date(reservationStart), DateHelpers.DefaultTimeZone)?.slice(\r\n sliceReservationDatesNumber\r\n )}{\" \"}\r\n {t(\"common.to\")}{\" \"}\r\n {DateHelpers.formatDateTime(new Date(reservationEnd), DateHelpers.DefaultTimeZone)?.slice(\r\n sliceReservationDatesNumber\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n <div className=\"modal-footer\">\r\n <button type=\"button\" className=\"btn btn-outline-primary\" data-bs-dismiss=\"modal\">\r\n {t(\"common.close\")}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </td>\r\n </tr>\r\n );\r\n }\r\n return \"\";\r\n })}\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n\r\n function onTabKeyDownToAddTrackingNumber(input: React.KeyboardEvent<any>, order: Order, organizationId: string, orderItemId: string) {\r\n if (input.key === \"Tab\") {\r\n const trackingNumberInput: HTMLInputElement = document.getElementById(\"trackingNumberInput\") as HTMLInputElement;\r\n addTrackingNumber(organizationId, order, orderItemId, trackingNumberInput?.value);\r\n showAddOrderItemTrackingNumberInput(orderItemId, false);\r\n }\r\n }\r\n\r\n async function addTrackingNumber(organizationId: string, currentOrder: Order, orderItemId: string, trackingNumber: string) {\r\n if (!trackingNumber) {\r\n return;\r\n }\r\n\r\n if (organization.id == \"granby\" && isPersonalStorage && !trackingNumber.match(/^[1-4]{6}$/)) {\r\n ToastHelpers.error(t(\"input-component.error-code-sl5c\"));\r\n return;\r\n }\r\n\r\n const order: Order = { ...currentOrder };\r\n let trackingNumbers = new Array<string>();\r\n\r\n if (order) {\r\n for (let i = 0; i < order.items.length; i++) {\r\n if (order.items[i].id === orderItemId) {\r\n order.items[i].reservation.trackingNumbers.push(trackingNumber);\r\n trackingNumbers = order.items[i].reservation.trackingNumbers;\r\n }\r\n }\r\n\r\n await orderService.updateOrderItem(organizationId, orderId, orderItemId, trackingNumbers).catch((error: any) => {\r\n if (error?.response?.data === \"Tracking number already existing\") {\r\n if (isPersonalStorage) {\r\n ToastHelpers.error(t(\"order-page.code-already-existing\"));\r\n } else {\r\n ToastHelpers.error(t(\"order-page.tracking-number-already-existing\"));\r\n }\r\n } else {\r\n ToastHelpers.error(t(\"order-page.error-create-tracking-number\"));\r\n }\r\n });\r\n\r\n await onRefresh();\r\n }\r\n }\r\n}\r\n\r\nfunction canCreateReservation(hub: Hub, itemIdInOpening: String | null, order: Order) {\r\n if (!HubHelpers.isOneGroupsOnline(hub)) {\r\n return false;\r\n }\r\n\r\n if (itemIdInOpening) {\r\n return false;\r\n }\r\n\r\n return OrderHelpers.editable(order);\r\n}\r\n\r\nfunction canCancelReservation(\r\n hub: Hub,\r\n order: Order,\r\n hasOpening: boolean,\r\n isAnyReservationOpened: boolean,\r\n reservation: Reservation,\r\n isReturn: boolean\r\n) {\r\n if (!hub) return false;\r\n if (order?.deleted) return false;\r\n if (hasOpening || isAnyReservationOpened) return false;\r\n\r\n if (reservation.state === ReservationState.New) return true;\r\n\r\n if (!isReturn && reservation.state === ReservationState.ReadyForPickUp) {\r\n return HubHelpers.isGroupOnline(hub, reservation.groupId);\r\n }\r\n\r\n return false;\r\n}\r\n\r\nfunction showAddOrderItemTrackingNumberInput(orderItemId: string, show: boolean) {\r\n let inputContainer = document.getElementById(`tracking-number-adding-${orderItemId}`);\r\n let btn = document.getElementById(`tracking-number-add-btn-${orderItemId}`);\r\n\r\n if (inputContainer) {\r\n inputContainer.hidden = !show;\r\n let input = inputContainer.getElementsByTagName(\"form\")[0].getElementsByTagName(\"input\")[0];\r\n if (show) {\r\n input.focus();\r\n } else {\r\n input.value = \"\";\r\n }\r\n }\r\n if (btn) {\r\n btn.hidden = show;\r\n }\r\n}\r\n\r\nexport default OrderReservation;\r\n","import { useState } from \"react\";\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { ActionButtonComponent } from \"../../../components/button-component\";\r\nimport { InputComponent } from \"../../../components/input\";\r\nimport organizationService from \"../../../services/member/organization-service\";\r\nimport { Order } from \"../../../services/order/order\";\r\nimport Organization from \"../../../services/organization/organization\";\r\n\r\nexport interface OrderRequestOrganizationAddressModalProps {\r\n isAdmin: boolean;\r\n organization: Organization;\r\n order: Order;\r\n onRequiredAddressMessageChange: (isAddressMessageRequired: boolean) => void;\r\n requestCarrierPickup: (order: Order, organization: Organization) => void;\r\n}\r\nfunction OrderRequestOrganizationAddressModal(props: OrderRequestOrganizationAddressModalProps) {\r\n const { isAdmin, organization, order, onRequiredAddressMessageChange, requestCarrierPickup } = props;\r\n const { t } = useTranslation();\r\n\r\n const [streetNumber, setStreetNumber] = useState<string>(\"\");\r\n const [street, setStreet] = useState<string>(\"\");\r\n const [city, setCity] = useState<string>(\"\");\r\n const [postalCode, setPostalCode] = useState<string>(\"\");\r\n const state = \"QC\";\r\n const country = \"Canada\";\r\n\r\n if (!isAdmin) {\r\n return (\r\n <div className=\"container page\">\r\n <div className=\"col-12 col-xl-6 offset-xl-3\">\r\n <div className=\"card\">\r\n <div className=\"card-header align-items-center\">\r\n <div className=\"d-inline-block\">\r\n <h2>{t(\"order-page.msg-admin-requires-address\")}</h2>{\" \"}\r\n </div>\r\n </div>\r\n <div className=\"card-body\">\r\n <div className=\"align-items-center\">\r\n <button className=\"btn btn-primary\" onClick={() => onRequiredAddressMessageChange(false)}>\r\n {t(\"common.return\")}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"container page\">\r\n <div className=\"col-12 col-xl-6 offset-xl-3\">\r\n <div className=\"card\">\r\n <div className=\"card-header align-items-center\">\r\n <div className=\"d-inline-block\">\r\n <h2>{t(\"order-page.msg-requires-address\")}</h2>\r\n <div>{t(\"order-page.msg-address-precision\")}</div>\r\n </div>\r\n </div>\r\n <div className=\"card-body\">\r\n <form className=\"row g-3\" onSubmit={(ev) => ev.preventDefault()}>\r\n <div className=\"col-md-3\">\r\n <InputComponent\r\n labelText={t(\"member-profile.streetNumber\") + \"*\"}\r\n setValue={(value: string) => setStreetNumber(value)}\r\n value={streetNumber}\r\n />\r\n </div>\r\n <div className=\"col-md-9\">\r\n <InputComponent\r\n labelText={t(\"member-profile.street\") + \"*\"}\r\n setValue={(value: string) => setStreet(value)}\r\n value={street}\r\n />\r\n </div>\r\n <div className=\"col-md-8\">\r\n <InputComponent labelText={t(\"member-profile.city\") + \"*\"} setValue={(value: string) => setCity(value)} value={city} />\r\n </div>\r\n <div className=\"col-md-4\">\r\n <InputComponent\r\n labelText={t(\"member-profile.postalCode\") + \"*\"}\r\n setValue={(value: string) => setPostalCode(value)}\r\n value={postalCode}\r\n />\r\n </div>\r\n <div className=\"col-md-6\">\r\n <InputComponent labelText={t(\"member-profile.state\") + \"*\"} setValue={(value: string) => {}} value={state} disabled />\r\n </div>\r\n <div className=\"col-md-6\">\r\n <InputComponent labelText={t(\"member-profile.country\") + \"*\"} setValue={(value: string) => {}} value={country} disabled />\r\n </div>\r\n <div className=\"col-6\">\r\n <ActionButtonComponent\r\n type=\"submit\"\r\n title={t(\"order-page.request-carrier-pickup\")}\r\n onClick={() => saveAddressAndSend(order)}\r\n disabled={saveDisabled()}\r\n className=\"btn btn-primary me-2\"\r\n icon={[\"fas\", \"paper-plane\"]}\r\n />\r\n <ActionButtonComponent\r\n title={t(\"common.cancel\")}\r\n onClick={() => onRequiredAddressMessageChange(false)}\r\n className=\"btn btn-outline-secondary me-2\"\r\n />\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n\r\n function saveDisabled(): boolean {\r\n return !street || !streetNumber || !city || !postalCode;\r\n }\r\n\r\n function saveAddressAndSend(order: Order) {\r\n if (street && streetNumber && city && postalCode && organization) {\r\n organizationService.updateOrganization(organization.id, streetNumber, street, city, postalCode, state, country).then(() => {\r\n onRequiredAddressMessageChange(false);\r\n\r\n organization.street = street;\r\n organization.streetNumber = streetNumber;\r\n organization.city = city;\r\n organization.postalCode = postalCode;\r\n organization.state = state;\r\n organization.country = country;\r\n\r\n requestCarrierPickup(order, organization);\r\n });\r\n }\r\n\r\n onRequiredAddressMessageChange(false);\r\n }\r\n}\r\n\r\nexport default OrderRequestOrganizationAddressModal;\r\n","import { useState, useEffect, useCallback } from \"react\";\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { Link, useParams } from \"react-router-dom\";\r\nimport { Hub } from \"../../services/hub/hub\";\r\nimport hubService from \"../../services/hub/hub-service\";\r\nimport { Order, OrderFlowStringValue } from \"../../services/order/order\";\r\nimport orderService from \"../../services/order/order-service\";\r\nimport \"./order-page.scss\";\r\nimport StringHelpers from \"../../services/core/string-helpers\";\r\nimport { OrderHelpers } from \"../../services/order/order-helpers\";\r\nimport { HubHelpers } from \"../../services/hub/hub-helper\";\r\nimport Member from \"../../services/member/member\";\r\nimport languageService from \"../../services/core/language-service\";\r\nimport compartmentSizeService from \"../../services/hub/compartmentSize-service\";\r\nimport \"./orders-page.scss\";\r\nimport { CompartmentSize } from \"../../services/hub/compartmentSize\";\r\nimport { PackagingOption } from \"../../services/hub/packgingOption\";\r\nimport packagingOptionService from \"../../services/hub/packagingOption-service\";\r\nimport { YesNoComponent } from \"../../components/yesno-component\";\r\nimport { ActionButtonComponent, DeleteButtonComponent } from \"../../components/button-component\";\r\nimport LoadingComponent from \"../../components/loading-component\";\r\nimport ToastHelpers from \"../../services/core/toast-helpers\";\r\n\r\nimport { CancelReservationMsgomponent } from \"../../components/cancel-reservation-msg-component\";\r\nimport { StateBadgeComponent } from \"../../components/state-badge-component\";\r\nimport Organization from \"../../services/organization/organization\";\r\nimport memberService from \"../../services/member/member-service\";\r\nimport paymentService from \"../../services/payment/payment-service\";\r\nimport { Payment } from \"../../services/payment/payment\";\r\nimport OrderHistory from \"./order-details/order-history\";\r\nimport OrderPaymentInformation from \"./order-details/order-payment-information\";\r\nimport OrderGeneral from \"./order-details/order-general\";\r\nimport OrderCustomer from \"./order-details/order-customer\";\r\nimport OrderReservation from \"./order-details/order-reservation\";\r\nimport OrderRequestOrganizationAddressModal from \"./order-modals/order-request-organization-address-modal\";\r\nimport DateHelpers from \"../../services/core/date-helpers\";\r\n\r\ninterface OrderPageProps {\r\n organization: Organization;\r\n member: Member;\r\n}\r\n\r\ninterface IParamTypes {\r\n orderId: string;\r\n}\r\n\r\nexport default function OrderPage(props: OrderPageProps) {\r\n const { organization, member } = props;\r\n const { orderId } = useParams<IParamTypes>();\r\n\r\n const [loading, setLoading] = useState<boolean>(true);\r\n const [order, setOrder] = useState<Order | null>(null);\r\n const [hub, setHub] = useState<Hub>(new Hub());\r\n const [compartmentSizes, setCompatmentSizes] = useState<Array<CompartmentSize>>([]);\r\n const [isEdit, setIsEdit] = useState<boolean>(false);\r\n const [selectSizeDisabled, setSelectSizeDisabled] = useState<boolean>(false);\r\n const [msgEditError, setMsgEditError] = useState<string | undefined>(undefined);\r\n const [packagingOption, setPackagingOption] = useState<PackagingOption | null>(null);\r\n const [isCancelOrder, setIsCancelOrder] = useState<boolean>(false);\r\n const [isCancelReservation, setIsCancelReservation] = useState<boolean>(false);\r\n const [itemIdInOpening, setItemIdInOpening] = useState<string | null>(null);\r\n const [isCarriedByCarrier, setIsCarriedByCarrier] = useState<boolean>(false);\r\n const [isRequestingCarrierPickup, setIsRequestingCarrierPickup] = useState<boolean>(false);\r\n const [isCancellingCarrierPickup, setIsCancellingCarrierPickup] = useState<boolean>(false);\r\n const [isCarrierPickupRequested, setIsCarrierPickupRequested] = useState<boolean>(false);\r\n const [canSendNotification, setCanSendNotification] = useState<boolean>(false);\r\n const [isSendingNotification, setIsSendingNotification] = useState<boolean>(false);\r\n const [isReturn, setIsReturn] = useState<boolean>(false);\r\n const [labelBlob, setLabelBlob] = useState<Blob | null>(null);\r\n const [isRequiresAddressMessage, setIsRequiresAddressMessage] = useState<boolean>(false);\r\n const [isDeleteTrackingNumber, setIsDeleteTrackingNumber] = useState<boolean>(false);\r\n const [isCompleteOrder, setIsCompleteOrder] = useState<boolean>(false);\r\n\r\n const [isPersonalStorage, setIsPersonalStorage] = useState<boolean>(false);\r\n const [isRequestingRefund, setIsRequestingRefund] = useState<boolean>(false);\r\n const [payment, setPayment] = useState<Payment | undefined>();\r\n\r\n const [itemHeight, setItemHeight] = useState<string | undefined>();\r\n const [itemWidth, setItemWidth] = useState<string | undefined>();\r\n const [itemDepth, setItemDepth] = useState<string | undefined>();\r\n const [itemWeight, setItemWeight] = useState<string | undefined>();\r\n const [orderItemId, setOrderItemId] = useState<string>(\"\");\r\n const [trackingNumber, setTrackingNumber] = useState<string | undefined>();\r\n const [isAdmin, setIsAdmin] = useState<boolean>(false);\r\n const [isOrgContributor, setIsOrgContributor] = useState<boolean>();\r\n\r\n const { t } = useTranslation();\r\n const language: string = languageService.getLanguage();\r\n\r\n useEffect(\r\n () => {\r\n if (loading && organization.id) {\r\n setIsAdmin(memberService.isOrganizationAdmin(member, organization.id));\r\n setIsOrgContributor(memberService.isOrganizationContributor(member, organization.id));\r\n packagingOptionService.getPackagingOptions().then((packagingOptions) => {\r\n orderService\r\n .getOrderById(organization.id, orderId)\r\n .then((order) => {\r\n setOrder(order);\r\n setPayment(order?.payments?.[0]);\r\n\r\n if (order) {\r\n setIsReturn(order.flow.toString() === \"Return\");\r\n setIsPersonalStorage(order.flow.toString() === \"PersonalStorage\");\r\n\r\n if (order.flow.toString() === \"Return\") {\r\n setCanSendNotification(order.state === \"New\");\r\n } else if (order.flow.toString() === \"PersonalStorage\") {\r\n setCanSendNotification(order.state !== \"Cancelled\" && order.state !== \"Completed\");\r\n } else {\r\n setCanSendNotification(order.state === \"ReadyForPickUp\");\r\n }\r\n\r\n setIsCarriedByCarrier(order.carrierId ? true : false);\r\n\r\n if (order.carrierSubmissionReferenceNumber) setIsCarrierPickupRequested(true);\r\n\r\n if (order.hubId) {\r\n hubService.getHubById(order.hubId).then((hub) => {\r\n setHub(hub);\r\n\r\n compartmentSizeService.getCompartmentSizes().then((compartmentSizes: Array<CompartmentSize>) => {\r\n let compartmentSizeIdsOfHub = HubHelpers.getCompartmentSizeIds(hub);\r\n let compartmentSizesOfHub = compartmentSizes?.filter((size) => compartmentSizeIdsOfHub.has(size.id));\r\n setCompatmentSizes(compartmentSizesOfHub);\r\n });\r\n\r\n if (order.packagingOptionId) {\r\n const option = packagingOptions.find((po) => po.id === order.packagingOptionId);\r\n\r\n if (option) {\r\n setPackagingOption(option);\r\n }\r\n }\r\n });\r\n }\r\n }\r\n })\r\n .catch((error) => {\r\n ToastHelpers.error(t(\"order-page.error-refresh\", { status: error?.response?.status }));\r\n })\r\n .finally(() => {\r\n setLoading(false);\r\n });\r\n });\r\n }\r\n },\r\n // eslint-disable-next-line\r\n [orderId, organization, itemIdInOpening]\r\n );\r\n\r\n useEffect(() => {\r\n const refreshInterval = setInterval(refresh, 5000);\r\n return () => clearInterval(refreshInterval);\r\n }, [loading]);\r\n\r\n const requestCarrierPickup = useCallback(\r\n async (order: Order, organization: Organization) => {\r\n try {\r\n if (OrderHelpers.canRequestCarrierPickup(order)) {\r\n if (requiresAddress(order, organization)) {\r\n setIsRequestingCarrierPickup(false);\r\n setIsRequiresAddressMessage(true);\r\n return;\r\n }\r\n\r\n setIsRequestingCarrierPickup(false);\r\n await orderService.requestCarrierPickup(order.organizationId.toString(), order.id);\r\n await refresh();\r\n setIsRequestingCarrierPickup(false);\r\n }\r\n } catch (error: any) {\r\n ToastHelpers.error(t(\"common.error-generic\"));\r\n }\r\n },\r\n [refresh] // I think refresh needs to use callback too because otherwise, requestCarrierPickup will re-render every time the component renders\r\n );\r\n\r\n let listInfo = [];\r\n let customer = StringHelpers.getFullName(order?.customer?.firstname, order?.customer?.lastname);\r\n if (customer) {\r\n listInfo.push(customer);\r\n }\r\n\r\n let email = order?.customer?.email || \"\";\r\n if (email) {\r\n listInfo.push(email);\r\n }\r\n\r\n let phone = order?.customer?.phone || \"\";\r\n if (phone) {\r\n listInfo.push(phone);\r\n }\r\n\r\n let refId = order?.customer?.referenceId || \"\";\r\n if (refId) {\r\n listInfo.push(`${t(\"order-page.reference-number\")}: <strong>${refId}</strong>`);\r\n }\r\n\r\n let customerInfoHtml = listInfo.join(\"<br/>\");\r\n\r\n let carrierName = hub?.carriers?.find((c) => c.id === order?.carrierId)?.name;\r\n\r\n return (\r\n <div>\r\n {canShowOrderDetails() === true && (\r\n <div className=\"container page order-page\">\r\n <div className=\"page-breadcrumb\">\r\n <ul className=\"breadcrumb\">\r\n <li className=\"breadcrumb-item active\">\r\n <Link className=\"\" to=\"/orders\">\r\n {t(\"order-page.orderlink\")}\r\n </Link>\r\n </li>\r\n <li className=\"breadcrumb-item active\">{orderId}</li>\r\n </ul>\r\n </div>\r\n\r\n {!loading && !order && (\r\n <div className=\"text-center mt-4\">\r\n <p>{t(\"order-page.no-order-message\")}</p>\r\n </div>\r\n )}\r\n\r\n <div className=\"page-background-boxing shadow\">\r\n <div className=\"header\">\r\n <div className=\"d-flex flex-row\">\r\n <h1 className=\"d-inline-block\">{`${t(\"order-page.order\")} #${orderId}`}</h1>\r\n {/* Complete order*/}\r\n {isAdmin && order?.flow?.toString() === \"Deliver\" && (\r\n <button\r\n type=\"button\"\r\n className=\"btn btn-danger d-inline-block ms-3 mt-3\"\r\n onClick={() => setIsCompleteOrder(true)}\r\n disabled={itemIdInOpening ? true : false || !OrderHelpers.canCompleteOrder(order)}\r\n >\r\n {t(\"order-page.complete-order\")}\r\n </button>\r\n )}\r\n </div>\r\n <div className=\"order-state\">\r\n {order && (\r\n <StateBadgeComponent\r\n state={order.state}\r\n isPersonalStorage={order.flow.toString() === OrderFlowStringValue.PersonalStorage}\r\n ></StateBadgeComponent>\r\n )}\r\n </div>\r\n </div>\r\n\r\n <LoadingComponent loading={loading} />\r\n\r\n {order && organization && orderId && (\r\n <>\r\n <div className=\"row\">\r\n <OrderCustomer\r\n customerInfoHtml={customerInfoHtml}\r\n hasCustomerContactInformation={Boolean(email || phone)}\r\n canSendNotification={canSendNotification}\r\n isFirstTimeNotification={isReturn || isPersonalStorage}\r\n onSendNotification={() => setIsSendingNotification(true)}\r\n />\r\n\r\n <OrderGeneral\r\n order={order}\r\n hub={hub}\r\n isOrgContributor={isOrgContributor}\r\n timeZone={DateHelpers.UserTimeZone}\r\n packagingOption={packagingOption}\r\n carrierName={carrierName}\r\n />\r\n\r\n <OrderPaymentInformation\r\n order={order}\r\n payment={payment}\r\n isPersonalStorage={isPersonalStorage}\r\n timeZone={DateHelpers.UserTimeZone}\r\n />\r\n </div>\r\n\r\n <OrderReservation\r\n order={order}\r\n orderId={orderId}\r\n organization={organization}\r\n hub={hub}\r\n isAdmin={isAdmin}\r\n isOrgContributor={isOrgContributor}\r\n isCarriedByCarrier={isCarriedByCarrier}\r\n isPersonalStorage={isPersonalStorage}\r\n isReturn={isReturn}\r\n itemIdInOpening={itemIdInOpening}\r\n compartmentSizes={compartmentSizes}\r\n onRefresh={refresh}\r\n onTrackingNumberDelete={(orderItemId: string, trackingNumber: string) => {\r\n setOrderItemId(orderItemId);\r\n setTrackingNumber(trackingNumber);\r\n setIsDeleteTrackingNumber(true);\r\n }}\r\n onCreateReservation={btnCreateReservation}\r\n onOrderItemDelete={btnDeletOrderItem}\r\n openDoor={openDoor}\r\n />\r\n\r\n <div className=\"mb-3\">\r\n {/* Request carrier pickup */}\r\n {isCarriedByCarrier && (\r\n <>\r\n {!isCarrierPickupRequested && (\r\n <ActionButtonComponent\r\n title={t(\"order-page.request-carrier-pickup\")}\r\n onClick={() => setIsRequestingCarrierPickup(true)}\r\n disabled={itemIdInOpening ? true : false || !OrderHelpers.canRequestCarrierPickup(order)}\r\n className=\"btn btn-primary me-2\"\r\n icon={[\"fas\", \"paper-plane\"]}\r\n ></ActionButtonComponent>\r\n )}\r\n\r\n {isCarrierPickupRequested && (\r\n <>\r\n <ActionButtonComponent\r\n title={t(\"order-page.cancel-carrier-pickup\")}\r\n onClick={() => setIsCancellingCarrierPickup(true)}\r\n disabled={itemIdInOpening ? true : false || !OrderHelpers.canCancelCarrierPickup(order)}\r\n className=\"btn btn-outline-primary me-2\"\r\n icon={[\"fas\", \"ban\"]}\r\n ></ActionButtonComponent>\r\n\r\n <ActionButtonComponent\r\n title={t(\"order-page.download-label\")}\r\n onClick={() => downloadLabelPdf(organization.id, orderId)}\r\n disabled={itemIdInOpening ? true : false || !OrderHelpers.canCancelCarrierPickup(order)}\r\n className=\"btn btn-outline-primary me-2\"\r\n icon={[\"fas\", \"tag\"]}\r\n ></ActionButtonComponent>\r\n </>\r\n )}\r\n </>\r\n )}\r\n\r\n {/* delete order */}\r\n {isPersonalStorage && payment && payment.amount > 0 ? (\r\n <>\r\n <ActionButtonComponent\r\n title={t(\"order-page.request-refund\")}\r\n onClick={() => setIsRequestingRefund(true)}\r\n disabled={!OrderHelpers.canRefundOrder(order)}\r\n className=\"btn btn-outline-primary me-2\"\r\n icon={[\"fas\", \"credit-card\"]}\r\n ></ActionButtonComponent>\r\n </>\r\n ) : (\r\n <>\r\n <DeleteButtonComponent\r\n title={t(\"order-page.delete-order\")}\r\n onClick={() => setIsCancelOrder(true)}\r\n disabled={itemIdInOpening ? true : false || !OrderHelpers.canDeleteOrder(order)}\r\n ></DeleteButtonComponent>\r\n </>\r\n )}\r\n </div>\r\n\r\n <OrderHistory order={order} member={member}></OrderHistory>\r\n </>\r\n )}\r\n </div>\r\n </div>\r\n )}\r\n\r\n {!isCarriedByCarrier && isEdit && (\r\n <div className=\"container page orders-page\">\r\n <div className=\"col-12 col-xl-8 offset-md-1 offset-xl-2\">\r\n <div className=\"card\">\r\n <div className=\"card-header align-items-center\">\r\n <div className=\"d-inline-block\">\r\n <h2>{t(\"order-page.edit-size-title\")}</h2>\r\n </div>\r\n <button className=\"btn-close float-end\" onClick={() => cancelEdit()}></button>\r\n </div>\r\n <div className=\"card-body\">\r\n {compartmentSizes && organization.id && (\r\n <table className=\"table table-hover row-clikable\">\r\n <tbody>\r\n {compartmentSizes.map((compartmentSize: CompartmentSize) => {\r\n return (\r\n <tr\r\n key={compartmentSize.id}\r\n onClick={() => {\r\n if (!selectSizeDisabled) createReservation(organization.id, orderId, compartmentSize.id);\r\n }}\r\n >\r\n <td>\r\n {compartmentSize.name.get(language)}: {compartmentSize.description.get(language)}\r\n </td>\r\n </tr>\r\n );\r\n })}\r\n </tbody>\r\n </table>\r\n )}\r\n\r\n {msgEditError && <label className=\"form-label text-danger\">{msgEditError}</label>}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {isCarriedByCarrier && isEdit && (\r\n <div className=\"container page orders-page\">\r\n <div className=\"col-12 col-sm-8 col-xl-6 offset-sm-2 offset-xl-3\">\r\n <div className=\"card\">\r\n <div className=\"card-header align-items-center\">\r\n <div className=\"d-inline-block\">\r\n <h2>{t(\"order-page.add-item-title\")}</h2>\r\n </div>\r\n <button className=\"btn-close float-end\" onClick={() => cancelEdit()}></button>\r\n </div>\r\n <div className=\"card-body\">\r\n {compartmentSizes && organization.id && (\r\n <form onSubmit={(ev) => ev.preventDefault()}>\r\n <label className=\"form-label\">{t(\"order-page.item.enter-height\")}</label>\r\n <input\r\n className=\"form-control\"\r\n value={itemHeight}\r\n onChange={(ev) => setItemHeight(ev.target.value)}\r\n required\r\n autoFocus={true}\r\n />\r\n <label className=\"form-label mt-2\">{t(\"order-page.item.enter-width\")}</label>\r\n <input className=\"form-control\" value={itemWidth} onChange={(ev) => setItemWidth(ev.target.value)} required />\r\n <label className=\"form-label mt-2\">{t(\"order-page.item.enter-depth\")}</label>\r\n <input className=\"form-control\" value={itemDepth} onChange={(ev) => setItemDepth(ev.target.value)} required />\r\n <label className=\"form-label mt-2\">{t(\"order-page.item.enter-weight\")}</label>\r\n <input className=\"form-control\" value={itemWeight} onChange={(ev) => setItemWeight(ev.target.value)} required />\r\n <button\r\n className=\"btn btn-md btn-primary mt-3\"\r\n type=\"submit\"\r\n onClick={() => addItem(organization.id)}\r\n disabled={selectSizeDisabled}\r\n >\r\n {t(\"order-page.item.add\")}\r\n </button>\r\n </form>\r\n )}\r\n\r\n {msgEditError && <label className=\"form-label text-danger\">{msgEditError}</label>}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n {isCancelOrder && organization && order && (\r\n <YesNoComponent\r\n headerMsg={t(\"order-page.msg-cancel-order\")}\r\n onYesClick={() => cancelOrder(organization.id, order)}\r\n onNoClick={setIsCancelOrder}\r\n />\r\n )}\r\n\r\n {isCompleteOrder && organization && order && isAdmin && OrderHelpers.canCompleteOrder(order) && (\r\n <YesNoComponent\r\n headerMsg={t(\"order-page.msg-complete-order\")}\r\n onYesClick={() => CompleteOrder(organization.id, order)}\r\n onNoClick={setIsCompleteOrder}\r\n />\r\n )}\r\n\r\n {isDeleteTrackingNumber && organization && order && orderItemId && trackingNumber && (\r\n <YesNoComponent\r\n headerMsg={t(\"order-page.msg-remove-tracking\", { trackingNumber: trackingNumber })}\r\n onYesClick={() => removeTrackingNumber(organization.id, order, orderItemId, trackingNumber)}\r\n onNoClick={setIsDeleteTrackingNumber}\r\n />\r\n )}\r\n\r\n {isRequestingRefund && organization && order && (\r\n <YesNoComponent\r\n headerMsg={t(\"order-page.msg-refund-order\")}\r\n onYesClick={() => refundOrder(organization.id, order)}\r\n onNoClick={setIsRequestingRefund}\r\n />\r\n )}\r\n\r\n {isRequestingCarrierPickup && order && (\r\n <YesNoComponent\r\n headerMsg={t(\"order-page.msg-requesting-carrier-pickup\")}\r\n onYesClick={() => requestCarrierPickup(order, organization)}\r\n onNoClick={setIsRequestingCarrierPickup}\r\n />\r\n )}\r\n\r\n {isCancellingCarrierPickup && order && (\r\n <YesNoComponent\r\n headerMsg={t(\"order-page.msg-cancelling-carrier-pickup\")}\r\n onYesClick={() => cancelCarrierPickup(order)}\r\n onNoClick={setIsCancellingCarrierPickup}\r\n />\r\n )}\r\n\r\n {isSendingNotification && organization && orderId && (\r\n <YesNoComponent\r\n headerMsg={isReturn ? t(\"order-page.msg-send-return-notification\") : t(\"order-page.msg-send-notification\")}\r\n onYesClick={() => sendNotification(organization.id, orderId)}\r\n onNoClick={setIsSendingNotification}\r\n />\r\n )}\r\n\r\n {isRequiresAddressMessage && organization && order && (\r\n <OrderRequestOrganizationAddressModal\r\n isAdmin={isAdmin}\r\n organization={organization}\r\n order={order}\r\n onRequiredAddressMessageChange={setIsRequiresAddressMessage}\r\n requestCarrierPickup={requestCarrierPickup}\r\n />\r\n )}\r\n\r\n {isCancelReservation && organization && orderId && order && (\r\n <CancelReservationMsgomponent\r\n headerMsg={t(\"order-page.cancel-reservation.msg-cancel-order-openDoor\")}\r\n onYesClick={() => openDoorForCancellation(organization.id, orderId, orderItemId)}\r\n onNoClick={setIsCancelReservation}\r\n ></CancelReservationMsgomponent>\r\n )}\r\n </div>\r\n );\r\n\r\n function downloadLabelPdf(organizationId: string, orderId: string) {\r\n const download = (labelBlob: Blob) => {\r\n const url = window.URL.createObjectURL(labelBlob);\r\n const link = document.createElement(\"a\");\r\n link.href = url;\r\n link.setAttribute(\"download\", `Label-${orderId}.pdf`);\r\n document.body.appendChild(link);\r\n link.click();\r\n link.parentNode?.removeChild(link);\r\n };\r\n\r\n if (labelBlob) {\r\n download(labelBlob);\r\n return;\r\n }\r\n\r\n orderService\r\n .getAsset(organizationId, orderId, \"1\") //For now, there's always only one asset\r\n .then((res: Blob | null) => {\r\n if (res) {\r\n setLabelBlob(res);\r\n download(res);\r\n }\r\n })\r\n .catch((error: any) => {\r\n ToastHelpers.error(t(\"order-page.error-label-download\"));\r\n });\r\n }\r\n\r\n function sendNotification(organizationId: string, orderId: string) {\r\n if (canSendNotification) {\r\n orderService.sendReadyForPickupNotification(organizationId, orderId).catch((error: any) => {\r\n //ToastHelpers.error(t(\"order-page.error-refresh\", { status: error?.response?.status }));\r\n });\r\n setIsSendingNotification(false);\r\n }\r\n }\r\n\r\n async function createReservation(organizationId: string, orderId: string, sizeId: string) {\r\n setSelectSizeDisabled(true);\r\n try {\r\n const response = await orderService.createOrderItem(organizationId, orderId, sizeId);\r\n if (response) {\r\n setIsEdit(false);\r\n await refresh();\r\n setOrderItemId(\"\");\r\n setMsgEditError(undefined);\r\n } else {\r\n setMsgEditError(t(\"order-page.error-edit-size\"));\r\n }\r\n } catch (error: any) {\r\n if (error?.response?.status === 409) {\r\n setMsgEditError(t(\"order-page.error-edit-size\"));\r\n } else {\r\n ToastHelpers.error(t(\"common.error-generic\"));\r\n }\r\n }\r\n setSelectSizeDisabled(false);\r\n }\r\n\r\n async function cancelEdit() {\r\n setMsgEditError(undefined);\r\n setIsEdit(false);\r\n }\r\n\r\n async function cancelOrder(organizationId: string, order: Order) {\r\n try {\r\n if (OrderHelpers.canDeleteOrder(order)) {\r\n setIsCancelOrder(false);\r\n await orderService.cancelOrder(organizationId, order.id);\r\n await refresh();\r\n setIsCancelOrder(false);\r\n }\r\n } catch (error: any) {\r\n if (error?.response?.status === 409) {\r\n ToastHelpers.error(t(\"order-page.error-cancel-order-item\"));\r\n } else {\r\n ToastHelpers.error(t(\"common.error-generic\"));\r\n }\r\n }\r\n }\r\n\r\n async function CompleteOrder(organizationId: string, order: Order) {\r\n try {\r\n if (isAdmin && OrderHelpers.canCompleteOrder(order)) {\r\n if (order.carrierSubmissionReferenceNumber && order.carrierId) {\r\n await orderService.cancelCarrierPickup(organizationId, order.id);\r\n }\r\n\r\n await orderService.completeBopilOrder(organizationId, order.id);\r\n await refresh();\r\n }\r\n } catch (error: any) {\r\n if (error?.response?.status === 400 && error?.response?.data === \"CompletedDeleted\") {\r\n ToastHelpers.error(t(\"order-page.error-complete-order\"));\r\n } else {\r\n ToastHelpers.error(t(\"common.error-generic\"));\r\n }\r\n }\r\n setIsCompleteOrder(false);\r\n }\r\n\r\n async function removeTrackingNumber(organizationId: string, order: Order, orderItemId: string, trackingNumber: string) {\r\n let orderItem = OrderHelpers.getOrderItem(order, orderItemId);\r\n let trackingNumbers: Array<any> = [];\r\n orderItem?.reservation.trackingNumbers.forEach((tracking) => {\r\n if (trackingNumber !== tracking) {\r\n trackingNumbers.push(tracking);\r\n }\r\n });\r\n await orderService\r\n .updateOrderItem(organizationId, orderId, orderItemId, trackingNumbers, true)\r\n .catch((error: any) => ToastHelpers.error(t(\"order-page.error-delete-tracking-number\")));\r\n await refresh();\r\n setIsDeleteTrackingNumber(false);\r\n }\r\n\r\n async function refundOrder(organizationId: string, order: Order) {\r\n try {\r\n if (OrderHelpers.canRefundOrder(order)) {\r\n setIsRequestingRefund(false);\r\n\r\n if (order.payments) {\r\n await paymentService.refundPayment(order.payments[0].id);\r\n await refresh();\r\n }\r\n\r\n setIsRequestingRefund(false);\r\n }\r\n } catch (error: any) {\r\n if (error?.response?.status === 409) {\r\n ToastHelpers.error(t(\"order-page.error-cancel-order-item\"));\r\n } else {\r\n ToastHelpers.error(t(\"common.error-generic\"));\r\n }\r\n }\r\n }\r\n\r\n async function cancelCarrierPickup(order: Order) {\r\n try {\r\n if (OrderHelpers.canCancelCarrierPickup(order)) {\r\n setIsCancellingCarrierPickup(false);\r\n\r\n await orderService.cancelCarrierPickup(order.organizationId.toString(), order.id);\r\n await refresh();\r\n setIsCancellingCarrierPickup(false);\r\n }\r\n } catch (error: any) {\r\n ToastHelpers.error(t(\"common.error-generic\"));\r\n }\r\n }\r\n\r\n async function addItem(organizationId: string) {\r\n let height = Number.parseFloat(itemHeight ? itemHeight.valueOf() : \"\");\r\n let width = Number.parseFloat(itemWidth ? itemWidth.valueOf() : \"\");\r\n let depth = Number.parseFloat(itemDepth ? itemDepth.valueOf() : \"\");\r\n let weight = Number.parseFloat(itemWeight ? itemWeight.valueOf() : \"\");\r\n\r\n if (!height || !width || !depth || !weight) {\r\n ToastHelpers.error(t(\"order-page.item.error-size\"));\r\n return;\r\n }\r\n\r\n setSelectSizeDisabled(true);\r\n var sizeId = \"\";\r\n for (let i = 0; i < compartmentSizes.length; i++) {\r\n let cSize = compartmentSizes[i];\r\n\r\n if (\r\n (cSize.height >= height && ((cSize.width >= width && cSize.depth >= depth) || (cSize.depth >= width && cSize.width >= depth))) ||\r\n (cSize.height >= width && ((cSize.width >= height && cSize.depth >= depth) || (cSize.depth >= height && cSize.width >= depth))) ||\r\n (cSize.height >= depth && ((cSize.width >= width && cSize.depth >= height) || (cSize.depth >= width && cSize.width >= height)))\r\n ) {\r\n sizeId = cSize.id;\r\n break;\r\n }\r\n }\r\n\r\n if (!sizeId) {\r\n setMsgEditError(t(\"order-page.error-add-item\"));\r\n setSelectSizeDisabled(false);\r\n return;\r\n }\r\n\r\n try {\r\n const response = await orderService.createOrderItem(organizationId, orderId, sizeId, height, width, depth, weight);\r\n if (response) {\r\n setIsEdit(false);\r\n await refresh();\r\n setOrderItemId(\"\");\r\n setMsgEditError(undefined);\r\n setSelectSizeDisabled(false);\r\n } else {\r\n setMsgEditError(t(\"order-page.error-add-item\"));\r\n setSelectSizeDisabled(false);\r\n }\r\n } catch (error: any) {\r\n if (error?.response?.status === 409) {\r\n setMsgEditError(t(\"order-page.error-add-item\"));\r\n } else {\r\n ToastHelpers.error(t(\"common.error-generic\"));\r\n }\r\n }\r\n }\r\n\r\n async function openDoorForCancellation(organizationId: string, orderId: string, orderItemId: string): Promise<void> {\r\n setItemIdInOpening(orderItemId);\r\n setIsCancelReservation(false);\r\n\r\n await orderService\r\n .openDoor(organizationId, orderId, orderItemId, \"Recuperate\", null)\r\n .then(async () => {\r\n await orderService.cancelOrderItem(organizationId, orderId, orderItemId);\r\n await refresh();\r\n })\r\n .catch((error) => {\r\n if (error?.response?.status === 409) {\r\n ToastHelpers.error(t(\"order-page.error-opendoor\"));\r\n } else if (error?.response?.status === 424) {\r\n ToastHelpers.error(t(\"order-page.error-opendoor-424\"));\r\n } else {\r\n ToastHelpers.error(t(\"common.error-generic\"));\r\n }\r\n })\r\n .finally(async () => {\r\n await setItemIdInOpening(null);\r\n });\r\n }\r\n\r\n function canShowOrderDetails() {\r\n return (\r\n !isEdit &&\r\n !isCancelOrder &&\r\n !isCompleteOrder &&\r\n !isCancelReservation &&\r\n !isRequestingCarrierPickup &&\r\n !isCancellingCarrierPickup &&\r\n !isSendingNotification &&\r\n !isRequiresAddressMessage &&\r\n !isRequestingRefund &&\r\n !isDeleteTrackingNumber\r\n );\r\n }\r\n\r\n function btnCreateReservation() {\r\n if (HubHelpers.isHubOnline(hub.state)) {\r\n setSelectSizeDisabled(false);\r\n setIsEdit(true);\r\n } else {\r\n ToastHelpers.error(t(\"create-order-page.error-hub-offline\"));\r\n }\r\n }\r\n\r\n function btnDeletOrderItem(organizationId: string, orderId: string, orderItemId: string, reservationState: string) {\r\n if (reservationState === \"New\") {\r\n deletOrderItem(organizationId, orderId, orderItemId);\r\n } else if (reservationState === \"ReadyForPickUp\") {\r\n setIsCancelReservation(true);\r\n setOrderItemId(orderItemId);\r\n }\r\n }\r\n\r\n async function deletOrderItem(organizationId: string, orderId: string, orderItemId: string): Promise<void> {\r\n try {\r\n await orderService.deleteOrderItem(organizationId, orderId, orderItemId);\r\n setOrderItemId(\"\");\r\n setIsCancelReservation(false);\r\n await refresh();\r\n } catch (error: any) {\r\n if (error?.response?.status === 409) {\r\n ToastHelpers.error(t(\"order-page.error-delete-order-item\"));\r\n } else {\r\n ToastHelpers.error(t(\"common.error-generic\"));\r\n }\r\n }\r\n }\r\n\r\n async function openDoor(organizationId: string, orderId: string, orderItemId: string, state: string): Promise<void> {\r\n let reason: string;\r\n if (isReturn) {\r\n if (state === \"ReadyForPickUp\") {\r\n reason = \"Pickup\";\r\n } else {\r\n return;\r\n }\r\n } else {\r\n if (state === \"New\") {\r\n reason = \"Dropoff\";\r\n } else if (state === \"PackagingReadyForPickUp\") {\r\n reason = \"PackagingPickup\";\r\n } else {\r\n return;\r\n }\r\n }\r\n\r\n setItemIdInOpening(orderItemId);\r\n\r\n orderService\r\n .openDoor(organizationId, orderId, orderItemId, reason, null)\r\n .then(async () => {\r\n await refresh();\r\n })\r\n .catch((error) => {\r\n if (error?.response?.status === 409) {\r\n ToastHelpers.error(t(\"order-page.error-opendoor\"));\r\n } else if (error?.response?.status === 424) {\r\n ToastHelpers.error(t(\"order-page.error-opendoor-424\"));\r\n } else {\r\n ToastHelpers.error(t(\"common.error-generic\"));\r\n }\r\n })\r\n .finally(() => {\r\n setItemIdInOpening(null);\r\n });\r\n }\r\n\r\n async function refresh() {\r\n if (!loading && organization.id) {\r\n try {\r\n const order = await orderService.getOrderById(organization.id, orderId);\r\n if (order) {\r\n setOrder(order);\r\n\r\n if (isReturn) {\r\n setCanSendNotification(order.state === \"New\");\r\n } else if (isPersonalStorage) {\r\n setCanSendNotification(order.state !== \"Completed\" && order.state !== \"Cancelled\");\r\n } else {\r\n setCanSendNotification(order.state === \"ReadyForPickUp\");\r\n }\r\n\r\n if (order?.carrierSubmissionReferenceNumber) {\r\n setIsCarrierPickupRequested(true);\r\n } else {\r\n setIsCarrierPickupRequested(false);\r\n setLabelBlob(null);\r\n }\r\n }\r\n } catch (error) {}\r\n }\r\n }\r\n}\r\n\r\nfunction requiresAddress(order: Order, organization: Organization): boolean {\r\n if (order.organizationId.toString() !== organization.id) {\r\n return false;\r\n }\r\n\r\n return (\r\n organization.city === \"\" ||\r\n organization.city === null ||\r\n organization.country === \"\" ||\r\n organization.country === null ||\r\n organization.postalCode === \"\" ||\r\n organization.postalCode === null ||\r\n organization.street === \"\" ||\r\n organization.street === null ||\r\n organization.streetNumber === \"\" ||\r\n organization.streetNumber === null ||\r\n organization.state === \"\" ||\r\n organization.state === null ||\r\n organization.country === \"\" ||\r\n organization.country === null\r\n );\r\n}\r\n","import \"./organizations-page.scss\";\r\nimport { useState } from \"react\";\r\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { useHistory } from \"react-router-dom\";\r\nimport Member from \"../../services/member/member\";\r\nimport MemberRoleOrganization from \"../../services/member/member-role-organization\";\r\nimport memberService from \"../../services/member/member-service\";\r\nimport { AddButtonComponent } from \"../../components/button-component\";\r\n\r\ntype Props = {\r\n member: Member;\r\n activeOrganization: MemberRoleOrganization | null;\r\n changeActiveOrganization: any;\r\n};\r\n\r\nexport default function OrganizationsPage(props: Props) {\r\n const { member, activeOrganization, changeActiveOrganization } = props;\r\n\r\n const history = useHistory();\r\n\r\n const [associatedOrganizations] = useState<MemberRoleOrganization[] | undefined>(member.associatedOrganizations);\r\n\r\n const { t } = useTranslation();\r\n\r\n return (\r\n <div className=\"container pt-5 page organizations-page\">\r\n <div className=\"row\">\r\n {/* Organizations */}\r\n <div className=\"col-12 offset-lg-2 col-lg-8\">\r\n <div className=\"card\">\r\n <div className=\"card-header align-items-center\">\r\n <h2>{t(\"organizations-page.title\")}</h2>\r\n </div>\r\n\r\n <div className=\"card-body\">\r\n <div className=\"col-12\">\r\n <table className=\"table table-hover row-clikable\">\r\n <thead>\r\n <tr>\r\n <th></th>\r\n <th>{t(\"organizations-page.organization\")}</th>\r\n <th>\r\n {memberService.isLocketgoAdmin(member) && (\r\n <AddButtonComponent\r\n title={\"Create Organization\"}\r\n onClick={() => history.push(\"/create-organization\")}\r\n ></AddButtonComponent>\r\n )}\r\n </th>\r\n <th></th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {member &&\r\n associatedOrganizations &&\r\n associatedOrganizations.map((associatedOrganization) => {\r\n const current: boolean =\r\n activeOrganization &&\r\n activeOrganization.entity &&\r\n associatedOrganization.entity &&\r\n associatedOrganization.entity.id === activeOrganization.entity.id\r\n ? true\r\n : false;\r\n\r\n return (\r\n <tr\r\n key={associatedOrganization.entity?.id}\r\n onClick={() => history.push(`organizations/${associatedOrganization.entity?.id}`)}\r\n >\r\n <td>{current && <FontAwesomeIcon className=\"text-success\" icon={[\"fas\", \"check-circle\"]} />}</td>\r\n <td>{associatedOrganization.entity?.name}</td>\r\n <td>\r\n {!current && (\r\n <button\r\n className=\"btn btn-primary me-2\"\r\n onClick={(ev) => {\r\n ev.stopPropagation();\r\n changeActiveOrganization(associatedOrganization);\r\n }}\r\n >\r\n {t(\"organizations-page.select-organization\")}\r\n </button>\r\n )}\r\n </td>\r\n <td>\r\n <button\r\n className=\"btn btn-outline-primary\"\r\n onClick={(ev) => {\r\n ev.stopPropagation();\r\n history.push(`organizations/${associatedOrganization.entity?.id}`);\r\n }}\r\n >\r\n <FontAwesomeIcon icon={[\"fas\", \"pen\"]} />\r\n </button>\r\n </td>\r\n </tr>\r\n );\r\n })}\r\n {(!member || !associatedOrganizations) && (\r\n <tr>\r\n <td colSpan={2}>{t(\"organizations-page.no-organization-associated\")}</td>\r\n </tr>\r\n )}\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n","export default function WaitingComponent() {\r\n return (\r\n <>\r\n <div className=\"waiting-icon\">\r\n <img src=\"/locketgo-glyph-spin.gif\" alt=\"\" />\r\n </div>\r\n </>\r\n );\r\n}\r\n","import { useEffect, useState } from \"react\";\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { Link, useHistory, useParams } from \"react-router-dom\";\r\nimport { ActionButtonComponent } from \"../../components/button-component\";\r\nimport { InputComponent } from \"../../components/input\";\r\nimport WaitingComponent from \"../../components/waiting-component\";\r\nimport StringHelpers from \"../../services/core/string-helpers\";\r\nimport ToastHelpers from \"../../services/core/toast-helpers\";\r\nimport Member from \"../../services/member/member\";\r\nimport MemberRoleOrganization from \"../../services/member/member-role-organization\";\r\nimport memberService from \"../../services/member/member-service\";\r\nimport organizationService from \"../../services/member/organization-service\";\r\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\r\n\r\ntype Props = {\r\n member: Member;\r\n changeMember: Function;\r\n};\r\n\r\ninterface IApprobationProps {\r\n state: string;\r\n}\r\n\r\ninterface IParamTypes {\r\n organizationId: string;\r\n}\r\n\r\nfunction ApprobationComponent(props: IApprobationProps) {\r\n const { state } = props;\r\n const { t } = useTranslation();\r\n\r\n return <>{t(`hub-association-state.${state}`)}</>;\r\n}\r\n\r\nexport default function OrganizationPage(props: Props) {\r\n const { member, changeMember } = props;\r\n const { organizationId } = useParams<IParamTypes>();\r\n const { t } = useTranslation();\r\n const [loading, setLoading] = useState<boolean>(true);\r\n\r\n const [activeOrganization, setActiveOrganization] = useState<MemberRoleOrganization | undefined>(undefined);\r\n const [organizationName, setOrganizationName] = useState<string | undefined>(undefined);\r\n const [streetNumber, setStreetNumber] = useState<string | undefined>(undefined);\r\n const [streetNumberError, setStreetNumberError] = useState<string | undefined>(undefined);\r\n const [street, setStreet] = useState<string | undefined>(undefined);\r\n const [city, setCity] = useState<string | undefined>(undefined);\r\n const [postalCode, setPostalCode] = useState<string | undefined>(undefined);\r\n const [state, setState] = useState<string>(\"\");\r\n const [country, setCountry] = useState<string>(\"\");\r\n\r\n const isAdmin = memberService.isOrganizationAdmin(member, organizationId);\r\n\r\n const [micrositesLength, setMicrositesLength] = useState<number>(0);\r\n\r\n const history = useHistory();\r\n\r\n useEffect(() => {\r\n let organization = member.associatedOrganizations.find((organization) => organization.entity?.id == organizationId);\r\n if (organization) {\r\n setActiveOrganization(organization);\r\n setOrganizationName(organization.entity?.name);\r\n setCity(organization.entity?.city);\r\n setPostalCode(organization.entity?.postalCode);\r\n\r\n setStreet(organization.entity?.street);\r\n setStreetNumber(organization.entity?.streetNumber);\r\n\r\n setCountry(organization.entity?.country ? organization.entity?.country : \"Canada\");\r\n setState(organization.entity?.state ? organization.entity?.state : \"QC\");\r\n organizationService\r\n .getAllMicrositesOfOrganization(organizationId)\r\n .then((microsites) => {\r\n setMicrositesLength(microsites.length);\r\n setLoading(false);\r\n })\r\n .catch(() => {\r\n ToastHelpers.error(t(\"microsites-page.microsites-error\"));\r\n });\r\n }\r\n }, []);\r\n\r\n return (\r\n <div className=\"container pt-3 page organizations-page\">\r\n {loading && <WaitingComponent />}\r\n {!loading && (\r\n <>\r\n <div className=\"col-12 offset-lg-2 col-lg-8\">\r\n <div className=\"page-breadcrumb\">\r\n <ul className=\"breadcrumb\">\r\n <li className=\"breadcrumb-item active\">\r\n <Link className=\"microsites\" to=\"/organizations\">\r\n {t(\"common.organizations\")}\r\n </Link>\r\n </li>\r\n <li className=\"breadcrumb-item active\">{organizationName}</li>\r\n </ul>\r\n <h1>{`${organizationName}`}</h1>\r\n </div>\r\n\r\n {/* Microsites button */}\r\n {micrositesLength !== 0 && member && memberService.isOrganizationContributor(member, organizationId) && (\r\n <div>\r\n <Link className=\" microsites btn btn-primary\" to={`/organizations/${organizationId}/microsites`}>\r\n {t(\"organization-page.microsites-page\")}\r\n </Link>\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* Edit organization */}\r\n <div className=\"col-12 offset-lg-2 col-lg-8\">\r\n <div className=\"card\">\r\n <div className=\"card-header align-items-center\">\r\n <button className=\"btn-close float-end\" onClick={() => history.push(`/organizations`)}></button>\r\n <h2>{t(\"organization-page.address\")}</h2>\r\n </div>\r\n <div className=\"card-body\">\r\n <form className=\"row g-3\" onSubmit={(ev) => ev.preventDefault()}>\r\n <div className=\"col-md-3\">\r\n <InputComponent\r\n type=\"number\"\r\n regExp={/^[0-9]*$/}\r\n labelText={t(\"member-profile.streetNumber\") + \"*\"}\r\n setValue={(value: string) => {\r\n setStreetNumber(value);\r\n StringHelpers.isStringOnlyNumbers(value)\r\n ? setStreetNumberError(undefined)\r\n : setStreetNumberError(t(\"member-profile.street-number-error\"));\r\n }}\r\n value={streetNumber ? streetNumber : \"\"}\r\n disabled={!isAdmin}\r\n msgError={streetNumberError}\r\n />\r\n </div>\r\n <div className=\"col-md-9\">\r\n <InputComponent\r\n labelText={t(\"member-profile.street\") + \"*\"}\r\n setValue={(value: string) => setStreet(value)}\r\n value={street ? street : \"\"}\r\n disabled={!isAdmin}\r\n />\r\n </div>\r\n <div className=\"col-md-8\">\r\n <InputComponent\r\n labelText={t(\"member-profile.city\") + \"*\"}\r\n setValue={(value: string) => setCity(value)}\r\n value={city ? city : \"\"}\r\n disabled={!isAdmin}\r\n />\r\n </div>\r\n <div className=\"col-md-4\">\r\n <InputComponent\r\n labelText={t(\"member-profile.postalCode\") + \"*\"}\r\n setValue={(value: string) => setPostalCode(value)}\r\n value={postalCode ? postalCode : \"\"}\r\n disabled={!isAdmin}\r\n />\r\n </div>\r\n <div className=\"col-md-6\">\r\n <InputComponent labelText={t(\"member-profile.state\") + \"*\"} setValue={(value: string) => {}} value={state} disabled />\r\n </div>\r\n <div className=\"col-md-6\">\r\n <InputComponent\r\n labelText={t(\"member-profile.country\") + \"*\"}\r\n setValue={(value: string) => {}}\r\n value={country}\r\n disabled\r\n />\r\n </div>\r\n\r\n {isAdmin && (\r\n <div>\r\n <ActionButtonComponent\r\n type=\"submit\"\r\n title={t(\"organization-page.save-address\")}\r\n onClick={() => saveAddress()}\r\n className=\"btn btn-primary\"\r\n disabled={false}\r\n />\r\n <button className=\"btn btn-md btn-primary-outline\" type=\"submit\" onClick={() => history.push(`/organizations`)}>\r\n {t(\"common.cancel\")}\r\n </button>\r\n {memberService.isLocketgoAdmin(member) && (\r\n <button className={`btn btn-danger float-end`} onClick={() => handleDelete()} disabled={false}>\r\n <FontAwesomeIcon icon={[\"fas\", \"trash-alt\"]} /> {t(\"common.delete\")}\r\n </button>\r\n )}\r\n </div>\r\n )}\r\n </form>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* My roles */}\r\n <div className=\"col-12 offset-lg-2 col-lg-8\">\r\n <div className=\"card\">\r\n <div className=\"card-header align-items-center\">\r\n <h2>{t(\"organization-page.organization-roles\")}</h2>\r\n </div>\r\n\r\n <div className=\"card-body\">\r\n <div className=\"col-12\">\r\n <table className=\"table\">\r\n <thead>\r\n <tr>\r\n <th>{t(\"organization-page.organization-roles-name\")}</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {activeOrganization?.roles?.map((role) => {\r\n return (\r\n <tr key={role}>\r\n <td className=\"text-start\">{role}</td>\r\n </tr>\r\n );\r\n })}\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* Associated Hubs */}\r\n <div className=\"col-12 offset-lg-2 col-lg-8\">\r\n <div className=\"card\">\r\n <div className=\"card-header align-items-center\">\r\n <h2>{t(\"organization-page.associated-hubs\")}</h2>\r\n </div>\r\n\r\n <div className=\"card-body\">\r\n <div className=\"col-12\">\r\n <table className=\"table\">\r\n <thead>\r\n <tr>\r\n <th className=\"text-center\">{t(\"organization-page.location\")}</th>\r\n <th>{t(\"organization-page.approbation\")}</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {activeOrganization?.entity?.associatedHubs.map((associatedHub) => {\r\n return (\r\n <tr key={associatedHub.hubId}>\r\n <td>{associatedHub.hubId}</td>\r\n <td>\r\n <ApprobationComponent state={associatedHub.state} />\r\n </td>\r\n </tr>\r\n );\r\n })}\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </>\r\n )}\r\n </div>\r\n );\r\n\r\n function handleDelete() {\r\n setLoading(true);\r\n organizationService\r\n .updateOrganization(organizationId, streetNumber ?? \"\", street ?? \"\", city ?? \"\", postalCode ?? \"\", state ?? \"\", country ?? \"\", false)\r\n .catch((error: any) => {\r\n ToastHelpers.error(t(\"common.error-refresh\"));\r\n })\r\n .finally(() => {\r\n memberService.getMemberMe().then((member) => {\r\n changeMember(member);\r\n history.push(`/organizations`);\r\n });\r\n });\r\n }\r\n\r\n function saveAddress() {\r\n setLoading(true);\r\n organizationService\r\n .updateOrganization(organizationId, streetNumber ?? \"\", street ?? \"\", city ?? \"\", postalCode ?? \"\", state ?? \"\", country ?? \"\")\r\n .catch((error: any) => {\r\n ToastHelpers.error(t(\"common.error-refresh\"));\r\n })\r\n .finally(() => setLoading(false));\r\n }\r\n}\r\n","import { useTranslation } from \"react-i18next\";\r\n\r\ntype Props = {\r\n value: string;\r\n setValue: Function;\r\n msgError: string | undefined;\r\n onMsgErrorChanged: Function;\r\n disabled?: boolean | undefined;\r\n};\r\n\r\nexport function FirstNameComponent(props: Props) {\r\n const { t } = useTranslation();\r\n return (\r\n <>\r\n <label className=\"form-label\">{t(\"member-profile.firstName\")}</label>\r\n <input className=\"form-control\" value={props.value} onChange={(ev) => validate(ev.target.value)} disabled={props.disabled} maxLength={50}/>\r\n {props.msgError && <label className=\"error-msg\">{props.msgError}</label>}\r\n </>\r\n );\r\n function validate(value : string)\r\n {\r\n value = value.substring(0,50);\r\n props.setValue(value);\r\n\r\n props.onMsgErrorChanged(\"\");\r\n if(value.length > 50)\r\n {\r\n props.onMsgErrorChanged(t(\"input-component.firstname-error\"));\r\n }\r\n }\r\n}\r\n","import { useTranslation } from \"react-i18next\";\r\n\r\ntype Props = {\r\n value: string;\r\n setValue: Function;\r\n msgError: string | undefined;\r\n onMsgErrorChanged: Function;\r\n disabled?: boolean | undefined;\r\n};\r\n\r\nexport function LastNameComponent(props: Props) {\r\n const { t } = useTranslation();\r\n\r\n return (\r\n <>\r\n <label className=\"form-label\">{t(\"member-profile.lastName\")}</label>\r\n <input className=\"form-control\" value={props.value} onChange={(ev) => validate(ev.target.value)} disabled={props.disabled} maxLength={50}/>\r\n {props.msgError && <label className=\"error-msg\">{props.msgError}</label>}\r\n </>\r\n );\r\n function validate(value : string)\r\n {\r\n value = value.substring(0,50);\r\n props.setValue(value);\r\n\r\n props.onMsgErrorChanged(\"\");\r\n if(value.length > 50)\r\n {\r\n props.onMsgErrorChanged(t(\"input-component.lastname-error\"));\r\n }\r\n }\r\n}\r\n\r\n","import { useTranslation } from \"react-i18next\";\r\nimport { useHistory } from \"react-router-dom\";\r\nimport \"./member-page.scss\";\r\nimport Member from \"../../services/member/member\";\r\nimport authService from \"../../services/auth/auth-service\";\r\nimport { InputComponent } from \"../../components/input\";\r\nimport { useState } from \"react\";\r\nimport memberService from \"../../services/member/member-service\";\r\nimport { ActionButtonComponent } from \"../../components/button-component\";\r\nimport ToastHelpers from \"../../services/core/toast-helpers\";\r\nimport { PhoneFormComponent } from \"../../components/customer-information-components/phone-component\";\r\nimport { FirstNameComponent } from \"../../components/customer-information-components/firstname-component\";\r\nimport { LastNameComponent } from \"../../components/customer-information-components/lastname-components\";\r\n\r\ntype Props = {\r\n member: Member;\r\n changeMember: any;\r\n};\r\n\r\nexport default function MemberPage(props: Props) {\r\n const { member, changeMember } = props;\r\n const { t } = useTranslation();\r\n const history = useHistory();\r\n\r\n const [firstname, setFirstname] = useState<string>(member.firstname);\r\n const [lastname, setLastname] = useState<string>(member.lastname);\r\n const [email, setEmail] = useState<string>(member.email);\r\n const [phone, setPhone] = useState<string>(member.phone);\r\n const [phoneExtension, setPhoneExtension] = useState<number | undefined>(member.phoneExtension);\r\n const [phoneError, setPhoneError] = useState<string | undefined>(undefined);\r\n const [firstnameError, setFirstnameError] = useState<string | undefined>(undefined);\r\n const [lastnameError, setLastnameError] = useState<string | undefined>(undefined);\r\n\r\n const [isEdit, setIsEdit] = useState<boolean>(false);\r\n\r\n // const hasBopil = member.features.includes(\"bopil\");\r\n // const hasPersonalStorage = member.features.includes(\"personalstorage\");\r\n\r\n return (\r\n <div className=\"container pt-5 page member-page\">\r\n <div className=\"row\">\r\n <div className=\"col-12 offset-lg-2 col-lg-8\">\r\n <div className=\"card\">\r\n <div className=\"card-header align-items-center\">\r\n <h2>{t(\"member-profile.title\")}</h2>\r\n </div>\r\n\r\n <div className=\"card-body\">\r\n <div className=\"profile-buttons\">\r\n {!isEdit && (\r\n <>\r\n <button className=\"btn btn-primary\" data-bs-target=\"#changePasswordModal\" data-bs-toggle=\"modal\">\r\n {t(\"member-profile.change-password\")}\r\n </button>\r\n <div className=\"modal\" tabIndex={-1} id=\"changePasswordModal\">\r\n <div className=\"modal-dialog\">\r\n <div className=\"modal-content\">\r\n <div className=\"modal-header\">\r\n <h5 className=\"modal-title\">{t(\"member-profile.change-password\")}</h5>\r\n <button type=\"button\" className=\"btn-close\" data-bs-dismiss=\"modal\" aria-label=\"Close\"></button>\r\n </div>\r\n <div className=\"modal-body\">\r\n <p>{t(\"member-profile.change-password-text\")}</p>\r\n </div>\r\n <div className=\"modal-footer\">\r\n <button type=\"button\" className=\"btn btn-outline-primary\" data-bs-dismiss=\"modal\">\r\n {t(\"common.close\")}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <button className=\"btn btn-purple ms-2\" onClick={async () => await logout()}>\r\n {t(\"account.logout\")}\r\n </button>\r\n\r\n <ActionButtonComponent onClick={() => setIsEdit(true)} className=\"btn btn-outline-primary ms-2\" icon={[\"fas\", \"pen\"]} />\r\n </>\r\n )}\r\n </div>\r\n\r\n <div className=\"row g-3\">\r\n <div className=\"col-md-6\">\r\n <FirstNameComponent\r\n value={firstname}\r\n setValue={setFirstname}\r\n msgError={firstnameError}\r\n onMsgErrorChanged={setFirstnameError}\r\n disabled={!isEdit}\r\n />\r\n </div>\r\n <div className=\"col-md-6\">\r\n <LastNameComponent\r\n value={lastname}\r\n setValue={setLastname}\r\n msgError={lastnameError}\r\n onMsgErrorChanged={setLastnameError}\r\n disabled={!isEdit}\r\n />\r\n </div>\r\n <div className=\"col-md-6\">\r\n <InputComponent\r\n labelText={t(\"member-profile.email\")}\r\n value={email}\r\n setValue={(value: string) => setEmail(value)}\r\n disabled={true}\r\n />\r\n </div>\r\n <div className=\"col-md-4\">\r\n {/* <InputComponent\r\n labelText={t(\"common.phone\")}\r\n value={phone}\r\n setValue={(value: string) => setPhone(value)}\r\n disabled={!isEdit}\r\n /> */}\r\n <PhoneFormComponent\r\n value={phone}\r\n setValue={setPhone}\r\n onMsgErrorChanged={setPhoneError}\r\n msgError={phoneError}\r\n label={t(\"common.phone\")}\r\n disabled={!isEdit}\r\n />\r\n </div>\r\n <div className=\"col-md-2\">\r\n <InputComponent\r\n labelText={t(\"member-profile.extension\")}\r\n value={phoneExtension ? phoneExtension.toString() : \"\"}\r\n setValue={(value: number) => setPhoneExtension(value)}\r\n disabled={!isEdit}\r\n />\r\n </div>\r\n\r\n <div>\r\n {isEdit && (\r\n <>\r\n <ActionButtonComponent\r\n title={t(\"common.save\")}\r\n onClick={() => save()}\r\n className=\"btn btn-primary\"\r\n disabled={saveDisabled()}\r\n />\r\n <ActionButtonComponent\r\n title={t(\"common.cancel\")}\r\n onClick={() => cancelEdit()}\r\n className=\"ms-2 btn btn-outline-primary\"\r\n />\r\n </>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n {/* <div className=\"col-12 offset-lg-2 col-lg-8\">\r\n <div className=\"card\">\r\n <div className=\"card-header align-items-center\">\r\n <h2>{t(\"member-profile.title-features\")}</h2>\r\n </div>\r\n\r\n <div className=\"card-body\">\r\n <form className=\"row g-3\">\r\n <div className=\"col-12\">\r\n <div className=\"form-check\">\r\n <input className=\"form-check-input\" type=\"checkbox\" checked={hasBopil} disabled />\r\n <label className=\"form-check-label\">{t(\"member-profile.feature-bopil\")}</label>\r\n </div>\r\n </div>\r\n <div className=\"col-12\">\r\n <div className=\"form-check\">\r\n <input className=\"form-check-input\" type=\"checkbox\" checked={hasPersonalStorage} disabled />\r\n <label className=\"form-check-label\">{t(\"member-profile.feature-personal-storage\")}</label>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n </div> */}\r\n </div>\r\n </div>\r\n );\r\n\r\n async function logout(): Promise<void> {\r\n history.push(\"/\");\r\n changeMember(null);\r\n await authService.logout();\r\n }\r\n\r\n function saveDisabled(): boolean {\r\n return !firstname || !lastname || !email || !phone || firstname.length > 50 || lastname.length > 50 || !isValidPhone(phone);\r\n }\r\n function isValidPhone(value: string): boolean {\r\n const RegExPhone1 = /^[0-9]{3}-[0-9]{3}-[0-9]{4}$/;\r\n const RegExPhone2 = /^\\d{10}$/;\r\n let valid: boolean = RegExPhone1.test(value) || RegExPhone2.test(value);\r\n\r\n if (valid) return true;\r\n\r\n return false;\r\n }\r\n function save() {\r\n if (firstname && lastname && email && phone) {\r\n let newMember = { ...member };\r\n\r\n newMember.firstname = firstname;\r\n newMember.lastname = lastname;\r\n newMember.email = email;\r\n newMember.phone = phone;\r\n newMember.phoneExtension = phoneExtension;\r\n\r\n memberService\r\n .updateMemberMe(newMember)\r\n .then(() => {\r\n setIsEdit(false);\r\n refreshMe();\r\n })\r\n .catch((error: any) => {\r\n ToastHelpers.error(t(\"common.error-refresh\"));\r\n });\r\n }\r\n }\r\n\r\n function refreshMe() {\r\n memberService.getMemberMe().then((me) => {\r\n changeMember(me);\r\n if (me) {\r\n setFirstname(me.firstname);\r\n setLastname(me.lastname);\r\n setPhone(me.phone);\r\n setPhoneExtension(me.phoneExtension);\r\n setEmail(me.email);\r\n }\r\n });\r\n }\r\n\r\n function cancelEdit() {\r\n setIsEdit(false);\r\n\r\n refreshMe();\r\n }\r\n}\r\n","import React, { useEffect, useState } from \"react\";\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { useHistory } from \"react-router-dom\";\r\nimport StringHelpers from \"../../services/core/string-helpers\";\r\nimport { Hub } from \"../../services/hub/hub\";\r\nimport orderService from \"../../services/order/order-service\";\r\nimport hubService from \"../../services/hub/hub-service\";\r\nimport \"./create-order-page.scss\";\r\nimport Member from \"../../services/member/member\";\r\nimport { InputComponent } from \"../../components/input\";\r\nimport { HubHelpers } from \"../../services/hub/hub-helper\";\r\nimport packagingOptionService from \"../../services/hub/packagingOption-service\";\r\nimport { PackagingOption } from \"../../services/hub/packgingOption\";\r\nimport languageService from \"../../services/core/language-service\";\r\nimport Organization from \"../../services/organization/organization\";\r\nimport LoadingComponent from \"../../components/loading-component\";\r\nimport ToastHelpers from \"../../services/core/toast-helpers\";\r\nimport HubLocationComponent from \"../../components/hub-location-component\";\r\nimport customersService from \"../../services/member/customers-service\";\r\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\r\nimport { PhoneFormComponent } from \"../../components/customer-information-components/phone-component\";\r\nimport { Carrier } from \"../../services/carrier/carrier\";\r\nimport { OrderFlow } from \"../../services/order/order\";\r\nimport { InfoCirleButton } from \"../../components/button-component\";\r\n\r\ninterface CreateOrderPageProps {\r\n isReturn?: boolean | undefined;\r\n organization: Organization | undefined;\r\n member: Member;\r\n}\r\n\r\nexport default function CreateOrderPage(props: CreateOrderPageProps) {\r\n const { organization, isReturn } = props;\r\n\r\n const [loading, setLoading] = useState(true);\r\n\r\n const searchResultCount: number = 5;\r\n const [hubs, setHubs] = useState<Array<Hub> | null>(null);\r\n const [carriers, setCarriers] = useState<Array<Carrier>>([]);\r\n const [packagingOptions, setPackagingOptions] = useState<Array<PackagingOption> | null>(null);\r\n const [packagingOptionsAvailable, setPackagingOptionsAvailable] = useState<Array<PackagingOption> | null>(null);\r\n const [customers, setCustomers] = useState<Array<Member>>([]);\r\n const [filteredCustomers, setFilteredCustomers] = useState<Array<Member>>([]);\r\n const [customerSearchText, setCustomerSearchText] = useState<string>(\"\");\r\n const [customerSelectedEmail, setCustomerSelectedEmail] = useState<string>(\"\");\r\n const [referenceId, setReferenceId] = useState<string>(\"\");\r\n\r\n const [step, setStep] = useState(1);\r\n\r\n const [selectExistingCustomer, setSelectExistingCustomer] = useState(true);\r\n\r\n const [hubId, setHubId] = useState<string>();\r\n\r\n const [phoneNumber, setPhoneNumber] = useState<string>(\"\");\r\n const [email, setEmail] = useState<string>(\"\");\r\n const [firstname, setFistname] = useState<string>(\"\");\r\n const [lastname, setLastname] = useState<string>(\"\");\r\n\r\n const [emailError, setEmailError] = useState<string>();\r\n const [phoneError, setPhoneError] = useState<string>();\r\n\r\n const [isCreating, setIsCreating] = useState<boolean>(false);\r\n\r\n const [packagingOptionId, setPackagingOptionId] = useState<string>(\"nopackaging\");\r\n const [carrierId, setCarrierId] = useState<string>(\"nocarrier\");\r\n\r\n const nocarrier = carrierId !== \"nocarrier\";\r\n\r\n const { t } = useTranslation();\r\n const history = useHistory();\r\n\r\n useEffect(\r\n () => {\r\n if (organization) {\r\n packagingOptionService\r\n .getPackagingOptions()\r\n .then((packagingOptions) => {\r\n setPackagingOptions(packagingOptions);\r\n\r\n const hubAssociations = organization.associatedHubs.filter((o) => o.state !== \"Rejected\");\r\n\r\n hubService\r\n .getHubs()\r\n .then((hubs) => {\r\n const hubsFiltered = hubs.filter((h) => hubAssociations?.find((ha) => ha.hubId === h.id) && h.active);\r\n setHubs(hubsFiltered);\r\n\r\n if (hubsFiltered.length === 1) {\r\n onHubSelected(hubs, packagingOptions, hubsFiltered[0].id);\r\n }\r\n\r\n customersService\r\n .getCustomers(organization?.id)\r\n .then((customers) => {\r\n customers = customers.filter((customer) => customer.firstname && customer.lastname && customer.email);\r\n setCustomers(customers);\r\n setSelectExistingCustomer(customers.length > 0);\r\n\r\n onCustomerSearchTextChanged(\"\", customers);\r\n\r\n setLoading(false);\r\n })\r\n .catch(() => {\r\n ToastHelpers.error(t(\"customers-page.error-refresh\"));\r\n });\r\n })\r\n .catch(() => {\r\n ToastHelpers.error(t(\"common.error-refresh\"));\r\n });\r\n })\r\n .catch(() => {\r\n ToastHelpers.error(t(\"common.error-refresh\"));\r\n });\r\n }\r\n },\r\n // eslint-disable-next-line\r\n [organization]\r\n );\r\n\r\n if (hubs?.length === 0) {\r\n return (\r\n <div className=\"container page create-order-page\">\r\n <div className=\"col col-lg-6 offset-lg-3\">\r\n <p>{t(\"create-order-page.no-hub\")}</p>\r\n <button className=\"btn btn-primary\" onClick={() => history.push(`/orders`)}>\r\n {t(\"common.return\")}\r\n </button>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"container page create-order-page\">\r\n <div className=\"col col-lg-6 offset-lg-3\">\r\n <h1>{isReturn ? t(\"create-order-page.return.title\") : t(\"create-order-page.title\")}</h1>\r\n\r\n <LoadingComponent loading={loading} />\r\n\r\n {!loading && step === 1 && (\r\n <div className=\"customer card\">\r\n <div className=\"card-header align-items-center\">\r\n <div className=\"d-inline-block\">\r\n <h2>{t(\"create-order-page.chose-hub\")}</h2>\r\n </div>\r\n <button className=\"btn-close float-end\" onClick={() => history.push(\"orders\")}></button>\r\n </div>\r\n <div className=\"card-body\">\r\n {hubs && (\r\n <table className=\"table table-hover row-clikable\">\r\n <tbody>\r\n {hubs.map((hub: Hub) => {\r\n return (\r\n <tr\r\n key={hub.id}\r\n onClick={() => {\r\n onHubSelected(hubs, packagingOptions, hub.id);\r\n }}\r\n >\r\n <td style={{ textAlign: \"left\" }}>\r\n <HubLocationComponent hub={hub} />\r\n </td>\r\n <td>\r\n {!HubHelpers.isHubOnline(hub.state) && (\r\n <span style={{ color: \"red\" }}>{\" \" + t(\"create-order-page.select-hub-not-available\")}</span>\r\n )}\r\n </td>\r\n </tr>\r\n );\r\n })}\r\n </tbody>\r\n </table>\r\n )}\r\n </div>\r\n </div>\r\n )}\r\n\r\n {!loading && step === 2 && (\r\n <div className=\"customer card\">\r\n <div className=\"card-header align-items-center\">\r\n <div className=\"d-inline-block\">\r\n <h2>{t(\"customer.customer-information\")}</h2>\r\n </div>\r\n <button className=\"btn-close float-end\" onClick={() => history.push(\"orders\")}></button>\r\n </div>\r\n\r\n <div className=\"card-body\">\r\n <form onSubmit={(ev) => ev.preventDefault()}>\r\n <div className=\"mb-4\">\r\n <input\r\n type=\"radio\"\r\n className=\"form-check-input\"\r\n name=\"selectexistingcustomer\"\r\n id=\"selectexistingcustomer\"\r\n key=\"selectexistingcustomer\"\r\n checked={selectExistingCustomer}\r\n disabled={customers.length === 0}\r\n onChange={onSelectCustomerSelected}\r\n />\r\n <label className=\"form-check-label\" htmlFor=\"selectexistingcustomer\">\r\n {t(\"create-order-page.existing-customer\")}\r\n </label>\r\n\r\n {customers.length > 0 && selectExistingCustomer && (\r\n <>\r\n <div className=\"ms-4 mb-2\">\r\n <input\r\n className=\"form-control mb-2\"\r\n value={customerSearchText}\r\n placeholder={t(\"create-order-page.searchbox\")}\r\n onChange={(ev) => onCustomerSearchTextChanged(ev.target.value, customers)}\r\n autoFocus={true}\r\n />\r\n <div className=\"fixed-head-table\">\r\n <table className=\"table table-sm table-hover row-clikable\">\r\n <thead>\r\n <tr>\r\n <th></th>\r\n <th>{t(\"create-order-page.name\")}</th>\r\n <th>{t(\"create-order-page.email\")}</th>\r\n <th>{t(\"common.phone\")}</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {filteredCustomers.length > 0 &&\r\n filteredCustomers.map((c) => (\r\n <tr key={c.email} onClick={() => setCustomerSelectedEmail(c.email)}>\r\n <td>\r\n {customerSelectedEmail === c.email && (\r\n <FontAwesomeIcon icon=\"check-circle\" className=\"text-success\"></FontAwesomeIcon>\r\n )}\r\n </td>\r\n <td>\r\n {c.firstname} {c.lastname?.length > 0 && \" \" + c.lastname}\r\n </td>\r\n <td>{c.email}</td>\r\n <td>{c.phone}</td>\r\n </tr>\r\n ))}\r\n {filteredCustomers.length === 0 && <div>{t(\"create-order-page.no-results\")}</div>}\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n </>\r\n )}\r\n\r\n <div>\r\n <input\r\n type=\"radio\"\r\n className=\"form-check-input\"\r\n name=\"newcustomer\"\r\n id=\"newcustomer\"\r\n key=\"newcustomer\"\r\n checked={!selectExistingCustomer}\r\n onChange={onSelectCustomerSelected}\r\n />\r\n <label className=\"form-check-label\" htmlFor=\"newcustomer\">\r\n {t(\"create-order-page.new-customer\")}\r\n </label>\r\n\r\n {(customers.length === 0 || !selectExistingCustomer) && (\r\n <div className=\"ms-4\">\r\n {/* FIRST NAME */}\r\n <div className=\"mb-3\">\r\n <label className=\"form-label\">{t(\"customer.enter-firstname\")}</label>\r\n <input\r\n className=\"form-control\"\r\n value={firstname}\r\n onChange={(ev) => setFistname(ev.target.value)}\r\n required\r\n autoFocus={true}\r\n />\r\n </div>\r\n\r\n {/* LAST NAME */}\r\n <div className=\"mb-3\">\r\n <label className=\"form-label\">{t(\"customer.enter-lastname\")}</label>\r\n <input className=\"form-control\" value={lastname} onChange={(ev) => setLastname(ev.target.value)} required />\r\n </div>\r\n\r\n {/* PHONE */}\r\n <div className=\"mb-3\">\r\n <PhoneFormComponent\r\n value={phoneNumber}\r\n setValue={setPhoneNumber}\r\n onMsgErrorChanged={setPhoneError}\r\n msgError={phoneError}\r\n label={t(\"common.phone\")}\r\n />\r\n </div>\r\n\r\n {/* EMAIL */}\r\n <div className=\"mb-3\">\r\n <InputComponent\r\n value={email}\r\n setValue={setEmail}\r\n regExp={StringHelpers.getEmailRegExp()}\r\n msgError={emailError}\r\n onMsgErrorChanged={setEmailError}\r\n type={\"email\"}\r\n labelText={t(\"customer.enter-email\")}\r\n required={true}\r\n />\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n\r\n <div className=\"mb-3\">\r\n <label className=\"form-label\">{t(\"create-order-page.reference-number\")}</label>\r\n <input\r\n className=\"form-control\"\r\n value={referenceId}\r\n onChange={(ev) => setReferenceId(ev.target.value.substring(0, 128))}\r\n maxLength={128}\r\n />\r\n </div>\r\n\r\n {/* Packaging Options */}\r\n {!isReturn && hubs && packagingOptionsAvailable && packagingOptionsAvailable.length > 0 && (\r\n <div className=\"mb-4\">\r\n <div className=\"mb-2\">\r\n {t(\"create-order-page.chose-packaging-option\")}\r\n <InfoCirleButton\r\n id={\"packagingInfo\"}\r\n title={t(\"create-order-page.chose-packaging-option\")}\r\n textInfo={t(\"create-order-page.packaging-option-info\")}\r\n />\r\n </div>\r\n <div className=\"btn-group\" role=\"group\">\r\n <input\r\n type=\"radio\"\r\n className=\"btn-check\"\r\n name=\"nopackaging\"\r\n id=\"nopackaging\"\r\n key=\"nopackaging\"\r\n checked={packagingOptionId === \"nopackaging\"}\r\n onChange={onPackagingOptionSelected}\r\n disabled={nocarrier}\r\n />\r\n <label className=\"btn btn-outline-primary\" htmlFor=\"nopackaging\">\r\n {t(\"create-order-page.no-packaging\")}\r\n </label>\r\n\r\n {packagingOptionsAvailable?.map((packagingOption: PackagingOption) => {\r\n return (\r\n <React.Fragment key={packagingOption.id}>\r\n <input\r\n type=\"radio\"\r\n className=\"btn-check\"\r\n name={packagingOption.id}\r\n id={packagingOption.id}\r\n checked={packagingOptionId === packagingOption.id}\r\n onChange={onPackagingOptionSelected}\r\n disabled={nocarrier}\r\n />\r\n <label className=\"btn btn-outline-primary\" htmlFor={packagingOption.id}>\r\n {packagingOption.description.get(languageService.language)}\r\n </label>\r\n </React.Fragment>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Carrier Options */}\r\n {!isReturn && hubs && carriers.length > 0 && (\r\n <div className=\"mb-5\">\r\n <div className=\"mb-2\">\r\n {t(\"create-order-page.chose-carrier-option\")}\r\n <InfoCirleButton\r\n id={\"carrierInfo\"}\r\n title={t(\"create-order-page.chose-carrier-option\")}\r\n textInfo={t(\"create-order-page.carrier-info\")}\r\n />\r\n </div>\r\n <div className=\"btn-group\" role=\"group\">\r\n <input\r\n type=\"radio\"\r\n className=\"btn-check\"\r\n name=\"nocarrier\"\r\n id=\"nocarrier\"\r\n key=\"nocarrier\"\r\n checked={carrierId === \"nocarrier\"}\r\n onChange={onCarrierSelected}\r\n />\r\n <label className=\"btn btn-outline-primary\" htmlFor=\"nocarrier\">\r\n {t(\"create-order-page.default-carrier-option\")}\r\n </label>\r\n\r\n {carriers.map((carrier: Carrier) => {\r\n return (\r\n <React.Fragment key={carrier.id}>\r\n <input\r\n type=\"radio\"\r\n className=\"btn-check\"\r\n name={carrier.id}\r\n id={carrier.id}\r\n checked={carrierId === carrier.id}\r\n onChange={onCarrierSelected}\r\n />\r\n <label className=\"btn btn-outline-primary\" htmlFor={carrier.id}>\r\n {carrier.name}\r\n </label>\r\n </React.Fragment>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n )}\r\n\r\n <button className=\"btn btn-lg btn-primary\" type=\"submit\" onClick={() => createOrder()} disabled={isCreating}>\r\n {isReturn ? t(\"create-order-page.return.create\") : t(\"create-order-page.create\")}\r\n </button>\r\n </form>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n function onPackagingOptionSelected(event: any) {\r\n event.persist();\r\n const { id } = event.target;\r\n setPackagingOptionId(id);\r\n\r\n if (carrierId !== \"nocarrier\" && id !== \"nopackaging\") setPackagingOptionId(\"nopackaging\");\r\n }\r\n\r\n function onCarrierSelected(event: any) {\r\n event.persist();\r\n const { id } = event.target;\r\n setCarrierId(id);\r\n\r\n if (id !== \"nocarrier\") setPackagingOptionId(\"nopackaging\");\r\n }\r\n\r\n function onSelectCustomerSelected(event: any) {\r\n event.persist();\r\n const { id } = event.target;\r\n setSelectExistingCustomer(id === \"selectexistingcustomer\");\r\n }\r\n\r\n function onCustomerSearchTextChanged(text: string, customers: Array<Member>) {\r\n setCustomerSearchText(text);\r\n\r\n if (text === \"\") {\r\n //console.log(\"listFiltered : No text to filter\");\r\n setFilteredCustomers(customers);\r\n } else {\r\n const listFiltered = customers.filter((c) => {\r\n return searchMatch(c.firstname, text) || searchMatch(c.lastname, text) || searchMatch(c.email, text) || searchMatch(c.phone, text);\r\n });\r\n\r\n if (listFiltered.length > searchResultCount) {\r\n listFiltered.slice(0, searchResultCount);\r\n }\r\n\r\n // console.log(\"listFiltered\", listFiltered);\r\n setFilteredCustomers(listFiltered);\r\n }\r\n }\r\n\r\n function searchMatch(text: string, search: string): boolean {\r\n return text.startsWith(search);\r\n }\r\n\r\n function onClick(number: number) {\r\n number < 4 && setStep(number);\r\n }\r\n\r\n function onHubSelected(hubs: Array<Hub> | null, packagingOptions: Array<PackagingOption> | null, hubId: string) {\r\n setHubId(hubId);\r\n\r\n const hub = hubs?.find((h) => h.id === hubId);\r\n\r\n if (HubHelpers.isHubOnline(hub?.state)) {\r\n if (hub) {\r\n setCarriers(hub.carriers);\r\n\r\n const ids = Array.from(HubHelpers.getPackagingOptiponIds(hub));\r\n\r\n let options = new Array<PackagingOption>();\r\n ids.forEach((id) => {\r\n const option = packagingOptions?.find((option) => option.id === id);\r\n if (option) {\r\n options.push(option);\r\n }\r\n });\r\n setPackagingOptionsAvailable(options);\r\n }\r\n\r\n onClick(step + 1);\r\n } else {\r\n ToastHelpers.error(t(\"create-order-page.error-hub-offline\"));\r\n }\r\n }\r\n\r\n function createOrder() {\r\n if (!hubId || !organization) return;\r\n\r\n if (selectExistingCustomer && customerSelectedEmail?.length === 0) {\r\n ToastHelpers.error(t(\"create-order-page.error-select-customer\"));\r\n return;\r\n }\r\n\r\n if (packagingOptionId !== \"nopackaging\" && carrierId !== \"nocarrier\") return;\r\n\r\n if (!selectExistingCustomer && (!email || !firstname || !lastname || phoneError || emailError)) {\r\n setIsCreating(false);\r\n return;\r\n }\r\n\r\n setIsCreating(true);\r\n\r\n let packagingId = packagingOptionId;\r\n if (packagingOptionId === \"nopackaging\") {\r\n packagingId = \"\";\r\n }\r\n\r\n let newCarrierId: string | undefined = carrierId;\r\n if (newCarrierId === \"nocarrier\") {\r\n newCarrierId = undefined;\r\n }\r\n\r\n let tmpFirstname = firstname;\r\n let tmpLastname = lastname;\r\n let tmpEmail = email;\r\n let tmpPhoneNumber = phoneNumber;\r\n if (selectExistingCustomer && customerSelectedEmail?.length > 0) {\r\n const customerSelected = customers.find((c) => c.email === customerSelectedEmail);\r\n if (customerSelected) {\r\n tmpFirstname = customerSelected?.firstname;\r\n tmpLastname = customerSelected?.lastname;\r\n tmpEmail = customerSelected?.email;\r\n tmpPhoneNumber = customerSelected?.phone;\r\n }\r\n }\r\n\r\n if (tmpFirstname && tmpLastname && tmpEmail) {\r\n const flow = isReturn ? OrderFlow.Return : OrderFlow.Deliver;\r\n orderService\r\n .createOrder(\r\n hubId,\r\n organization.id,\r\n tmpPhoneNumber,\r\n tmpEmail,\r\n tmpFirstname,\r\n tmpLastname,\r\n languageService.getLanguage(),\r\n packagingId,\r\n newCarrierId,\r\n flow,\r\n referenceId\r\n )\r\n .then((response) => {\r\n return history.push(`/orders/${response}`);\r\n })\r\n .catch((error) => {\r\n setIsCreating(false);\r\n if (error?.response?.status === 409) {\r\n setEmailError(t(\"create-order-page.error-email-exist\"));\r\n } else {\r\n ToastHelpers.error(t(\"create-order-page.error-conflict\"));\r\n }\r\n });\r\n } else {\r\n ToastHelpers.error(t(\"create-order-page.customer-information-error\"));\r\n }\r\n }\r\n}\r\n","import { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { AssetColors } from \"../../assets/assets-colors\";\r\nimport { HeaderIcon } from \"../../components/header\";\r\n\r\ninterface NoConnectionPageProps {\r\n changeLanguage: any;\r\n}\r\n\r\nexport default function NoConnectionPage(props: NoConnectionPageProps) {\r\n const { changeLanguage } = props;\r\n const { t } = useTranslation();\r\n\r\n function reload() {\r\n window.location.reload();\r\n }\r\n\r\n return (\r\n <>\r\n <header>\r\n <div className=\"container\">\r\n <div className=\"row\">\r\n <div className=\"col-12 col-md-10 col-lg-8 offset-md-1 offset-lg-2\">\r\n <nav className=\"navbar reset\">\r\n <ul className=\"navbar-nav align-items-center ms-auto\">\r\n <li className=\"nav-item\">\r\n <button className=\"nav-link\" onClick={changeLanguage}>\r\n <FontAwesomeIcon className=\"me-2\" icon={[\"fas\", \"globe\"]} />\r\n {t(\"language.display-long\")}\r\n </button>\r\n </li>\r\n </ul>\r\n </nav>\r\n </div>\r\n </div>\r\n </div>\r\n </header>\r\n\r\n <div className=\"container page sign-up-page pt-5\">\r\n <div className=\"row\">\r\n <div className=\"col-12 col-md-10 col-lg-8 offset-md-1 offset-lg-2\">\r\n <div className=\"card card-full\">\r\n <div className=\"row\">\r\n <div className=\"col col-xl-8\">\r\n <div className=\"logo\">\r\n <HeaderIcon logo={AssetColors.Blue} />\r\n </div>\r\n\r\n <div className=\"card-left\">\r\n <div className=\"card-body\">\r\n <h5>{t(\"no-connection-page.oups\")}</h5>\r\n <h6>{t(\"no-connection-page.title\")}</h6>\r\n <h6>{t(\"no-connection-page.subtitle\")}</h6>\r\n\r\n <button className=\"btn btn-lg btn-primary\" onClick={async () => await reload()}>\r\n {t(\"no-connection-page.retry\")}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <div className=\"card-right d-none d-xl-inline-block col-4 gx-0\">\r\n <img className=\"img-fluid\" src=\"/images/sign-up.jpg\" alt=\"\" />\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </>\r\n );\r\n}\r\n","import { useEffect, useState } from \"react\";\r\n\r\ntype Props = {\r\n children: any;\r\n waitBeforeShow?: number;\r\n};\r\n\r\nexport default function DelayCompoment({ children, waitBeforeShow = 500 }: Props) {\r\n const [isShown, setIsShown] = useState(false);\r\n\r\n useEffect(() => {\r\n let timeoutId = setTimeout(() => {\r\n setIsShown(true);\r\n }, waitBeforeShow);\r\n\r\n return () => clearInterval(timeoutId);\r\n }, [waitBeforeShow]);\r\n\r\n if (isShown) {\r\n return children;\r\n }\r\n return null;\r\n}\r\n","import { useEffect, useState } from \"react\";\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { useHistory } from \"react-router-dom\";\r\nimport { PhoneFormComponent } from \"../../components/customer-information-components/phone-component\";\r\nimport { InputComponent } from \"../../components/input\";\r\nimport LoadingComponent from \"../../components/loading-component\";\r\nimport StringHelpers from \"../../services/core/string-helpers\";\r\nimport ToastHelpers from \"../../services/core/toast-helpers\";\r\nimport customersService from \"../../services/member/customers-service\";\r\nimport Organization from \"../../services/organization/organization\";\r\n\r\ntype Props = {\r\n organization: Organization | undefined;\r\n};\r\n\r\nexport function CreateCustomerPage(props: Props) {\r\n const { organization } = props;\r\n\r\n const [loading, setLoading] = useState<boolean>(true);\r\n\r\n const [phoneNumber, setPhoneNumber] = useState<string>(\"\");\r\n const [email, setEmail] = useState<string>(\"\");\r\n const [firstname, setFistname] = useState<string>(\"\");\r\n const [lastname, setLastname] = useState<string>(\"\");\r\n const [unit, setUnit] = useState<string>(\"\");\r\n\r\n const [emailError, setEmailError] = useState<string>();\r\n const [phoneError, setPhoneError] = useState<string>();\r\n\r\n const { t } = useTranslation();\r\n const history = useHistory();\r\n\r\n useEffect(() => {\r\n setLoading(false);\r\n });\r\n\r\n return (\r\n <div className=\"container page orders-page\">\r\n <div className=\"col col-lg-6 offset-lg-3\">\r\n <h1>{t(\"customer.create-customer-title\")}</h1>\r\n\r\n <LoadingComponent loading={loading} />\r\n\r\n {!loading && (\r\n <div className=\"customer card\">\r\n <div className=\"card-header align-items-center\">\r\n <div className=\"d-inline-block\">\r\n <h2>{t(\"customer.customer-information\")}</h2>\r\n </div>\r\n <button className=\"btn-close float-end\" onClick={() => history.push(\"/customers\")}></button>\r\n </div>\r\n\r\n <div className=\"card-body\">\r\n <form onSubmit={(ev) => ev.preventDefault()}>\r\n {/* FIRST NAME */}\r\n <div className=\"mb-3\">\r\n <label className=\"form-label\">{t(\"customer.enter-firstname\")}</label>\r\n <input\r\n className=\"form-control\"\r\n value={firstname}\r\n onChange={(ev) => setFistname(ev.target.value)}\r\n required\r\n autoFocus={true}\r\n />\r\n </div>\r\n\r\n {/* LAST NAME */}\r\n <div className=\"mb-3\">\r\n <label className=\"form-label\">{t(\"customer.enter-lastname\")}</label>\r\n <input className=\"form-control\" value={lastname} onChange={(ev) => setLastname(ev.target.value)} required />\r\n </div>\r\n\r\n {/* PHONE */}\r\n <div className=\"mb-3\">\r\n <PhoneFormComponent\r\n value={phoneNumber}\r\n setValue={setPhoneNumber}\r\n onMsgErrorChanged={setPhoneError}\r\n msgError={phoneError}\r\n label={t(\"common.phone\")}\r\n />\r\n </div>\r\n\r\n {/* EMAIL */}\r\n <div className=\"mb-3\">\r\n <InputComponent\r\n value={email}\r\n setValue={setEmail}\r\n regExp={StringHelpers.getEmailRegExp()}\r\n msgError={emailError}\r\n onMsgErrorChanged={setEmailError}\r\n type={\"email\"}\r\n labelText={t(\"customer.enter-email\")}\r\n required={true}\r\n />\r\n </div>\r\n\r\n {/* UNIT */}\r\n <div className=\"mb-3\">\r\n <label className=\"form-label\">{t(\"customer.enter-unit\")}</label>\r\n <input className=\"form-control\" value={unit} onChange={(ev) => setUnit(ev.target.value)} />\r\n </div>\r\n\r\n <button className=\"btn btn-lg btn-primary\" type=\"submit\" onClick={() => createCustomer()}>\r\n {t(\"customer.create\")}\r\n </button>\r\n </form>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n\r\n async function createCustomer() {\r\n if (organization?.id && firstname && lastname && email && !phoneError && !emailError) {\r\n const lowerCaseEmail = email.toLowerCase();\r\n await customersService\r\n .createCustomer(organization.id, firstname, lastname, phoneNumber, lowerCaseEmail, unit)\r\n .then(() => {\r\n return history.push(`/customers`);\r\n })\r\n .catch((error) => {\r\n if (error?.response?.status === 409) {\r\n setEmailError(t(\"create-order-page.error-email-exist\"));\r\n } else {\r\n ToastHelpers.error(t(\"create-order-page.error-conflict\"));\r\n }\r\n });\r\n }\r\n }\r\n}\r\n","import { useEffect, useState } from \"react\";\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { useHistory, useParams } from \"react-router-dom\";\r\nimport LoadingComponent from \"../../components/loading-component\";\r\nimport ToastHelpers from \"../../services/core/toast-helpers\";\r\nimport customersService from \"../../services/member/customers-service\";\r\nimport membersService from \"../../services/member/member-service\";\r\nimport Member from \"../../services/member/member\";\r\nimport Organization from \"../../services/organization/organization\";\r\nimport { PhoneFormComponent } from \"../../components/customer-information-components/phone-component\";\r\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\r\nimport { YesNoComponent } from \"../../components/yesno-component\";\r\n\r\ntype Props = {\r\n organization: Organization | undefined;\r\n user: Member | undefined;\r\n};\r\n\r\ninterface IParamTypes {\r\n customerId: string;\r\n}\r\n\r\nexport function EditCustomerPage(props: Props) {\r\n const { organization } = props;\r\n const { user } = props;\r\n const { customerId } = useParams<IParamTypes>();\r\n\r\n const [loading, setLoading] = useState<boolean>(true);\r\n\r\n const [customer, setCustomer] = useState<Member>();\r\n const [phone, setPhone] = useState<string>(\"\");\r\n const [email, setEmail] = useState<string>(\"\");\r\n const [firstname, setFistname] = useState<string>(\"\");\r\n const [lastname, setLastname] = useState<string>(\"\");\r\n const [unit, setUnit] = useState<string>(\"\");\r\n const [isDeletedCustomer, setIsDeletedCustomer] = useState<boolean>(false);\r\n\r\n const [phoneError, setPhoneError] = useState<string>();\r\n\r\n const { t } = useTranslation();\r\n const history = useHistory();\r\n\r\n useEffect(() => {\r\n if (organization && customerId) {\r\n customersService\r\n .getCustomer(organization?.id, customerId)\r\n .then((response: Member | undefined) => {\r\n setCustomer(response);\r\n\r\n if (response) {\r\n setEmail(response?.email);\r\n setPhone(response?.phone);\r\n setFistname(response?.firstname);\r\n setLastname(response?.lastname);\r\n setUnit(response?.unit);\r\n }\r\n })\r\n .catch(() => {\r\n ToastHelpers.error(t(\"customers-page.error-refresh\"));\r\n });\r\n }\r\n setLoading(false);\r\n }, [customerId, organization]);\r\n\r\n return (\r\n <div className=\"container page orders-page\">\r\n {isDeletedCustomer ? (\r\n <YesNoComponent\r\n headerMsg={t(\"edit-customer-page.msg-delete-customer\")}\r\n onYesClick={() => deleteCustomer()}\r\n onNoClick={setIsDeletedCustomer}\r\n />\r\n ) : (\r\n <div className=\"col col-lg-6 offset-lg-3\">\r\n <h1>{t(\"edit-customer-page.title\")}</h1>\r\n\r\n <LoadingComponent loading={loading} />\r\n\r\n {!loading && (\r\n <div className=\"customer card\">\r\n <div className=\"card-header align-items-center\">\r\n <div className=\"d-inline-block\">\r\n <h2>{t(\"customer.customer-information\")}</h2>\r\n </div>\r\n <button className=\"btn-close float-end\" onClick={() => history.push(\"/customers\")}></button>\r\n </div>\r\n\r\n <div className=\"card-body\">\r\n <form onSubmit={(ev) => ev.preventDefault()}>\r\n {/* FIRST NAME */}\r\n <div className=\"mb-3\">\r\n <label className=\"form-label\">{t(\"customer.enter-firstname\")}</label>\r\n <input\r\n className=\"form-control\"\r\n value={firstname}\r\n onChange={(ev) => setFistname(ev.target.value)}\r\n required\r\n autoFocus={true}\r\n />\r\n </div>\r\n\r\n {/* LAST NAME */}\r\n <div className=\"mb-3\">\r\n <label className=\"form-label\">{t(\"customer.enter-lastname\")}</label>\r\n <input className=\"form-control\" value={lastname} onChange={(ev) => setLastname(ev.target.value)} required />\r\n </div>\r\n\r\n {/* PHONE */}\r\n <div className=\"mb-3\">\r\n <PhoneFormComponent\r\n value={phone}\r\n setValue={setPhone}\r\n onMsgErrorChanged={setPhoneError}\r\n msgError={phoneError}\r\n label={t(\"customer.enter-phone\")}\r\n />\r\n </div>\r\n\r\n {/* UNIT */}\r\n <div className=\"mb-3\">\r\n <label className=\"form-label\">{t(\"customer.enter-unit\")}</label>\r\n <input className=\"form-control\" value={unit} onChange={(ev) => setUnit(ev.target.value)} />\r\n </div>\r\n\r\n {canEdit() && (\r\n <>\r\n <button className=\"btn btn-lg btn-primary\" type=\"submit\" onClick={() => editCustomer()}>\r\n {t(\"edit-customer-page.btn-save\")}\r\n </button>\r\n <button className={`btn btn-lg btn-outline-primary float-end`} onClick={() => setIsDeletedCustomer(true)}>\r\n <FontAwesomeIcon icon={[\"fas\", \"trash-alt\"]} /> {t(\"common.delete\")}\r\n </button>\r\n </>\r\n )}\r\n\r\n {!canEdit() && <label>{t(\"edit-customer-page.not-authorized\")}</label>}\r\n <button className=\"btn btn-lg btn-primary-outline\" type=\"submit\" onClick={() => history.push(\"/customers\")}>\r\n {t(\"edit-customer-page.btn-cancel\")}\r\n </button>\r\n </form>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n\r\n function canEdit(): boolean {\r\n if (user && membersService.isLocketgoAdmin(user)) return true;\r\n\r\n if (customer?.type === \"User\") return false;\r\n\r\n return true;\r\n }\r\n\r\n async function editCustomer() {\r\n if (organization?.id && firstname && lastname && email && !phoneError) {\r\n let newCustomer = { ...customer, firstname, lastname, phone, email, unit };\r\n\r\n await customersService\r\n .updateCustomer(organization?.id, newCustomer)\r\n .then(() => {\r\n return history.push(`/customers`);\r\n })\r\n .catch(() => {\r\n ToastHelpers.error(t(\"create-order-page.error-conflict\"));\r\n });\r\n }\r\n }\r\n\r\n async function deleteCustomer() {\r\n if (organization?.id && customerId) {\r\n setIsDeletedCustomer(false);\r\n await customersService\r\n .deleteCustomer(organization?.id, customerId)\r\n .then(() => {\r\n return history.push(`/customers`);\r\n })\r\n .catch(() => {\r\n ToastHelpers.error(t(\"edit-customer-page.error-delete-customer\"));\r\n });\r\n }\r\n }\r\n}\r\n","import ReservationBlock from \"./reservationBlock\";\r\n\r\nexport class MicrositeHelpers {\r\n static reservationBlockIsAvailable(rb: ReservationBlock) {\r\n let dateNow = new Date(Date.now());\r\n let availableStart = new Date(rb.availableStart);\r\n return availableStart <= dateNow;\r\n }\r\n\r\n static reservationBlockIsPassed(rb: ReservationBlock) {\r\n if (!rb.availableEnd) {\r\n return false;\r\n }\r\n\r\n let dateNow = new Date(Date.now());\r\n let availableEnd = new Date(rb.availableEnd);\r\n return availableEnd <= dateNow;\r\n }\r\n\r\n static compareReservationBlocks(rb1: ReservationBlock, rb2: ReservationBlock): number {\r\n if (this.reservationBlockIsPassed(rb1) && !this.reservationBlockIsPassed(rb2)) {\r\n return -1;\r\n }\r\n if (this.reservationBlockIsPassed(rb2) && !this.reservationBlockIsPassed(rb1)) {\r\n return 1;\r\n }\r\n\r\n if (this.reservationBlockIsAvailable(rb1) && !this.reservationBlockIsAvailable(rb2)) {\r\n return -1;\r\n }\r\n if (this.reservationBlockIsAvailable(rb2) && !this.reservationBlockIsAvailable(rb1)) {\r\n return 1;\r\n }\r\n\r\n if (rb1.availableEnd && rb2.availableEnd && rb1.availableEnd > rb2.availableEnd && rb1.duration > rb2.duration) {\r\n return 1;\r\n } else if (rb1.availableEnd && rb2.availableEnd && rb1.availableEnd === rb2.availableEnd && rb1.duration < rb2.duration) {\r\n return -1;\r\n }\r\n\r\n if (\r\n (rb1.availableStart && rb2.availableStart && rb1.availableStart < rb2.availableStart) ||\r\n (rb1.startOn && rb2.startOn && rb1.startOn < rb2.startOn) ||\r\n (!rb1.startOn && !rb1.availableStart && (rb2.startOn || rb2.availableStart))\r\n ) {\r\n return -1;\r\n }\r\n\r\n return 0;\r\n }\r\n}\r\n","import languageService from \"../core/language-service\";\r\nimport { HubHelpers } from \"../hub/hub-helper\";\r\nimport hubService from \"../hub/hub-service\";\r\nimport { Order } from \"../order/order\";\r\nimport ServicesApiBaseService from \"../services-api-base-service\";\r\nimport Microsite from \"./microsite\";\r\nimport ReservationBlock from \"./reservationBlock\";\r\n\r\ninterface ICreateReservationBlock {\r\n MicrositeId: string;\r\n Name: { [key: string]: string };\r\n Description?: { [key: string]: string | undefined };\r\n LogoUrl?: string;\r\n Price: number;\r\n StartOn?: string;\r\n Duration: number;\r\n AvailableStart?: string;\r\n AvailableEnd?: string;\r\n CodeSpecified: boolean;\r\n Meta?: { [key: string]: string | undefined };\r\n Active: boolean;\r\n}\r\n\r\ninterface IUpdateReservationBlock {\r\n Id: string;\r\n Name: { [key: string]: string };\r\n Description?: { [key: string]: string | undefined };\r\n LogoUrl?: string;\r\n Price: number;\r\n StartOn?: string;\r\n Duration: number;\r\n AvailableStart?: string;\r\n AvailableEnd?: string;\r\n CodeSpecified: boolean;\r\n Meta?: { [key: string]: string | undefined };\r\n}\r\n\r\nclass MicrositeService extends ServicesApiBaseService {\r\n async getMicrosite(micrositeId: string, filter: string = \"Active\"): Promise<Microsite | undefined> {\r\n const microsite = await this.getObject<Microsite>(`${this.apiUrl}/microsites/${micrositeId}?filter=${filter}`);\r\n if (microsite) {\r\n if (microsite.name) {\r\n microsite.name = new Map(Object.entries(microsite?.name));\r\n }\r\n if (microsite.reservationBlocks) {\r\n microsite.reservationBlocks.map((reservationBlock) => {\r\n if (reservationBlock.name) {\r\n reservationBlock.name = new Map(Object.entries(reservationBlock.name));\r\n }\r\n\r\n if (reservationBlock.description) {\r\n reservationBlock.description = new Map(Object.entries(reservationBlock.description));\r\n }\r\n return reservationBlock;\r\n });\r\n }\r\n }\r\n\r\n return microsite || undefined;\r\n }\r\n\r\n async getTimeUntilExpired(orderId: String | undefined): Promise<any> {\r\n const result = await this.getObject<any>(`${this.apiUrl}/microsites/timeUntilExpired/${orderId}`);\r\n return result || 0;\r\n }\r\n\r\n async getReservationBlockById(micrositeId: string, reservationBlockId: string): Promise<ReservationBlock | undefined> {\r\n const reservationBlock = await this.getObject<any>(`${this.apiUrl}/microsites/${micrositeId}/reservationBlocks/${reservationBlockId}`);\r\n if (reservationBlock) {\r\n if (reservationBlock.name) {\r\n reservationBlock.name = new Map(Object.entries(reservationBlock.name));\r\n }\r\n\r\n if (reservationBlock.description) {\r\n reservationBlock.description = new Map(Object.entries(reservationBlock.description));\r\n }\r\n }\r\n return reservationBlock;\r\n }\r\n\r\n async createReservationBlock(organizationId: string, data: ICreateReservationBlock): Promise<number | undefined> {\r\n return await this.postObject<any, number>(\r\n `${this.apiUrl}/microsites/${data.MicrositeId}/organization/${organizationId}/reservationBlocks`,\r\n data\r\n );\r\n }\r\n\r\n async updateReservationBlock(organizationId: string, micrositeId: string, data: IUpdateReservationBlock): Promise<void> {\r\n return await this.putObject<any>(\r\n `${this.apiUrl}/microsites/${micrositeId}/organization/${organizationId}/reservationBlocks/${data.Id}`,\r\n data\r\n );\r\n }\r\n\r\n async deleteReservationBlock(organizationId: string, micrositeId: string, reservationBlockId: string): Promise<void> {\r\n return await this.deleteObject<any>(\r\n `${this.apiUrl}/microsites/${micrositeId}/organization/${organizationId}/reservationBlocks/${reservationBlockId}`\r\n );\r\n }\r\n\r\n async createOrder(\r\n micrositeId: string,\r\n reservationBlockId: string,\r\n createPayment: boolean,\r\n phoneNumber?: string | undefined,\r\n email?: string | undefined,\r\n firstname?: string | undefined,\r\n lastname?: string | undefined,\r\n referenceId?: string | undefined,\r\n code?: string | undefined,\r\n language?: string | undefined,\r\n end: string | undefined = undefined,\r\n allowOffline: boolean = true\r\n ): Promise<string> {\r\n const result = await this.postObject<any, string>(\r\n `${this.apiUrl}/microsites/${micrositeId}/reservationBlocks/${reservationBlockId}/orders`,\r\n {\r\n phone: phoneNumber,\r\n email: email,\r\n firstname: firstname,\r\n lastname: lastname,\r\n referenceId: referenceId,\r\n createPayment: createPayment,\r\n code: code,\r\n language: language || languageService.getLanguage(),\r\n end: end,\r\n allowOffline: allowOffline,\r\n }\r\n );\r\n return result || \"\";\r\n }\r\n\r\n async resendNotification(\r\n micrositeId: string,\r\n reservationBlockId: string,\r\n orderId: string,\r\n phoneNumber?: string | undefined,\r\n email?: string | undefined,\r\n referenceId?: string | undefined\r\n ): Promise<string> {\r\n const result = await this.postObject<any, string>(\r\n `${this.apiUrl}/microsites/${micrositeId}/reservationBlocks/${reservationBlockId}/resendNotification`,\r\n {\r\n phone: phoneNumber,\r\n email: email,\r\n referenceId: referenceId,\r\n orderId: orderId,\r\n }\r\n );\r\n return result || \"\";\r\n }\r\n\r\n async getMicrositeSizesIds(microsite: Microsite): Promise<Set<String>> {\r\n let sizeIds = new Set<String>();\r\n const hubs = await hubService.getHubs();\r\n\r\n microsite.hubIds.forEach((hubId) => {\r\n let hub = hubs.find((h) => h.id === hubId);\r\n if (hub) {\r\n let compartmentSizes = HubHelpers.getCompartmentSizeIds(hub);\r\n compartmentSizes.forEach((sizeId) => sizeIds.add(sizeId));\r\n }\r\n });\r\n\r\n return sizeIds;\r\n }\r\n\r\n async getEventOrders(micrositeId: string, eventId: string): Promise<Array<Order>> {\r\n let result = await this.getObject<Array<Order>>(`${this.apiUrl}/microsites/${micrositeId}/reservationBlocks/${eventId}/orders`);\r\n\r\n return result || [];\r\n }\r\n}\r\n\r\nconst micrositeService = new MicrositeService();\r\nexport default micrositeService;\r\n","const PricePerHour = \"PricePerHour\";\r\nconst PricePerMinute = \"PricePerMinute\";\r\nconst MinimalPrice = \"MinimalPrice\";\r\nconst CodeType = \"CodeType\";\r\nconst ResetTime = \"ResetTime\";\r\nexport { PricePerHour, PricePerMinute, MinimalPrice, CodeType, ResetTime };\r\n","import moment from \"moment\";\r\nimport StringHelpers from \"../../services/core/string-helpers\";\r\nimport { MinimalPrice, PricePerHour, PricePerMinute, ResetTime } from \"../../assets/meta-table-keys\";\r\nimport { Trans, useTranslation } from \"react-i18next\";\r\nimport ReservationBlock from \"../../services/micro-site/reservationBlock\";\r\nimport Microsite from \"../../services/micro-site/microsite\";\r\nimport DateHelpers from \"../../services/core/date-helpers\";\r\n\r\ntype EventCardProps = {\r\n reservationBlock: ReservationBlock;\r\n microsite: Microsite;\r\n language: string;\r\n reserve: (reservationBlock: ReservationBlock) => void;\r\n canShowCreateReservation: (reservationBlock: ReservationBlock) => boolean;\r\n};\r\n\r\nexport default function EventCard(props: EventCardProps) {\r\n const { reservationBlock, microsite, language, reserve, canShowCreateReservation } = props;\r\n const { t } = useTranslation();\r\n\r\n const until = moment(reservationBlock.startOn).add(reservationBlock.duration, \"seconds\").toDate();\r\n const priceFormatted = StringHelpers.formatPrice(reservationBlock.price + reservationBlock.price * reservationBlock.saleTaxRate);\r\n\r\n const showCreateReservation = canShowCreateReservation(reservationBlock);\r\n const pricePerHour = Number.parseFloat(reservationBlock.meta[PricePerHour]);\r\n const pricePerMinute = Number.parseFloat(reservationBlock.meta[PricePerMinute]);\r\n const resetTime = reservationBlock.meta[ResetTime];\r\n const resetTimeDate = DateHelpers.getNextDayWithTime(resetTime, DateHelpers.UserTimeZone);\r\n\r\n const isSwych = microsite.id === \"swych\";\r\n\r\n if (!pricePerHour && !pricePerMinute)\r\n return (\r\n <div className=\"card\" key={reservationBlock.id}>\r\n <div className=\"card-header\">\r\n {reservationBlock?.logoUrl && <img src={reservationBlock?.logoUrl} alt=\"\" className=\"img-logo\" />}\r\n <h2 className=\"mt-4\"> {reservationBlock.name.get(language)}</h2>\r\n </div>\r\n\r\n <div className=\"card-body\">\r\n {microsite.logoUrl && <img src={microsite.logoUrl} alt=\"\" className=\"img-logo float-end\" />}\r\n <p>\r\n {reservationBlock.description && reservationBlock.description.length > 0 && (\r\n <>\r\n {reservationBlock.description.get(language)}\r\n <br />\r\n </>\r\n )}\r\n\r\n {reservationBlock.startOn ? (\r\n <Trans\r\n i18nKey=\"micro-site-page.locker-available\"\r\n values={{\r\n start: DateHelpers.formatDateTime(new Date(reservationBlock.startOn), DateHelpers.UserTimeZone),\r\n end: DateHelpers.formatDateTime(until, DateHelpers.UserTimeZone),\r\n }}\r\n />\r\n ) : (\r\n <>\r\n {!resetTime ? (\r\n <>\r\n <Trans\r\n i18nKey=\"micro-site-page.locker-available-now\"\r\n values={{ duration: DateHelpers.formatDuration(reservationBlock.duration) }}\r\n />\r\n </>\r\n ) : (\r\n <>\r\n <Trans\r\n i18nKey=\"micro-site-page.reservation-valid-until\"\r\n values={{\r\n month: DateHelpers.getMonth(resetTimeDate),\r\n day: DateHelpers.getDay(resetTimeDate),\r\n time: DateHelpers.formatTime(resetTime, DateHelpers.UserTimeZone),\r\n }}\r\n />\r\n </>\r\n )}\r\n </>\r\n )}\r\n </p>\r\n\r\n <p>{t(\"micro-site-page.cost\", { cost: priceFormatted, currency: microsite.currency })}</p>\r\n\r\n {showCreateReservation ? (\r\n <div className=\"mt-4\">\r\n <button className=\"btn btn-lg btn-primary\" onClick={() => reserve(reservationBlock)}>\r\n {isSwych ? t(\"micro-site-page.create-reservation-swych\") : t(\"micro-site-page.create-reservation\")}\r\n </button>\r\n </div>\r\n ) : (\r\n <p>\r\n {t(\"micro-site-page.reservation-not-available\", {\r\n date: DateHelpers.formatDateTime(new Date(reservationBlock.availableStart.toString()), \"America/Toronto\"),\r\n })}\r\n </p>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n\r\n const minimalPrice = Number.parseFloat(reservationBlock.meta[MinimalPrice]);\r\n const minimalPriceFormatted = StringHelpers.formatPrice(minimalPrice + minimalPrice * reservationBlock.saleTaxRate);\r\n\r\n let cost = \"\";\r\n if (pricePerHour) cost = StringHelpers.formatPrice(pricePerHour + pricePerHour * reservationBlock.saleTaxRate);\r\n else if (pricePerMinute) cost = StringHelpers.formatPrice(pricePerMinute + pricePerMinute * reservationBlock.saleTaxRate);\r\n\r\n return (\r\n <div className=\"card\" key={reservationBlock.id}>\r\n <div className=\"card-header\">\r\n {reservationBlock?.logoUrl && <img src={reservationBlock?.logoUrl} alt=\"\" className=\"img-logo\" />}\r\n <h2 className=\"mt-4\"> {reservationBlock.name.get(language)}</h2>\r\n </div>\r\n\r\n <div className=\"card-body\">\r\n {microsite.logoUrl && <img src={microsite.logoUrl} alt=\"\" className=\"img-logo float-end\" />}\r\n <p>\r\n {reservationBlock.description && reservationBlock.description.length > 0 && (\r\n <>\r\n {reservationBlock.description.get(language)}\r\n <br />\r\n </>\r\n )}\r\n <Trans\r\n i18nKey=\"micro-site-page.reservation-valid-until\"\r\n values={{\r\n month: DateHelpers.getMonth(resetTimeDate),\r\n day: DateHelpers.getDay(resetTimeDate),\r\n time: DateHelpers.formatTime(resetTime, DateHelpers.UserTimeZone),\r\n }}\r\n />\r\n </p>\r\n\r\n <p>\r\n <strong>{t(\"micro-site-page.cost-title\")}</strong>\r\n <br />\r\n\r\n {!!pricePerHour && t(\"micro-site-page.cost-per-hour\", { cost: cost, currency: microsite.currency })}\r\n {!!pricePerMinute && t(\"micro-site-page.cost-per-minute\", { cost: cost, currency: microsite.currency })}\r\n {minimalPrice > 0 && (\r\n <>\r\n <br />\r\n {t(\"micro-site-page.min-cost\", { cost: minimalPriceFormatted, currency: microsite.currency })}\r\n </>\r\n )}\r\n <br />\r\n {t(\"micro-site-page.max-cost\", { cost: priceFormatted, currency: microsite.currency })}\r\n </p>\r\n\r\n {showCreateReservation ? (\r\n <div className=\"mt-4\">\r\n <button className=\"btn btn-lg btn-primary\" onClick={() => reserve(reservationBlock)}>\r\n {isSwych ? t(\"micro-site-page.create-reservation-swych\") : t(\"micro-site-page.create-reservation\")}\r\n </button>\r\n </div>\r\n ) : (\r\n <p>\r\n {t(\"micro-site-page.reservation-not-available\", {\r\n date: DateHelpers.formatDateTime(new Date(reservationBlock.availableStart.toString()), \"America/Toronto\"),\r\n })}\r\n </p>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import moment from \"moment\";\r\nimport { useEffect, useState } from \"react\";\r\nimport { Trans, useTranslation } from \"react-i18next\";\r\nimport { useHistory, useParams } from \"react-router-dom\";\r\nimport LoadingComponent from \"../../components/loading-component\";\r\nimport languageService from \"../../services/core/language-service\";\r\nimport StringHelpers from \"../../services/core/string-helpers\";\r\nimport Member from \"../../services/member/member\";\r\nimport Microsite from \"../../services/micro-site/microsite\";\r\nimport { MicrositeHelpers } from \"../../services/micro-site/microsite-helpers\";\r\nimport micrositeService from \"../../services/micro-site/microsite-service\";\r\nimport ReservationBlock from \"../../services/micro-site/reservationBlock\";\r\nimport \"./micro-site-page.scss\";\r\nimport { MinimalPrice, PricePerHour } from \"../../assets/meta-table-keys\";\r\nimport EventCard from \"./event-card\";\r\n\r\ntype Props = {\r\n member: Member | null;\r\n setNoConnection: any;\r\n};\r\n\r\ninterface IParamTypes {\r\n micrositeId: string;\r\n}\r\n\r\nexport default function MicroSitePage(props: Props) {\r\n const { member, setNoConnection } = props;\r\n\r\n const { t } = useTranslation();\r\n const language: string = languageService.getLanguage();\r\n const history = useHistory();\r\n const { micrositeId } = useParams<IParamTypes>();\r\n\r\n const [loading, setLoading] = useState<boolean>(true);\r\n const [microsite, setMicrosite] = useState<Microsite>();\r\n const [reservationBlocks, setReservationBlocks] = useState<ReservationBlock[]>([]);\r\n\r\n useEffect(() => {\r\n micrositeService\r\n .getMicrosite(micrositeId)\r\n .then((microsite: Microsite | undefined) => {\r\n if (microsite) {\r\n setMicrosite(microsite);\r\n if (microsite.reservationBlocks[0]) {\r\n setReservationBlocks(\r\n microsite.reservationBlocks.sort((rb1, rb2) => new Date(rb1.startOn).getTime() - new Date(rb2.startOn).getTime())\r\n );\r\n }\r\n }\r\n })\r\n .catch(() => setNoConnection(true))\r\n .finally(() => {\r\n setLoading(false);\r\n });\r\n }, [member, setNoConnection, micrositeId]);\r\n\r\n if (loading) {\r\n return <LoadingComponent loading={loading} />;\r\n }\r\n\r\n if (!microsite) {\r\n return (\r\n <div className=\"container page micro-site-page\">\r\n {!microsite && (\r\n <div className=\"text-center mt-4\">\r\n <p>{t(\"micro-site-page.no-reservationBlock\")}</p>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"container page micro-site-page \">\r\n <div className=\"row\">\r\n <div className=\"col-12 offset-lg-2 col-lg-8 page-background-boxing shadow\">\r\n {/* No reservation */}\r\n {reservationBlocks.length === 0 && (\r\n <div className=\"row\">\r\n <div className=\"col-12 offset-lg-2 col-lg-8\">\r\n <div className=\"card-body\">\r\n <h1>{microsite.name.get(language)}</h1>\r\n <h5>{t(\"micro-site-page.no-reservationBlock\")}</h5>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Display the reservations */}\r\n {reservationBlocks.map((reservationBlock) => {\r\n return (\r\n <EventCard\r\n reserve={reserve}\r\n reservationBlock={reservationBlock}\r\n language={language}\r\n microsite={microsite}\r\n canShowCreateReservation={canShowCreateReservation}\r\n />\r\n );\r\n })}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n\r\n function canShowCreateReservation(reservationBlock: ReservationBlock): boolean {\r\n return MicrositeHelpers.reservationBlockIsAvailable(reservationBlock);\r\n }\r\n\r\n async function reserve(reservationBlock: ReservationBlock) {\r\n const reserveUrl = `/sites/${micrositeId}/signin-reserve-locker/${reservationBlock?.id}`;\r\n history.push(reserveUrl);\r\n }\r\n}\r\n","import { useEffect, useState } from \"react\";\r\nimport { Trans } from \"react-i18next\";\r\nimport \"./timerComponent.scss\";\r\nimport DateHelpers from \"../services/core/date-helpers\";\r\n\r\ntype Props = {\r\n timeInSeconds: number;\r\n message: string;\r\n onTimerEnds: VoidFunction;\r\n className?: string;\r\n};\r\n\r\nexport default function TimerComponent(props: Props) {\r\n const { timeInSeconds, message, onTimerEnds, className } = props;\r\n const [counter, setCounter] = useState(timeInSeconds);\r\n\r\n useEffect(() => {\r\n if (counter <= 0) {\r\n onTimerEnds();\r\n }\r\n\r\n const timer = (counter > 0 && setInterval(() => setCounter(counter - 1), 1000)) || undefined;\r\n\r\n return timer && (() => clearInterval(timer));\r\n }, [counter]);\r\n\r\n const dateTime = DateHelpers.formatNumberToTimeLeftString(counter);\r\n\r\n return (\r\n <div className={className ?? \"countdown-red\"}>\r\n {message && <Trans i18nKey={message} values={{ dateTimeFormat: dateTime }} />}\r\n {!message && <strong>{dateTime}</strong>}\r\n </div>\r\n );\r\n}\r\n","export enum ChargeState {\r\n EnteringData = \"EnteringData\",\r\n ChargeInProgress = \"ChargeInProgress\",\r\n ChargeTimeout = \"ChargeTimeout\",\r\n ChargeError = \"ChargeError\",\r\n Completed = \"Completed\",\r\n}\r\n","export class CardPaymentRequest {\r\n orderToken: string = \"\";\r\n token: string = \"\";\r\n idempotencyKey: string = \"\";\r\n PayNow: boolean = true;\r\n}\r\n","import React, { useEffect, useState } from \"react\";\r\nimport { useTranslation } from \"react-i18next\";\r\nimport \"./payment-form-square.scss\";\r\nimport { useHistory } from \"react-router-dom\";\r\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\r\nimport LoadingComponent from \"../loading-component\";\r\nimport { CardPaymentRequest } from \"../../services/payment/payment-request\";\r\nimport paymentService from \"../../services/payment/payment-service\";\r\nimport { ChargeState } from \"./charge-state\";\r\nimport { PaymentState } from \"../../services/payment/payment-state\";\r\nimport { CardPaymentResponse } from \"../../services/payment/payment-response\";\r\n\r\ndeclare global {\r\n interface Window {\r\n Square: any; // This is to make sure the typescript doesn't cry.\r\n }\r\n}\r\n\r\ninterface PaymentFormProps {\r\n cost: string;\r\n currency: string;\r\n orderToken: string;\r\n organizationId: string;\r\n locationId: string;\r\n paynow: boolean;\r\n minPrice?: string;\r\n}\r\n\r\nexport default function PaymentFormSquare(props: PaymentFormProps) {\r\n const { cost, currency, locationId, orderToken, organizationId, paynow, minPrice } = props;\r\n const { t } = useTranslation();\r\n const history = useHistory();\r\n\r\n const [card, setCard] = useState<any>(null);\r\n const [state, setState] = useState<ChargeState>(ChargeState.EnteringData);\r\n\r\n if (!window.Square) throw new Error(\"PaymentLib failed to load properly.\");\r\n\r\n useEffect(() => {\r\n if (state !== ChargeState.ChargeTimeout) {\r\n try {\r\n initializeCard();\r\n } catch (e) {\r\n console.error(\"Initializing Card failed\", e);\r\n }\r\n }\r\n }, [locationId]);\r\n\r\n return (\r\n <div className=\"payment-form-container\">\r\n {state === ChargeState.ChargeTimeout && (\r\n <div>\r\n <div className=\"text-danger\">\r\n <FontAwesomeIcon className=\"me-2\" icon={[\"fas\", \"exclamation-triangle\"]} />\r\n {t(\"micro-site-reserve-locker.payment-timeout-msg\")}\r\n </div>\r\n <div className=\"mt-2\">\r\n <button className=\"btn btn-primary\" onClick={() => window.location.reload()}>\r\n {t(\"micro-site-reserve-locker.try-again\")}\r\n </button>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {state !== ChargeState.ChargeTimeout && (\r\n <>\r\n <label className=\"form-label\">{t(\"micro-site-reserve-locker.credit-card\")}</label>\r\n\r\n <form id=\"payment-form\">\r\n <div id=\"card-container\"></div>\r\n <div id=\"payment-status-container\"></div>\r\n <LoadingComponent loading={state === ChargeState.ChargeInProgress} />\r\n <button\r\n id=\"card-button\"\r\n className=\"btn btn-primary pushable rounded-3 shadow-lg\"\r\n type=\"button\"\r\n disabled={state === ChargeState.ChargeInProgress}\r\n onClick={(ev: React.MouseEvent) => pay(ev, card, setState)}\r\n >\r\n <span className=\"front rounded-3\">\r\n {paynow && t(\"payment.pay\", { cost: cost })}\r\n {!paynow && (\r\n <>\r\n {!minPrice && t(\"payment.hold\", { cost: cost })}\r\n {minPrice && t(\"payment.pay\", { cost: minPrice })}\r\n </>\r\n )}\r\n </span>\r\n </button>\r\n </form>\r\n\r\n <div className=\"mt-3\">\r\n <FontAwesomeIcon icon={[\"fas\", \"info-circle\"]} /> {t(\"micro-site-reserve-locker.msg-taxes\")}\r\n </div>\r\n </>\r\n )}\r\n </div>\r\n );\r\n\r\n async function initializeCard() {\r\n let payments;\r\n try {\r\n payments = window.Square.payments(process.env.REACT_APP_SQUARE_APP_ID, locationId);\r\n } catch {\r\n const statusContainer = document.getElementById(\"payment-status-container\");\r\n if (statusContainer) {\r\n statusContainer.className = \"missing-credentials\";\r\n statusContainer.style.visibility = \"visible\";\r\n }\r\n return;\r\n }\r\n\r\n const _card = await payments.card();\r\n setCard(_card);\r\n\r\n const container = document.getElementById(\"card-container\");\r\n if (container) container.innerHTML = \"\";\r\n await _card.attach(\"#card-container\");\r\n\r\n console.log(\"initializeCard done.\");\r\n }\r\n\r\n function clearPaymentResults() {\r\n const statusContainer = document.getElementById(\"payment-status-container\");\r\n if (statusContainer) {\r\n statusContainer.style.visibility = \"visible\";\r\n statusContainer.classList.remove(\"is-success\");\r\n statusContainer.classList.remove(\"is-failure\");\r\n statusContainer.innerHTML = \"\";\r\n }\r\n }\r\n\r\n async function pay(event: React.MouseEvent, card: any, setState: Function) {\r\n event.preventDefault();\r\n clearPaymentResults();\r\n\r\n setState(ChargeState.ChargeInProgress);\r\n\r\n const token = await tokenize(card);\r\n if (!token) {\r\n console.error(\"Unable to retreive the token\");\r\n displayPaymentResultsSquare(\"FAILURE\");\r\n setState(ChargeState.ChargeError);\r\n return;\r\n }\r\n\r\n const cardPaymentRequest = new CardPaymentRequest();\r\n cardPaymentRequest.token = token;\r\n cardPaymentRequest.orderToken = orderToken;\r\n cardPaymentRequest.PayNow = paynow;\r\n await paymentService\r\n .pay(cardPaymentRequest, organizationId)\r\n .then((result: CardPaymentResponse) => {\r\n switch (result.state) {\r\n case PaymentState.Success:\r\n displayPaymentResultsSquare(\"SUCCESS\");\r\n console.log(\"Payment charge Success\");\r\n setState(ChargeState.Completed);\r\n history.push(`/my-reservations/${orderToken}`);\r\n break;\r\n case PaymentState.Error:\r\n setState(ChargeState.ChargeError);\r\n displayPaymentResultsSquare(\"FAILURE\");\r\n break;\r\n case PaymentState.Timeout:\r\n setState(ChargeState.ChargeTimeout);\r\n displayPaymentResultsSquare(\"FAILURE\");\r\n break;\r\n }\r\n })\r\n .catch(() => {\r\n setState(ChargeState.ChargeError);\r\n displayPaymentResultsSquare(\"FAILURE\");\r\n });\r\n }\r\n\r\n async function tokenize(paymentMethod: any): Promise<string | null> {\r\n try {\r\n const tokenResult = await paymentMethod.tokenize();\r\n if (tokenResult.status === \"OK\") {\r\n return tokenResult.token;\r\n }\r\n\r\n return null;\r\n } catch {\r\n return null;\r\n }\r\n }\r\n\r\n function displayPaymentResultsSquare(status: string) {\r\n // 'SUCCESS' or 'FAILURE'\r\n const statusContainer = document.getElementById(\"payment-status-container\");\r\n if (!statusContainer) return;\r\n\r\n if (status === \"SUCCESS\") {\r\n statusContainer.classList.remove(\"is-failure\");\r\n statusContainer.classList.add(\"is-success\");\r\n statusContainer.innerHTML += t(\"payment.is-success\");\r\n } else {\r\n statusContainer.classList.remove(\"is-success\");\r\n statusContainer.classList.add(\"is-failure\");\r\n statusContainer.innerHTML += t(\"payment.is-failure\");\r\n }\r\n statusContainer.style.visibility = \"visible\";\r\n }\r\n}\r\n","import { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\r\nimport { useStripe, useElements, CardElement } from \"@stripe/react-stripe-js\";\r\nimport { StripeCardElement } from \"@stripe/stripe-js\";\r\nimport { useState } from \"react\";\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { useHistory } from \"react-router-dom\";\r\nimport { CardPaymentRequest } from \"../../services/payment/payment-request\";\r\nimport { CardPaymentResponse } from \"../../services/payment/payment-response\";\r\nimport paymentService from \"../../services/payment/payment-service\";\r\nimport { PaymentState } from \"../../services/payment/payment-state\";\r\nimport LoadingComponent from \"../loading-component\";\r\nimport { ChargeState } from \"./charge-state\";\r\nimport \"./payment-form-stripe.scss\";\r\n\r\ntype Props = {\r\n cost: string;\r\n currency: string;\r\n orderToken: string;\r\n organizationId: string;\r\n paynow: boolean;\r\n minPrice?: string;\r\n};\r\n\r\nconst CARD_ELEMENT_OPTIONS = {\r\n style: {\r\n base: {\r\n color: \"#32325d\",\r\n fontFamily: '\"Helvetica Neue\", Helvetica, sans-serif',\r\n fontSmoothing: \"antialiased\",\r\n fontSize: \"16px\",\r\n \"::placeholder\": {\r\n color: \"#aab7c4\",\r\n },\r\n },\r\n invalid: {\r\n color: \"#fa755a\",\r\n iconColor: \"#fa755a\",\r\n },\r\n },\r\n};\r\n\r\nexport default function PaymentFormStripe(props: Props) {\r\n const { cost, currency, orderToken, organizationId, paynow, minPrice } = props;\r\n\r\n const stripe = useStripe();\r\n const elements = useElements();\r\n const { t } = useTranslation();\r\n const history = useHistory();\r\n\r\n const [message, setMessage] = useState<any>(null);\r\n const [state, setState] = useState<ChargeState>(ChargeState.EnteringData);\r\n\r\n return (\r\n <div>\r\n {state === ChargeState.ChargeTimeout && (\r\n <div>\r\n <div className=\"text-danger\">\r\n <FontAwesomeIcon className=\"me-2\" icon={[\"fas\", \"exclamation-triangle\"]} />\r\n {t(\"micro-site-reserve-locker.payment-timeout-msg\")}\r\n </div>\r\n <div className=\"mt-2\">\r\n <button className=\"btn btn-primary\" onClick={() => window.location.reload()}>\r\n {t(\"micro-site-reserve-locker.try-again\")}\r\n </button>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {state !== ChargeState.ChargeTimeout && (\r\n <form id=\"payment-form\" onSubmit={pay}>\r\n <CardElement options={CARD_ELEMENT_OPTIONS} onChange={handleCardChange} />\r\n\r\n <br />\r\n <button\r\n disabled={!stripe || !elements || state === ChargeState.ChargeInProgress}\r\n id=\"submit\"\r\n className=\"btn btn-primary pushable rounded-3 shadow-lg\"\r\n >\r\n <span id=\"button-text\" className=\"front rounded-3\">\r\n {paynow && t(\"payment.pay\", { cost: cost })}\r\n {!paynow && (\r\n <>\r\n {!minPrice && t(\"payment.hold\", { cost: cost })}\r\n {minPrice && t(\"payment.pay\", { cost: minPrice })}\r\n </>\r\n )}\r\n </span>\r\n </button>\r\n\r\n <LoadingComponent loading={state === ChargeState.ChargeInProgress} />\r\n\r\n {message && <div id=\"payment-message\">{message}</div>}\r\n <div className=\"mt-3\">\r\n <FontAwesomeIcon icon={[\"fas\", \"info-circle\"]} /> {t(\"micro-site-reserve-locker.msg-taxes\")}\r\n </div>\r\n </form>\r\n )}\r\n </div>\r\n );\r\n\r\n async function pay(e: any) {\r\n e.preventDefault();\r\n\r\n // Stripe.js has not yet loaded. Make sure to disable form submission until Stripe.js has loaded.\r\n if (!stripe || !elements) {\r\n return;\r\n }\r\n\r\n setState(ChargeState.ChargeInProgress);\r\n\r\n const result = await stripe\r\n .createPaymentMethod({\r\n type: \"card\",\r\n card: elements.getElement(CardElement) as StripeCardElement,\r\n })\r\n .catch((e: any) => console.log(\"createPaymentMethod error\", e));\r\n if (!result) {\r\n console.error(\"Unable to create payment method\");\r\n setMessage(t(\"common.error-generic\"));\r\n setState(ChargeState.ChargeError);\r\n return;\r\n }\r\n if (result.error) {\r\n console.error(\"Unable to create payment method, error:\", result.error);\r\n setMessage(result.error.message);\r\n setState(ChargeState.ChargeError);\r\n return;\r\n }\r\n\r\n const cardPaymentRequest = new CardPaymentRequest();\r\n cardPaymentRequest.token = result.paymentMethod.id;\r\n cardPaymentRequest.orderToken = orderToken;\r\n cardPaymentRequest.PayNow = paynow;\r\n await paymentService\r\n .pay(cardPaymentRequest, organizationId)\r\n .then((result: CardPaymentResponse) => {\r\n switch (result.state) {\r\n case PaymentState.Success:\r\n setMessage(\"\");\r\n console.log(\"Payment charge Success\");\r\n setState(ChargeState.Completed);\r\n history.push(`/my-reservations/${orderToken}`);\r\n break;\r\n case PaymentState.Error:\r\n setState(ChargeState.ChargeError);\r\n setMessage(result.error ?? t(\"common.error-generic\"));\r\n break;\r\n case PaymentState.Timeout:\r\n setState(ChargeState.ChargeTimeout);\r\n setMessage(\"\");\r\n break;\r\n }\r\n })\r\n .catch(() => {\r\n setState(ChargeState.ChargeError);\r\n setMessage(t(\"common.error-generic\"));\r\n });\r\n }\r\n\r\n function handleCardChange(event: any) {\r\n const errorMessage = event.error ? event.error.message : null;\r\n setMessage(errorMessage);\r\n }\r\n}\r\n","import { Elements } from \"@stripe/react-stripe-js\";\r\nimport { loadStripe, Stripe } from \"@stripe/stripe-js\";\r\nimport { useEffect, useState } from \"react\";\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { useHistory } from \"react-router-dom\";\r\nimport { CardPaymentIntentResponse } from \"../../services/payment/payment-intent-response\";\r\nimport { CardPaymentRequest } from \"../../services/payment/payment-request\";\r\nimport { CardPaymentResponse } from \"../../services/payment/payment-response\";\r\nimport paymentService from \"../../services/payment/payment-service\";\r\nimport { PaymentState } from \"../../services/payment/payment-state\";\r\nimport PaymentFormSquare from \"./payment-form-square\";\r\nimport PaymentFormStripe from \"./payment-form-stripe\";\r\n\r\ntype Props = {\r\n paymentIntent: CardPaymentIntentResponse;\r\n organizationId: string;\r\n orderToken: string;\r\n cost: string;\r\n currency: string;\r\n hasPayment: boolean;\r\n paynow: boolean;\r\n minPrice?: string;\r\n};\r\n\r\nexport default function PaymentForm(props: Props) {\r\n const { paymentIntent, organizationId, orderToken, currency, cost, hasPayment, paynow, minPrice } = props;\r\n const { t } = useTranslation();\r\n const history = useHistory();\r\n\r\n const [stripePromise, setStripePromise] = useState<Promise<Stripe | null>>();\r\n const [message, setMessage] = useState<any>(null);\r\n\r\n useEffect(() => {\r\n if (process.env.REACT_APP_STRIPE_APP_PUBLIC_KEY && paymentIntent.providerType === \"Stripe\") {\r\n setStripePromise(loadStripe(process.env.REACT_APP_STRIPE_APP_PUBLIC_KEY));\r\n }\r\n }, []);\r\n\r\n if (hasPayment) {\r\n const appearance = {\r\n theme: \"stripe\",\r\n };\r\n const stripeOptions: any = {\r\n appearance,\r\n };\r\n\r\n return (\r\n <>\r\n {paymentIntent.providerType === \"Stripe\" && stripePromise && (\r\n <Elements options={stripeOptions} stripe={stripePromise}>\r\n <PaymentFormStripe\r\n organizationId={organizationId}\r\n orderToken={orderToken}\r\n cost={cost}\r\n currency={currency}\r\n paynow={paynow}\r\n minPrice={minPrice}\r\n />\r\n </Elements>\r\n )}\r\n\r\n {paymentIntent.providerType === \"Square\" && (\r\n <PaymentFormSquare\r\n organizationId={organizationId}\r\n orderToken={orderToken}\r\n cost={cost}\r\n currency={currency}\r\n locationId={paymentIntent.location}\r\n paynow={paynow}\r\n minPrice={minPrice}\r\n />\r\n )}\r\n </>\r\n );\r\n } else {\r\n return (\r\n <>\r\n <button className=\"btn btn-primary pushable rounded-3 shadow-lg\" onClick={payFreeReservation}>\r\n <span className=\"front rounded-3\">{t(\"payment.reserve\")}</span>\r\n </button>\r\n\r\n {message && <div id=\"payment-message\">{message}</div>}\r\n </>\r\n );\r\n }\r\n\r\n async function payFreeReservation() {\r\n const cardPaymentRequest = new CardPaymentRequest();\r\n cardPaymentRequest.token = orderToken;\r\n cardPaymentRequest.orderToken = orderToken;\r\n await paymentService\r\n .pay(cardPaymentRequest, organizationId)\r\n .then((result: CardPaymentResponse) => {\r\n switch (result.state) {\r\n case PaymentState.Success:\r\n setMessage(\"\");\r\n console.log(\"Payment charge Success\");\r\n history.push(`/my-reservations/${orderToken}`);\r\n break;\r\n case PaymentState.Error:\r\n setMessage(result.error ?? t(\"common.error-generic\"));\r\n break;\r\n case PaymentState.Timeout:\r\n setMessage(t(\"common.error-generic\"));\r\n break;\r\n }\r\n })\r\n .catch(() => {\r\n setMessage(t(\"common.error-generic\"));\r\n });\r\n }\r\n}\r\n","import moment from \"moment\";\r\nimport { useState, useEffect } from \"react\";\r\nimport { Trans, useTranslation } from \"react-i18next\";\r\nimport { useHistory, useParams } from \"react-router-dom\";\r\nimport TimerComponent from \"../../components/timerComponent\";\r\nimport LoadingComponent from \"../../components/loading-component\";\r\nimport PaymentForm from \"../../components/payment-forms/payment-form\";\r\nimport languageService from \"../../services/core/language-service\";\r\nimport StringHelpers from \"../../services/core/string-helpers\";\r\nimport Microsite from \"../../services/micro-site/microsite\";\r\nimport micrositeService from \"../../services/micro-site/microsite-service\";\r\nimport ReservationBlock from \"../../services/micro-site/reservationBlock\";\r\nimport orderService from \"../../services/order/order-service\";\r\nimport { CardPaymentIntentResponse } from \"../../services/payment/payment-intent-response\";\r\nimport paymentService from \"../../services/payment/payment-service\";\r\nimport \"./reserve-locker.scss\";\r\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\r\nimport { MinimalPrice, PricePerHour, PricePerMinute } from \"../../assets/meta-table-keys\";\r\nimport DateHelpers from \"../../services/core/date-helpers\";\r\n\r\ninterface IParamTypes {\r\n micrositeId: string;\r\n reservationBlockId: string;\r\n token: string;\r\n}\r\n\r\nexport default function ReserveLockerPage() {\r\n const { t } = useTranslation();\r\n const history = useHistory();\r\n const language: string = languageService.getLanguage();\r\n\r\n const { micrositeId, reservationBlockId, token } = useParams<IParamTypes>();\r\n const [loading, setLoading] = useState<boolean>(true);\r\n const [reservationBlock, setReservationBlock] = useState<ReservationBlock | null>();\r\n const [timeUntilExpired, setTimeUntilExpired] = useState<number>();\r\n\r\n const [microsite, setMicrosite] = useState<Microsite | undefined>(undefined);\r\n const [paymentIntent, setPaymentIntent] = useState<CardPaymentIntentResponse>();\r\n\r\n useEffect(() => {\r\n //Gather the microsite and reservation block requested\r\n micrositeService.getMicrosite(micrositeId).then((microsite: Microsite | undefined) => {\r\n if (microsite) {\r\n setMicrosite(microsite);\r\n const reservationBlock = microsite.reservationBlocks.find((rb) => rb.id === reservationBlockId);\r\n setReservationBlock(reservationBlock);\r\n if (token) {\r\n orderService.getOrderById(microsite.organizationId, token, token).then((order) => {\r\n if (order) {\r\n if (order.payments && order.payments.length > 0) {\r\n history.push(`/my-reservations/${token}`);\r\n }\r\n\r\n paymentService.createPaymentIntent(order.id).then((paymentIntent: CardPaymentIntentResponse) => {\r\n setPaymentIntent(paymentIntent);\r\n });\r\n\r\n if (reservationBlock) {\r\n micrositeService\r\n .getTimeUntilExpired(order.id)\r\n .then((result) => {\r\n setTimeUntilExpired(parseInt(StringHelpers.formatNumber(result, 0)));\r\n })\r\n .catch(() => {\r\n setLoading(false);\r\n })\r\n .finally(() => setLoading(false));\r\n } else {\r\n setLoading(false);\r\n }\r\n } else {\r\n history.push(`/sites/reservation-expired/${micrositeId}`);\r\n }\r\n });\r\n }\r\n }\r\n });\r\n }, [micrositeId, reservationBlockId]);\r\n\r\n if (loading) {\r\n return <LoadingComponent loading={loading} />;\r\n }\r\n\r\n if (!reservationBlock) {\r\n return (\r\n <div className=\"page reserve-locker-page container \">\r\n <div className=\"col col-lg-6 offset-lg-3\">\r\n <div className=\"card\">{!reservationBlock && <div>{t(\"micro-site-reserve-locker.no-reservation-block\")}</div>}</div>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n const until = reservationBlock ? moment(reservationBlock.startOn).add(reservationBlock.duration, \"seconds\").toDate() : new Date();\r\n const reservationBlockIsFree = reservationBlock.price === 0;\r\n const dateNow = new Date();\r\n const untilStart = (new Date(reservationBlock.startOn).getTime() - dateNow.getTime()) / 1000;\r\n\r\n const meta = reservationBlock?.meta;\r\n const pricePerHour = meta ? Number.parseFloat(meta[PricePerHour]) : null;\r\n const pricePerMinute = meta ? Number.parseFloat(meta[PricePerMinute]) : null;\r\n const minimalPrice = meta ? Number.parseFloat(meta[MinimalPrice]) : null;\r\n const paynow = pricePerHour || pricePerMinute ? false : true;\r\n\r\n const isSwych = micrositeId === \"swych\";\r\n\r\n return (\r\n <div className=\"page reserve-locker-page container\">\r\n <div className=\"col col-sm-12 col-lg-8 offset-lg-2 page-background-boxing shadow\">\r\n <div className=\"d-inline\">\r\n <button className=\"btn fs-5 text-grey mt-2\" onClick={() => history.push(`/sites/${micrositeId}`)}>\r\n <FontAwesomeIcon icon={[\"fas\", \"arrow-left\"]} className=\"me-2\" />\r\n {t(\"common.go-back\")}\r\n </button>\r\n </div>\r\n <TimerComponent\r\n timeInSeconds={timeUntilExpired ?? 5 * 60}\r\n message=\"micro-site-page.msg-time-until-expired\"\r\n onTimerEnds={() => {\r\n history.push(`/sites/reservation-expired/${micrositeId}`);\r\n }}\r\n className=\"mb-1 me-3 float-end text-grey timeLeft text-center d-inline\"\r\n />\r\n\r\n <div className=\"card-body text-center text-grey mt-4\">\r\n <div className=\"d-inline-block mt-0 pb-0 text-dark\">\r\n {reservationBlock?.logoUrl && <img src={reservationBlock?.logoUrl} alt=\"\" className=\"img-logo\" />}\r\n <h2 className=\"mt-2 fs-3\"> {reservationBlock?.name.get(language)}</h2>\r\n </div>\r\n <div className=\"mb-4 mt-3\">\r\n <div className=\"mb-1\">\r\n {isSwych ? t(\"micro-site-page.temp-locker-reserve-swych\") : t(\"micro-site-page.temp-locker-reserve\")}\r\n </div>\r\n\r\n {reservationBlock.description.get(language) && <span className=\"mb-2\">{reservationBlock.description.get(language)}</span>}\r\n\r\n {reservationBlock.startOn && (\r\n <>\r\n <TimerComponent\r\n timeInSeconds={untilStart}\r\n message=\"micro-site-page.locker-available-from\"\r\n onTimerEnds={() => null}\r\n className=\"timeBeforeStart mb-1\"\r\n />\r\n <Trans\r\n i18nKey=\"micro-site-page.locker-available-to\"\r\n values={{\r\n end: DateHelpers.formatDateTime(until, DateHelpers.UserTimeZone),\r\n }}\r\n />\r\n </>\r\n )}\r\n {!reservationBlock.startOn && (\r\n <div className=\"durationAvailability\">\r\n <Trans\r\n i18nKey=\"micro-site-page.locker-available-now\"\r\n values={{ duration: DateHelpers.formatDuration(reservationBlock.duration) }}\r\n />\r\n </div>\r\n )}\r\n </div>\r\n\r\n {!!pricePerHour ||\r\n (!!pricePerMinute && (\r\n <div className=\"row\">\r\n <div className=\"col-12 col-lg-8 offset-lg-2\">\r\n <div className=\"text-center\">\r\n <p>\r\n <strong>{t(\"micro-site-page.cost-title\")}</strong>\r\n <br />\r\n {!!pricePerHour &&\r\n t(\"micro-site-page.cost-per-hour\", {\r\n cost: StringHelpers.formatPrice(pricePerHour + pricePerHour * reservationBlock.saleTaxRate),\r\n currency: microsite?.currency,\r\n })}\r\n {!!pricePerMinute &&\r\n t(\"micro-site-page.cost-per-minute\", {\r\n cost: StringHelpers.formatPrice(pricePerMinute + pricePerMinute * reservationBlock.saleTaxRate),\r\n currency: microsite?.currency,\r\n })}\r\n <br />\r\n {!!minimalPrice && (\r\n <>\r\n {t(\"micro-site-page.min-cost\", {\r\n cost: StringHelpers.formatPrice(minimalPrice + minimalPrice * reservationBlock.saleTaxRate),\r\n currency: microsite?.currency,\r\n })}\r\n <br />\r\n </>\r\n )}\r\n {t(\"micro-site-page.max-cost\", {\r\n cost: StringHelpers.formatPrice(reservationBlock.price + reservationBlock.price * reservationBlock.saleTaxRate),\r\n currency: microsite?.currency,\r\n })}\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n ))}\r\n\r\n <div className=\"row\">\r\n <div className=\"col-12 col-lg-8 offset-lg-2\">\r\n {paymentIntent && token && microsite?.organizationId && (\r\n <>\r\n <PaymentForm\r\n paymentIntent={paymentIntent}\r\n orderToken={token}\r\n organizationId={microsite?.organizationId}\r\n hasPayment={!reservationBlockIsFree}\r\n cost={StringHelpers.formatPrice(reservationBlock.price + reservationBlock.price * reservationBlock.saleTaxRate)}\r\n currency={microsite.currency}\r\n paynow={paynow}\r\n minPrice={\r\n minimalPrice ? StringHelpers.formatPrice(minimalPrice + minimalPrice * reservationBlock.saleTaxRate) : undefined\r\n }\r\n />\r\n </>\r\n )}\r\n </div>\r\n </div>\r\n\r\n <div className=\"text-start row mt-4\">\r\n <div className=\"col-5\">\r\n <div className=\"text-start text-very-small\">*{t(\"micro-site-page.charge-explenation-now\")}</div>\r\n <div className=\"text-very-small\">**{t(\"micro-site-page.privilage-explenation\")}</div>\r\n </div>\r\n <div className=\"col-5 offset-2\">\r\n <div className=\"text-danger text-very-small\">\r\n {isSwych ? t(\"micro-site-page.causion-message-swych\") : t(\"micro-site-page.causion-message\")}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {!reservationBlockIsFree && paymentIntent && (\r\n <>\r\n <hr className=\"mt-4\"></hr>\r\n <a\r\n href={\r\n paymentIntent.providerType !== \"Stripe\"\r\n ? language === \"fr\"\r\n ? \"https://squareup.com/ca/fr/security\"\r\n : \"https://squareup.com/us/en/security\"\r\n : \"https://stripe.com/docs/security\"\r\n }\r\n target=\"_blank\"\r\n rel=\"noreferrer\"\r\n >{`${t(\"micro-site-page.provider-security-message\")} ${paymentIntent.providerType}`}</a>\r\n </>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import ReactPlaceholder from \"react-placeholder\";\r\n\r\ninterface Props {\r\n loading: boolean;\r\n children: JSX.Element;\r\n type?: any;\r\n rows?: number;\r\n}\r\n\r\nPlacerholderComponent.defaultProps = {\r\n type: \"text\",\r\n rows: 5,\r\n};\r\nfunction PlacerholderComponent(props: Props) {\r\n const { loading, children, rows, type } = props;\r\n\r\n return (\r\n <ReactPlaceholder type={type} rows={rows} ready={!loading}>\r\n {children}\r\n </ReactPlaceholder>\r\n );\r\n}\r\n\r\nexport default PlacerholderComponent;\r\n","export enum RequestState {\r\n Loading = \"Loading\",\r\n Success = \"Success\",\r\n Failure = \"Failure\",\r\n}\r\n","import { useEffect, useState } from \"react\";\r\nimport { RequestState } from \"../core/request-state\";\r\nimport ToastHelpers from \"../core/toast-helpers\";\r\nimport { Hub } from \"./hub\";\r\nimport hubService from \"./hub-service\";\r\n\r\ninterface IProps {\r\n onErrorNotificationMessage: string;\r\n}\r\n\r\nfunction useMyHubs(props: IProps) {\r\n const { onErrorNotificationMessage } = props;\r\n\r\n const [requestState, setRequestState] = useState<RequestState>(RequestState.Loading);\r\n const [error, setError] = useState<string>(\"\");\r\n const [hubs, setHubs] = useState<Array<Hub>>([]);\r\n\r\n useEffect(\r\n () => {\r\n refresh();\r\n },\r\n // eslint-disable-next-line\r\n []\r\n );\r\n\r\n function refresh() {\r\n setRequestState(RequestState.Loading);\r\n\r\n hubService\r\n .getMyHubs()\r\n .then((hubs) => {\r\n setHubs(hubs);\r\n setRequestState(RequestState.Success);\r\n })\r\n .catch((e) => {\r\n setRequestState(RequestState.Failure);\r\n setError(e);\r\n\r\n if (onErrorNotificationMessage) {\r\n ToastHelpers.error(onErrorNotificationMessage);\r\n }\r\n });\r\n }\r\n\r\n return { hubs, requestState, error, refresh };\r\n}\r\n\r\nexport default useMyHubs;\r\n","import \"./hubs-page.scss\";\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { useHistory } from \"react-router-dom\";\r\nimport { EditButtonComponent, SyncButtonComponent } from \"../../components/button-component\";\r\nimport PlacerholderComponent from \"../../components/placerholder-component\";\r\nimport useMyHubs from \"../../services/hub/useMyHubs\";\r\nimport { RequestState } from \"../../services/core/request-state\";\r\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\r\nimport { HubHelpers } from \"../../services/hub/hub-helper\";\r\nimport MemberService from \"../../services/member/member-service\";\r\nimport StringHelpers from \"../../services/core/string-helpers\";\r\nimport Member from \"../../services/member/member\";\r\nimport DateHelpers from \"../../services/core/date-helpers\";\r\n\r\ntype Props = {\r\n member: Member;\r\n};\r\n\r\nexport default function HubsPage(props: Props) {\r\n const { member } = props;\r\n const { t } = useTranslation();\r\n const history = useHistory();\r\n\r\n const { hubs, requestState, refresh } = useMyHubs({ onErrorNotificationMessage: t(\"hubs-page.error-refresh\") });\r\n\r\n return (\r\n <div className=\"container page hubs-page pt-5\">\r\n <h1>{t(\"hubs-page.title\")}</h1>\r\n <SyncButtonComponent\r\n className=\"ms-3 mb-3\"\r\n disabled={requestState !== RequestState.Success}\r\n onClick={() => refresh()}\r\n ></SyncButtonComponent>\r\n\r\n {requestState === RequestState.Failure && <div>{t(\"hubs-page.error-refresh\")}</div>}\r\n\r\n <div className=\"row mt-3\">\r\n <div className=\"col\">\r\n <div className=\"customer card\">\r\n <div className=\"card-body\">\r\n <PlacerholderComponent loading={requestState === RequestState.Loading} rows={5}>\r\n <table className=\"table table-sm table-hover row-clikable\">\r\n <thead>\r\n <tr>\r\n <th>{t(\"hubs-page.name\")}</th>\r\n <th>{t(\"hubs-page.state\")}</th>\r\n {MemberService.isLocketgoHubAdmin(member) && <th>{t(\"hubs-page.version\")}</th>}\r\n <th></th>\r\n\r\n {/* Empty column header for actions */}\r\n <th></th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {requestState === RequestState.Success && hubs.length === 0 && (\r\n <tr>\r\n <td colSpan={3}>{t(\"hubs-page.no-hubs\")}</td>\r\n </tr>\r\n )}\r\n\r\n {hubs.map((hub) => {\r\n const url = `/hubs/${hub.id}`;\r\n const online = hub.state === \"Online\";\r\n const title = t(online ? \"components.location-online\" : \"components.location-offline\");\r\n if (!hub.active) {\r\n return <></>;\r\n }\r\n return (\r\n <tr key={hub.id} onClick={() => history.push(url)}>\r\n <td>\r\n {hub.name}\r\n {hub.private && <FontAwesomeIcon className=\"ms-2\" icon={[\"fas\", \"user-lock\"]} />}\r\n </td>\r\n <td>\r\n <span\r\n className={`ms-2 text-${online ? \"success\" : \"danger\"}`}\r\n data-bs-toggle=\"tooltip\"\r\n data-bs-placement=\"top\"\r\n title={title}\r\n >\r\n <FontAwesomeIcon icon={[\"fas\", \"circle\"]} />\r\n </span>\r\n </td>\r\n {MemberService.isLocketgoHubAdmin(member) && (\r\n <td>\r\n {hub.version &&\r\n DateHelpers.formatDateTime(new Date(hub.version.substring(0, 19) + \"+00:00\"), DateHelpers.UserTimeZone)}\r\n </td>\r\n )}\r\n <td>{t(\"hubs-page.compartments\", { count: HubHelpers.GetCompartmentCount(hub) })}</td>\r\n <td>\r\n <EditButtonComponent url={url}></EditButtonComponent>\r\n </td>\r\n </tr>\r\n );\r\n })}\r\n </tbody>\r\n </table>\r\n </PlacerholderComponent>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import { useEffect, useState } from \"react\";\r\nimport { RequestState } from \"../core/request-state\";\r\nimport ToastHelpers from \"../core/toast-helpers\";\r\nimport { MyHub } from \"./hub\";\r\nimport hubService from \"./hub-service\";\r\n\r\ninterface IProps {\r\n hubId: string;\r\n onErrorNotificationMessage: string;\r\n}\r\n\r\nfunction useMyHub(props: IProps) {\r\n const { hubId, onErrorNotificationMessage } = props;\r\n\r\n const [requestState, setRequestState] = useState<RequestState>(RequestState.Loading);\r\n const [error, setError] = useState<string>(\"\");\r\n const [hub, setHub] = useState<MyHub | null>(null);\r\n\r\n useEffect(\r\n () => {\r\n refresh();\r\n },\r\n // eslint-disable-next-line\r\n []\r\n );\r\n\r\n function refresh() {\r\n hubService\r\n .getMyHubById(hubId)\r\n .then((hub) => {\r\n setHub(hub);\r\n setRequestState(RequestState.Success);\r\n })\r\n .catch((e) => {\r\n setRequestState(RequestState.Failure);\r\n setError(e);\r\n\r\n if (onErrorNotificationMessage) {\r\n ToastHelpers.error(onErrorNotificationMessage);\r\n }\r\n });\r\n }\r\n\r\n return { hub, requestState, error, refresh };\r\n}\r\n\r\nexport default useMyHub;\r\n","import { useState } from \"react\";\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { MyHub } from \"../../../services/hub/hub\";\r\nimport hubService from \"../../../services/hub/hub-service\";\r\n\r\ninterface IPropHubOpenDoor {\r\n hub: MyHub | null;\r\n onClose: any;\r\n refresh: any;\r\n}\r\n\r\nenum OpeningAllDoorsState {\r\n Question = 0,\r\n Opening,\r\n Finished,\r\n}\r\n\r\nexport default function HubOpenAllDoor(props: IPropHubOpenDoor) {\r\n const { hub, onClose, refresh } = props;\r\n const { t } = useTranslation();\r\n\r\n const [state, setState] = useState<OpeningAllDoorsState>(OpeningAllDoorsState.Question);\r\n\r\n return (\r\n <div className=\"panel-popup panel-centered\">\r\n <div className=\"card\">\r\n <div className=\"card-header align-items-center\">\r\n <div className=\"d-inline-block\">\r\n <h2>{t(\"hub-page.open-all-door-title\")}</h2>\r\n </div>\r\n <button className=\"btn-close float-end\" onClick={onClose}></button>\r\n </div>\r\n\r\n <div className=\"card-body\">\r\n {state === OpeningAllDoorsState.Question && (\r\n <>\r\n {t(\"hub-page.open-all-door-message\")}\r\n <div className=\"mt-3\">\r\n <button className=\"btn btn-primary\" onClick={openDoors}>\r\n {t(\"common.yes\")}\r\n </button>\r\n <button className=\"ms-2 btn btn-primary\" onClick={onClose}>\r\n {t(\"common.no\")}\r\n </button>\r\n </div>\r\n </>\r\n )}\r\n\r\n {state === OpeningAllDoorsState.Opening && (\r\n <div>\r\n <div>{t(\"hub-page.opening\")}</div>\r\n </div>\r\n )}\r\n\r\n {state === OpeningAllDoorsState.Finished && <div>{t(\"hub-page.opening-done\")}</div>}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n\r\n async function openDoors(): Promise<void> {\r\n if (!hub) {\r\n return;\r\n }\r\n\r\n try {\r\n setState(OpeningAllDoorsState.Opening);\r\n\r\n await hubService.openAllDoors(hub.id);\r\n } finally {\r\n setState(OpeningAllDoorsState.Finished);\r\n await refresh();\r\n }\r\n\r\n const delayReset = () =>\r\n new Promise(() =>\r\n setTimeout(() => {\r\n onClose();\r\n }, 5000)\r\n );\r\n await delayReset();\r\n await refresh();\r\n }\r\n}\r\n","import { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\r\nimport { useEffect, useState } from \"react\";\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { Link } from \"react-router-dom\";\r\nimport { SyncButtonComponent } from \"../../components/button-component\";\r\nimport { DoorOpenedComponent, DoorOpeningGifComponent, OpenDoorComponent } from \"../../components/order-page-components\";\r\nimport ToastHelpers from \"../../services/core/toast-helpers\";\r\nimport { CompartmentStates } from \"../../services/hub/compartment\";\r\nimport { MyHub } from \"../../services/hub/hub\";\r\nimport hubService from \"../../services/hub/hub-service\";\r\nimport Member from \"../../services/member/member\";\r\nimport memberService from \"../../services/member/member-service\";\r\n\r\ninterface IPropCompartmentDetail {\r\n hub: MyHub | null;\r\n orderId?: string;\r\n paymentId?: string;\r\n groupId: string;\r\n compartmentNumber: string;\r\n side: string;\r\n member: Member;\r\n onClose: any;\r\n refresh: any;\r\n}\r\n\r\nexport default function HubCompartmentDetail(props: IPropCompartmentDetail) {\r\n const { hub, orderId, paymentId, groupId, compartmentNumber, side, member, onClose, refresh } = props;\r\n const { t } = useTranslation();\r\n\r\n const [inOpening, setInOpening] = useState<boolean>(false);\r\n const [isLocketgoHubAdmin, setIsLocketgoHubAdmin] = useState<boolean>(false);\r\n const [isHubAdmin, setIsHubAdmin] = useState<boolean>(false);\r\n\r\n const group = hub?.groups.find((g) => g.id === groupId);\r\n const compartment = group?.compartments.find((c) => c.number === compartmentNumber);\r\n const isOpened = compartment?.state === CompartmentStates.Opened;\r\n const isDeactivated = hub?.reservationDenies?.some(\r\n (r) => r.compartmentNumber === compartmentNumber && r.groupId === groupId && r.hubId === hub.id\r\n );\r\n var doornumber = \"\";\r\n if(compartment) {\r\n doornumber = /^\\d+$/.test(compartment.number) ? compartment.number : group?.id + compartment.number;\r\n }\r\n\r\n useEffect(() => {\r\n if (hub) {\r\n setIsLocketgoHubAdmin(memberService.isLocketgoHubAdmin(member));\r\n setIsHubAdmin(memberService.isHubContributor(member, hub.id));\r\n } else {\r\n setIsLocketgoHubAdmin(false);\r\n setIsHubAdmin(false);\r\n }\r\n }, [hub, member]);\r\n\r\n if (!compartment) {\r\n return <div>{t(\"hub-compartment-detail.error-loading-compartment\")}</div>;\r\n }\r\n\r\n return (\r\n <div className=\"panel-popup panel-centered\">\r\n <div className=\"card\">\r\n <div className=\"card-header align-items-center\">\r\n <div className=\"d-inline-block\">\r\n <h2>\r\n {doornumber ? doornumber : group?.id + compartment.number}\r\n <SyncButtonComponent\r\n onClick={() => {\r\n refresh();\r\n setInOpening(false);\r\n }}\r\n className={\"ms-2\"}\r\n />\r\n </h2>\r\n </div>\r\n <button className=\"btn-close float-end\" onClick={() => onClose()}></button>\r\n </div>\r\n\r\n <div className=\"card-body\">\r\n {/* Order */}\r\n {orderId && (\r\n <div className=\"mb-3\">\r\n <div>\r\n <div className=\"lead\">{t(\"hub-page.detail-order-title\")}</div>\r\n <Link className=\"ps-0\" to={`/orders/${orderId}`}>\r\n {orderId}\r\n </Link>\r\n </div>\r\n\r\n {paymentId && (\r\n <div>\r\n {t(\"hub-compartment-detail.with-payment\")}\r\n <FontAwesomeIcon className=\"ms-2\" icon={[\"fas\", \"credit-card\"]} />\r\n </div>\r\n )}\r\n <hr />\r\n </div>\r\n )}\r\n\r\n <div className={orderId ? \"mt-3\" : \"\"}>\r\n <div className=\"lead mb-2\">{t(\"hub-page.detail-door-management\")}</div>\r\n\r\n {/* Open */}\r\n <div /*className={\"item-lock\" + (isOpened ? \" opened\" : \" closed\")}*/>\r\n {/*isOpened && <DoorOpenedComponent />*/}\r\n <span /*className={isOpened ? \"ms-3\" : \"\"}*/>\r\n {inOpening ? (\r\n <DoorOpeningGifComponent />\r\n ) : (\r\n <OpenDoorComponent displayIcon={true /*!isOpened*/} onClick={openDoor} disabled={inOpening /* || isOpened*/} />\r\n )}\r\n </span>\r\n </div>\r\n\r\n {/* Toggle */}\r\n {isLocketgoHubAdmin && (\r\n <div className=\"mt-2\">\r\n <button className=\"btn btn-outline-primary\" onClick={toggleDoor}>\r\n {t(\"hub-page.toggle-door\")}\r\n </button>\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* Activate/Deactivate */}\r\n <div className=\"mt-3\">\r\n <hr />\r\n\r\n <div className=\"lead mb-2\">{t(\"hub-page.reservationDenies-label-title\")}</div>\r\n\r\n {isDeactivated && <label className=\"disabled me-2\">{t(\"hub-page.reservationDenies-label-deactivated\")}</label>}\r\n {!isDeactivated && <label className=\"me-2\">{t(\"hub-page.reservationDenies-label-activated\")}</label>}\r\n\r\n {isHubAdmin && (\r\n <>\r\n {isDeactivated ? (\r\n <button className=\"btn btn-outline-primary mb-2\" onClick={onActivation}>\r\n {t(\"hub-page.reservationDenies-activate\")}\r\n </button>\r\n ) : (\r\n <button className=\"btn btn-outline-primary mb-2\" onClick={onDeactivation}>\r\n {t(\"hub-page.reservationDenies-deactivate\")}\r\n </button>\r\n )}\r\n </>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n\r\n async function openDoor(): Promise<void> {\r\n if (!hub) {\r\n return;\r\n }\r\n\r\n setInOpening(true);\r\n hubService\r\n .openDoor(hub.id, groupId, compartmentNumber, side)\r\n .then(async (success) => {\r\n await refresh();\r\n })\r\n .catch((error) => {\r\n if (error?.response?.status === 409) {\r\n ToastHelpers.error(t(\"order-page.error-opendoor\"));\r\n } else if (error?.response?.status === 424) {\r\n ToastHelpers.error(t(\"order-page.error-opendoor-424\"));\r\n } else {\r\n ToastHelpers.error(t(\"common.error-generic\"));\r\n }\r\n })\r\n .finally(() => {\r\n setInOpening(false);\r\n });\r\n }\r\n\r\n async function toggleDoor(): Promise<void> {\r\n if (!hub) {\r\n return;\r\n }\r\n\r\n hubService\r\n .toggleDoor(hub.id, groupId, compartmentNumber)\r\n .then(async (success) => {\r\n ToastHelpers.success(t(\"hub-page.toggle-message\", { state: success ? \"done\" : \"error\" }));\r\n })\r\n .catch((error) => {\r\n if (error?.response?.status === 409) {\r\n ToastHelpers.error(t(\"order-page.error-opendoor\"));\r\n } else if (error?.response?.status === 424) {\r\n ToastHelpers.error(t(\"order-page.error-opendoor-424\"));\r\n } else {\r\n ToastHelpers.error(t(\"common.error-generic\"));\r\n }\r\n });\r\n }\r\n\r\n function onDeactivation() {\r\n if (compartment?.state && hub) {\r\n hubService\r\n .deactivateLockerReservation(hub.id, groupId, compartmentNumber)\r\n .then(async (success) => {\r\n await refresh();\r\n })\r\n .catch((error) => {\r\n ToastHelpers.error(t(\"common.error-generic\"));\r\n });\r\n }\r\n }\r\n\r\n function onActivation() {\r\n if (compartment?.state && hub) {\r\n hubService\r\n .activateLockerReservation(hub.id, groupId, compartmentNumber)\r\n .then(async (success) => {\r\n await refresh();\r\n })\r\n .catch((error) => {\r\n ToastHelpers.error(t(\"common.error-generic\"));\r\n });\r\n }\r\n }\r\n}\r\n","import { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\r\nimport { useTranslation } from \"react-i18next\";\r\n\r\nexport default function HubLegend() {\r\n const { t } = useTranslation();\r\n return (\r\n <div className=\"mt-3\">\r\n <span>\r\n <FontAwesomeIcon className=\"text-black bg-white border-1\" icon={[\"far\", \"square\"]} /> {t(\"common.closed\")}\r\n </span>\r\n <span className=\"ms-3\">\r\n <FontAwesomeIcon className=\"text-danger\" icon={[\"fas\", \"square\"]} /> {t(\"common.opened\")}\r\n </span>\r\n <span className=\"ms-3\">\r\n <FontAwesomeIcon className=\"text-success\" icon={[\"fas\", \"square\"]} /> {t(\"hub-page.state-with-reservation\")}\r\n </span>\r\n <span className=\"ms-3\">\r\n <FontAwesomeIcon className=\"text-muted\" icon={[\"fas\", \"square\"]} /> {t(\"hub-page.state-unavailable\")}\r\n </span>\r\n <span className=\"ms-3\">\r\n <FontAwesomeIcon className=\"text-danger bg-white border-1\" icon={[\"far\", \"square\"]} />{\" \"}\r\n {t(\"hub-page.reservationDenies-label-deactivated\")}\r\n </span>\r\n </div>\r\n );\r\n}\r\n","import { useState } from \"react\";\r\nimport { Address } from \"../services/core/address\";\r\n\r\ninterface Props {\r\n address: Address;\r\n intialDetail: boolean;\r\n}\r\nAddressDetailComponent.defaultProps = {\r\n intialDetail: false,\r\n};\r\nexport default function AddressDetailComponent(props: Props) {\r\n const { address, intialDetail } = props;\r\n const [detail, setDetail] = useState<boolean>(intialDetail);\r\n\r\n return (\r\n <>\r\n {address.streetNumber} {address.street}\r\n <br />\r\n {address.city}{\" \"}\r\n {detail ? (\r\n <>\r\n <br />\r\n <span>\r\n {address.state}, {address.country}, {address.postalCode}\r\n </span>\r\n </>\r\n ) : (\r\n <button\r\n className=\"btn btn-sm btn-outline-primary\"\r\n onClick={() => {\r\n setDetail((curValue) => !curValue);\r\n }}\r\n >\r\n ...\r\n </button>\r\n )}\r\n </>\r\n );\r\n}\r\n","import { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\r\nimport { useEffect, useState } from \"react\";\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { useHistory, useParams } from \"react-router-dom\";\r\nimport AddressDetailComponent from \"../../../components/address-detail-component\";\r\nimport HubLocationComponent from \"../../../components/hub-location-component\";\r\nimport LoadingComponent from \"../../../components/loading-component\";\r\nimport { RequestState } from \"../../../services/core/request-state\";\r\nimport StringHelpers from \"../../../services/core/string-helpers\";\r\nimport useMyHub from \"../../../services/hub/useMyHub\";\r\nimport Member from \"../../../services/member/member\";\r\nimport memberService from \"../../../services/member/member-service\";\r\nimport DateHelpers from \"../../../services/core/date-helpers\";\r\n\r\ninterface HubStateInformationProps {\r\n member: Member;\r\n}\r\n\r\ninterface IParamTypes {\r\n hubId: string;\r\n}\r\n\r\nexport default function HubStateInformation(props: HubStateInformationProps) {\r\n const { member } = props;\r\n\r\n const { hubId } = useParams<IParamTypes>();\r\n const { t } = useTranslation();\r\n const history = useHistory();\r\n const { hub, requestState } = useMyHub({ hubId: hubId, onErrorNotificationMessage: t(\"hub-page.error-refresh\") });\r\n\r\n const [isLocketgoHubAdmin, setIsLocketgoHubAdmin] = useState<boolean>(false);\r\n const [isHubAdmin, setIsHubAdmin] = useState<boolean>(false);\r\n\r\n const loading = requestState === RequestState.Loading;\r\n\r\n useEffect(() => {\r\n setIsLocketgoHubAdmin(memberService.isLocketgoHubAdmin(member));\r\n setIsHubAdmin(memberService.isHubContributor(member, hub?.id));\r\n }, [member]);\r\n\r\n return (\r\n <div className=\"row hub-infos\">\r\n <div className=\"col-12\">\r\n <div className=\"card\">\r\n <div className=\"card-body\">\r\n {loading && <LoadingComponent loading={loading} />}\r\n {!loading && (\r\n <>\r\n <div className=\"row\">\r\n <div className=\"col-6\">\r\n {hub ? <HubLocationComponent hub={hub} /> : <p>{t(\"hub-page.no-hub-message\")}</p>}\r\n {hub?.private && <FontAwesomeIcon className=\"ms-2\" icon={[\"fas\", \"user-lock\"]} />}\r\n {hub && isHubAdmin && (\r\n <>\r\n {hub.lastSynchronization && (\r\n <>\r\n <br />\r\n <span>\r\n {t(\"hub-page.last-synchronization\")}{\" \"}\r\n {DateHelpers.formatDateTime(new Date(hub.lastSynchronization), DateHelpers.UserTimeZone)}\r\n </span>\r\n </>\r\n )}\r\n {hub.version && (\r\n <>\r\n <br />\r\n <span>\r\n Version:{\" \"}\r\n {DateHelpers.formatDateTime(new Date(hub.version.substring(0, 19) + \"+00:00\"), DateHelpers.UserTimeZone)}\r\n </span>\r\n </>\r\n )}\r\n </>\r\n )}\r\n </div>\r\n\r\n {hub?.address && (\r\n <div className=\"col-6\">{hub ? <AddressDetailComponent intialDetail={true} address={hub.address} /> : <></>}</div>\r\n )}\r\n {hub && hub.computerMetrics && isLocketgoHubAdmin && (\r\n <>\r\n <div className=\"col-6\">\r\n <hr></hr>\r\n <h5>Computer metrics</h5>\r\n <span>\r\n {t(\"hub-page.computerMetrics-cpuTemp\")} {roundValue(hub.computerMetrics.cpuTemperature, 1)} C°\r\n </span>\r\n <br />\r\n <span>\r\n {t(\"hub-page.computerMetrics-cpuUsed\")} {roundValue(hub.computerMetrics.cpuPercentage, 1)}%\r\n </span>\r\n <br />\r\n <span>\r\n {t(\"hub-page.computerMetrics-memUsed\")} {Math.round(hub.computerMetrics.memUsed)} /{\" \"}\r\n {Math.round(hub.computerMetrics.memTotal)} MB ({roundValue(hub.computerMetrics.memUsedPercentage, 1)}%)\r\n </span>\r\n <br />\r\n <span>\r\n {t(\"hub-page.computerMetrics-diskUsed\")} {Math.round(hub.computerMetrics.diskUsed)} /{\" \"}\r\n {Math.round(hub.computerMetrics.diskTotal)} MB ({roundValue(hub.computerMetrics.diskUsedPercentage, 1)}%)\r\n </span>\r\n </div>\r\n </>\r\n )}\r\n </div>\r\n <div className=\"row\">\r\n <div className=\"col-12\">\r\n <button\r\n className=\"btn btn-sm btn-primary float-end\"\r\n onClick={(ev) => {\r\n ev.stopPropagation();\r\n history.push(`/hubs/${hubId}/activities`);\r\n }}\r\n >\r\n {t(\"hub-page.history\")}\r\n </button>\r\n </div>\r\n </div>\r\n </>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nfunction roundValue(value: string, numberOfDigits: number): string {\r\n return Number.parseFloat(value).toFixed(numberOfDigits);\r\n}\r\n","import { Dropdown } from \"bootstrap\";\r\nimport { useState, useRef, useEffect } from \"react\";\r\nimport { useTranslation } from \"react-i18next\";\r\n\r\nenum Side {\r\n Front = \"front\",\r\n Back = \"back\",\r\n}\r\n \r\ninterface IDropdownSideProps {\r\n onChange: (side: Side) => void;\r\n}\r\n\r\nfunction DropdownSide(props: IDropdownSideProps) {\r\n const { onChange } = props;\r\n \r\n const [state, setState] = useState<Side>(Side.Front);\r\n const [dropdown, setDropdown] = useState<Dropdown | null>(null);\r\n const ddRef = useRef(null);\r\n \r\n const { t } = useTranslation();\r\n \r\n useEffect(() => {\r\n if (!dropdown) {\r\n setDropdown(new Dropdown(ddRef.current || \"\", {}));\r\n }\r\n }, [dropdown]);\r\n \r\n const onDropdownClick = () => {\r\n dropdown?.show();\r\n };\r\n \r\n const onItemClick = (newSide: Side) => {\r\n if (state !== newSide) {\r\n setState(newSide);\r\n onChange(newSide);\r\n }\r\n \r\n dropdown?.hide();\r\n };\r\n \r\n return (\r\n <div className=\"dropdown ms-2\">\r\n <button\r\n className=\"btn btn-outline-primary dropdown-toggle\"\r\n type=\"button\"\r\n data-bs-toggle=\"dropdown\"\r\n ref={ddRef}\r\n aria-expanded=\"false\"\r\n onClick={onDropdownClick}\r\n >\r\n {t(`hubs-page.dropdown-side-${state.toString()}`)}\r\n </button>\r\n <ul className=\"dropdown-menu\" aria-labelledby=\"dropdown1\">\r\n {Object.values(Side).map((state: Side) => {\r\n return (\r\n <li key={state}>\r\n <button\r\n className=\"dropdown-item\"\r\n onClick={() => {\r\n onItemClick(state);\r\n }}\r\n >\r\n {t(`hubs-page.dropdown-side-${state}`)}\r\n </button>\r\n </li>\r\n );\r\n })}\r\n </ul>\r\n </div>\r\n );\r\n }\r\n\r\n export default DropdownSide;","import { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\r\n\r\ninterface IProp {\r\n opened: boolean;\r\n disabled: boolean;\r\n}\r\n\r\nLockComponent.defaultProps = {\r\n opened: false,\r\n disabled: false,\r\n};\r\nexport default function LockComponent(props: IProp) {\r\n const { opened, disabled } = props;\r\n\r\n return (\r\n <FontAwesomeIcon\r\n className={\"lock\" + (opened ? \" opened\" : \"\") + (disabled ? \" disabled\" : \"\")}\r\n icon={[\"fas\", opened ? \"lock-open\" : \"lock\"]}\r\n />\r\n );\r\n}\r\n","import { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\r\nimport { Compartment, CompartmentStates } from \"../../services/hub/compartment\";\r\nimport { CompartmentSize } from \"../../services/hub/compartmentSize\";\r\nimport LockComponent from \"../lock-component\";\r\nimport { MyHub } from \"../../services/hub/hub\";\r\nimport { Group } from \"../../services/hub/group\";\r\n\r\ninterface LockerProps {\r\n hub: MyHub;\r\n group: Group;\r\n compartment: Compartment;\r\n compartmentSizes: CompartmentSize[];\r\n onCompartmentSelected: (group: Group, compartment: Compartment) => void;\r\n}\r\n\r\nfunction Locker(props: LockerProps) {\r\n const { hub, group, compartment, compartmentSizes, onCompartmentSelected } = props;\r\n\r\n const reservation = hub.reservations.find(\r\n (r) =>\r\n r.groupId === group.id &&\r\n r.compartmentNumber === compartment.number &&\r\n Date.parse(r.start) < Date.now() &&\r\n Date.parse(r.end) > Date.now()\r\n );\r\n const isOpened = compartment.state === CompartmentStates.Opened;\r\n const isDeactivated = hub?.reservationDenies?.some(\r\n (r) => r.compartmentNumber === compartment.number && r.groupId === group.id && r.hubId === hub.id\r\n );\r\n const compartmentName = group.id + compartment.number;\r\n var compartmentSize = compartmentSizes.find((cs) => cs.id === compartment.sizeId);\r\n const compartmentHeight = (compartmentSize ? compartmentSize.height * 7.3 : 50) + \"px\";\r\n\r\n let kioskSize: CompartmentSize | undefined = undefined;\r\n if (hub.kiosk && hub.kiosk.sizeId && hub.kiosk.position === compartmentName) {\r\n kioskSize = compartmentSizes.find((cs) => cs.id === hub.kiosk?.sizeId);\r\n }\r\n const kioskHeight = (kioskSize ? kioskSize.height * 7.3 : 50) + \"px\";\r\n\r\n const showObjectDetected = hub.flowConfigs.isRiderLocker || hub.id === \"swych-locker\" || hub.flowConfigs.hasObjectDetection;\r\n\r\n return (\r\n <div key={compartmentName}>\r\n {/* Kiosk */}\r\n {kioskSize && (\r\n <div key={\"kiosk\" + compartmentName} style={{ height: kioskHeight }} className={\"panel-kiosk\"}>\r\n <div className=\"kiosk\"></div>\r\n {/* <span className=\"item-number float-start\">{compartment.number}</span> */}\r\n </div>\r\n )}\r\n\r\n {/* Compartment */}\r\n <div\r\n style={{ height: compartmentHeight }}\r\n className={\r\n \"panel-compartment clickable\" +\r\n (reservation ? \" reservation\" : \"\") +\r\n (isOpened ? \" opened\" : \" closed\") +\r\n (isDeactivated ? \" disabled\" : \"\")\r\n }\r\n onClick={() => {\r\n onCompartmentSelected(group, compartment);\r\n }}\r\n >\r\n <div className=\"row\">\r\n <div className=\"col-12 text-center\">\r\n <span className=\"item-number float-start\">{compartment.number}</span>\r\n\r\n <span className={\"float-end item-lock\" + (isOpened ? \" opened\" : \" closed\")}>\r\n {reservation?.paymentId && <FontAwesomeIcon className=\"me-2\" icon={[\"fas\", \"credit-card\"]} />}\r\n\r\n {showObjectDetected && (\r\n <FontAwesomeIcon className=\"me-2\" style={{ opacity: !compartment.isObjectDetected ? 0.2 : 1 }} icon={[\"fas\", \"cube\"]} />\r\n )}\r\n\r\n <LockComponent opened={isOpened} disabled={hub.state !== \"Online\" || group.state !== \"Online\"} />\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nexport default Locker;\r\n","import { useEffect, useState } from \"react\";\r\nimport { RequestState } from \"../core/request-state\";\r\nimport ToastHelpers from \"../core/toast-helpers\";\r\nimport { CompartmentSize } from \"./compartmentSize\";\r\nimport compartmentSizeService from \"./compartmentSize-service\";\r\n\r\ninterface IProps {\r\n onErrorNotificationMessage: string;\r\n}\r\n\r\nexport default function useCompartmentSizes(props: IProps) {\r\n const { onErrorNotificationMessage } = props;\r\n\r\n const [requestState, setRequestState] = useState<RequestState>(RequestState.Loading);\r\n const [error, setError] = useState<string>(\"\");\r\n const [compartmentSizes, setCompatmentSizes] = useState<Array<CompartmentSize>>([]);\r\n\r\n useEffect(\r\n () => {\r\n refresh();\r\n },\r\n // eslint-disable-next-line\r\n []\r\n );\r\n\r\n function refresh() {\r\n compartmentSizeService\r\n .getCompartmentSizes()\r\n .then((compartmentSizes: Array<CompartmentSize>) => {\r\n setCompatmentSizes(compartmentSizes);\r\n setRequestState(RequestState.Success);\r\n })\r\n .catch((e) => {\r\n setRequestState(RequestState.Failure);\r\n setError(e);\r\n\r\n if (onErrorNotificationMessage) {\r\n ToastHelpers.error(onErrorNotificationMessage);\r\n }\r\n });\r\n }\r\n\r\n return { compartmentSizes, requestState, error, refresh };\r\n}\r\n","import \"./hub-page.scss\";\r\nimport { useCallback, useEffect, useState } from \"react\";\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { Link, useParams } from \"react-router-dom\";\r\nimport { SyncButtonComponent } from \"../../components/button-component\";\r\nimport { Compartment } from \"../../services/hub/compartment\";\r\nimport { Group } from \"../../services/hub/group\";\r\nimport useMyHub from \"../../services/hub/useMyHub\";\r\nimport Member from \"../../services/member/member\";\r\nimport HubCompartmentDetail from \"./hub-compartment-detail\";\r\nimport HubLegend from \"./hub-details/hub-legend\";\r\nimport HubOpenAllDoor from \"./hub-details/hub-open-all-door\";\r\nimport HubStateInformation from \"./hub-details/hub-state-information\";\r\nimport DropdownSide from \"../../components/hub/rider-lockers/dropdown-side-component\";\r\nimport hubService from \"../../services/hub/hub-service\";\r\nimport Locker from \"../../components/hub/locker-component\";\r\nimport { YesNoComponent } from \"../../components/yesno-component\";\r\nimport useCompartmentSizes from \"../../services/hub/useCompartmentSizes\";\r\n\r\ninterface IParamTypes {\r\n hubId: string;\r\n}\r\n\r\ntype HubPageProps = {\r\n member: Member;\r\n};\r\n\r\nexport default function HubPage(props: HubPageProps) {\r\n const { member } = props;\r\n const { hubId } = useParams<IParamTypes>();\r\n const { t } = useTranslation();\r\n\r\n const { hub, refresh } = useMyHub({ hubId: hubId, onErrorNotificationMessage: t(\"hub-page.error-refresh\") });\r\n const { compartmentSizes } = useCompartmentSizes({ onErrorNotificationMessage: t(\"hub-page.error-refresh\") });\r\n\r\n const [selectedGroupId, setSelectedGroupId] = useState<string>(\"\");\r\n const [selectedCompartmentNumber, setSelectedCompartmentNumber] = useState<string>(\"\");\r\n const [selectedSide, setSelectedSide] = useState<string>(\"front\");\r\n const [showOpenAllDoors, setShowOpenAllDoors] = useState<boolean>(false);\r\n const [isActivateAllDoors, setIsActivateAllDoors] = useState<boolean>(false);\r\n const [isDeactivateAllDoors, setIsDeactivateAllDoors] = useState<boolean>(false);\r\n\r\n const selectedReservation = hub?.reservations.find(\r\n (r) =>\r\n r.groupId === selectedGroupId &&\r\n r.compartmentNumber === selectedCompartmentNumber &&\r\n Date.parse(r.start) < Date.now() &&\r\n Date.parse(r.end) > Date.now()\r\n );\r\n\r\n useEffect(() => {\r\n const timeoutId = setInterval(async () => {\r\n await refresh();\r\n }, 5000);\r\n return () => clearInterval(timeoutId);\r\n }, [refresh]);\r\n\r\n const onCompartmentSelected = useCallback((group: Group, compartment: Compartment) => {\r\n setSelectedGroupId(group.id);\r\n setSelectedCompartmentNumber(compartment.number);\r\n }, []);\r\n\r\n if (isActivateAllDoors) {\r\n return (\r\n <YesNoComponent\r\n headerMsg={t(\"hub-page.msg-activate-all-doors\")}\r\n onYesClick={() => activateAllDoors(hubId)}\r\n onNoClick={setIsActivateAllDoors}\r\n />\r\n );\r\n }\r\n\r\n if (isDeactivateAllDoors) {\r\n return (\r\n <YesNoComponent\r\n headerMsg={t(\"hub-page.msg-deactivate-all-doors\")}\r\n onYesClick={() => deactivateAllDoors(hubId)}\r\n onNoClick={setIsDeactivateAllDoors}\r\n />\r\n );\r\n }\r\n\r\n return (\r\n <div>\r\n <div className=\"container page hub-page\">\r\n <div className=\"page-breadcrumb\">\r\n <ul className=\"breadcrumb\">\r\n <li className=\"breadcrumb-item active\">\r\n <Link className=\"\" to=\"/hubs\">\r\n {t(\"hub-page.hublink\")}\r\n </Link>\r\n </li>\r\n <li className=\"breadcrumb-item active\">{hub ? hub.name : hubId}</li>\r\n </ul>\r\n </div>\r\n\r\n <HubStateInformation member={member} />\r\n\r\n {/* Groups/Compartments */}\r\n {hub && hub.groups && hub.groups.length > 0 && (\r\n <div className=\"card\">\r\n <div className=\"card-body\">\r\n <h5 className=\"card-title toolbar\">\r\n {t(\"hub-page.compartments\")}\r\n {hub && (\r\n <>\r\n <SyncButtonComponent className=\"ms-2\" onClick={refresh}></SyncButtonComponent>\r\n\r\n <button className=\"ms-2 btn btn-outline-primary\" onClick={() => setShowOpenAllDoors(true)}>\r\n {t(\"hub-page.open-all-doors\")}\r\n </button>\r\n\r\n <button className=\"ms-2 btn btn-outline-primary\" onClick={() => setIsActivateAllDoors(true)}>\r\n {t(\"hub-page.activate-all-doors\")}\r\n </button>\r\n\r\n <button className=\"ms-2 btn btn-outline-primary\" onClick={() => setIsDeactivateAllDoors(true)}>\r\n {t(\"hub-page.deactivate-all-doors\")}\r\n </button>\r\n\r\n {hub.flowConfigs.isRiderLocker && (\r\n <DropdownSide\r\n onChange={(side: string) => {\r\n setSelectedSide(side);\r\n }}\r\n />\r\n )}\r\n </>\r\n )}\r\n </h5>\r\n\r\n <HubLegend />\r\n\r\n <div className=\"row g-1\">\r\n {hub?.groups?.map((group: Group) => {\r\n return (\r\n <div key={group.id} className={\"panel-group col-4 col-md-3 col-lg-2\" + (group.state !== \"Online\" ? \" disabled\" : \"\")}>\r\n <div className=\"row\">\r\n <div className=\"col-12\">\r\n <div className=\"group-title\">{group.id} </div>\r\n </div>\r\n </div>\r\n\r\n <div className=\"compartments\">\r\n {group.compartments.map((compartment: Compartment) => {\r\n return (\r\n <Locker\r\n hub={hub}\r\n group={group}\r\n compartment={compartment}\r\n onCompartmentSelected={onCompartmentSelected}\r\n compartmentSizes={compartmentSizes}\r\n />\r\n );\r\n })}\r\n </div>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n\r\n {selectedGroupId !== \"\" && selectedCompartmentNumber !== \"\" && (\r\n <HubCompartmentDetail\r\n hub={hub}\r\n orderId={selectedReservation?.orderId}\r\n paymentId={selectedReservation?.paymentId}\r\n groupId={selectedGroupId}\r\n compartmentNumber={selectedCompartmentNumber}\r\n side={selectedSide}\r\n member={member}\r\n onClose={clearCompartmentSelected}\r\n refresh={refresh}\r\n />\r\n )}\r\n\r\n {showOpenAllDoors && <HubOpenAllDoor hub={hub} onClose={() => setShowOpenAllDoors(false)} refresh={refresh} />}\r\n </div>\r\n );\r\n\r\n function clearCompartmentSelected() {\r\n setSelectedGroupId(\"\");\r\n setSelectedCompartmentNumber(\"\");\r\n }\r\n\r\n async function activateAllDoors(hubId: string) {\r\n setIsActivateAllDoors(false);\r\n await hubService.activateAllLockers(hubId);\r\n }\r\n\r\n async function deactivateAllDoors(hubId: string) {\r\n setIsDeactivateAllDoors(false);\r\n await hubService.deactivateAllLockers(hubId);\r\n }\r\n}\r\n","import { useTranslation } from \"react-i18next\";\r\nimport { Hub } from \"../services/hub/hub\";\r\nimport { Order } from \"../services/order/order\";\r\nimport { OrderHelpers } from \"../services/order/order-helpers\";\r\nimport { Reservation } from \"../services/order/reservation\";\r\nimport { ReservationState } from \"../services/order/ReservationState\";\r\nimport LockComponent from \"./lock-component\";\r\nimport TimerComponent from \"./timerComponent\";\r\n\r\ninterface LockerSingleReservationMessageProps {\r\n firstOrder: Order;\r\n firstReservation: Reservation;\r\n firstHub: Hub;\r\n askOpenDoor: (order: Order, reservation: Reservation) => Promise<void>;\r\n disabled: boolean;\r\n dateNow: Date;\r\n}\r\n\r\nexport default function LockerSingleReservationMessageComponent({\r\n firstOrder,\r\n firstReservation,\r\n firstHub,\r\n askOpenDoor,\r\n disabled,\r\n dateNow,\r\n}: LockerSingleReservationMessageProps) {\r\n const { t } = useTranslation();\r\n const startTime = new Date(firstReservation.start);\r\n const endTime = new Date(firstReservation.end);\r\n const isCompleted = firstReservation?.state === ReservationState.Completed || dateNow > endTime;\r\n const isNotStarted = dateNow < startTime;\r\n const reservationTimeLeftBeforeStart = (startTime.getTime() - dateNow.getTime()) / 1000;\r\n //Checking if compartment number is a number, if it is, only show the compartment numb, if not show the col name as well\r\n const lockernumb = /^\\d+$/.test(firstReservation.compartmentNumber)\r\n ? firstReservation.compartmentNumber\r\n : firstReservation.groupId + firstReservation.compartmentNumber;\r\n return (\r\n <>\r\n {isNotStarted && (\r\n <div className=\"text-center mb-3 d-block\">\r\n <div className=\"fs-5 start-reservation\">\r\n <TimerComponent\r\n timeInSeconds={reservationTimeLeftBeforeStart}\r\n message=\"my-reservations-page.start-of-reservation\"\r\n onTimerEnds={() => null}\r\n />\r\n </div>\r\n </div>\r\n )}\r\n\r\n {firstOrder.flow.toString() === \"Deliver\" && <div className=\"spacer\"></div>}\r\n\r\n <h1 className=\"text-center fw-bold mt-0 pt-0 pb-1 mb-3 text-dark\">\r\n {firstHub.zoneName} - {t(\"common.locker\")} {lockernumb}\r\n </h1>\r\n <h2 className=\"text-center fw-bold mt-0 pt-0 pb-1 mb-3 text-dark\">\r\n {firstReservation.micrositeId == \"yano\" || firstReservation.micrositeId == \"shabono\"\r\n ? t(\"my-reservations-page.locker-code\") + firstReservation.trackingNumbers[0]\r\n : \"\"}\r\n </h2>\r\n <div className=\"row justify-content-center mb-3\">\r\n <button\r\n className=\"btn col-11 btn-primary rounded-3 shadow-lg pushable\"\r\n onClick={async () => await askOpenDoor(firstOrder, firstReservation)}\r\n disabled={disabled || isCompleted || isNotStarted}\r\n >\r\n <span className=\"front rounded-3\">\r\n <span className=\"me-2\">\r\n <LockComponent opened={OrderHelpers.inOpenedState(firstReservation?.state)} />\r\n </span>\r\n <span>{t(\"my-reservations-page.open-locker\").toUpperCase()}</span>\r\n </span>\r\n </button>\r\n </div>\r\n </>\r\n );\r\n}\r\n","import { useMemo } from \"react\";\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { Hub } from \"../services/hub/hub\";\r\nimport { HubHelpers } from \"../services/hub/hub-helper\";\r\nimport { Order, OrderFlowStringValue } from \"../services/order/order\";\r\nimport { OrderHelpers } from \"../services/order/order-helpers\";\r\nimport { Reservation } from \"../services/order/reservation\";\r\nimport { OpenDoorComponent, DoorOpenedComponent } from \"./order-page-components\";\r\nimport { StateBadgeComponent } from \"./state-badge-component\";\r\nimport TimerComponent from \"./timerComponent\";\r\n\r\ninterface LockerMultipleReservationsMessageProps {\r\n askOpenDoor: (order: Order, reservation: Reservation) => Promise<void>;\r\n order: Order | undefined;\r\n reservation: Reservation;\r\n hub: Hub | undefined;\r\n reservationInOpening: null;\r\n reservationIsActive: boolean;\r\n compartmentSizeName?: string;\r\n helpLink: string;\r\n hubName?: string;\r\n}\r\n\r\nexport default function LockerMultipleReservationsMessageComponent({\r\n askOpenDoor,\r\n order,\r\n reservation,\r\n hub,\r\n reservationInOpening,\r\n reservationIsActive,\r\n compartmentSizeName,\r\n helpLink,\r\n hubName,\r\n}: LockerMultipleReservationsMessageProps) {\r\n const { t } = useTranslation();\r\n const groupId = reservation.groupId;\r\n const opened = OrderHelpers.inOpenedState(reservation.state);\r\n const inOpening = reservationInOpening !== null;\r\n const isPersonalStorage = order?.flow?.toString() === OrderFlowStringValue.PersonalStorage;\r\n\r\n const reservationTimeLeft = useMemo(() => {\r\n const dateNow = new Date();\r\n const until = new Date(reservation.end);\r\n const milisecondsLeft = until.getTime() - dateNow.getTime();\r\n return milisecondsLeft / 1000;\r\n }, [reservation.end]);\r\n\r\n return (\r\n <tr key={reservation.id}>\r\n <td>\r\n {hubName ?? /^\\d+$/.test(reservation.compartmentNumber)\r\n ? reservation.compartmentNumber\r\n : reservation.groupId + reservation.compartmentNumber}\r\n </td>\r\n <td>\r\n <TimerComponent timeInSeconds={reservationTimeLeft} message=\"\" onTimerEnds={() => null} className={\"text-dark\"} />\r\n </td>\r\n {compartmentSizeName && <td>{compartmentSizeName}</td>}\r\n <td>\r\n <StateBadgeComponent state={reservation.state} isPersonalStorage={isPersonalStorage}></StateBadgeComponent>\r\n </td>\r\n <td>\r\n {hub && HubHelpers.isGroupOnline(hub, groupId) ? (\r\n <>\r\n <OpenDoorComponent\r\n onClick={() => {\r\n if (order) askOpenDoor(order, reservation);\r\n }}\r\n disabled={opened || inOpening || !reservationIsActive}\r\n ></OpenDoorComponent>\r\n {!inOpening && opened && reservationIsActive && <DoorOpenedComponent />}\r\n </>\r\n ) : (\r\n <>\r\n <h4 className=\"text-center fw-bold mt-0 pt-0\">\r\n {t(\"my-reservations-page.hub-or-group-offline\")}\r\n <br />\r\n <a className=\"h4 text-center mt-0 pt-0\" href={helpLink}>\r\n {helpLink}\r\n </a>\r\n </h4>\r\n <br />\r\n </>\r\n )}\r\n </td>\r\n </tr>\r\n );\r\n}\r\n","import \"./my-reservations-page.scss\";\r\nimport { useEffect, useState } from \"react\";\r\nimport { Trans, useTranslation } from \"react-i18next\";\r\nimport languageService from \"../../services/core/language-service\";\r\nimport StringHelpers from \"../../services/core/string-helpers\";\r\nimport { Reservation } from \"../../services/order/reservation\";\r\nimport { Order, OrderFlowStringValue } from \"../../services/order/order\";\r\nimport memberService from \"../../services/member/member-service\";\r\nimport ToastHelpers from \"../../services/core/toast-helpers\";\r\nimport orderService from \"../../services/order/order-service\";\r\nimport { MyReservations } from \"../../services/member/my-reservations\";\r\nimport { YesNoComponent } from \"../../components/yesno-component\";\r\nimport LoadingComponent from \"../../components/loading-component\";\r\nimport { HubHelpers } from \"../../services/hub/hub-helper\";\r\nimport compartmentSizeService from \"../../services/hub/compartmentSize-service\";\r\nimport { CompartmentSize } from \"../../services/hub/compartmentSize\";\r\nimport { useParams } from \"react-router-dom\";\r\nimport LockerSingleReservationMessageComponent from \"../../components/locker-single-reservation-message-component\";\r\nimport { ReservationState } from \"../../services/order/ReservationState\";\r\nimport { StateBadgeComponent } from \"../../components/state-badge-component\";\r\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\r\nimport TimerComponent from \"../../components/timerComponent\";\r\nimport LockerMultipleReservationsMessageComponent from \"../../components/locker-multiple-reservations-message-component\";\r\nimport paymentService from \"../../services/payment/payment-service\";\r\nimport { Pricing } from \"../../services/payment/pricing\";\r\nimport { Payment } from \"../../services/payment/payment\";\r\nimport DateHelpers from \"../../services/core/date-helpers\";\r\n\r\ninterface IParamTypes {\r\n token?: string;\r\n}\r\n\r\nexport default function MyReservationsPage() {\r\n const { t } = useTranslation();\r\n const { token } = useParams<IParamTypes>();\r\n const language: string = languageService.getLanguage();\r\n const [loading, setIsLoading] = useState<boolean>(true);\r\n const [myReservations, setMyReservations] = useState<MyReservations>();\r\n const [reservationInOpening, setReservationInOpening] = useState<{ order: Order; reservation: Reservation } | null>(null);\r\n const [compartmentSizes, setCompartmentSizes] = useState<Array<CompartmentSize>>([]);\r\n const [firstOrder, setFirstOrder] = useState<Order>();\r\n const [firstReservation, setFirstReservation] = useState<Reservation | undefined>(undefined);\r\n const [isFirstReservationStarted, setIsFirstReservationStarted] = useState<boolean>(false);\r\n const [reservationTimeLeft, setReservationTimeLeft] = useState<number | undefined>(undefined);\r\n const [isAskingReservationEnd, setIsAskingReservationEnd] = useState<boolean>(false);\r\n const [endPricing, setEndPricing] = useState<Pricing | undefined>(undefined);\r\n const [payments, setPayments] = useState<Payment[]>([]);\r\n\r\n useEffect(() => {\r\n async function setValues() {\r\n try {\r\n setEndPricing(await paymentService.getEndNowPricing(token || \"\"));\r\n const myReservations = await memberService.getMyReservations(token || \"\");\r\n setPayments(await paymentService.getPayment(token || \"\"));\r\n if (myReservations) {\r\n setMyReservations(myReservations);\r\n let firstOrderTmp = myReservations.orders?.[0];\r\n\r\n if (firstOrderTmp) {\r\n await setMyReservationState();\r\n const reservation = firstOrderTmp.items[0]?.reservation;\r\n setFirstReservation(reservation);\r\n const isStarted = dateNow >= new Date(reservation.start);\r\n setIsFirstReservationStarted(isStarted);\r\n const end = new Date(reservation.end);\r\n const milisecondsLeft = end.getTime() - dateNow.getTime();\r\n setReservationTimeLeft(milisecondsLeft / 1000);\r\n }\r\n setFirstOrder(myReservations.orders?.[0]);\r\n }\r\n const compartmentSizes = await compartmentSizeService.getCompartmentSizes(token);\r\n setCompartmentSizes(compartmentSizes);\r\n } catch (error: any) {\r\n ToastHelpers.error(t(\"my-reservations-page.error-refresh\", { status: error?.response?.status }));\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n }\r\n\r\n setValues();\r\n }, [t]);\r\n\r\n const isSingleReservation = myReservations?.orders.length === 1 && firstOrder?.items.length === 1;\r\n const dateNow = new Date();\r\n\r\n //This is a checker if the door is opened or closed\r\n useEffect(() => {\r\n setInterval(async () => {\r\n await setMyReservationState();\r\n setEndPricing(await paymentService.getEndNowPricing(token || \"\"));\r\n }, 10000);\r\n }, []);\r\n\r\n const firstReservationBlock = myReservations?.myReservations?.[0]?.reservationBlock;\r\n const firstCurrency = myReservations?.myReservations?.[0]?.currency;\r\n const firstHub = myReservations?.hubs.find((h) => h.id === firstOrder?.hubId);\r\n\r\n const payed = payments?.some((p) => p.state === \"Completed\");\r\n\r\n const isCompleted =\r\n firstReservation && (firstReservation?.state === ReservationState.Completed || dateNow > new Date(firstReservation?.end));\r\n\r\n const isCompartmentOnline =\r\n firstHub && firstReservation && HubHelpers.isCompartmentOnline(firstHub, firstReservation.groupId, firstReservation.compartmentNumber);\r\n\r\n const isSwych = firstReservationBlock?.micrositeId === \"swych\";\r\n\r\n const helpLink = \"https://locketgo.com/faq.html\";\r\n\r\n const timeZone = DateHelpers.UserTimeZone;\r\n\r\n return (\r\n <div className=\"container page my-reservations-page\">\r\n <div className=\"col col-lg-8 offset-lg-2\">\r\n <LoadingComponent loading={loading} />\r\n\r\n {reservationInOpening && (\r\n <YesNoComponent\r\n headerMsg={t(\"my-reservations-page.msg-opendoor\")}\r\n onYesClick={async () =>\r\n await onYesClickOpenDoor(reservationInOpening.order, reservationInOpening.reservation, isSingleReservation)\r\n }\r\n onNoClick={() => setReservationInOpening(null)}\r\n />\r\n )}\r\n\r\n {isAskingReservationEnd && (\r\n <YesNoComponent\r\n isDangerousChoice={true}\r\n headerMsg={t(\"my-reservations-page.msg-end-reservation\")}\r\n onYesClick={async () => await endReservation()}\r\n onNoClick={() => setIsAskingReservationEnd(false)}\r\n >\r\n <p>{t(\"my-reservations-page.msg-end-reservation-info\")}</p>\r\n {!isSwych && (\r\n <p>\r\n {t(\"my-reservations-page.msg-end-reservation-new-amount\", {\r\n amount: endPricing ? StringHelpers.formatPrice(endPricing.price + endPricing.saleTaxTotal) : \"0.00\",\r\n currency: firstCurrency,\r\n })}\r\n </p>\r\n )}\r\n </YesNoComponent>\r\n )}\r\n\r\n {!loading &&\r\n !reservationInOpening &&\r\n !isAskingReservationEnd &&\r\n (isSingleReservation ? (\r\n <div className=\"page-background-boxing shadow text-center pt-5 pb-5\">\r\n {/*This section is for personal storage and bopil single reservation*/}\r\n {firstReservationBlock && (\r\n <h2 className=\"mb-4\">{language === \"en\" ? firstReservationBlock.name.en : firstReservationBlock.name.fr}</h2>\r\n )}\r\n {(!myReservations || !firstOrder || !firstOrder.items.length) && (\r\n <div className=\"row\">\r\n <div className=\"col\">\r\n <div className=\"customer card\">\r\n <div className=\"card-body text-center\">{t(\"my-reservations-page.no-reservation\")}</div>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n {firstOrder && (\r\n <div>\r\n {firstHub && firstHub.zoneName && (\r\n <>\r\n {firstReservation && (\r\n <>\r\n {isFirstReservationStarted && (\r\n <>\r\n <span className=\"fs-5 congrats\">{t(\"my-reservations-page.congrats-msg\")}</span>\r\n <div className=\"d-flex justify-content-center fs-2 mb-3 mt-2\">\r\n <StateBadgeComponent\r\n state={firstReservation.state}\r\n isPersonalStorage={firstOrder.flow.toString() === OrderFlowStringValue.PersonalStorage}\r\n ></StateBadgeComponent>\r\n </div>\r\n </>\r\n )}\r\n {firstHub.address && firstOrder.flow.toString() === \"Deliver\" && (\r\n <span className=\"mt-3 pt-0 pb-1 location\">\r\n <FontAwesomeIcon className=\"me-2 mb-1\" icon={[\"fas\", \"map-marker-alt\"]} />\r\n {HubHelpers.getAddress(firstHub)}\r\n </span>\r\n )}\r\n </>\r\n )}\r\n </>\r\n )}\r\n\r\n {firstReservation && (\r\n <>\r\n {firstHub && isCompartmentOnline ? (\r\n <LockerSingleReservationMessageComponent\r\n firstOrder={firstOrder}\r\n firstReservation={firstReservation}\r\n firstHub={firstHub}\r\n askOpenDoor={askOpenDoor}\r\n disabled={/*OrderHelpers.inOpenedState(firstReservation.state) ||*/ reservationInOpening != null}\r\n dateNow={dateNow}\r\n />\r\n ) : (\r\n <>\r\n <h4 className=\"text-center fw-bold mt-0 pt-0\">\r\n {t(\"my-reservations-page.hub-or-group-offline\")}\r\n <br />\r\n <a className=\"h4 text-center mt-0 pt-0\" href={helpLink}>\r\n {helpLink}\r\n </a>\r\n </h4>\r\n <br />\r\n </>\r\n )}\r\n {isFirstReservationStarted ? (\r\n reservationTimeLeft && (\r\n <>\r\n {firstReservation.state !== ReservationState.Completed && (\r\n <div className=\"fs-5 end-reservation\">\r\n <TimerComponent\r\n timeInSeconds={reservationTimeLeft}\r\n message=\"my-reservations-page.end-of-reservation\"\r\n onTimerEnds={() => null}\r\n />\r\n </div>\r\n )}\r\n {(!payed || isSwych) && (\r\n <div className=\"mt-3 row justify-content-center mb-3\">\r\n <button\r\n className=\"btn btn-md col-11 btn-danger rounded-3 shadow-lg pushable\"\r\n onClick={() => setIsAskingReservationEnd(true)}\r\n disabled={isCompleted || !isCompartmentOnline}\r\n >\r\n <span className=\"front rounded-3\">\r\n <span>{t(\"my-reservations-page.end-reservation-early\").toUpperCase()}</span>\r\n </span>\r\n </button>\r\n </div>\r\n )}\r\n </>\r\n )\r\n ) : (\r\n <div className=\"fs-5 text-center mb-3 end-reservation text-strong-black\">\r\n <Trans\r\n i18nKey={\"my-reservations-page.end-of-reservation-before-start\"}\r\n values={{\r\n dateTimeFormat:\r\n DateHelpers.toDateString(new Date(firstReservation.end), timeZone) +\r\n \" \" +\r\n DateHelpers.toHourString(new Date(firstReservation.end), timeZone),\r\n }}\r\n />\r\n </div>\r\n )}\r\n </>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n ) : (\r\n <>\r\n <h1>{t(\"my-reservations-page.title\")}</h1>\r\n {(!myReservations || !(myReservations?.orders?.length > 0) || !myReservations?.orders?.some((o) => o.items.length > 0)) && (\r\n <div className=\"row\">\r\n <div className=\"col\">\r\n <div className=\"customer card\">\r\n <div className=\"card-body text-center\">{t(\"my-reservations-page.no-reservation\")}</div>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n {myReservations && myReservations.myReservations.length > 0\r\n ? myReservations?.myReservations.map((myReservation) => {\r\n //This section is for personal storage multiple reservations, This part will never be used, because at this time a PS order only have one reservation.\r\n const reservationBlock = myReservation.reservationBlock;\r\n\r\n const curReservations: Array<Reservation> = [];\r\n myReservations.orders.forEach((order) => {\r\n order.items.forEach((item) => {\r\n if (item.reservation.reservationBlockId === reservationBlock.id) {\r\n curReservations.push(item.reservation);\r\n }\r\n });\r\n });\r\n\r\n const name = language === \"en\" ? reservationBlock.name.en : reservationBlock.name.fr;\r\n\r\n return (\r\n <div className=\"row\" key={myReservation.reservationBlock.id}>\r\n <div className=\"col\">\r\n <div className=\"customer card\">\r\n <div className=\"card-body\">\r\n {myReservation.micrositeLogoUrl && (\r\n <img src={myReservation.micrositeLogoUrl} alt=\"\" className=\"img-logo float-end\" />\r\n )}\r\n\r\n <h2 className=\"card-title pb-0 mb-0\">\r\n {reservationBlock.logoUrl && <img src={reservationBlock.logoUrl} alt=\"\" className=\"app-logo\" />} {name}\r\n </h2>\r\n\r\n {reservationBlock.startOn && (\r\n <div className=\"large mb-2\">{DateHelpers.formatDateTime(new Date(reservationBlock.startOn), timeZone)}</div>\r\n )}\r\n\r\n <table className=\"table table-sm table-reservations\">\r\n <thead>\r\n <tr>\r\n <th>{t(\"my-reservations-page-table-header.locker-id\")}</th>\r\n <th>{t(\"my-reservations-page-table-header.end-time\")}</th>\r\n <th>{t(\"my-reservations-page-table-header.size\")}</th>\r\n <th>{t(\"my-reservations-page-table-header.reservation-state\")}</th>\r\n <th>{t(\"my-reservations-page-table-header.locker-door\")}</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {curReservations.map((reservation) => {\r\n const order = myReservations.orders.find((o) =>\r\n o.items.find((i) => i.reservation.id === reservation.id)\r\n );\r\n const hub = myReservations.hubs.find((h) => h.id === order?.hubId);\r\n let hubName = hub?.name;\r\n if (hubName?.startsWith(\"Event \")) {\r\n hubName = \"Section \" + hubName.substr(6, hubName.length - 6) + \" - \";\r\n } else {\r\n hubName = \"\";\r\n }\r\n\r\n let compartmentSizeName = name;\r\n if (hub) {\r\n let sizeId = HubHelpers.findGroup(hub, reservation.groupId)?.compartments.find(\r\n (c) => c.number === reservation.compartmentNumber\r\n )?.sizeId;\r\n\r\n var compartmentSize = compartmentSizes.find((cs) => cs.id === sizeId);\r\n compartmentSizeName = compartmentSize?.name.get(language);\r\n }\r\n\r\n const startOn = new Date(reservation.start);\r\n const until = new Date(reservation.end);\r\n const reservationIsActive = dateNow >= startOn && dateNow <= until;\r\n\r\n return (\r\n <LockerMultipleReservationsMessageComponent\r\n order={order}\r\n reservation={reservation}\r\n hub={hub}\r\n askOpenDoor={askOpenDoor}\r\n helpLink={helpLink}\r\n compartmentSizeName={compartmentSizeName}\r\n reservationIsActive={reservationIsActive}\r\n reservationInOpening={reservationInOpening}\r\n hubName={hubName}\r\n />\r\n );\r\n })}\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n })\r\n : myReservations?.orders.map((order) => {\r\n //This section is for bopil multiple reservations\r\n const hub = myReservations.hubs.find((h) => h.id === order?.hubId);\r\n return (\r\n !!order.items.length && (\r\n <div className=\"row\" key={order.id}>\r\n <div className=\"col\">\r\n <div className=\"customer card\">\r\n <div className=\"card-body\">\r\n <h1 className=\"mb-1 pb-0 pt-2 ms-4\">{hub?.name}</h1>\r\n {hub?.address && (\r\n <span className=\"location ms-4\">\r\n <FontAwesomeIcon className=\"me-2 mb-1\" icon={[\"fas\", \"map-marker-alt\"]} />\r\n {HubHelpers.getAddress(hub)}\r\n </span>\r\n )}\r\n\r\n <table className=\"table table-sm table-reservations mt-4\">\r\n <thead>\r\n <tr>\r\n <th>{t(\"my-reservations-page-table-header.locker-id\")}</th>\r\n <th>{t(\"my-reservations-page-table-header.end-time\")}</th>\r\n <th>{t(\"my-reservations-page-table-header.reservation-state\")}</th>\r\n <th>{t(\"my-reservations-page-table-header.locker-door\")}</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {order.items.map((orderItem) => {\r\n const reservation = orderItem.reservation;\r\n if (!reservation) {\r\n return null;\r\n }\r\n\r\n let reservationIsActive = false;\r\n if (order.flow.toString() === \"Return\") {\r\n reservationIsActive = reservation.state === ReservationState.New;\r\n } else {\r\n reservationIsActive = reservation.state === ReservationState.ReadyForPickUp;\r\n }\r\n\r\n return (\r\n <LockerMultipleReservationsMessageComponent\r\n order={order}\r\n reservation={reservation}\r\n hub={hub}\r\n askOpenDoor={askOpenDoor}\r\n helpLink={helpLink}\r\n reservationIsActive={reservationIsActive}\r\n reservationInOpening={reservationInOpening}\r\n />\r\n );\r\n })}\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n )\r\n );\r\n })}\r\n </>\r\n ))}\r\n </div>\r\n </div>\r\n );\r\n\r\n async function endReservation(): Promise<void> {\r\n if (token) {\r\n setIsLoading(true);\r\n setIsAskingReservationEnd(false);\r\n\r\n if (isSwych) {\r\n if (firstOrder) {\r\n await orderService\r\n .endOrder(firstOrder?.organizationId, firstOrder?.id, token)\r\n .then(async () => {\r\n await setMyReservationState();\r\n })\r\n .finally(() => setIsLoading(false));\r\n }\r\n } else {\r\n await paymentService\r\n .endReservationEarly(token)\r\n .then(async () => {\r\n await setMyReservationState();\r\n })\r\n .finally(() => setIsLoading(false));\r\n }\r\n }\r\n }\r\n\r\n async function onYesClickOpenDoor(order: Order, reservation: Reservation, isSingleReservation: boolean): Promise<void> {\r\n if (order && reservation) {\r\n setIsLoading(true);\r\n await openDoor(order, reservation)\r\n .then(async () => {\r\n if (isSingleReservation) {\r\n await setMyReservationState();\r\n } else {\r\n const myReservations = await memberService.getMyReservations(token || \"\");\r\n if (myReservations) {\r\n setMyReservations(myReservations);\r\n }\r\n }\r\n })\r\n .finally(() => setIsLoading(false));\r\n } else {\r\n ToastHelpers.error(t(\"my-reservations-page.error-opendoor-424\"));\r\n }\r\n }\r\n\r\n async function setMyReservationState(): Promise<void> {\r\n const myReservations = await memberService.getMyReservations(token || \"\");\r\n if (myReservations) {\r\n const firstReservationTmp = myReservations.orders[0]?.items[0]?.reservation;\r\n setFirstReservation(firstReservationTmp);\r\n }\r\n }\r\n\r\n async function askOpenDoor(order: Order, reservation: Reservation): Promise<void> {\r\n setReservationInOpening({ order, reservation });\r\n }\r\n\r\n async function openDoor(order: Order, reservation: Reservation): Promise<void> {\r\n setReservationInOpening(null);\r\n let reason = null;\r\n switch (order.flow.toString()) {\r\n case \"PersonalStorage\":\r\n reason = \"PersonalStorage\";\r\n break;\r\n case \"Deliver\":\r\n reason = \"Pickup\";\r\n break;\r\n case \"Return\":\r\n reason = \"Dropoff\";\r\n break;\r\n }\r\n\r\n const orderItem = order.items.find((i) => i.reservation.id === reservation.id);\r\n let tokenTmp = token || null;\r\n if (orderItem && reason) {\r\n await orderService.openDoor(order.organizationId.toString(), order.id, orderItem.id, reason, tokenTmp).catch((error) => {\r\n switch (error?.response?.status) {\r\n case 409:\r\n ToastHelpers.error(t(\"my-reservations-page.error-opendoor\"));\r\n break;\r\n case 424:\r\n ToastHelpers.error(t(\"my-reservations-page.error-opendoor-424\"));\r\n break;\r\n case 429:\r\n ToastHelpers.error(t(\"my-reservations-page.error-opendoor-429\"));\r\n break;\r\n default:\r\n ToastHelpers.error(t(\"common.error-generic\"));\r\n break;\r\n }\r\n });\r\n }\r\n }\r\n}\r\n","import { useTranslation } from \"react-i18next\";\r\nimport { useHistory, useParams } from \"react-router-dom\";\r\n\r\ninterface IParamTypes {\r\n micrositeId: string;\r\n}\r\n\r\nexport default function OrderExpiredPage() {\r\n const { t } = useTranslation();\r\n const history = useHistory();\r\n\r\n const { micrositeId } = useParams<IParamTypes>();\r\n\r\n return (\r\n <div className=\"container page orders-page\">\r\n <div className=\"col col-lg-6 offset-lg-3\">\r\n <div className=\"customer card\">\r\n <div className=\"card-header align-items-center\">\r\n <div className=\"d-inline-block\">\r\n <h2>{t(\"micro-site-reserve-locker.order-expired\")}</h2>\r\n </div>\r\n <button className=\"btn-close float-end\" onClick={() => history.push(`/sites/${micrositeId}`)}></button>\r\n </div>\r\n\r\n <div className=\"card-body\">\r\n <div className=\"align-items-center\">\r\n <button className=\"btn btn-outline-primary me-2\" onClick={() => history.push(`/sites/${micrositeId}`)}>\r\n {t(\"micro-site-reserve-locker.new-reservation\")}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import ServicesApiBaseService from \"../services-api-base-service\";\r\nimport { Dashboard } from \"./dashboard\";\r\n\r\nclass AnalyticService extends ServicesApiBaseService {\r\n async getDashboard(start:string, end:string): Promise<Dashboard | undefined> {\r\n const dashboard = await this.getObject<Dashboard>(`${this.apiUrl}/analytics?start=${start}&end=${end}`);\r\n return dashboard;\r\n }\r\n}\r\n\r\nconst analyticService = new AnalyticService();\r\nexport default analyticService;\r\n","import { useTranslation } from \"react-i18next\";\r\nimport \"./dashboard-page.scss\";\r\nimport HubLocationComponent from \"../../components/hub-location-component\";\r\nimport { Hub } from \"../../services/hub/hub\";\r\nimport StringHelpers from \"../../services/core/string-helpers\";\r\nimport { HubUsage } from \"../../services/analytic/hubUsage\";\r\nimport { useHistory } from \"react-router-dom\";\r\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\r\n\r\ntype Props = {\r\n hubs: Array<Hub> | undefined;\r\n hubUsages: Array<HubUsage> | undefined;\r\n};\r\n\r\nexport default function HubStatsComponent(props: Props) {\r\n const { hubs, hubUsages } = props;\r\n const history = useHistory();\r\n\r\n const { t } = useTranslation();\r\n\r\n const hubCount = (hubs && hubs.length) || 0;\r\n const groupCount = (hubs && hubs.map((item) => item.groups.length).reduce((prev, next) => prev + next)) || 0;\r\n const used = (hubUsages && hubUsages.length && hubUsages?.map((item) => item.used).reduce((prev, next) => prev + next)) || 0;\r\n const total = (hubUsages && hubUsages.length && hubUsages?.map((item) => item.total).reduce((prev, next) => prev + next)) || 0;\r\n\r\n return (\r\n <>\r\n {/* Hub Capacity */}\r\n {hubUsages && hubUsages.length > 0 && (\r\n <div className=\"hubs-component\">\r\n <h5>{t(\"analytic.hub-usage-title\")}</h5>\r\n <div className=\"hubs-usage shadow rounded-3 mt-2 border p-3\">\r\n <div className=\"col-12\">\r\n <table className=\"table table-sm table-hover row-clikable\">\r\n <thead>\r\n <tr>\r\n <th>{t(\"analytic.hub\")}</th>\r\n <th>{t(\"analytic.hub-usage\")}</th>\r\n <th></th>\r\n <th></th>\r\n <th></th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {hubUsages.map((hubUsage) => {\r\n const percentage = hubUsage.total > 0 ? (hubUsage.used * 100) / hubUsage.total : 0;\r\n const progressStyle = { width: percentage + \"%\" };\r\n const hub = hubs?.find((h) => h.id === hubUsage.id) || null;\r\n const url = hub ? `/hubs/${hub.id}` : \"/\";\r\n\r\n return (\r\n <tr key={hubUsage.id} onClick={() => history.push(url)}>\r\n <td className=\"pt-2 pb-2\">\r\n <HubLocationComponent hub={hub} />\r\n </td>\r\n <td className=\"pt-2 pb-2\">{t(\"analytic.hub-usage-text\", { used: hubUsage.used, total: hubUsage.total })}</td>\r\n <td className=\"pt-2 pb-2\">\r\n <div className=\"progress\">\r\n <div\r\n className=\"progress-bar progress-bar-striped\"\r\n role=\"progressbar\"\r\n style={progressStyle}\r\n aria-valuenow={hubUsage.used}\r\n aria-valuemin={0}\r\n aria-valuemax={hubUsage.total}\r\n ></div>\r\n </div>\r\n </td>\r\n <td className=\"pt-2 pb-2\">{StringHelpers.formatNumber(percentage, 0)}%</td>\r\n <td className=\"pt-2 pb-2\">\r\n <FontAwesomeIcon icon={[\"fas\", \"angle-right\"]} />\r\n </td>\r\n </tr>\r\n );\r\n })}\r\n </tbody>\r\n </table>\r\n </div>\r\n\r\n <div>\r\n <span>{t(\"analytic.hub-summary-text1\", { hubCount, groupCount })}</span>\r\n <span className=\"float-end\">{t(\"analytic.hub-summary-text2\", { used, total })}</span>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n </>\r\n );\r\n}\r\n","import { Line } from \"react-chartjs-2\";\r\nimport ChartProps from \"./chart-props\";\r\n\r\nexport default function ChartLine(props: ChartProps) {\r\n const data = {\r\n labels: props.labels,\r\n datasets: [\r\n {\r\n data: props.data,\r\n fill: true,\r\n backgroundColor: \"rgba(54, 162, 235, 0.2)\",\r\n borderColor: \"rgba(54, 162, 235, 1)\",\r\n borderWidth: 1,\r\n tension: 0.2,\r\n },\r\n ],\r\n };\r\n const options = {\r\n plugins: {\r\n legend: {\r\n display: false,\r\n },\r\n },\r\n elements: {\r\n point: {\r\n radius: 2,\r\n backgroundColor: \"rgba(54, 162, 235, 0)\",\r\n },\r\n },\r\n interaction: {\r\n intersect: false,\r\n },\r\n scales: {\r\n x: {\r\n display: true,\r\n grid: { display: false, drawTicks: true },\r\n },\r\n y: {\r\n display: true,\r\n beginAtZero: true,\r\n },\r\n },\r\n };\r\n\r\n return <Line data={data} options={options} />;\r\n}\r\n","import { useTranslation } from \"react-i18next\";\r\nimport { ExportButton } from \"../../components/button-component\";\r\nimport { Kpi } from \"../../services/analytic/kpi\";\r\nimport StringHelpers from \"../../services/core/string-helpers\";\r\n\r\ntype Props = {\r\n model: Kpi;\r\n isLocketgoAdmin: boolean;\r\n exportFileName: string;\r\n title: string;\r\n};\r\n\r\nexport default function OrderStatsTable(props: Props) {\r\n const { model, isLocketgoAdmin } = props;\r\n const { t } = useTranslation();\r\n\r\n let data: Array<any> = [];\r\n\r\n var resSum: number = 0;\r\n var confirmedSum: number = 0;\r\n var totalCadSum: number = 0;\r\n var totalUSSum: number = 0;\r\n\r\n props.model.values.forEach((elem) => {\r\n resSum += elem.count;\r\n confirmedSum += elem.countPaid;\r\n totalCadSum += elem.currency == \"CAD\" ? elem.amountGross : 0;\r\n totalUSSum += elem.currency == \"USD\" ? elem.amountGross : 0;\r\n\r\n data.push({\r\n Name: elem.name,\r\n Reservations: elem.count,\r\n Confirmed: elem.countPaid,\r\n \"Total Amount of CAD\": elem.currency == \"CAD\" ? elem.amountGross : 0,\r\n \"Total Amount of USD\": elem.currency == \"USD\" ? elem.amountGross : 0,\r\n });\r\n });\r\n\r\n data.push({\r\n Name: \"Total\",\r\n Reservations: resSum,\r\n Confirmed: confirmedSum,\r\n \"Total Amount of CAD\": totalCadSum,\r\n \"Total Amount of USD\": totalUSSum,\r\n });\r\n\r\n props.model.values.sort((a, b) => {\r\n let dif = b.count - a.count;\r\n if (dif !== 0) return dif;\r\n return b.countPaid - a.countPaid;\r\n });\r\n\r\n return (\r\n <div className=\"col-12\">\r\n <table className=\"table table-sm mt-4\">\r\n <thead>\r\n <tr>\r\n <th>\r\n {props.title}\r\n <span className=\"ms-2\">\r\n <ExportButton data={data} fileName={props.exportFileName} />\r\n </span>\r\n </th>\r\n <th className=\"text-end\">{t(\"analytic.reserved\")}</th>\r\n {isLocketgoAdmin && <th className=\"text-end\">{t(\"analytic.confirmed\")}</th>}\r\n <th className=\"text-end\">{t(\"analytic.total-amount\")}</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {model.values.map((kpi) => {\r\n return (\r\n <tr key={kpi.name}>\r\n <td className=\"pt-2 pb-2\">{kpi.name}</td>\r\n <td className=\"text-end pt-2 pb-2\">{kpi.count}</td>\r\n {isLocketgoAdmin && <td className=\"text-end pt-2 pb-2\">{kpi.countPaid}</td>}\r\n <td className=\"text-end pt-2 pb-2\">\r\n {!kpi.currency\r\n ? \"N/A\"\r\n : t(\"common.price-format\", { price: StringHelpers.formatPrice(kpi.amountGross), currency: kpi.currency })}\r\n </td>\r\n </tr>\r\n );\r\n })}\r\n </tbody>\r\n </table>\r\n </div>\r\n );\r\n}\r\n","import { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\r\nimport { CSVLink } from \"react-csv\";\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { useHistory } from \"react-router-dom\";\r\nimport { Kpi } from \"../../services/analytic/kpi\";\r\nimport languageService from \"../../services/core/language-service\";\r\nimport StringHelpers from \"../../services/core/string-helpers\";\r\nimport Microsite from \"../../services/micro-site/microsite\";\r\nimport DateHelpers from \"../../services/core/date-helpers\";\r\n\r\ntype Props = {\r\n model: Kpi;\r\n microsites: Array<Microsite>;\r\n isLocketgoAdmin: boolean;\r\n exportFileName: string;\r\n title: string;\r\n};\r\n\r\ntype EventData = {\r\n Name: string;\r\n Organization: string;\r\n Reservations: number;\r\n Confirmed: number;\r\n \"Event Started On\": string;\r\n \"Total Amount of CAD\": undefined | number;\r\n \"Total Amount of USD\": undefined | number;\r\n};\r\n\r\nexport default function EventStatsTable(props: Props) {\r\n const { model, isLocketgoAdmin, microsites, exportFileName } = props;\r\n const { t } = useTranslation();\r\n const history = useHistory();\r\n\r\n const datas: Array<EventData> = [];\r\n\r\n var resSum: number = 0;\r\n var confirmedSum: number = 0;\r\n var totalCadSum: number = 0;\r\n var totalUSSum: number = 0;\r\n\r\n model.values.forEach((elem) => {\r\n const microsite = microsites.find((m) => m.reservationBlocks.some((rb) => rb.id === elem.entityId));\r\n const reservationBlock = microsite?.reservationBlocks.find((rb) => rb.id === elem.entityId);\r\n\r\n resSum += elem.count;\r\n confirmedSum += elem.countPaid;\r\n totalCadSum += elem.currency == \"CAD\" ? elem.amountGross : 0;\r\n totalUSSum += elem.currency == \"USD\" ? elem.amountGross : 0;\r\n\r\n datas.push({\r\n Name: elem.name,\r\n Organization: elem.organizationName,\r\n Reservations: elem.count,\r\n Confirmed: elem.countPaid,\r\n \"Event Started On\": !reservationBlock?.startOn\r\n ? \"N/A\"\r\n : DateHelpers.formatDateTime(new Date(reservationBlock.startOn), \"America/Toronto\") || \"N/A\",\r\n \"Total Amount of CAD\": elem.currency == \"CAD\" ? elem.amountGross : 0,\r\n \"Total Amount of USD\": elem.currency == \"USD\" ? elem.amountGross : 0,\r\n });\r\n });\r\n\r\n datas.push({\r\n Name: \"Total\",\r\n Organization: \"N/A\",\r\n Reservations: resSum,\r\n Confirmed: confirmedSum,\r\n \"Event Started On\": \"N/A\",\r\n \"Total Amount of CAD\": totalCadSum,\r\n \"Total Amount of USD\": totalUSSum,\r\n });\r\n\r\n model.values.sort((a, b) => {\r\n const dataA = datas.find((d) => d.Name === a.name);\r\n const dataB = datas.find((d) => d.Name === b.name);\r\n\r\n if (dataA && dataB) {\r\n const startOnA = new Date(dataA[\"Event Started On\"]);\r\n const startOnB = new Date(dataB[\"Event Started On\"]);\r\n\r\n if (startOnA.valueOf() && startOnB.valueOf()) {\r\n const dif = startOnB.valueOf() - startOnA.valueOf();\r\n\r\n if (dif > 0) return 1;\r\n if (dif < 0) return -1;\r\n return 0;\r\n }\r\n\r\n if (!startOnA.valueOf() && startOnB.valueOf()) {\r\n return 1;\r\n }\r\n\r\n if (startOnA.valueOf() && !startOnB.valueOf()) {\r\n return -1;\r\n }\r\n\r\n return 0;\r\n }\r\n\r\n const dif = b.count - a.count + (b.countPaid - a.countPaid);\r\n if (dif > 0) return 1;\r\n if (dif < 0) return -1;\r\n return 0;\r\n });\r\n\r\n return (\r\n <div className=\"col-12\">\r\n <table className=\"table table-sm mt-4 table-hover row-clikable\">\r\n <thead>\r\n <tr>\r\n <th>\r\n {t(\"analytic.events\")}\r\n <CSVLink\r\n className=\"btn btn-outline-primary ms-2\"\r\n title={t(\"common.export\")}\r\n data={datas}\r\n enclosingCharacter={`\"`}\r\n filename={exportFileName}\r\n >\r\n <FontAwesomeIcon icon=\"file-export\"></FontAwesomeIcon>\r\n </CSVLink>\r\n </th>\r\n <th className=\"text-end\">{t(\"analytic.organization\")}</th>\r\n <th className=\"text-end\">{t(\"analytic.start-on\")}</th>\r\n <th className=\"text-end\">{t(\"analytic.reserved\")}</th>\r\n {isLocketgoAdmin && <th className=\"text-end\">{t(\"analytic.confirmed\")}</th>}\r\n <th className=\"text-end\">{t(\"analytic.total-amount\")}</th>\r\n <th></th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {model.values.map((kpi) => {\r\n const microsite = microsites.find((m) => m.reservationBlocks.some((rb) => rb.id === kpi.entityId));\r\n const reservationBlock = microsite?.reservationBlocks.find((rb) => rb.id === kpi.entityId);\r\n const data = datas.find((d) => d.Name === kpi.name);\r\n const url =\r\n microsite && reservationBlock\r\n ? `/organizations/${microsite?.organizationId}/microsites/${microsite?.id}/reservationBlocks/${reservationBlock?.id}/sales-report`\r\n : \"/\";\r\n\r\n if (!reservationBlock) {\r\n return <></>;\r\n }\r\n\r\n return (\r\n <tr key={kpi.name} onClick={() => history.push(url)}>\r\n <td className=\"pt-2 pb-2\">{kpi.translatedName[languageService.language] ?? kpi.name}</td>\r\n <td className=\"text-end pt-2 pb-2\">{kpi.organizationName}</td>\r\n <td className=\"text-end pt-2 pb-2\">{data?.[\"Event Started On\"]}</td>\r\n <td className=\"text-end pt-2 pb-2\">{kpi.count}</td>\r\n {isLocketgoAdmin && <td className=\"text-end pt-2 pb-2\">{kpi.countPaid}</td>}\r\n <td className=\"text-end pt-2 pb-2\">\r\n {!kpi.currency\r\n ? \"N/A\"\r\n : t(\"common.price-format\", {\r\n price: StringHelpers.formatPrice(kpi.amountGross),\r\n currency: kpi.currency,\r\n })}\r\n </td>\r\n <td className=\"ps-4 pt-2 pb-2\">\r\n <FontAwesomeIcon icon={[\"fas\", \"angle-right\"]} />\r\n </td>\r\n </tr>\r\n );\r\n })}\r\n </tbody>\r\n </table>\r\n </div>\r\n );\r\n}\r\n","import { useEffect, useMemo, useState } from \"react\";\r\nimport { useTranslation } from \"react-i18next\";\r\nimport \"./dashboard-page.scss\";\r\nimport analyticService from \"../../services/analytic/analytic-service\";\r\nimport { Dashboard } from \"../../services/analytic/dashboard\";\r\nimport ToastHelpers from \"../../services/core/toast-helpers\";\r\nimport hubService from \"../../services/hub/hub-service\";\r\nimport { Hub } from \"../../services/hub/hub\";\r\nimport Member from \"../../services/member/member\";\r\nimport HubStatsComponent from \"./hub-stats-component\";\r\nimport memberService from \"../../services/member/member-service\";\r\nimport { SyncButtonComponent } from \"../../components/button-component\";\r\nimport ChartLine from \"../../components/chart-line\";\r\nimport StringHelpers from \"../../services/core/string-helpers\";\r\nimport OrderStatsTable from \"./order-stats-component\";\r\nimport DateRangeComponent, { DateRangeOptions } from \"../../components/dateRangeComponent\";\r\nimport EventStatsTable from \"./event-stats-component\";\r\nimport LoadingComponent from \"../../components/loading-component\";\r\nimport DateHelpers from \"../../services/core/date-helpers\";\r\n\r\ntype Props = {\r\n member: Member;\r\n};\r\n\r\ninterface onDateProps {\r\n currentStart: string;\r\n currentEnd: string;\r\n}\r\n\r\nexport default function DashboardPage(props: Props) {\r\n const { member } = props;\r\n\r\n const [loading, setLoading] = useState<boolean>(true);\r\n\r\n const [model, setModel] = useState<Dashboard | undefined>(undefined);\r\n const [hubs, setHubs] = useState<Array<Hub> | null>(null);\r\n const isHubContributor = memberService.isHubContributor(member);\r\n const isOrganizationContributor = memberService.isOrganizationContributor(member);\r\n const isLocketgoAdmin = memberService.isLocketgoAdmin(member);\r\n const refreshOn = isLocketgoAdmin ? 60000 : 300000;\r\n const { t } = useTranslation();\r\n\r\n let now = new Date(Date.now());\r\n let roundAt5 = 5 - (now.getMinutes() % 5);\r\n now.setMinutes(now.getMinutes() + roundAt5);\r\n\r\n let startDate = now;\r\n let endDate = new Date(now);\r\n endDate.setDate(endDate.getDate() + 1);\r\n startDate.setDate(startDate.getDate() - 6);\r\n let startInit = DateHelpers.toDateString(startDate, DateHelpers.UserTimeZone);\r\n let endInit = DateHelpers.toDateString(endDate, DateHelpers.UserTimeZone);\r\n\r\n const [currentStartEnd, setCurrentStartEnd] = useState<onDateProps>({\r\n currentStart: startInit,\r\n currentEnd: endInit,\r\n });\r\n const [canApply, setCanApply] = useState<boolean>(true);\r\n\r\n useMemo(async () => {\r\n await hubService\r\n .getHubs()\r\n .then((hubs) => {\r\n setHubs(hubs);\r\n })\r\n .catch(() => {\r\n ToastHelpers.error(t(\"analytic.error\"));\r\n })\r\n .finally(() => setLoading(false));\r\n }, []);\r\n\r\n useMemo(async () => {\r\n if (currentStartEnd) {\r\n await refresh(currentStartEnd.currentStart, currentStartEnd.currentEnd);\r\n }\r\n }, [currentStartEnd]);\r\n\r\n useEffect(() => {\r\n const timeoutId = setInterval(async () => {\r\n if (currentStartEnd) {\r\n await refresh(currentStartEnd.currentStart, currentStartEnd.currentEnd);\r\n }\r\n }, refreshOn);\r\n return () => clearInterval(timeoutId);\r\n }, [currentStartEnd]);\r\n\r\n let dateStringExport = `-${DateHelpers.formatDateEightChar(\r\n new Date(currentStartEnd.currentStart),\r\n DateHelpers.UserTimeZone\r\n )}-${DateHelpers.formatDateEightChar(new Date(currentStartEnd.currentEnd), DateHelpers.UserTimeZone)}`;\r\n\r\n if (loading) {\r\n return <LoadingComponent loading={loading} />;\r\n }\r\n\r\n const hasEvents = model && model.events?.values?.length > 0;\r\n const hasOrgs = model && model.organizations?.values?.length > 0;\r\n const hasHubs = model && model.hubs?.values?.length > 0;\r\n\r\n return (\r\n <div className=\"page dashboard-page\">\r\n {model && (\r\n <div className=\"container\">\r\n <h5>{t(\"analytic.reservation-title\")}</h5>\r\n <SyncButtonComponent\r\n className=\"ms-2 mb-1\"\r\n onClick={async () => await refresh(currentStartEnd?.currentStart, currentStartEnd?.currentEnd)}\r\n />\r\n {isOrganizationContributor && model.organizations && (\r\n <>\r\n <div className=\"section-reservation-detail bg-light shadow rounded-3 border p-3\">\r\n <div className=\"float-end\">\r\n <DateRangeComponent\r\n id={\"dateRangeSelection\"}\r\n default={DateRangeOptions.Week}\r\n onDateChange={onDateChanged}\r\n start={currentStartEnd.currentStart}\r\n end={currentStartEnd.currentEnd}\r\n />\r\n </div>\r\n\r\n <ChartLine\r\n labels={model.organizations.timeline.map((timeline) => timeline.text)}\r\n data={model.organizations.timeline.map((timeline) => timeline.count)}\r\n />\r\n {(hasOrgs || hasEvents || hasHubs) && (\r\n <div className=\"row justify-content-between mt-4\">\r\n <nav>\r\n <ul className=\"nav nav-tabs\" id=\"nav-tab\" role=\"tablist\">\r\n {hasEvents && (\r\n <li className=\"nav-item \">\r\n <button\r\n className=\"nav-link active\"\r\n id=\"nav-events-tab\"\r\n data-bs-toggle=\"tab\"\r\n data-bs-target=\"#nav-events\"\r\n type=\"button\"\r\n role=\"tab\"\r\n aria-controls=\"nav-events\"\r\n aria-selected=\"true\"\r\n >\r\n {t(\"analytic.events\")}\r\n </button>\r\n </li>\r\n )}\r\n {hasOrgs && (\r\n <li className=\"nav-item \">\r\n <button\r\n className={`nav-link ${!hasEvents ? \"active\" : \"\"}`}\r\n id=\"nav-organizations-tab\"\r\n data-bs-toggle=\"tab\"\r\n data-bs-target=\"#nav-organizations\"\r\n type=\"button\"\r\n role=\"tab\"\r\n aria-controls=\"nav-organizations\"\r\n aria-selected={!hasEvents}\r\n >\r\n {t(\"common.organizations\")}\r\n </button>\r\n </li>\r\n )}\r\n {hasHubs && (\r\n <li className=\"nav-item \">\r\n <button\r\n className={`nav-link ${!hasEvents && !hasOrgs ? \"active\" : \"\"}`}\r\n id=\"nav-hubs-tab\"\r\n data-bs-toggle=\"tab\"\r\n data-bs-target=\"#nav-hubs\"\r\n type=\"button\"\r\n role=\"tab\"\r\n aria-controls=\"nav-hubs\"\r\n aria-selected={!hasEvents && !hasOrgs}\r\n >\r\n {t(\"analytic.hubs\")}\r\n </button>\r\n </li>\r\n )}\r\n </ul>\r\n </nav>\r\n <div className=\"tab-content\" id=\"nav-tabContent\">\r\n {hasEvents && (\r\n <div className=\"tab-pane fade show shadow active\" id=\"nav-events\" role=\"tabpanel\" aria-labelledby=\"nav-events-tab\">\r\n <EventStatsTable\r\n title={t(\"analytic.events\")}\r\n isLocketgoAdmin={isLocketgoAdmin}\r\n model={model.events}\r\n microsites={model.microsites}\r\n exportFileName={`ExportEvents${dateStringExport}.csv`}\r\n ></EventStatsTable>\r\n </div>\r\n )}\r\n {hasOrgs && (\r\n <div\r\n className={`tab-pane fade shadow ${!hasEvents ? \"show active\" : \"\"}`}\r\n id=\"nav-organizations\"\r\n role=\"tabpanel\"\r\n aria-labelledby=\"nav-organizations-tab\"\r\n >\r\n <OrderStatsTable\r\n title={t(\"common.organizations\")}\r\n isLocketgoAdmin={isLocketgoAdmin}\r\n model={model.organizations}\r\n exportFileName={`ExportOrganizations${dateStringExport}`}\r\n ></OrderStatsTable>\r\n </div>\r\n )}\r\n {hasHubs && (\r\n <div\r\n className={`tab-pane fade shadow ${!hasEvents && !hasOrgs ? \"show active\" : \"\"}`}\r\n id=\"nav-hubs\"\r\n role=\"tabpanel\"\r\n aria-labelledby=\"nav-hubs-tab\"\r\n >\r\n <OrderStatsTable\r\n title={t(\"analytic.hubs\")}\r\n isLocketgoAdmin={isLocketgoAdmin}\r\n model={model.hubs}\r\n exportFileName={`ExportHubs${dateStringExport}`}\r\n ></OrderStatsTable>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n </>\r\n )}\r\n {isHubContributor && <HubStatsComponent hubs={hubs || undefined} hubUsages={model.hubUsages} />}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n\r\n async function refresh(startDate: string, endDate: string) {\r\n await analyticService\r\n .getDashboard(startDate, endDate)\r\n .then((dashboard) => {\r\n if (dashboard) {\r\n setModel(dashboard);\r\n }\r\n })\r\n .catch(() => {\r\n ToastHelpers.error(t(\"analytic.error\"));\r\n });\r\n }\r\n\r\n function onDateChanged(start: string, end: string) {\r\n if (currentStartEnd.currentStart !== start || currentStartEnd.currentEnd !== end) {\r\n setCurrentStartEnd({ currentStart: start, currentEnd: end });\r\n }\r\n }\r\n}\r\n","import { useEffect, useState } from \"react\";\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { Link, useHistory, useParams } from \"react-router-dom\";\r\nimport { ActionButtonComponent, AddButtonComponent, EditButtonComponent } from \"../../components/button-component\";\r\nimport languageService from \"../../services/core/language-service\";\r\nimport ToastHelpers from \"../../services/core/toast-helpers\";\r\nimport Member from \"../../services/member/member\";\r\nimport MemberRoleOrganization from \"../../services/member/member-role-organization\";\r\nimport memberService from \"../../services/member/member-service\";\r\nimport organizationService from \"../../services/member/organization-service\";\r\nimport Microsite from \"../../services/micro-site/microsite\";\r\n\r\ninterface Props {\r\n member: Member | undefined;\r\n}\r\n\r\ninterface IParamTypes {\r\n organizationId: string;\r\n}\r\n\r\nexport default function MicrositesPage(props: Props) {\r\n const { t } = useTranslation();\r\n const { member } = props;\r\n const language: string = languageService.getLanguage();\r\n const { organizationId } = useParams<IParamTypes>();\r\n\r\n const [microsites, setMicrosites] = useState<Array<Microsite>>([]);\r\n const [currentOrganization, setCurrentOrganization] = useState<MemberRoleOrganization | undefined>(undefined);\r\n\r\n const history = useHistory();\r\n\r\n useEffect(\r\n () => {\r\n if (member) {\r\n let organization = member.associatedOrganizations.find((organization) => organization.entity?.id == organizationId);\r\n if (member && organization && memberService.isOrganizationContributor(member, organizationId)) {\r\n setCurrentOrganization(organization);\r\n organizationService\r\n .getAllMicrositesOfOrganization(organizationId)\r\n .then((microsites) => {\r\n setMicrosites(microsites);\r\n if (!microsites.length && !memberService.isLocketgoAdmin(member)) {\r\n history.push(`/organizations`);\r\n }\r\n })\r\n .catch(() => {\r\n ToastHelpers.error(t(\"micro-site-page.microsites-error\"));\r\n });\r\n }\r\n }\r\n },\r\n // eslint-disable-next-line\r\n [currentOrganization]\r\n );\r\n\r\n return (\r\n <>\r\n {member && currentOrganization && memberService.isOrganizationContributor(member, organizationId) && (\r\n <div className=\"container pt-3 page\">\r\n <div className=\"row\">\r\n <div className=\"col-12 offset-lg-2 col-lg-8\">\r\n <div className=\"page-breadcrumb\">\r\n <ul className=\"breadcrumb\">\r\n <li className=\"breadcrumb-item active\">\r\n <Link to={`/organizations`}>{t(\"common.organizations\")}</Link>\r\n {\" / \"}\r\n <Link to={`/organizations/${organizationId}`}>{currentOrganization?.entity?.name}</Link>\r\n {` / ${t(\"microsites-page.name\")}`}\r\n </li>\r\n </ul>\r\n </div>\r\n <div className=\"header\">\r\n <h1>{`${t(\"microsites-page.title\")}`}</h1>\r\n </div>\r\n <div className=\"card\">\r\n <div className=\"card-body\">\r\n <div className=\"col-12\">\r\n <table className=\"table table-hover row-clikable table-order\">\r\n <thead>\r\n <tr>\r\n <th>{t(\"common.name\")}</th>\r\n <th>\r\n {memberService.isLocketgoAdmin(member) && (\r\n <AddButtonComponent\r\n title={\"Create Microsite\"}\r\n onClick={() => history.push(`/database-admin/microsite/${organizationId}/NEWMICROSITE`)}\r\n ></AddButtonComponent>\r\n )}\r\n </th>\r\n {memberService.isLocketgoAdmin(member) && <th>LOCKETGO ADMIN EDIT</th>}\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {microsites?.map((microsite) => {\r\n const isLocketgoAdmin = memberService.isLocketgoAdmin(member);\r\n const url = `/organizations/${organizationId}/microsites/${microsite.id}/reservationBlocks`;\r\n return (\r\n <tr\r\n key={microsite.id}\r\n onClick={() => {\r\n isLocketgoAdmin ?? history.push(url);\r\n }}\r\n >\r\n <td>{microsite.name.get(language)}</td>\r\n <td>\r\n <ActionButtonComponent\r\n icon={[\"fas\", \"pen\"]}\r\n title={t(\"events-page.events\")}\r\n onClick={() => {\r\n history.push(url);\r\n }}\r\n className=\"btn btn-primary\"\r\n disabled={false}\r\n />\r\n </td>\r\n {isLocketgoAdmin && (\r\n <td>\r\n <ActionButtonComponent\r\n icon={[\"fas\", \"pen\"]}\r\n title={\"Microsite\"}\r\n onClick={() => {\r\n history.push(`/database-admin/microsite/${organizationId}/${microsite.id}`);\r\n }}\r\n className=\"btn btn-primary\"\r\n disabled={false}\r\n />\r\n </td>\r\n )}\r\n </tr>\r\n );\r\n })}\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n </>\r\n );\r\n}\r\n","import { useState, useEffect } from \"react\";\r\nimport { useTranslation } from \"react-i18next\";\r\nimport ToastHelpers from \"../../services/core/toast-helpers\";\r\nimport { Hub } from \"../../services/hub/hub\";\r\nimport hubService from \"../../services/hub/hub-service\";\r\n\r\nexport default function useHubs() {\r\n const { t } = useTranslation();\r\n\r\n const [hubs, setHubs] = useState<Array<Hub>>();\r\n const [loading, setLoading] = useState<boolean>(true);\r\n\r\n useEffect(() => {\r\n function get() {\r\n hubService\r\n .getHubs()\r\n .then((hubs) => {\r\n if (hubs) {\r\n setHubs(hubs);\r\n }\r\n })\r\n .catch(() => {\r\n ToastHelpers.error(t(\"orders-page.error-refresh\"));\r\n })\r\n .finally(() => setLoading(false));\r\n }\r\n\r\n get();\r\n }, [t]);\r\n\r\n return { hubs, isHubsLoading: loading };\r\n}\r\n","import Member from \"../../services/member/member\";\r\nimport MemberRoleOrganization from \"./member-role-organization\";\r\n\r\nexport default class MemberExtensions {\r\n static getMemberRoleOrganization(member: Member, organizationId: string): MemberRoleOrganization | undefined {\r\n return member.associatedOrganizations.find((organization) => organization.entity?.id === organizationId);\r\n }\r\n}\r\n","import { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { useHistory, useParams } from \"react-router-dom\";\r\nimport { EditButtonComponent } from \"../../components/button-component\";\r\nimport LoadingComponent from \"../../components/loading-component\";\r\nimport languageService from \"../../services/core/language-service\";\r\nimport StringHelpers from \"../../services/core/string-helpers\";\r\nimport Microsite from \"../../services/micro-site/microsite\";\r\nimport { MicrositeHelpers } from \"../../services/micro-site/microsite-helpers\";\r\nimport DateHelpers from \"../../services/core/date-helpers\";\r\n\r\ninterface EventsTableProps {\r\n microsite: Microsite | undefined;\r\n isOrgAdmin: boolean;\r\n isLoading: boolean;\r\n}\r\n\r\ninterface IParamTypes {\r\n organizationId: string;\r\n micrositeId: string;\r\n}\r\n\r\nfunction EventsTable(props: EventsTableProps) {\r\n const { microsite, isOrgAdmin, isLoading } = props;\r\n const { organizationId, micrositeId } = useParams<IParamTypes>();\r\n \r\n const { t } = useTranslation();\r\n const language: string = languageService.getLanguage();\r\n const history = useHistory();\r\n\r\n if (microsite?.reservationBlocks.length === 0) {\r\n return <div>{t(\"events-page.no-events\")}</div>;\r\n }\r\n if (microsite?.reservationBlocks[0]) {\r\n microsite.reservationBlocks = microsite.reservationBlocks.sort(\r\n (rb1, rb2) => new Date(rb1.startOn).getTime() - new Date(rb2.startOn).getTime()\r\n );\r\n }\r\n return (\r\n <table className=\"table table-order\">\r\n <thead>\r\n <tr>\r\n <th>{t(\"common.name\")}</th>\r\n <th>{t(\"common.price\")}</th>\r\n <th>{t(\"common.start-on\")}</th>\r\n <th>{t(\"common.duration\")}</th>\r\n <th></th>\r\n {isOrgAdmin && <th></th>}\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {isLoading && (\r\n <tr>\r\n <td colSpan={5} className=\"text-center\">\r\n <LoadingComponent loading={isLoading} />\r\n </td>\r\n </tr>\r\n )}\r\n {!isLoading &&\r\n microsite?.reservationBlocks?.map((reservationBlock) => {\r\n return (\r\n reservationBlock &&\r\n reservationBlock.name.get(language) &&\r\n reservationBlock.active === true && (\r\n <tr key={reservationBlock.id}>\r\n <td>{reservationBlock.name.get(language)}</td>\r\n <td>\r\n {t(\"common.price-format\", {\r\n price: StringHelpers.formatPrice(reservationBlock.price + reservationBlock.price * reservationBlock.saleTaxRate),\r\n currency: microsite.currency,\r\n })}\r\n </td>\r\n <td>\r\n {reservationBlock.startOn && DateHelpers.formatDateTime(new Date(reservationBlock.startOn), DateHelpers.UserTimeZone)}\r\n </td>\r\n <td>{reservationBlock.duration && DateHelpers.formatDuration(reservationBlock.duration)}</td>\r\n <td className=\"text-center\">\r\n <button\r\n className=\"btn btn-primary me-2\"\r\n onClick={(ev) => {\r\n ev.stopPropagation();\r\n history.push(\r\n `/organizations/${organizationId}/microsites/${micrositeId}/reservationBlocks/${reservationBlock.id}/reserve-locker`\r\n );\r\n }}\r\n disabled={MicrositeHelpers.reservationBlockIsPassed(reservationBlock)}\r\n >\r\n {t(\"common.reserve-locker\")}\r\n </button>\r\n </td>\r\n {isOrgAdmin && (\r\n <>\r\n <td className=\"text-center\">\r\n <button\r\n title={t(\"event-page.sales\")}\r\n className=\"btn btn-outline-primary me-2\"\r\n onClick={(ev) => {\r\n ev.stopPropagation();\r\n history.push(\r\n `/organizations/${organizationId}/microsites/${microsite.id}/reservationBlocks/${reservationBlock.id}/sales-report`\r\n );\r\n }}\r\n >\r\n <FontAwesomeIcon icon={[\"fas\", \"file-invoice-dollar\"]}></FontAwesomeIcon>\r\n </button>\r\n <EditButtonComponent\r\n url={`/organizations/${organizationId}/microsites/${microsite.id}/reservationBlocks/${reservationBlock.id}`}\r\n />\r\n </td>\r\n </>\r\n )}\r\n </tr>\r\n )\r\n );\r\n })}\r\n </tbody>\r\n </table>\r\n );\r\n}\r\n\r\nexport default EventsTable;\r\n","import { useTranslation } from \"react-i18next\";\r\nimport LoadingComponent from \"../../components/loading-component\";\r\nimport useHubs from \"../../components/useEffect/useHubs\";\r\nimport Microsite from \"../../services/micro-site/microsite\";\r\n\r\ninterface ZoneProps {\r\n microsite: Microsite | undefined;\r\n isLoading: boolean;\r\n}\r\n\r\nfunction MicrositeZones(props: ZoneProps) {\r\n const { t } = useTranslation();\r\n const { hubs } = useHubs();\r\n\r\n if (!props.microsite || props.microsite.hubIds.length === 0) {\r\n return null;\r\n }\r\n\r\n const matchingHubs = hubs?.filter((h) => {\r\n return props.microsite?.hubIds.includes(h.id) && !h.name;\r\n });\r\n\r\n if (!matchingHubs || matchingHubs.length === 0) {\r\n return null;\r\n }\r\n\r\n return (\r\n <div className=\"card col-4\">\r\n <div className=\"card-header align-items-center\">\r\n <h2>{t(\"events-page.zones\")}</h2>\r\n </div>\r\n\r\n <div className=\"card-body\">\r\n <div className=\"col-12\">\r\n {props.isLoading && <LoadingComponent loading={props.isLoading} />}\r\n {!props.isLoading && (\r\n <ul className=\"\">\r\n {matchingHubs.map((hub) => {\r\n return <li className=\"\">{hub?.zoneName}</li>;\r\n })}\r\n </ul>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nexport default MicrositeZones;\r\n","import { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\r\nimport { useEffect, useMemo, useState } from \"react\";\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { Link, useParams } from \"react-router-dom\";\r\nimport { SyncButtonComponent } from \"../../components/button-component\";\r\nimport HubLocationComponent from \"../../components/hub-location-component\";\r\nimport LoadingComponent from \"../../components/loading-component\";\r\nimport useHubs from \"../../components/useEffect/useHubs\";\r\nimport languageService from \"../../services/core/language-service\";\r\nimport ToastHelpers from \"../../services/core/toast-helpers\";\r\nimport Member from \"../../services/member/member\";\r\nimport MemberExtensions from \"../../services/member/member-extensions\";\r\nimport MemberRoleOrganization from \"../../services/member/member-role-organization\";\r\nimport memberService from \"../../services/member/member-service\";\r\nimport Microsite from \"../../services/micro-site/microsite\";\r\nimport { MicrositeHelpers } from \"../../services/micro-site/microsite-helpers\";\r\nimport micrositeService from \"../../services/micro-site/microsite-service\";\r\nimport EventsTable from \"./events-table\";\r\nimport MicrositeZones from \"./microsite-zones\";\r\n\r\ninterface Props {\r\n member: Member | undefined;\r\n}\r\n\r\ninterface IParamTypes {\r\n organizationId: string;\r\n micrositeId: string;\r\n}\r\n\r\ninterface ZoneProps {\r\n microsite: Microsite | undefined;\r\n isLoading: boolean;\r\n}\r\n\r\nexport default function EventsPage(props: Props) {\r\n const { t } = useTranslation();\r\n const { member } = props;\r\n const { organizationId, micrositeId } = useParams<IParamTypes>();\r\n const language: string = languageService.getLanguage();\r\n\r\n const [microsite, setMicrosite] = useState<Microsite | undefined>();\r\n const [currentOrganization, setCurrentOrganization] = useState<MemberRoleOrganization | undefined>(undefined);\r\n const { hubs, isHubsLoading } = useHubs();\r\n const [loading, setLoading] = useState<boolean>(true);\r\n\r\n const isLoading = useMemo(() => {\r\n return !isHubsLoading && !loading ? false : true;\r\n }, [loading, isHubsLoading]);\r\n\r\n const [isOrgAdmin, setIsOrgAdmin] = useState<boolean>(false);\r\n const [isOrgContributor, setIsOrgContributor] = useState<boolean>(false);\r\n\r\n useEffect(\r\n () => {\r\n refreshEvents();\r\n },\r\n // eslint-disable-next-line\r\n [currentOrganization]\r\n );\r\n\r\n useEffect(\r\n () => {\r\n if (member) {\r\n setIsOrgContributor(memberService.isOrganizationContributor(member, organizationId));\r\n setIsOrgAdmin(memberService.isOrganizationAdmin(member, organizationId));\r\n }\r\n },\r\n // eslint-disable-next-line\r\n [member]\r\n );\r\n\r\n return (\r\n <>\r\n {member && currentOrganization && isOrgContributor && (\r\n <div className=\"container pt-3 page\">\r\n <div className=\"row\">\r\n <div className=\"page-breadcrumb\">\r\n <ul className=\"breadcrumb\">\r\n <li className=\"breadcrumb-item active\">\r\n <Link to={`/organizations`}>{t(\"common.organizations\")}</Link>\r\n {` / `}\r\n <Link to={`/organizations/${organizationId}`}>{currentOrganization?.entity?.name}</Link>\r\n {` / `}\r\n <Link to={`/organizations/${organizationId}/microsites`}>{t(\"microsites-page.name\")}</Link>\r\n {` / ${microsite?.name.get(language)}`}\r\n </li>\r\n </ul>\r\n </div>\r\n\r\n <div className=\"header\">\r\n <h1>{microsite?.name.get(language).toUpperCase()}</h1>\r\n </div>\r\n\r\n <div className=\"card col-6 col-lg-4\">\r\n <div className=\"card-body\">\r\n <h5 className=\"card-title d-flex justify-content-between\">\r\n <span>{t(\"common.hubs\")}</span>\r\n </h5>\r\n <LoadingComponent loading={isHubsLoading} />\r\n {hubs && !isHubsLoading && (\r\n <p className=\"card-text\">\r\n {hubs\r\n .filter((hub) => microsite?.hubIds.includes(hub.id))\r\n .map((hub) => {\r\n return (\r\n <>\r\n <HubLocationComponent hub={hub} />\r\n <br />\r\n </>\r\n );\r\n })}\r\n </p>\r\n )}\r\n </div>\r\n </div>\r\n\r\n <MicrositeZones microsite={microsite} isLoading={isLoading} />\r\n\r\n <div className=\"card\">\r\n <div className=\"card-header align-items-center\">\r\n <h2>{t(\"events-page.events\")}</h2>\r\n </div>\r\n\r\n <div className=\"card-body\">\r\n <div className=\"col-12\">\r\n {isOrgAdmin && (\r\n <Link className=\"btn btn-primary mb-4\" to=\"reservationBlocks/new\">\r\n {t(\"events-page.create-event\")}\r\n </Link>\r\n )}\r\n\r\n <a\r\n title={t(\"orders-page.microsite-reservation-button\")}\r\n className=\"btn btn-outline-primary mb-4 ms-2\"\r\n href={`/sites/${micrositeId}`}\r\n target={\"_blank\"}\r\n rel=\"noreferrer\"\r\n >\r\n <FontAwesomeIcon icon={[\"fas\", \"external-link-square-alt\"]} />\r\n <span> {t(\"orders-page.microsite-reservation-button\")}</span>\r\n </a>\r\n\r\n <SyncButtonComponent className=\"mb-4 ms-2\" onClick={() => refreshEvents()} />\r\n <EventsTable microsite={microsite} isOrgAdmin={isOrgAdmin} isLoading={isLoading} />\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n </>\r\n );\r\n\r\n function refreshEvents() {\r\n if (member) {\r\n let organization = MemberExtensions.getMemberRoleOrganization(member, organizationId);\r\n if (organization && memberService.isOrganizationContributor(member, organizationId)) {\r\n setCurrentOrganization(organization);\r\n micrositeService\r\n .getMicrosite(micrositeId, \"All\")\r\n .then((microsite) => {\r\n if (microsite) {\r\n microsite.reservationBlocks = microsite.reservationBlocks.sort((rb1, rb2) => {\r\n return MicrositeHelpers.compareReservationBlocks(rb1, rb2) * -1;\r\n });\r\n setMicrosite(microsite);\r\n } else ToastHelpers.error(t(\"events-page.events-page-error-refresh\"));\r\n })\r\n .catch((error: any) => {\r\n if (error?.response?.status === 409) {\r\n ToastHelpers.error(t(\"events-page.events-page-error-refresh\"));\r\n } else {\r\n ToastHelpers.error(t(\"common.error-generic\"));\r\n }\r\n })\r\n .finally(() => {\r\n setLoading(false);\r\n });\r\n }\r\n }\r\n }\r\n}\r\n","import React, { useState, useEffect } from \"react\";\r\nimport Microsite from \"../services/micro-site/microsite\";\r\nimport languageService from \"../services/core/language-service\";\r\n\r\ninterface Props {\r\n setTargetMicrosite: Function;\r\n micrositesList: Array<Microsite>;\r\n targetMicrosite: Microsite | undefined;\r\n}\r\n\r\nfunction MicrositeDropdown(props: Props) {\r\n const { setTargetMicrosite, micrositesList, targetMicrosite } = props;\r\n\r\n const language: string = languageService.getLanguage();\r\n const handleMicrositeChange = (event: React.ChangeEvent<HTMLSelectElement>) => {\r\n const selectedMicrosite = micrositesList.find((microsite) => microsite.name.get(language) === event.target.value);\r\n setTargetMicrosite(selectedMicrosite);\r\n };\r\n\r\n return (\r\n <div className=\"d-flex justify-content-center align-items-center bg-light\">\r\n <select onChange={handleMicrositeChange} className=\"form-select\" aria-label=\"Microsite selection\">\r\n {micrositesList.map((microsite) => (\r\n <option key={microsite.id} value={microsite.name.get(language)} selected={targetMicrosite?.id === microsite.id}>\r\n {microsite.name.get(language)}\r\n </option>\r\n ))}\r\n </select>\r\n </div>\r\n );\r\n}\r\n\r\nexport default MicrositeDropdown;\r\n","import { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\r\nimport moment from \"moment\";\r\nimport { useEffect, useState } from \"react\";\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { useHistory, useParams } from \"react-router-dom\";\r\nimport LoadingComponent from \"../../components/loading-component\";\r\nimport { YesNoComponent } from \"../../components/yesno-component\";\r\nimport ToastHelpers from \"../../services/core/toast-helpers\";\r\nimport Member from \"../../services/member/member\";\r\nimport memberService from \"../../services/member/member-service\";\r\nimport micrositeService from \"../../services/micro-site/microsite-service\";\r\nimport useCompartmentSizes from \"../../services/hub/useCompartmentSizes\";\r\nimport { CompartmentSize } from \"../../services/hub/compartmentSize\";\r\nimport languageService from \"../../services/core/language-service\";\r\nimport \"./event-page.scss\";\r\nimport { CodeType, MinimalPrice, PricePerHour, PricePerMinute, ResetTime } from \"../../assets/meta-table-keys\";\r\nimport DateHelpers from \"../../services/core/date-helpers\";\r\nimport organizationService from \"../../services/member/organization-service\";\r\nimport Microsite from \"../../services/micro-site/microsite\";\r\nimport MicrositeDropdown from \"../../components/micrositeDropDown\";\r\nimport { NumberDropDown } from \"../../components/NumberDropdown\";\r\n\r\nenum EventType {\r\n Duration = \"duration\",\r\n StartEnd = \"startend\",\r\n ResetTime = \"resetTime\",\r\n}\r\n\r\ninterface Props {\r\n member: Member | undefined;\r\n}\r\n\r\ninterface IParamTypes {\r\n organizationId: string;\r\n micrositeId: string;\r\n eventId: string;\r\n}\r\n\r\nexport default function EventPage(props: Props) {\r\n const { t } = useTranslation();\r\n const { member } = props;\r\n const { organizationId, micrositeId, eventId } = useParams<IParamTypes>();\r\n const language: string = languageService.getLanguage();\r\n\r\n const { compartmentSizes } = useCompartmentSizes({ onErrorNotificationMessage: t(\"event-page.event-page-error-refresh\") });\r\n const [micrositeCompartmentSizes, setMicrositeCompartmentSizes] = useState<CompartmentSize[] | undefined>(undefined);\r\n const [currency, setCurrency] = useState<string>(\"CAD\");\r\n const [currEventId, setCurrEventId] = useState<string>(eventId);\r\n\r\n const [loading, setLoading] = useState<boolean>(true);\r\n const [isDeleteReservationBlock, setIsDeleteReservationBlock] = useState<boolean>(false);\r\n const [eventAlreadyStarted, setEventAlreadyStarted] = useState<boolean>(false);\r\n\r\n const [nameFrError, setNameFrError] = useState<boolean>(false);\r\n const [nameEnError, setNameEnError] = useState<boolean>(false);\r\n const [priceError, setPriceError] = useState<boolean>(false);\r\n const [saleTaxRateError, setSaleTaxError] = useState<boolean>(false);\r\n const [availableStartError, setAvailableStartError] = useState<string | undefined>(undefined);\r\n const [availableEndError, setAvailableEndError] = useState<string | undefined>(undefined);\r\n const [endOnError, setEndOnError] = useState<string | undefined>(undefined);\r\n const [startOnError, setStartOnError] = useState<string | undefined>(undefined);\r\n\r\n const [nameFr, setNameFr] = useState<string | undefined>(undefined);\r\n const [nameEn, setNameEn] = useState<string | undefined>(undefined);\r\n const [descriptionFr, setDescriptionFr] = useState<string | undefined>(undefined);\r\n const [descriptionEn, setDescriptionEn] = useState<string | undefined>(undefined);\r\n const [logoUrl, setLogoUrl] = useState<string | undefined>(undefined);\r\n const [price, setPrice] = useState<number>(0);\r\n const [pricePerHour, setPricePerHour] = useState<number>(0);\r\n const [pricePerMinute, setPricePerMinute] = useState<number>(0);\r\n const [minimalPrice, setMinimalPrice] = useState<number>(0);\r\n const [saleTaxRate, setSaleTaxRate] = useState<number>(0);\r\n const [startOn, setStartOn] = useState<string | undefined>(undefined);\r\n const [availableStart, setAvailableStart] = useState<string | undefined>(undefined);\r\n const [availableEnd, setAvailableEnd] = useState<string | undefined>(undefined);\r\n const [endOn, setEndOn] = useState<string | undefined>(undefined);\r\n const [sizeId, setSizeId] = useState<string | undefined>(undefined);\r\n const [codeType, setCodeType] = useState<string | undefined>(\"none\");\r\n const [resetTime, setResetTime] = useState<string | undefined>(undefined);\r\n\r\n const [eventType, setEventType] = useState<EventType>(EventType.Duration);\r\n\r\n const [durationError, setDurationError] = useState<boolean>(false);\r\n const [durationDays, setDurationDays] = useState<number>(0);\r\n const [durationHours, setDurationHours] = useState<number>(0);\r\n const [durationMinutes, setDurationMinutes] = useState<number>(0);\r\n\r\n const [isPricedPerHour, setIsPricedPerHour] = useState<boolean>(false);\r\n const [isPricedPerMinute, setIsPricedPerMinute] = useState<boolean>(false);\r\n const [isResetTimeInput, setIsResetTimeInput] = useState<boolean>(true);\r\n const [isFixedPeriod, setIsFixedPeriod] = useState<boolean>(false);\r\n const [micrositesList, setMicrosites] = useState<Array<Microsite>>();\r\n const [targetMicrosite, setTargetMicrosite] = useState<Microsite>();\r\n\r\n const dateTimeNow = () => moment(new Date()).format(\"YYYY-MM-DDTHH:mm\");\r\n\r\n const history = useHistory();\r\n\r\n useEffect(\r\n () => {\r\n if (compartmentSizes.length > 0) {\r\n let organization = member && member.associatedOrganizations.find((organization) => organization.entity?.id === organizationId);\r\n if (member) {\r\n if (organization && memberService.isOrganizationContributor(member, organizationId)) {\r\n micrositeService\r\n .getMicrosite(micrositeId, \"All\")\r\n .then((microsite) => {\r\n if (microsite) {\r\n setCurrency(microsite.currency);\r\n setTargetMicrosite(microsite);\r\n micrositeService\r\n .getMicrositeSizesIds(microsite)\r\n .then((sizeIds) => {\r\n let tmpCompartmentSizes = compartmentSizes.filter((size) => sizeIds.has(size.id));\r\n setMicrositeCompartmentSizes(tmpCompartmentSizes);\r\n })\r\n .catch(() => {\r\n ToastHelpers.error(t(\"event-page.event-page-error-refresh\"));\r\n })\r\n .finally(() => {\r\n setLoading(false);\r\n });\r\n\r\n var reservationBlock = microsite.reservationBlocks.find((rb) => rb.id === currEventId);\r\n\r\n if (reservationBlock && currEventId !== \"new\") {\r\n setNameFr(reservationBlock.name.get(\"fr\"));\r\n setNameEn(reservationBlock.name.get(\"en\"));\r\n setDescriptionFr(reservationBlock.description.get(\"fr\"));\r\n setDescriptionEn(reservationBlock.description.get(\"en\"));\r\n setLogoUrl(reservationBlock.logoUrl);\r\n setPrice(reservationBlock.price);\r\n setSaleTaxRate(reservationBlock.saleTaxRate * 100);\r\n setSizeId(reservationBlock.sizeId);\r\n\r\n let Hours_Minutes = [\"\"];\r\n if (reservationBlock.duration.toString().includes(\".\")) {\r\n let days = reservationBlock.duration.toString().split(\".\");\r\n setDurationDays(parseInt(days[0]));\r\n Hours_Minutes = days[1].split(\":\");\r\n } else Hours_Minutes = reservationBlock.duration.toString().split(\":\");\r\n\r\n setDurationHours(parseInt(Hours_Minutes[0]));\r\n setDurationMinutes(parseInt(Hours_Minutes[1]));\r\n\r\n if (reservationBlock.meta) {\r\n if (reservationBlock.meta[CodeType]) setCodeType(reservationBlock.meta[CodeType]);\r\n if (reservationBlock.meta[MinimalPrice]) setMinimalPrice(parseFloat(reservationBlock.meta[MinimalPrice]));\r\n if (reservationBlock.meta[ResetTime]) {\r\n setResetTime(reservationBlock.meta[ResetTime]);\r\n setEventType(EventType.ResetTime);\r\n }\r\n if (reservationBlock.meta[PricePerHour]) {\r\n setPricePerHour(parseFloat(reservationBlock.meta[PricePerHour]));\r\n // setIsPricedPerHour(true);\r\n }\r\n }\r\n\r\n if (reservationBlock.startOn && reservationBlock.availableEnd) {\r\n setStartOn(moment(new Date(reservationBlock.startOn)).format(\"YYYY-MM-DDTHH:mm\"));\r\n setEndOn(moment(new Date(reservationBlock.availableEnd)).format(\"YYYY-MM-DDTHH:mm\"));\r\n setEventType(EventType.StartEnd);\r\n // setIsResetTimeInput(false);\r\n // setIsDurationInput(false);\r\n }\r\n\r\n //Get the date and put it in the selected options\r\n if (reservationBlock.startOn && reservationBlock.availableEnd && reservationBlock.availableStart) {\r\n setAvailableStart(moment(new Date(reservationBlock.availableStart)).format(\"YYYY-MM-DDTHH:mm\"));\r\n\r\n if (dateTimeNow() > moment(new Date(reservationBlock.startOn)).format(\"YYYY-MM-DDTHH:mm\"))\r\n setEventAlreadyStarted(true);\r\n } else {\r\n if (reservationBlock.availableStart && reservationBlock.availableEnd) {\r\n setIsFixedPeriod(true);\r\n\r\n if (dateTimeNow() > moment(new Date(reservationBlock.availableStart)).format(\"YYYY-MM-DDTHH:mm\"))\r\n setEventAlreadyStarted(true);\r\n\r\n setAvailableStart(moment(new Date(reservationBlock.availableStart)).format(\"YYYY-MM-DDTHH:mm\"));\r\n setAvailableEnd(moment(new Date(reservationBlock.availableEnd)).format(\"YYYY-MM-DDTHH:mm\"));\r\n } //else if (!reservationBlock.startOn) {\r\n // setAvailableStart(undefined);\r\n // setAvailableEnd(undefined);\r\n // }\r\n }\r\n }\r\n }\r\n })\r\n .catch(() => {\r\n ToastHelpers.error(t(\"event-page.event-page-error-refresh\"));\r\n setLoading(false);\r\n });\r\n }\r\n }\r\n }\r\n },\r\n // eslint-disable-next-line\r\n [compartmentSizes]\r\n );\r\n\r\n useEffect(() => {\r\n if (member) {\r\n let organization = member.associatedOrganizations.find((organization) => organization.entity?.id == organizationId);\r\n if (member && organization && memberService.isOrganizationContributor(member, organizationId)) {\r\n organizationService\r\n .getAllMicrositesOfOrganization(organizationId)\r\n .then((microsites) => {\r\n setMicrosites(microsites);\r\n })\r\n .catch(() => {\r\n ToastHelpers.error(t(\"micro-site-page.microsites-error\"));\r\n });\r\n }\r\n }\r\n }, []);\r\n\r\n if (isDeleteReservationBlock) {\r\n return (\r\n <div className=\"container page orders-page\">\r\n <YesNoComponent\r\n headerMsg={t(\"event-page.event-page-msg-delete-reservationBlock\")}\r\n onYesClick={() => deleteReservationBlock()}\r\n onNoClick={setIsDeleteReservationBlock}\r\n />\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"container page orders-page\">\r\n <div className=\"col\">\r\n <LoadingComponent loading={loading} />\r\n\r\n {!loading && (\r\n <form onSubmit={(ev) => ev.preventDefault()}>\r\n <div className=\"row\">\r\n <div className=\"col-12 col-lg-6\">\r\n <div className=\"card\">\r\n <div className=\"card-header align-items-center\">\r\n <div className=\"d-inline-block\">\r\n <h2>{t(\"event-page.event-page-information\")}</h2>\r\n </div>\r\n <button\r\n className=\"btn-close float-end\"\r\n onClick={() => history.push(`/organizations/${organizationId}/microsites/${micrositeId}/reservationBlocks`)}\r\n ></button>\r\n </div>\r\n\r\n <div className=\"card-body\">\r\n {/* Name Fr */}\r\n <div className=\"mb-3\">\r\n <label className=\"form-label\">{t(\"event-page.event-page-create-nameFr\")}</label>\r\n <input\r\n className=\"form-control\"\r\n value={nameFr}\r\n onChange={(ev) => onNameChange(ev.target.value, setNameFr, setNameFrError)}\r\n required\r\n autoFocus={true}\r\n disabled={eventAlreadyStarted}\r\n />\r\n {nameFrError && (\r\n <label className=\"error-msg\" id=\"nameFr-Error-Msg\">\r\n {t(\"event-page.event-page-error-nameFr\")}\r\n </label>\r\n )}\r\n </div>\r\n\r\n {/* Name En */}\r\n <div className=\"mb-3\">\r\n <label className=\"form-label\">{t(\"event-page.event-page-create-nameEn\")}</label>\r\n <input\r\n className=\"form-control\"\r\n value={nameEn}\r\n onChange={(ev) => onNameChange(ev.target.value, setNameEn, setNameEnError)}\r\n required\r\n disabled={eventAlreadyStarted}\r\n />\r\n {nameEnError && (\r\n <label className=\"error-msg\" id=\"nameEn-Error-Msg\">\r\n {t(\"event-page.event-page-error-nameEn\")}\r\n </label>\r\n )}\r\n </div>\r\n\r\n {/* Description Fr */}\r\n <div className=\"mb-3\">\r\n <label className=\"form-label\">{t(\"event-page.event-page-create-descriptionFr\")}</label>\r\n <input\r\n className=\"form-control\"\r\n value={descriptionFr}\r\n onChange={(ev) => setDescriptionFr(ev.target.value)}\r\n disabled={eventAlreadyStarted}\r\n />\r\n </div>\r\n\r\n {/* Description En */}\r\n <div className=\"mb-3\">\r\n <label className=\"form-label\">{t(\"event-page.event-page-create-descriptionEn\")}</label>\r\n <input\r\n className=\"form-control\"\r\n value={descriptionEn}\r\n onChange={(ev) => setDescriptionEn(ev.target.value)}\r\n disabled={eventAlreadyStarted}\r\n />\r\n </div>\r\n\r\n {/* Logo Url */}\r\n <div className=\"mb-3\">\r\n <label className=\"form-label\">{t(\"event-page.event-page-create-logoUrl\")}</label>\r\n <input\r\n className=\"form-control\"\r\n value={logoUrl}\r\n onChange={(ev) => setLogoUrl(ev.target.value)}\r\n disabled={eventAlreadyStarted}\r\n />\r\n </div>\r\n\r\n {/* Sale Tax */}\r\n <div className=\"mb-3\">\r\n <label className=\"form-label\">{t(\"event-page.event-page-create-saleTaxRate\")}</label>\r\n\r\n <div className=\"input-group mb-3\">\r\n <input\r\n type=\"number\"\r\n step=\"0.01\"\r\n className=\"form-control\"\r\n value={saleTaxRate}\r\n onChange={(ev) => onSaleTaxChange(ev.target.value)}\r\n required\r\n disabled={eventAlreadyStarted}\r\n />\r\n\r\n <span className=\"input-group-append input-group-text\">%</span>\r\n </div>\r\n {saleTaxRateError && (\r\n <label className=\"error-msg\" id=\"saleTaxRate-Error-Msg\">\r\n {t(\"event-page.event-page-error-saleTaxRate\")}\r\n </label>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div className=\"col-12 col-lg-6\">\r\n <div className=\"card\">\r\n <div className=\"card-header align-items-center\">\r\n <div className=\"d-inline-block\">\r\n <h2>{t(\"event-page.event-page-rules\")}</h2>\r\n </div>\r\n <button\r\n className=\"btn-close float-end\"\r\n onClick={() => history.push(`/organizations/${organizationId}/microsites/${micrositeId}/reservationBlocks`)}\r\n ></button>\r\n </div>\r\n\r\n <div className=\"card-body\">\r\n {/* Is Priced per hour */}\r\n <div className=\"mb-3\">\r\n <input\r\n type=\"checkbox\"\r\n id=\"isPricedPerHour\"\r\n onChange={() => onChangeIsPricedPerHour(!isPricedPerHour)}\r\n checked={isPricedPerHour}\r\n disabled={eventAlreadyStarted}\r\n />\r\n <label htmlFor=\"isPricedPerHour\" className=\"ms-2\">\r\n {t(\"event-page.event-is-priced-per-hour\")}\r\n </label>\r\n </div>\r\n\r\n {/* Is Priced per minute */}\r\n <div className=\"mb-3\">\r\n <input\r\n type=\"checkbox\"\r\n id=\"isPricedPerMinute\"\r\n onChange={() => onChangeIsPricedPerMinute(!isPricedPerMinute)}\r\n checked={isPricedPerMinute}\r\n disabled={eventAlreadyStarted}\r\n />\r\n <label htmlFor=\"isPricedPerMinute\" className=\"ms-2\">\r\n {t(\"event-page.event-is-priced-per-minute\")}\r\n </label>\r\n </div>\r\n\r\n {/* Code Type */}\r\n <div className=\"mb-3\" id=\"code-type\">\r\n <label htmlFor=\"codeTypeSelect\" className=\"form-label\">\r\n {t(\"event-page.event-page-create-code-type\")}\r\n </label>\r\n <select\r\n id={\"codeTypeSelect\"}\r\n className=\"form-select\"\r\n value={codeType}\r\n onChange={(ev) => setCodeType(ev.target.value)}\r\n >\r\n <option key=\"none\" id=\"none\" value=\"none\">\r\n {t(\"code-type.none\")}\r\n </option>\r\n <option key=\"6-digit\" id=\"6-digit\" value=\"6-digit\">\r\n {t(\"code-type.6-digit\")}\r\n </option>\r\n <option key=\"1-to-4\" id=\"1-to-4\" value=\"1-to-4\">\r\n {t(\"code-type.only-1-to-4\")}\r\n </option>\r\n </select>\r\n </div>\r\n\r\n {/* Price */}\r\n {isPricedPerHour || isPricedPerMinute ? (\r\n <>\r\n {/* Max */}\r\n <div className=\"mb-3\">\r\n <label className=\"form-label\">{t(\"event-page.event-page-create-price-max\")}</label>\r\n <div className=\"input-group\">\r\n <input\r\n type=\"number\"\r\n min=\"0.00\"\r\n step=\"0.01\"\r\n className=\"form-control\"\r\n value={price}\r\n onChange={(ev) => onPriceChange(parseFloat(ev.target.value))}\r\n disabled={eventAlreadyStarted}\r\n required\r\n />\r\n\r\n <span className=\"input-group-append input-group-text\">$ {currency}</span>\r\n {priceError && (\r\n <label className=\"error-msg\" id=\"price-Error-Msg\">\r\n {t(\"event-page.event-page-error-price\")}\r\n </label>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* Min */}\r\n <div className=\"mb-3\">\r\n <label className=\"form-label\">{t(\"event-page.event-page-create-price-min\")}</label>\r\n <div className=\"input-group\">\r\n <input\r\n type=\"number\"\r\n min=\"0.00\"\r\n step=\"0.01\"\r\n className=\"form-control\"\r\n value={minimalPrice}\r\n onChange={(ev) => onPriceChange(parseFloat(ev.target.value), setMinimalPrice)}\r\n disabled={eventAlreadyStarted}\r\n />\r\n\r\n <span className=\"input-group-append input-group-text\">$ {currency}</span>\r\n {priceError && (\r\n <label className=\"error-msg\" id=\"price-Error-Msg\">\r\n {t(\"event-page.event-page-error-price\")}\r\n </label>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {isPricedPerHour && (\r\n <>\r\n {/* Price per hour */}\r\n <div className=\"mb-3\">\r\n <label className=\"form-label\">{t(\"event-page.event-page-create-price-per-hour\")}</label>\r\n <div className=\"input-group\">\r\n <input\r\n type=\"number\"\r\n min=\"0.00\"\r\n step=\"0.01\"\r\n className=\"form-control\"\r\n value={pricePerHour}\r\n onChange={(ev) => onPriceChange(parseFloat(ev.target.value), setPricePerHour)}\r\n disabled={eventAlreadyStarted}\r\n required\r\n />\r\n\r\n <span className=\"input-group-append input-group-text\">$ {currency}/h</span>\r\n {priceError && (\r\n <label className=\"error-msg\" id=\"price-Error-Msg\">\r\n {t(\"event-page.event-page-error-price\")}\r\n </label>\r\n )}\r\n </div>\r\n </div>\r\n </>\r\n )}\r\n\r\n {isPricedPerMinute && (\r\n <>\r\n {/* Price per minute */}\r\n <div className=\"mb-3\">\r\n <label className=\"form-label\">{t(\"event-page.event-page-create-price-per-minute\")}</label>\r\n <div className=\"input-group\">\r\n <input\r\n type=\"number\"\r\n min=\"0.00\"\r\n step=\"0.01\"\r\n className=\"form-control\"\r\n value={pricePerMinute}\r\n onChange={(ev) => onPriceChange(parseFloat(ev.target.value), setPricePerMinute)}\r\n disabled={eventAlreadyStarted}\r\n required\r\n />\r\n\r\n <span className=\"input-group-append input-group-text\">$ {currency}/min</span>\r\n {priceError && (\r\n <label className=\"error-msg\" id=\"price-Error-Msg\">\r\n {t(\"event-page.event-page-error-price\")}\r\n </label>\r\n )}\r\n </div>\r\n </div>\r\n </>\r\n )}\r\n </>\r\n ) : (\r\n <div className=\"mb-3\">\r\n <label className=\"form-label\">{t(\"event-page.event-page-create-price\")}</label>\r\n <div className=\"input-group\">\r\n <input\r\n type=\"number\"\r\n min=\"0.00\"\r\n step=\"0.01\"\r\n className=\"form-control\"\r\n value={price}\r\n onChange={(ev) => onPriceChange(parseFloat(ev.target.value))}\r\n required\r\n disabled={eventAlreadyStarted}\r\n />\r\n\r\n <span className=\"input-group-append input-group-text\">$ {currency}</span>\r\n {priceError && (\r\n <label className=\"error-msg\" id=\"price-Error-Msg\">\r\n {t(\"event-page.event-page-error-price\")}\r\n </label>\r\n )}\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* SizeId */}\r\n <div className=\"mb-3\" id=\"size\">\r\n <label className=\"form-label\">{t(\"event-page.event-page-locker-size\")}</label>\r\n <select\r\n id={\"sizeInfoSelect\"}\r\n className=\"form-select\"\r\n value={sizeId}\r\n disabled={eventAlreadyStarted}\r\n onChange={(ev) => setSizeId(ev.target.value)}\r\n >\r\n <option key=\"Select_a_size\" id=\"Select_a_size\" value=\"Select a size\" hidden>\r\n {t(\"event-page.event-page-no-size-selected\")}\r\n </option>\r\n {micrositeCompartmentSizes &&\r\n micrositeCompartmentSizes.map((compartmentSize: CompartmentSize) => {\r\n return (\r\n <option key={\"sizeOpt_\" + compartmentSize.id} id={\"sizeOpt_\" + compartmentSize.id} value={compartmentSize.id}>\r\n <span>\r\n {compartmentSize?.name.get(language)} - {compartmentSize?.description.get(language)}\r\n </span>\r\n </option>\r\n );\r\n })}\r\n </select>\r\n </div>\r\n\r\n {isPricedPerHour || isPricedPerMinute ? (\r\n <>\r\n <label htmlFor=\"resetTime\">{t(\"event-page.event-page-create-resetting-time\")}</label>\r\n <input\r\n type=\"time\"\r\n id=\"resetTime\"\r\n name=\"resetTime\"\r\n className=\"form-control\"\r\n value={resetTime}\r\n onChange={(ev) => setResetTime(ev.target.value)}\r\n required\r\n />\r\n </>\r\n ) : (\r\n <>\r\n <div className=\"mb-3\">\r\n <div>\r\n <input\r\n type=\"radio\"\r\n id=\"byDuration\"\r\n name=\"reserve\"\r\n value=\"duration\"\r\n checked={eventType === EventType.Duration}\r\n disabled={eventAlreadyStarted}\r\n onChange={() => onEventTypeChange(EventType.Duration)}\r\n />\r\n <label htmlFor=\"byDuration\" className=\"ms-2 me-3\" onClick={() => onEventTypeChange(EventType.Duration)}>\r\n {t(\"event-page.event-page-create-reserveByDuration\")}\r\n </label>\r\n </div>\r\n <div>\r\n <input\r\n type=\"radio\"\r\n id=\"byResetTime\"\r\n name=\"reserve\"\r\n value=\"resetTime\"\r\n checked={eventType === EventType.ResetTime}\r\n disabled={eventAlreadyStarted}\r\n onChange={() => onEventTypeChange(EventType.ResetTime)}\r\n />\r\n <label htmlFor=\"byResetTime\" className=\"ms-2 me-3\" onClick={() => onEventTypeChange(EventType.ResetTime)}>\r\n {t(\"event-page.event-page-create-reserveByResetTime\")}\r\n </label>\r\n </div>\r\n <div>\r\n <input\r\n type=\"radio\"\r\n id=\"byStartEnd\"\r\n name=\"reserve\"\r\n value=\"startend\"\r\n checked={eventType === EventType.StartEnd}\r\n disabled={eventAlreadyStarted}\r\n onChange={() => onEventTypeChange(EventType.StartEnd)}\r\n />\r\n <label htmlFor=\"byStartEnd\" className=\"ms-2\" onClick={() => onEventTypeChange(EventType.StartEnd)}>\r\n {t(\"event-page.event-page-create-reserveByStart-End\")}\r\n </label>\r\n </div>\r\n </div>\r\n\r\n {eventType === EventType.Duration && (\r\n <>\r\n {/*duration*/}\r\n <div className={`ms-4 mb-3 ${eventAlreadyStarted && \"readOnly\"}`} id=\"duration\">\r\n <div>\r\n <span className=\"d-inline-block\">\r\n <label className=\"me-2\">{t(\"event-page.event-page-create-durationDays\")}</label>\r\n <NumberDropDown\r\n id=\"durationDays\"\r\n min={0}\r\n max={366}\r\n current={durationDays}\r\n disabled={eventAlreadyStarted}\r\n onchange={() => onDurationChange(\"durationDays\")}\r\n />\r\n </span>\r\n <span className=\"d-inline-block\">\r\n <label className=\"ms-2 me-2\">{t(\"event-page.event-page-create-durationHours\")}</label>\r\n <NumberDropDown\r\n id=\"durationHours\"\r\n min={0}\r\n max={24}\r\n current={durationHours}\r\n disabled={eventAlreadyStarted}\r\n onchange={() => onDurationChange(\"durationHours\")}\r\n />\r\n </span>\r\n <span className=\"d-inline-block\">\r\n <label className=\"ms-2 me-2\">{t(\"event-page.event-page-create-durationMinutes\")}</label>\r\n <NumberDropDown\r\n id=\"durationMinutes\"\r\n min={0}\r\n max={60}\r\n current={durationMinutes}\r\n disabled={eventAlreadyStarted}\r\n onchange={() => onDurationChange(\"durationMinutes\")}\r\n />\r\n </span>\r\n {durationError && <label className=\"error-msg\">{t(\"event-page.event-page-error-duration\")}</label>}\r\n </div>\r\n </div>\r\n <div className=\"ms-4 mb-3\">\r\n <input\r\n type=\"checkbox\"\r\n id=\"withAvailableStartEnd\"\r\n onChange={() => onFixedPeriod(!isFixedPeriod)}\r\n checked={isFixedPeriod}\r\n disabled={eventAlreadyStarted}\r\n />\r\n <label htmlFor=\"withAvailableStartEnd\" className=\"ms-2\">\r\n {t(\"event-page.event-page-create-checkbox\")}\r\n </label>\r\n </div>\r\n {isFixedPeriod && (\r\n <div className=\"ms-4\">\r\n {/* Available Start */}\r\n <div className=\"mb-3\">\r\n <label className=\"form-label\">{t(\"event-page.event-page-create-availableStart\")}</label>\r\n <input\r\n id=\"availableStartInput\"\r\n type=\"datetime-local\"\r\n className=\"form-control\"\r\n value={availableStart}\r\n onChange={(ev) => onAvailableStartChange(ev.target.value)}\r\n disabled={eventAlreadyStarted}\r\n />\r\n {availableStartError && <label className=\"error-msg\">{t(availableStartError)}</label>}\r\n </div>\r\n\r\n {/* Available End */}\r\n <div className=\"mb-3\">\r\n <label className=\"form-label\">{t(\"event-page.event-page-create-availableEnd\")}</label>\r\n <input\r\n id=\"availableEndInput\"\r\n type=\"datetime-local\"\r\n className=\"form-control\"\r\n value={availableEnd}\r\n onChange={(ev) => onAvailableEndChange(ev.target.value)}\r\n disabled={eventAlreadyStarted}\r\n />\r\n {availableEndError && <label className=\"error-msg\">{t(availableEndError)}</label>}\r\n </div>\r\n </div>\r\n )}\r\n </>\r\n )}\r\n {eventType === EventType.ResetTime && (\r\n <>\r\n <div className=\"ms-4 mb-3\">\r\n {/*Reset Time*/}\r\n <label htmlFor=\"resetTime\">{t(\"event-page.event-page-create-resetting-time\")}</label>\r\n <input\r\n type=\"time\"\r\n id=\"resetTime\"\r\n name=\"resetTime\"\r\n className=\"form-control\"\r\n value={resetTime}\r\n onChange={(ev) => setResetTime(ev.target.value)}\r\n required\r\n />\r\n </div>\r\n <div className=\"ms-4 mb-3\">\r\n <input\r\n type=\"checkbox\"\r\n id=\"withAvailableStartEnd\"\r\n onChange={() => onFixedPeriod(!isFixedPeriod)}\r\n checked={isFixedPeriod}\r\n disabled={eventAlreadyStarted}\r\n />\r\n <label htmlFor=\"withAvailableStartEnd\" className=\"ms-2\">\r\n {t(\"event-page.event-page-create-checkbox\")}\r\n </label>\r\n </div>\r\n {isFixedPeriod && (\r\n <div className=\"ms-4\">\r\n {/* Available Start */}\r\n <div className=\"mb-3\">\r\n <label className=\"form-label\">{t(\"event-page.event-page-create-availableStart\")}</label>\r\n <input\r\n id=\"availableStartInput\"\r\n type=\"datetime-local\"\r\n className=\"form-control\"\r\n value={availableStart}\r\n onChange={(ev) => onAvailableStartChange(ev.target.value)}\r\n disabled={eventAlreadyStarted}\r\n />\r\n {availableStartError && <label className=\"error-msg\">{t(availableStartError)}</label>}\r\n </div>\r\n\r\n {/* Available End */}\r\n <div className=\"mb-3\">\r\n <label className=\"form-label\">{t(\"event-page.event-page-create-availableEnd\")}</label>\r\n <input\r\n id=\"availableEndInput\"\r\n type=\"datetime-local\"\r\n className=\"form-control\"\r\n value={availableEnd}\r\n onChange={(ev) => onAvailableEndChange(ev.target.value)}\r\n disabled={eventAlreadyStarted}\r\n />\r\n\r\n {availableEndError && <label className=\"error-msg\">{t(availableEndError)}</label>}\r\n </div>\r\n </div>\r\n )}\r\n </>\r\n )}\r\n {eventType === EventType.StartEnd && (\r\n <>\r\n <div id=\"datesOnly\">\r\n {/* Start On */}\r\n <div className=\"mb-3\">\r\n <label className=\"form-label\">{t(\"event-page.event-page-create-startOn\")}</label>\r\n <input\r\n id=\"startOnInput\"\r\n type=\"datetime-local\"\r\n className=\"form-control\"\r\n value={startOn}\r\n onChange={(ev) => onStartOnChange(ev.target.value)}\r\n disabled={eventAlreadyStarted}\r\n />\r\n {startOnError && <label className=\"error-msg\">{t(startOnError)}</label>}\r\n </div>\r\n\r\n {/* End On */}\r\n <div className=\"mb-3\">\r\n <label className=\"form-label\">{t(\"event-page.event-page-create-endOn\")}</label>\r\n <input\r\n id=\"EndOnInput\"\r\n type=\"datetime-local\"\r\n className=\"form-control\"\r\n value={endOn}\r\n onChange={(ev) => onEndOnChange(ev.target.value)}\r\n disabled={eventAlreadyStarted}\r\n />\r\n {endOnError && <label className=\"error-msg\">{t(endOnError)}</label>}\r\n </div>\r\n\r\n {/* Available Start */}\r\n <div className=\"mb-3\">\r\n <label className=\"form-label\">{t(\"event-page.event-page-create-availableStart\")}</label>\r\n <input\r\n id=\"availableStartInput\"\r\n type=\"datetime-local\"\r\n className=\"form-control\"\r\n value={availableStart}\r\n onChange={(ev) => onAvailableStartChange(ev.target.value)}\r\n disabled={eventAlreadyStarted}\r\n />\r\n {availableStartError && <label className=\"error-msg\">{t(availableStartError)}</label>}\r\n </div>\r\n </div>\r\n </>\r\n )}\r\n </>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n <div className=\"row\">\r\n <div className=\"col-12\">\r\n <button\r\n className=\"btn btn-md btn-primary\"\r\n type=\"submit\"\r\n onClick={() => createOrUpdateReservationBlock()}\r\n disabled={!isValidData()}\r\n >\r\n {currEventId === \"cloned-event\" || currEventId === \"new\" ? t(\"create-org.create-org\") : t(\"common.save\")}\r\n </button>\r\n\r\n <button\r\n className=\"btn btn-md btn-outline-primary ms-2\"\r\n type=\"submit\"\r\n onClick={() => history.push(`/organizations/${organizationId}/microsites/${micrositeId}/reservationBlocks`)}\r\n >\r\n {t(\"common.cancel\")}\r\n </button>\r\n\r\n {currEventId !== \"new\" && currEventId !== \"cloned-event\" && (\r\n <div className=\"float-end\" style={{ display: \"flex\", flexDirection: \"row\" }}>\r\n <MicrositeDropdown\r\n setTargetMicrosite={setTargetMicrosite}\r\n micrositesList={micrositesList ?? []}\r\n targetMicrosite={targetMicrosite}\r\n />\r\n <button\r\n className={`btn btn-md btn-outline-primary float-end`}\r\n style={{ marginRight: \"20px\", marginLeft: 10 }}\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n setCurrEventId(\"cloned-event\");\r\n var prefix = \"CLONE - \";\r\n setNameFr(prefix + nameFr);\r\n setNameEn(prefix + nameEn);\r\n }}\r\n disabled={false}\r\n >\r\n {t(\"event-page.event-clone\")}\r\n </button>\r\n <button\r\n className={`btn btn-danger float-end`}\r\n style={{ marginLeft: 30 }}\r\n onClick={() => setIsDeleteReservationBlock(true)}\r\n disabled={false}\r\n >\r\n <FontAwesomeIcon icon={[\"fas\", \"trash-alt\"]} /> {t(\"common.delete\")}\r\n </button>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n\r\n function onDurationChange(id: string) {\r\n var select: HTMLSelectElement = document.getElementById(id) as HTMLSelectElement;\r\n\r\n let tmp = parseInt(select.options[select.selectedIndex].value);\r\n\r\n if (id === \"durationDays\") {\r\n setDurationDays(tmp);\r\n } else if (id === \"durationHours\") {\r\n setDurationHours(tmp);\r\n } else if (id === \"durationMinutes\") {\r\n setDurationMinutes(tmp);\r\n }\r\n\r\n if (tmp === 0 || !isDurationValid(tmp)) setDurationError(true);\r\n else setDurationError(false);\r\n }\r\n\r\n function onEventTypeChange(input: EventType) {\r\n if (currEventId === \"new\") {\r\n if (input !== EventType.StartEnd) {\r\n setStartOn(undefined);\r\n setEndOn(undefined);\r\n setAvailableStartError(undefined);\r\n setEndOnError(undefined);\r\n } else {\r\n setAvailableEnd(undefined);\r\n }\r\n setAvailableStart(undefined);\r\n }\r\n\r\n if (input === EventType.Duration) {\r\n setDurationDays(0);\r\n setDurationHours(0);\r\n setDurationMinutes(0);\r\n } else if (input === EventType.ResetTime) {\r\n setResetTime(undefined);\r\n } else {\r\n setStartOn(undefined);\r\n }\r\n\r\n setIsFixedPeriod(false);\r\n setEventType(input);\r\n }\r\n\r\n function isValidData(): boolean {\r\n if (hasError()) return false;\r\n\r\n if (eventAlreadyStarted || !nameFr || !nameEn || isNaN(price) || price < 0 || isNaN(saleTaxRate) || sizeId === undefined) return false;\r\n\r\n if (isPricedPerHour || isPricedPerMinute) {\r\n if (!resetTime) return false;\r\n } else {\r\n switch (eventType) {\r\n case EventType.Duration:\r\n if (!isDurationValid()) return false;\r\n break;\r\n case EventType.ResetTime:\r\n if (!resetTime) return false;\r\n break;\r\n case EventType.StartEnd:\r\n if (!startOn || !endOn) return false;\r\n break;\r\n }\r\n\r\n if (isFixedPeriod && (!availableStart || !availableEnd)) return false;\r\n\r\n if (availableStart && availableEnd) return !(availableStart > availableEnd || dateTimeNow() > availableStart);\r\n\r\n if (startOn && endOn) return !(startOn > endOn || dateTimeNow() > startOn);\r\n }\r\n return true;\r\n }\r\n\r\n function onNameChange(value: string, setValue: Function, setError: Function) {\r\n setValue(value);\r\n if (!value || value.length === 0) {\r\n setError(true);\r\n } else {\r\n setError(false);\r\n }\r\n }\r\n\r\n function onAvailableStartChange(value: string) {\r\n setAvailableStart(value);\r\n if (availableEnd && value) {\r\n if (dateTimeNow() > value) {\r\n setAvailableStartError(\"event-page.event-page-error-availableStart-now\");\r\n } else if (value > availableEnd) {\r\n setAvailableStartError(\"event-page.event-page-error-availableStart-availableEnd\");\r\n } else {\r\n setAvailableStartError(undefined);\r\n }\r\n } else {\r\n setAvailableStartError(undefined);\r\n }\r\n }\r\n\r\n function onAvailableEndChange(value: string) {\r\n setAvailableEnd(value);\r\n if (availableStart && value) {\r\n if (dateTimeNow() > value) {\r\n setAvailableEndError(\"event-page.event-page-error-availableEnd-now\");\r\n } else if (availableStart > value) {\r\n setAvailableEndError(\"event-page.event-page-error-availableStart-availableEnd\");\r\n } else {\r\n setAvailableEndError(undefined);\r\n }\r\n } else {\r\n setAvailableEndError(undefined);\r\n }\r\n }\r\n\r\n function onStartOnChange(value: string) {\r\n setStartOn(value);\r\n if (value && endOn) {\r\n if (dateTimeNow() > value) {\r\n setStartOnError(\"event-page.event-page-error-startOn-now\");\r\n } else if (value > endOn) {\r\n setStartOnError(\"event-page.event-page-error-startOn-endOn\");\r\n } else {\r\n setStartOnError(undefined);\r\n }\r\n } else {\r\n setStartOnError(undefined);\r\n }\r\n }\r\n\r\n function onEndOnChange(value: string) {\r\n setEndOn(value);\r\n setAvailableEnd(value);\r\n if (startOn && value) {\r\n if (dateTimeNow() > value) {\r\n setEndOnError(\"event-page.event-page-error-endOn-now\");\r\n } else if (startOn > value) {\r\n setEndOnError(\"event-page.event-page-error-startOn-endOn\");\r\n } else {\r\n setEndOnError(undefined);\r\n }\r\n } else {\r\n setEndOnError(undefined);\r\n }\r\n }\r\n\r\n function onChangeIsPricedPerHour(value: boolean) {\r\n if (value) {\r\n setIsPricedPerMinute(false);\r\n onEventTypeChange(EventType.ResetTime);\r\n }\r\n\r\n setIsPricedPerHour(value);\r\n }\r\n\r\n function onChangeIsPricedPerMinute(value: boolean) {\r\n if (value) {\r\n setIsPricedPerHour(false);\r\n onEventTypeChange(EventType.ResetTime);\r\n }\r\n\r\n setIsPricedPerMinute(value);\r\n }\r\n\r\n function onPriceChange(value: number, set: (v: number) => void = setPrice) {\r\n set(value);\r\n if (value < 0) {\r\n setPriceError(true);\r\n } else {\r\n setPriceError(false);\r\n }\r\n }\r\n\r\n function onSaleTaxChange(value: string) {\r\n const parsedValue = parseFloat(value);\r\n setSaleTaxRate(parsedValue);\r\n if (parsedValue !== undefined) {\r\n setSaleTaxError(!isValidSaleTax(value));\r\n }\r\n }\r\n\r\n function onFixedPeriod(input: boolean) {\r\n if (isFixedPeriod) {\r\n setAvailableStartError(undefined);\r\n setAvailableEndError(undefined);\r\n if (currEventId === \"new\") {\r\n setAvailableStart(undefined);\r\n setAvailableEnd(undefined);\r\n }\r\n }\r\n setIsFixedPeriod(input);\r\n setAvailableStart(undefined);\r\n setAvailableEnd(undefined);\r\n }\r\n\r\n function createOrUpdateReservationBlock() {\r\n let duration = 86400;\r\n let availableEndValue = availableEnd ?? \"\";\r\n const availableStartValue = availableStart ?? \"\";\r\n const startOnValue = startOn ?? \"\";\r\n const lockerSize = sizeId?.toLowerCase();\r\n const isCodeSpecified = codeType !== \"6-digit\" && codeType !== \"1-to-4\" ? false : true;\r\n\r\n if (sizeId === undefined) return;\r\n\r\n if (endOn && startOn) {\r\n let durationInMilisec = Date.parse(endOn) - Date.parse(startOn);\r\n duration = Math.round(durationInMilisec / 1000);\r\n availableEndValue = endOn;\r\n }\r\n\r\n if (durationDays > 0 || durationHours > 0 || durationMinutes > 0) {\r\n duration = durationDays * 86400 + durationHours * 3600 + durationMinutes * 60;\r\n }\r\n\r\n if (duration > 0) {\r\n let name = { fr: nameFr, en: nameEn };\r\n let description = { fr: descriptionFr, en: descriptionEn };\r\n let availableEnd = availableEndValue !== \"\" ? DateHelpers.toApiDate(new Date(availableEndValue)) : undefined;\r\n let availableStart = availableStartValue !== \"\" ? DateHelpers.toApiDate(new Date(availableStartValue)) : undefined;\r\n let startOn = startOnValue !== \"\" ? DateHelpers.toApiDate(new Date(startOnValue)) : undefined;\r\n let meta: { [key: string]: string | undefined } = {};\r\n\r\n meta[CodeType] = codeType;\r\n meta[ResetTime] = resetTime;\r\n\r\n if (isPricedPerHour || isPricedPerMinute) {\r\n if (isPricedPerHour) {\r\n meta[PricePerHour] = pricePerHour.toString();\r\n } else {\r\n meta[PricePerMinute] = pricePerMinute.toString();\r\n }\r\n meta[MinimalPrice] = minimalPrice.toString();\r\n }\r\n\r\n let data = {\r\n Name: name,\r\n Description: description,\r\n LogoUrl: logoUrl,\r\n Price: price,\r\n SaleTaxRate: saleTaxRate / 100,\r\n StartOn: startOn,\r\n Duration: duration,\r\n AvailableStart: availableStart,\r\n AvailableEnd: availableEnd,\r\n SizeId: lockerSize,\r\n CodeSpecified: isCodeSpecified,\r\n Meta: meta,\r\n };\r\n\r\n if (currEventId === \"new\" || currEventId === \"cloned-event\") createEvent(data);\r\n else updateEvent(data);\r\n }\r\n }\r\n\r\n function updateEvent(data: any) {\r\n data[\"Id\"] = currEventId;\r\n\r\n micrositeService\r\n .updateReservationBlock(organizationId, micrositeId, data)\r\n .then(() => {\r\n history.push(`/organizations/${organizationId}/microsites/${micrositeId}/reservationBlocks`);\r\n })\r\n .catch((error: any) => {\r\n if (error?.response?.status === 409) {\r\n ToastHelpers.error(t(\"event-page.event-page-error-update-reservationBlock\"));\r\n } else {\r\n ToastHelpers.error(t(\"common.error-generic\"));\r\n }\r\n });\r\n }\r\n\r\n function createEvent(data: any) {\r\n data[\"MicrositeId\"] = targetMicrosite?.id;\r\n data.Active = true;\r\n\r\n micrositeService\r\n .createReservationBlock(organizationId, data)\r\n .then(() => {\r\n if (targetMicrosite?.id) {\r\n return history.push(`/organizations/${organizationId}/microsites/${targetMicrosite?.id}/reservationBlocks`);\r\n }\r\n })\r\n .catch((error: any) => {\r\n if (error?.response?.status === 409) {\r\n ToastHelpers.error(t(\"event-page.event-page-error-create-reservationBlock\"));\r\n } else {\r\n ToastHelpers.error(t(\"common.error-generic\"));\r\n }\r\n });\r\n }\r\n\r\n function deleteReservationBlock() {\r\n if (organizationId && currEventId !== \"new\") {\r\n setIsDeleteReservationBlock(false);\r\n micrositeService\r\n .deleteReservationBlock(organizationId, micrositeId, currEventId)\r\n .then(() => {\r\n return history.push(`/organizations/${organizationId}/microsites/${micrositeId}/reservationBlocks`);\r\n })\r\n .catch((error: any) => {\r\n if (error?.response?.status === 409) {\r\n ToastHelpers.error(t(\"event-page.event-page-error-delete-reservationBlock\"));\r\n } else {\r\n ToastHelpers.error(t(\"common.error-generic\"));\r\n }\r\n });\r\n }\r\n }\r\n\r\n function hasError() {\r\n return (\r\n nameFrError ||\r\n nameEnError ||\r\n priceError ||\r\n durationError ||\r\n availableEndError ||\r\n availableStartError ||\r\n endOnError ||\r\n saleTaxRateError\r\n );\r\n }\r\n\r\n function isDurationValid(tmp: number = 0) {\r\n return (\r\n tmp !== 0 ||\r\n (durationDays && durationDays >= 0) ||\r\n (durationHours && durationHours >= 0) ||\r\n (durationMinutes && durationMinutes >= 0) ||\r\n (isFixedPeriod && (!availableStart || !availableEnd))\r\n );\r\n }\r\n}\r\n\r\nfunction isValidSaleTax(value: string): boolean {\r\n const regex = new RegExp(/^[0-9]{1,2}$|^[0-9]{1,2}\\.[0-9]{1,3}$/);\r\n return regex.test(value);\r\n}\r\n","interface NumberDropdownProps {\r\n id: string | undefined;\r\n min: number;\r\n max: number;\r\n current: number;\r\n disabled: boolean;\r\n onchange: Function;\r\n}\r\nexport function NumberDropDown(props: NumberDropdownProps) {\r\n return (\r\n <select\r\n id={props.id}\r\n value={props.current}\r\n style={{ width: \"auto\" }}\r\n className=\"form-select d-inline\"\r\n disabled={props.disabled}\r\n onChange={() => props.onchange(props.id)}\r\n >\r\n {Array.from(new Array(props.max), (x, i) => i + props.min).map((i) => {\r\n return (\r\n <option key={\"dropDownOpt\" + i} id={\"dropDownOpt\" + i} value={i}>\r\n {i}\r\n </option>\r\n );\r\n })}\r\n </select>\r\n );\r\n}\r\n","import { useTranslation } from \"react-i18next\";\r\nimport StringHelpers from \"../../services/core/string-helpers\";\r\n\r\ntype Props = {\r\n value: string;\r\n setValue: Function;\r\n msgError: string | undefined;\r\n onMsgErrorChanged: Function;\r\n required?: boolean | undefined;\r\n};\r\n\r\nexport function EmailFormComponent(props: Props) {\r\n const { t } = useTranslation();\r\n const type = \"tel\";\r\n const error = t(\"input-component.error-email\");\r\n\r\n return (\r\n <>\r\n <div className=\"mb-3\">\r\n <label className=\"form-label\">\r\n {t(\"member-profile.email\")}\r\n {props.required && \"*\"}\r\n </label>\r\n <input\r\n className=\"form-control\"\r\n type={type}\r\n value={props.value}\r\n placeholder={t(\"input-component.placeholder-email\")}\r\n onChange={(ev) => validate(ev.target.value)}\r\n required={props.required}\r\n />\r\n {props.msgError && <label className=\"error-msg\">{props.msgError}</label>}\r\n </div>\r\n </>\r\n );\r\n\r\n function validate(value: string) {\r\n props.setValue(value);\r\n\r\n if (isValid(value)) {\r\n props.onMsgErrorChanged(undefined);\r\n } else {\r\n props.onMsgErrorChanged(error);\r\n }\r\n }\r\n\r\n function isValid(value: string) {\r\n let valid: boolean = StringHelpers.getEmailRegExp().test(value);\r\n\r\n if (props.required && valid) return true;\r\n\r\n if (!props.required && (valid || value.length === 0)) return true;\r\n\r\n return false;\r\n }\r\n}\r\n","import { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\r\nimport moment from \"moment\";\r\nimport { useState, useEffect, useMemo } from \"react\";\r\nimport { Trans, useTranslation } from \"react-i18next\";\r\nimport { useHistory, useParams } from \"react-router-dom\";\r\nimport { EmailFormComponent } from \"../../components/customer-information-components/email-component\";\r\nimport { FirstNameComponent } from \"../../components/customer-information-components/firstname-component\";\r\nimport { LastNameComponent } from \"../../components/customer-information-components/lastname-components\";\r\nimport { PhoneFormComponent } from \"../../components/customer-information-components/phone-component\";\r\nimport LoadingComponent from \"../../components/loading-component\";\r\nimport useHubs from \"../../components/useEffect/useHubs\";\r\nimport languageService from \"../../services/core/language-service\";\r\nimport ToastHelpers from \"../../services/core/toast-helpers\";\r\nimport Member from \"../../services/member/member\";\r\nimport Microsite from \"../../services/micro-site/microsite\";\r\nimport micrositeService from \"../../services/micro-site/microsite-service\";\r\nimport ReservationBlock from \"../../services/micro-site/reservationBlock\";\r\nimport \"./reserve-locker.scss\";\r\nimport { InputComponent } from \"../../components/input\";\r\nimport DateHelpers from \"../../services/core/date-helpers\";\r\nimport { ResetTime } from \"../../assets/meta-table-keys\";\r\n\r\ntype Props = {\r\n member: Member;\r\n setNoConnection: any;\r\n};\r\n\r\ninterface IParamTypes {\r\n micrositeId: string;\r\n reservationBlockId: string;\r\n}\r\n\r\nexport default function ContributorReserveLockerPage(props: Props) {\r\n const { t } = useTranslation();\r\n const history = useHistory();\r\n const language: string = languageService.getLanguage();\r\n\r\n const { micrositeId, reservationBlockId } = useParams<IParamTypes>();\r\n const { member, setNoConnection } = props;\r\n const { hubs, isHubsLoading } = useHubs();\r\n const [reservationBlock, setReservationBlock] = useState<ReservationBlock | null>();\r\n const [organisationId, setOrganisationId] = useState<String>(\"\");\r\n\r\n const [phone, setPhone] = useState<string>(\"\");\r\n const [email, setEmail] = useState<string>(\"\");\r\n const [firstname, setFirstname] = useState<string>(\"\");\r\n const [lastname, setLastname] = useState<string>(\"\");\r\n const [referenceNumber, setReferenceNumber] = useState<string>(\"\");\r\n const [emailError, setEmailError] = useState<string | undefined>(undefined);\r\n const [firstnameError, setFirstnameError] = useState<string | undefined>(undefined);\r\n const [lastnameError, setLastnameError] = useState<string | undefined>(undefined);\r\n const [phoneError, setPhoneError] = useState<string>();\r\n\r\n const [code, setCode] = useState<string>(\"\");\r\n const [codeError, setCodeError] = useState<string | undefined>(undefined);\r\n\r\n const [microsite, setMicrosite] = useState<Microsite>();\r\n\r\n const [loading, setLoading] = useState<boolean>(true);\r\n\r\n const isLoading = useMemo(() => {\r\n return !isHubsLoading && !loading ? false : true;\r\n }, [loading, isHubsLoading]);\r\n\r\n //const showSms = microsite?.countryCode.toLocaleLowerCase() === \"ca\";\r\n const showSms = true;\r\n\r\n useEffect(() => {\r\n //Gather the microsite and reservation block requested\r\n micrositeService.getMicrosite(micrositeId).then((microsite: Microsite | undefined) => {\r\n if (microsite) {\r\n setMicrosite(microsite);\r\n setOrganisationId(microsite.organizationId);\r\n\r\n const reservationBlock = microsite.reservationBlocks.find((rb) => rb.id === reservationBlockId);\r\n if (reservationBlock) {\r\n setReservationBlock(reservationBlock);\r\n setLoading(false);\r\n }\r\n }\r\n });\r\n }, [micrositeId, reservationBlockId, member]);\r\n\r\n if (isLoading) {\r\n return <LoadingComponent loading={isLoading} />;\r\n }\r\n\r\n if (!reservationBlock) {\r\n return (\r\n <div className=\"container page reerve-locker-page\">\r\n <div className=\"col col-lg-6 offset-lg-3\">\r\n <div className=\"card\">{!reservationBlock && <div>{t(\"micro-site-reserve-locker.no-reservation-block\")}</div>}</div>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n const until = reservationBlock ? moment(reservationBlock.startOn).add(reservationBlock.duration, \"seconds\").toDate() : new Date();\r\n\r\n return (\r\n <div className=\"container page reserve-locker-page\">\r\n <div className=\"card\">\r\n <div className=\"card-header align-items-center\">\r\n <div className=\"d-inline-block\">\r\n {reservationBlock?.logoUrl && <img src={reservationBlock?.logoUrl} alt=\"\" className=\"img-logo\" />}\r\n <h2 className=\"mt-2\"> {reservationBlock?.name.get(language)}</h2>\r\n </div>\r\n <button\r\n className=\"btn-close float-end\"\r\n onClick={() => {\r\n history.push(`/organizations/${organisationId}/microsites/${micrositeId}/reservationBlocks`);\r\n }}\r\n ></button>\r\n </div>\r\n\r\n <div className=\"card-body\">\r\n <p className=\"mb-4\">\r\n {hubs?.every((hub) => hub.state !== \"Online\" || !microsite?.hubIds.includes(hub.id)) && (\r\n <>\r\n <span className=\"text-danger\">\r\n <FontAwesomeIcon icon={[\"fas\", \"exclamation-triangle\"]} className=\"me-2\" />\r\n {t(\"contributor-reserve-locker-page.no-hub-online\")}\r\n </span>\r\n <br />\r\n </>\r\n )}\r\n {reservationBlock.description.get(language)}\r\n <br />\r\n {reservationBlock.startOn && (\r\n <Trans\r\n i18nKey=\"micro-site-page.locker-available\"\r\n values={{\r\n start: DateHelpers.formatDateTime(new Date(reservationBlock.startOn), DateHelpers.UserTimeZone),\r\n end: DateHelpers.formatDateTime(until, DateHelpers.UserTimeZone),\r\n }}\r\n />\r\n )}\r\n {!reservationBlock.startOn && (\r\n <Trans\r\n i18nKey=\"micro-site-page.locker-available-now\"\r\n values={{ duration: DateHelpers.formatDuration(reservationBlock.duration) }}\r\n />\r\n )}\r\n </p>\r\n\r\n <>\r\n <p>{t(\"contributor-reserve-locker-page.msg-fill-info\")}</p>\r\n\r\n <div className=\"row\">\r\n <div className=\"col-12 col-lg-8\">\r\n <form onSubmit={(ev) => ev.preventDefault()}>\r\n <div className=\"mb-4\">\r\n <EmailFormComponent\r\n value={email}\r\n setValue={setEmail}\r\n msgError={emailError}\r\n onMsgErrorChanged={setEmailError}\r\n ></EmailFormComponent>\r\n\r\n <FirstNameComponent\r\n value={firstname}\r\n setValue={setFirstname}\r\n msgError={firstnameError}\r\n onMsgErrorChanged={setFirstnameError}\r\n ></FirstNameComponent>\r\n <LastNameComponent\r\n value={lastname}\r\n setValue={setLastname}\r\n msgError={lastnameError}\r\n onMsgErrorChanged={setLastnameError}\r\n ></LastNameComponent>\r\n {showSms && (\r\n <PhoneFormComponent\r\n value={phone}\r\n setValue={setPhone}\r\n onMsgErrorChanged={setPhoneError}\r\n msgError={phoneError}\r\n label={t(\"common.phone\")}\r\n />\r\n )}\r\n\r\n <div className=\"mb-3\">\r\n <label className=\"form-label\">{t(\"contributor-reserve-locker-page.reference-number\")}</label>\r\n <input\r\n className=\"form-control\"\r\n type=\"text\"\r\n value={referenceNumber}\r\n onChange={(ev) => setReferenceNumber(ev.target.value)}\r\n />\r\n </div>\r\n {reservationBlock.codeSpecified && (\r\n <InputComponent\r\n labelText={t(\"input-component.code-label\")}\r\n type=\"code-sl5c\"\r\n value={code}\r\n setValue={setCode}\r\n msgError={codeError}\r\n onMsgErrorChanged={setCodeError}\r\n required={true}\r\n regExp={/^[1-4]{6}$/}\r\n />\r\n )}\r\n </div>\r\n <button onClick={() => CreateOrder()} className=\"btn btn-primary\" disabled={!canCreateOrder()}>\r\n {t(\"common.reserve-locker\")}\r\n </button>\r\n </form>\r\n </div>\r\n </div>\r\n </>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n\r\n function canCreateOrder(): boolean {\r\n return !!(\r\n !emailError &&\r\n !phoneError &&\r\n !lastnameError &&\r\n !firstnameError &&\r\n (email !== \"\" || phone !== \"\" || referenceNumber !== \"\") &&\r\n !codeError &&\r\n (code !== \"\" || !reservationBlock?.codeSpecified)\r\n );\r\n }\r\n\r\n function CreateOrder() {\r\n if (reservationBlock) {\r\n setLoading(true);\r\n\r\n let end = undefined;\r\n if (reservationBlock.meta?.[ResetTime]) {\r\n let date = DateHelpers.getNextDayWithTime(reservationBlock.meta[ResetTime], DateHelpers.UserTimeZone);\r\n end = DateHelpers.toApiDate(date);\r\n }\r\n\r\n micrositeService\r\n .createOrder(micrositeId, reservationBlock.id, true, phone, email, firstname, lastname, referenceNumber, code, language, end, true)\r\n .then((orderId) => {\r\n if (orderId) {\r\n history.push(`/orders/${orderId}`);\r\n } else {\r\n ToastHelpers.error(t(\"create-order-page.error-conflict\"));\r\n }\r\n })\r\n .catch(() => {\r\n setNoConnection(true);\r\n ToastHelpers.error(t(\"create-order-page.error-conflict\"));\r\n })\r\n .finally(() => {\r\n setLoading(false);\r\n });\r\n }\r\n }\r\n}\r\n","import { useEffect, useState } from \"react\";\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { Link, useHistory, useParams } from \"react-router-dom\";\r\nimport LoadingComponent from \"../../components/loading-component\";\r\nimport languageService from \"../../services/core/language-service\";\r\nimport ToastHelpers from \"../../services/core/toast-helpers\";\r\nimport { CompartmentSize } from \"../../services/hub/compartmentSize\";\r\nimport compartmentSizeService from \"../../services/hub/compartmentSize-service\";\r\nimport { HubHelpers } from \"../../services/hub/hub-helper\";\r\nimport hubService from \"../../services/hub/hub-service\";\r\nimport Member from \"../../services/member/member\";\r\nimport memberService from \"../../services/member/member-service\";\r\nimport organizationService from \"../../services/member/organization-service\";\r\nimport { Order } from \"../../services/order/order\";\r\nimport orderService from \"../../services/order/order-service\";\r\nimport { Reservation } from \"../../services/order/reservation\";\r\nimport { ReservationState } from \"../../services/order/ReservationState\";\r\n\r\ninterface relocatePage {\r\n organizationId: string | undefined;\r\n member: Member;\r\n}\r\n\r\ninterface IParamTypes {\r\n orderId: string;\r\n itemId: string;\r\n}\r\n\r\nexport default function RelocatePage(props: relocatePage) {\r\n const { organizationId, member } = props;\r\n const { orderId, itemId } = useParams<IParamTypes>();\r\n\r\n const [compartmentSizes, setCompartmentSizes] = useState<CompartmentSize[]>();\r\n const [currentCompartmentSize, setCurrentCompartmentSize] = useState<CompartmentSize>();\r\n const [compartmentState, setCompartmentState] = useState<string>();\r\n const [reservation, setReservation] = useState<Reservation | undefined>();\r\n const [sizeId, setSizeId] = useState<string>();\r\n const [availableSizeIds, setAvailableSizeIds] = useState<Array<string>>();\r\n\r\n const [loading, setLoading] = useState<boolean>(true);\r\n const [isUpdating, setIsUpdating] = useState<boolean>(false);\r\n\r\n const [isOrgContributor, setIsOrgContributor] = useState<boolean>(false);\r\n\r\n const language: string = languageService.getLanguage();\r\n\r\n const history = useHistory();\r\n\r\n const { t } = useTranslation();\r\n\r\n useEffect(() => {\r\n if (!organizationId) {\r\n return;\r\n }\r\n\r\n orderService.getOrderById(organizationId, orderId).then(async (order: Order | null) => {\r\n const orderItem = order?.items.find((orderItem) => orderItem.id === itemId);\r\n const reservation = orderItem?.reservation;\r\n if (!reservation || !order?.hubId) {\r\n return;\r\n }\r\n\r\n const hub = await hubService.getHubById(order.hubId);\r\n const currentCompartment = HubHelpers.findCompartment(hub, reservation);\r\n const sizeId = currentCompartment?.sizeId;\r\n\r\n setCompartmentState(reservation.state);\r\n setReservation(reservation);\r\n\r\n await orderService\r\n .getAvailableCompartmentSizeIds(organizationId, hub.id, order.flow, reservation.start, reservation.end)\r\n .then(async (compartmentSizeIds) => {\r\n if (sizeId && compartmentSizeIds.includes(sizeId)) {\r\n setSizeId(sizeId);\r\n }\r\n\r\n setAvailableSizeIds(compartmentSizeIds);\r\n\r\n const compartmentSizes = await compartmentSizeService.getCompartmentSizes();\r\n const organization = await organizationService.getOrganizationById(organizationId);\r\n\r\n const compartmentSizeIdsOfHubsCandidates = organization?.associatedHubs?.map(async (hub) => {\r\n return await hubService.getHubById(hub.hubId).then((hub) => {\r\n return HubHelpers.getCompartmentSizeIds(hub);\r\n });\r\n });\r\n\r\n const compartmentSizesOfHubs = compartmentSizes?.filter((size) =>\r\n compartmentSizeIdsOfHubsCandidates?.some((c) => c.then((c) => c.has(size.id)))\r\n );\r\n\r\n setCompartmentSizes(compartmentSizesOfHubs);\r\n setCurrentCompartmentSize(compartmentSizes.find((cs) => cs.id === sizeId));\r\n })\r\n .finally(() => setLoading(false));\r\n });\r\n }, [organizationId]);\r\n\r\n useEffect(() => setIsOrgContributor(memberService.isOrganizationContributor(member, organizationId)), [member]);\r\n\r\n return (\r\n <div className=\"container pt-3 page\">\r\n <div className=\"row\">\r\n <div className=\"page-breadcrumb\">\r\n <ul className=\"breadcrumb\">\r\n <li className=\"breadcrumb-item active\">\r\n <Link to={`/orders`}>{t(\"order-page.orderlink\")}</Link>\r\n {` / `}\r\n <Link to={`/orders/${orderId}`}>{orderId}</Link>\r\n {` / `}\r\n {t(\"order-page.relocate\")}\r\n </li>\r\n </ul>\r\n </div>\r\n\r\n <LoadingComponent loading={loading || isUpdating} />\r\n\r\n {!loading && isOrgContributor && (\r\n <>\r\n <div className=\"page-background-boxing shadow\">\r\n <div className=\"header\">\r\n <h1>\r\n <div>\r\n {t(\"order-page.relocate\")} #{orderId}{\" \"}\r\n <button\r\n className=\"btn-close h5 float-end mb-0\"\r\n onClick={() => history.push(`/orders/${orderId}`)}\r\n disabled={loading || isUpdating}\r\n ></button>\r\n </div>\r\n </h1>\r\n </div>\r\n\r\n <div className=\"card\">\r\n <div className=\"card-header align-items-center\">\r\n <h2>{t(\"relocate-page.locker-reservation\")}</h2>\r\n </div>\r\n\r\n <div className=\"card-body\">\r\n <div className=\"col-12\">\r\n <table className=\"table table-hover row-clikable table-order\">\r\n <thead>\r\n <tr>\r\n <th>{t(\"order-page-table-header.locker\")}</th>\r\n <th>{t(\"order-page-table-header.size\")}</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr>\r\n <td>\r\n {reservation?.groupId}\r\n {reservation?.compartmentNumber}\r\n </td>\r\n <td>\r\n {currentCompartmentSize?.name.get(language)} {currentCompartmentSize?.description.get(language)}\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div className=\"card\">\r\n <div className=\"card-header align-items-center\">\r\n <h2>{t(\"relocate-page.size-title\")}</h2>\r\n </div>\r\n\r\n <div className=\"card-body\">\r\n <div className=\"col-12\">\r\n {availableSizeIds && availableSizeIds?.length > 0 ? (\r\n <>\r\n {compartmentSizes?.map((compartmentSize) => {\r\n return (\r\n <div className=\"clickable\">\r\n <input\r\n type=\"radio\"\r\n id={compartmentSize.id}\r\n name={compartmentSize.name.get(language)}\r\n value={compartmentSize.id}\r\n checked={compartmentSize.id === sizeId}\r\n onChange={() => setSizeId(compartmentSize.id)}\r\n disabled={\r\n !availableSizeIds?.includes(compartmentSize.id) || compartmentState === ReservationState.Completed\r\n }\r\n />\r\n <label htmlFor={compartmentSize.id} className=\"ms-2 me-3\">\r\n {compartmentSize.name.get(language)} {compartmentSize.description.get(language)}\r\n </label>\r\n <hr></hr>\r\n </div>\r\n );\r\n })}\r\n </>\r\n ) : (\r\n <>\r\n <span>{t(\"relocate-page.no-lockers-available\")}</span>\r\n <br />\r\n </>\r\n )}\r\n\r\n <br />\r\n <button\r\n type=\"submit\"\r\n className=\"btn btn-primary\"\r\n onClick={async () => await relocateLocker()}\r\n disabled={saveDisabled()}\r\n >\r\n {t(\"relocate-page.save-button\")}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n\r\n function saveDisabled(): boolean {\r\n return !sizeId || isUpdating || compartmentState === ReservationState.Completed || !availableSizeIds?.includes(sizeId);\r\n }\r\n\r\n async function relocateLocker() {\r\n if (organizationId && sizeId && compartmentState !== ReservationState.Completed && reservation) {\r\n setIsUpdating(true);\r\n\r\n try {\r\n await orderService.relocateReservation(organizationId, orderId, itemId, sizeId, reservation.start, reservation.end);\r\n\r\n if (compartmentState !== ReservationState.New) {\r\n await orderService.sendReadyForPickupNotification(organizationId, orderId).catch(() => {\r\n ToastHelpers.error(t(\"relocate-page.error-while-sending-notification\"));\r\n });\r\n }\r\n } catch (e) {\r\n ToastHelpers.error(t(\"common.error-generic\"));\r\n } finally {\r\n history.push(`/orders/${orderId}`);\r\n setIsUpdating(false);\r\n }\r\n }\r\n }\r\n}\r\n","import { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\r\nimport \"../dashboard/dashboard-page.scss\";\r\nimport { useEffect, useMemo, useState } from \"react\";\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { Link, useHistory, useParams } from \"react-router-dom\";\r\nimport LoadingComponent from \"../../components/loading-component\";\r\nimport useHubs from \"../../components/useEffect/useHubs\";\r\nimport useMicrosite from \"../../components/useEffect/useMicrosite\";\r\nimport languageService from \"../../services/core/language-service\";\r\nimport StringHelpers from \"../../services/core/string-helpers\";\r\nimport ToastHelpers from \"../../services/core/toast-helpers\";\r\nimport Member from \"../../services/member/member\";\r\nimport MemberExtensions from \"../../services/member/member-extensions\";\r\nimport MemberRoleOrganization from \"../../services/member/member-role-organization\";\r\nimport micrositeService from \"../../services/micro-site/microsite-service\";\r\nimport ReservationBlock from \"../../services/micro-site/reservationBlock\";\r\nimport { Order } from \"../../services/order/order\";\r\nimport { Hub } from \"../../services/hub/hub\";\r\nimport { HubHelpers } from \"../../services/hub/hub-helper\";\r\nimport { ExportButton } from \"../../components/button-component\";\r\nimport DateHelpers from \"../../services/core/date-helpers\";\r\n\r\nclass EventSalesReport {\r\n nbLockers: number = 0;\r\n nbLockersSold: number = 0;\r\n grossRevenue: number = 0;\r\n fees: number = 0;\r\n orders: Array<Order> = [];\r\n}\r\n\r\ninterface IParamTypes {\r\n organizationId: string;\r\n micrositeId: string;\r\n eventId: string;\r\n}\r\n\r\ninterface Props {\r\n member: Member;\r\n}\r\n\r\nexport default function EventSettlementReportPage(props: Props) {\r\n const language: string = languageService.getLanguage();\r\n const history = useHistory();\r\n const { t } = useTranslation();\r\n\r\n const { organizationId, micrositeId, eventId } = useParams<IParamTypes>();\r\n const { member } = props;\r\n\r\n const [loading, setLoading] = useState<boolean>(true);\r\n\r\n const { microsite, isMicrositeLoading } = useMicrosite(micrositeId);\r\n const { hubs, isHubsLoading } = useHubs();\r\n const [salesReport, setSalesReport] = useState<EventSalesReport>(new EventSalesReport());\r\n const [currentOrganization, setCurrentOrganization] = useState<MemberRoleOrganization | undefined>(undefined);\r\n const [lockerSold, setLockerSold] = useState<string | number>();\r\n const [netRevenue, setNetRevenue] = useState<number>(0);\r\n const [feesPerOrder, setFeesPerOrder] = useState<number>(0);\r\n\r\n const event: ReservationBlock | undefined = useMemo(() => {\r\n if (microsite) {\r\n return microsite.reservationBlocks.find((rb) => rb.id === eventId);\r\n }\r\n return undefined;\r\n }, [microsite, eventId]);\r\n\r\n useEffect(() => {\r\n setNetRevenue(salesReport.grossRevenue - salesReport.fees);\r\n setFeesPerOrder(salesReport.fees / salesReport.orders.length);\r\n }, [salesReport]);\r\n\r\n useEffect(() => {\r\n let organization = MemberExtensions.getMemberRoleOrganization(member, organizationId);\r\n\r\n if (organization) {\r\n setCurrentOrganization(organization);\r\n }\r\n\r\n if (!isHubsLoading && !isMicrositeLoading) {\r\n micrositeService\r\n .getEventOrders(micrositeId, eventId)\r\n .then((orders) => {\r\n if (orders && orders.length && hubs && hubs.length && microsite) {\r\n let micrositeHubs = hubs.filter((h) => microsite.hubIds.includes(h.id));\r\n setSalesReport(generateSalesFromOrders(orders, micrositeHubs));\r\n }\r\n })\r\n .catch(() => {\r\n ToastHelpers.error(t(\"event-page.event-page-error-refresh\"));\r\n })\r\n .finally(() => {\r\n setLoading(false);\r\n });\r\n }\r\n }, [micrositeId, eventId, microsite, hubs, t, member, organizationId, isHubsLoading, isMicrositeLoading]);\r\n\r\n const data: Array<any> = useMemo(() => generateSalesReportData(salesReport, hubs, event, feesPerOrder), [salesReport, feesPerOrder]);\r\n\r\n useEffect(() => {\r\n const isLimited = !!event?.startOn;\r\n const lockerSold = isLimited\r\n ? t(\"analytic.hub-usage-text\", { used: salesReport.nbLockersSold, total: salesReport.nbLockers })\r\n : salesReport.nbLockersSold;\r\n setLockerSold(lockerSold);\r\n }, [salesReport]);\r\n\r\n if (loading) {\r\n return (\r\n <div className=\"container page orders-page\">\r\n <LoadingComponent loading={loading} />\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"container page orders-page\">\r\n <div className=\"offset-lg-2\">\r\n <div className=\"page-breadcrumb\">\r\n <ul className=\"breadcrumb\">\r\n <li className=\"breadcrumb-item active\">\r\n <Link to={`/organizations`}>{t(\"common.organizations\")}</Link>\r\n {` / `}\r\n <Link to={`/organizations/${organizationId}`}>{currentOrganization?.entity?.name}</Link>\r\n {` / `}\r\n <Link to={`/organizations/${organizationId}/microsites`}>{t(\"microsites-page.name\")}</Link>\r\n {` / `}\r\n <Link to={`/organizations/${organizationId}/microsites/${micrositeId}/reservationBlocks`}>\r\n {microsite?.name.get(language)}\r\n </Link>\r\n {` / ${event?.name.get(language)}`}\r\n </li>\r\n </ul>\r\n </div>\r\n\r\n <div className=\"page-background-boxing shadow col-lg-8\">\r\n <h1 className=\"text-primary\">{t(\"event-settlement-report.metrics\", { event: event?.name.get(language) }).toUpperCase()}</h1>\r\n\r\n <div className=\"card\">\r\n <div className=\"card-header align-items-center\">\r\n <div className=\"d-inline-block\">\r\n <h2 className=\"mt-2\">\r\n {t(\"event-settlement-report.summary\")}\r\n <span className=\"ms-2\">\r\n <ExportButton data={data} fileName={`event-${event?.name.get(language)}-report`} />\r\n </span>\r\n </h2>\r\n </div>\r\n </div>\r\n <div className=\"card-body\">\r\n <div className=\"row mb-3\">\r\n <div className=\"col-lg-6 col-md-12\">\r\n {t(\"event-settlement-report.nb-locker-sold\")} {lockerSold}\r\n </div>\r\n </div>\r\n\r\n <div className=\"row\">\r\n <div className=\"col-6\">{t(\"event-settlement-report.gross-revenue\")}</div>\r\n <div className=\"col-6 text-end\">\r\n {t(\"common.price-format\", {\r\n price: StringHelpers.formatPrice(salesReport.grossRevenue),\r\n currency: microsite?.currency,\r\n })}\r\n </div>\r\n </div>\r\n <div className=\"row\">\r\n <div className=\"col-6\">{t(\"event-settlement-report.fees\")}</div>\r\n <div className=\"col-6 border-bottom text-end\">\r\n -\r\n {t(\"common.price-format\", {\r\n price: StringHelpers.formatPrice(salesReport.fees),\r\n currency: microsite?.currency,\r\n })}\r\n </div>\r\n </div>\r\n <div className=\"row\">\r\n <div className=\"col-6\">{t(\"event-settlement-report.net-revenue\")} </div>\r\n <div className=\"col-6 text-end\">\r\n {t(\"common.price-format\", { price: StringHelpers.formatPrice(netRevenue), currency: microsite?.currency })}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div className=\"card\">\r\n <div className=\"card-header align-items-center\">\r\n <div className=\"d-inline-block\">\r\n <h2 className=\"mt-2\">Reservations</h2>\r\n </div>\r\n </div>\r\n\r\n <div className=\"card-body\">\r\n <table className=\"table table-sm table-hover row-clikable\">\r\n <thead>\r\n <tr>\r\n <th>{t(\"common.location\")}</th>\r\n <th>{t(\"common.locker\")}</th>\r\n <th>{t(\"common.date\")}</th>\r\n <th></th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {salesReport?.orders.map((order: Order) => {\r\n let location = hubs?.find((hub) => hub.id === order.hubId)?.name;\r\n let compartmentNumber = order.items[0].reservation.compartmentNumber;\r\n let group = order.items[0].reservation.groupId;\r\n let date = DateHelpers.formatDateTime(new Date(order.orderDate), DateHelpers.UserTimeZone);\r\n const redirectToOrderPage = () => history.push(`/orders/${order.id}`);\r\n\r\n return (\r\n <tr onClick={() => redirectToOrderPage()}>\r\n <td>{location}</td>\r\n <td>{/^\\d+$/.test(compartmentNumber) ? compartmentNumber : group + compartmentNumber}</td>\r\n <td>{date}</td>\r\n <td>\r\n <FontAwesomeIcon icon={[\"fas\", \"angle-right\"]} />\r\n </td>\r\n </tr>\r\n );\r\n })}\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nfunction generateSalesFromOrders(orders: Array<Order>, hubs: Array<Hub>): EventSalesReport {\r\n let sr = new EventSalesReport();\r\n sr.nbLockers = hubs.reduce((total, h) => total + HubHelpers.GetCompartmentCount(h), 0);\r\n sr.orders = orders;\r\n\r\n for (let i = 0; i < orders.length; i++) {\r\n const order = orders[i];\r\n if (order.payments && order.payments.length) {\r\n const lockers = order.items.filter((value, index, array) => array.indexOf(value) === index).length;\r\n sr.nbLockersSold += lockers;\r\n\r\n order.payments.forEach((payment) => {\r\n sr.fees += payment.fees;\r\n sr.grossRevenue += payment.amount + payment.saleTaxTotal;\r\n });\r\n }\r\n }\r\n\r\n return sr;\r\n}\r\n\r\nfunction generateSalesReportData(\r\n salesReport: EventSalesReport,\r\n hubs: Hub[] | undefined,\r\n event: ReservationBlock | undefined,\r\n feesPerOrder: number\r\n) {\r\n return salesReport.orders.map((order) => {\r\n const reservation = order.items[0].reservation;\r\n\r\n let feesOrder: number = 0;\r\n let paymentOrder: number = 0;\r\n order?.payments?.forEach((payment) => {\r\n feesOrder += payment.fees;\r\n paymentOrder += payment.amount + payment.saleTaxTotal;\r\n });\r\n\r\n return {\r\n order_date: order.orderDate.toString(),\r\n locker_price: event?.price.toString(),\r\n locker: reservation.groupId.toString() + reservation.compartmentNumber.toString(),\r\n hub: hubs?.find((x) => x.id === order.hubId)?.name.toString(),\r\n price: paymentOrder.toString(),\r\n sale_tax_rate: event?.saleTaxRate.toString(),\r\n Fees: feesOrder.toString() ?? feesPerOrder.toString(),\r\n };\r\n });\r\n}\r\n","import { useEffect, useState } from \"react\";\r\nimport { useTranslation } from \"react-i18next\";\r\nimport ToastHelpers from \"../../services/core/toast-helpers\";\r\nimport Microsite from \"../../services/micro-site/microsite\";\r\nimport micrositeService from \"../../services/micro-site/microsite-service\";\r\n\r\nexport default function useMicrosite(micrositeId: string) {\r\n const { t } = useTranslation();\r\n\r\n const [microsite, setMicrosite] = useState<Microsite>();\r\n const [loading, setLoading] = useState<boolean>();\r\n\r\n useEffect(() => {\r\n function get() {\r\n micrositeService\r\n .getMicrosite(micrositeId, \"All\")\r\n .then((microsite) => {\r\n if (microsite) {\r\n setMicrosite(microsite);\r\n }\r\n })\r\n .catch((error: any) => {\r\n ToastHelpers.error(t(\"common.error-generic\"));\r\n })\r\n .finally(() => setLoading(false));\r\n }\r\n\r\n get();\r\n }, [micrositeId, t]);\r\n\r\n return { microsite, isMicrositeLoading: loading };\r\n}\r\n","import \"./hub-activities-page.scss\";\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { Link, useHistory, useParams } from \"react-router-dom\";\r\nimport languageService from \"../../services/core/language-service\";\r\nimport StringHelpers from \"../../services/core/string-helpers\";\r\nimport useMyHub from \"../../services/hub/useMyHub\";\r\nimport Member from \"../../services/member/member\";\r\nimport LoadingComponent from \"../../components/loading-component\";\r\nimport { useEffect, useMemo, useState } from \"react\";\r\nimport hubService from \"../../services/hub/hub-service\";\r\nimport { HubActivity } from \"../../services/hub/hub-activity\";\r\nimport ToastHelpers from \"../../services/core/toast-helpers\";\r\nimport { useGlobalFilter, usePagination, useTable } from \"react-table\";\r\nimport PagingComponent from \"../../components/paging-component\";\r\nimport { SyncButtonComponent } from \"../../components/button-component\";\r\nimport { OrderHelpers } from \"../../services/order/order-helpers\";\r\nimport { GlobalFilter } from \"../../components/globalfilter-component\";\r\nimport DateHelpers from \"../../services/core/date-helpers\";\r\n\r\ninterface IParamTypes {\r\n hubId: string;\r\n}\r\n\r\ninterface IHubActivitiesPageProps {\r\n member: Member;\r\n}\r\n\r\nexport function HubActivitiesPage(props: IHubActivitiesPageProps) {\r\n const { member } = props;\r\n const { hubId } = useParams<IParamTypes>();\r\n const { t } = useTranslation();\r\n\r\n const { hub } = useMyHub({\r\n hubId: hubId,\r\n onErrorNotificationMessage: t(\"hub-page.error-refresh\"),\r\n });\r\n\r\n const [activities, setActivities] = useState<Array<HubActivity>>([]);\r\n const [activitiesMultiplier, setActivitiesMutiplier] = useState<number>(1);\r\n const [loading, setLoading] = useState<boolean>(true);\r\n const [pagingIndex, setPagingIndex] = useState<number>(0);\r\n\r\n const history = useHistory();\r\n\r\n const columnsTemp = [\r\n {\r\n Header: t(\"hub-history-page.table-header.date\"),\r\n accessor: \"createdOn\",\r\n },\r\n {\r\n Header: t(\"hub-history-page.table-header.operation\"),\r\n accessor: \"description\",\r\n },\r\n {\r\n Header: t(\"hub-history-page.table-header.author\"),\r\n accessor: \"createdBy\",\r\n },\r\n ];\r\n\r\n const {\r\n getTableProps,\r\n getTableBodyProps,\r\n headerGroups,\r\n rows,\r\n prepareRow,\r\n page,\r\n canPreviousPage,\r\n canNextPage,\r\n pageOptions,\r\n nextPage,\r\n previousPage,\r\n state,\r\n preGlobalFilteredRows,\r\n setGlobalFilter,\r\n state: { pageIndex },\r\n } = useTable(\r\n {\r\n columns: useMemo(() => columnsTemp, [languageService.language]),\r\n data: useMemo(() => updateTableActivitiesData(activities, member), [activities, languageService.language]),\r\n initialState: { pageIndex: pagingIndex },\r\n },\r\n useGlobalFilter,\r\n usePagination\r\n );\r\n\r\n useEffect(() => {\r\n refresh(pageIndex);\r\n }, [pageIndex + 1 == pageOptions.length && pageOptions.length % 10 == 0]);\r\n\r\n useEffect(() => {\r\n setGlobalFilter(state.globalFilter);\r\n }, [activities, languageService.language]);\r\n\r\n return (\r\n <div className=\"container page hub-activities-page\">\r\n <div className=\"page-breadcrumb\">\r\n <ul className=\"breadcrumb\">\r\n <li className=\"breadcrumb-item active\">\r\n <Link className=\"\" to={`/hubs`}>\r\n {t(\"hub-page.hublink\")}\r\n </Link>\r\n </li>\r\n <li className=\"breadcrumb-item active\">\r\n <Link className=\"\" to={`/hubs/${hubId}`}>\r\n {hub ? hub.name : hubId}\r\n </Link>\r\n </li>\r\n <li className=\"breadcrumb-item active\">{t(\"hub-history-page.history-link\")}</li>\r\n </ul>\r\n </div>\r\n\r\n <h1>{t(\"hub-history-page.history\")}</h1>\r\n\r\n <div className=\"toolbar\">\r\n <SyncButtonComponent onClick={() => refresh(0)}></SyncButtonComponent>\r\n\r\n <GlobalFilter preGlobalFilteredRows={preGlobalFilteredRows} globalFilter={state.globalFilter} setGlobalFilter={setGlobalFilter} />\r\n </div>\r\n\r\n <div>\r\n <div className=\"row mt-3\">\r\n <div className=\"col\">\r\n <div className=\"card\">\r\n <div className=\"card-body\">\r\n <table {...getTableProps()} className=\"table table-sm table-hover row-clikable\">\r\n <thead>\r\n {headerGroups.map((headerGroup) => (\r\n <tr {...headerGroup.getHeaderGroupProps()}>\r\n {headerGroup.headers.map((column) => {\r\n return <th {...column.getHeaderProps()}>{column.render(\"Header\")}</th>;\r\n })}\r\n </tr>\r\n ))}\r\n </thead>\r\n <tbody {...getTableBodyProps()}>\r\n {loading && (\r\n <tr>\r\n <td colSpan={7} className=\"text-center\">\r\n <LoadingComponent loading={loading} />\r\n </td>\r\n </tr>\r\n )}\r\n\r\n {!loading &&\r\n page.map((row, i) => {\r\n prepareRow(row);\r\n\r\n let hubActivity = row.original as any;\r\n let url = `/hubs/${hubId}`;\r\n\r\n return (\r\n <tr {...row.getRowProps()} onClick={() => history.push(url)}>\r\n <td {...row.cells[0].getCellProps()}>{hubActivity.createdOn}</td>\r\n <td {...row.cells[1].getCellProps()}>{hubActivity.description}</td>\r\n <td {...row.cells[2].getCellProps()}>{hubActivity.createdBy}</td>\r\n </tr>\r\n );\r\n })}\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <PagingComponent\r\n countTextResource={\"hub-history-page.item-count\"}\r\n count={rows.length}\r\n pageLength={pageOptions.length}\r\n pageIndex={pageIndex}\r\n canPreviousPage={canPreviousPage}\r\n canNextPage={canNextPage}\r\n previousPage={previousPage}\r\n nextPage={nextPage}\r\n />\r\n </div>\r\n </div>\r\n );\r\n function refresh(pageIndex: number) {\r\n let multiplier = activitiesMultiplier;\r\n pageIndex++;\r\n\r\n if (pageIndex == pageOptions.length) {\r\n setPagingIndex(multiplier * 10 - 1);\r\n setActivitiesMutiplier(activitiesMultiplier + 1);\r\n multiplier++;\r\n } else if (pageIndex == 0) {\r\n multiplier = 1;\r\n setPagingIndex(0);\r\n setActivitiesMutiplier(1);\r\n }\r\n\r\n hubService\r\n .getHubActivities(hubId, multiplier * 100)\r\n .then((activities) => {\r\n setActivities(activities);\r\n })\r\n .catch((e) => {\r\n ToastHelpers.error(t(\"hub-history-page.history-error-refresh\"));\r\n })\r\n .finally(() => {\r\n setLoading(false);\r\n });\r\n }\r\n}\r\n\r\nfunction updateTableActivitiesData(activities: HubActivity[], member: Member): Array<any> {\r\n const tableData: Array<any> = [];\r\n if (activities) {\r\n activities.forEach((hubActivity: HubActivity) => {\r\n if (hubActivity.id) {\r\n tableData.push({\r\n id: hubActivity.id,\r\n createdOn: DateHelpers.formatDateTime(new Date(hubActivity.createdOn), DateHelpers.UserTimeZone) ?? \"\",\r\n description: OrderHelpers.getActivityDescription(hubActivity, languageService.language),\r\n createdBy: hubActivity.createBy?.toString() || \"\",\r\n });\r\n }\r\n });\r\n }\r\n return tableData;\r\n}\r\n","import { useEffect, useState } from \"react\";\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { useHistory, useParams } from \"react-router-dom\";\r\nimport { PhoneFormComponent } from \"../../components/customer-information-components/phone-component\";\r\nimport { InputComponent } from \"../../components/input\";\r\nimport LoadingComponent from \"../../components/loading-component\";\r\nimport StringHelpers from \"../../services/core/string-helpers\";\r\nimport ToastHelpers from \"../../services/core/toast-helpers\";\r\nimport micrositeService from \"../../services/micro-site/microsite-service\";\r\nimport { CodeType, ResetTime } from \"../../assets/meta-table-keys\";\r\nimport DateHelpers from \"../../services/core/date-helpers\";\r\n\r\ninterface IParamTypes {\r\n micrositeId: string;\r\n reservationBlockId: string;\r\n}\r\n\r\nexport default function ReserveLockerSignInPage() {\r\n const { t } = useTranslation();\r\n const history = useHistory();\r\n const { micrositeId, reservationBlockId } = useParams<IParamTypes>();\r\n const [isEmail, setIsEmail] = useState<boolean>(true);\r\n const [phone, setPhone] = useState<string>(\"\");\r\n const [phoneError, setPhoneError] = useState<string>(\"\");\r\n const [email, setEmail] = useState<string>(\"\");\r\n const [emailError, setEmailError] = useState<string>(\"\");\r\n\r\n const [code, setCode] = useState<string>(\"\");\r\n const [codeError, setCodeError] = useState<string | undefined>(undefined);\r\n\r\n const [orderId, setOrderId] = useState<string>(\"\");\r\n const [linkSent, setLinkSent] = useState<boolean>(false);\r\n const [loading, setLoading] = useState<boolean>(false);\r\n\r\n const resendNotificationTimeout = 60;\r\n const [counter, setCounter] = useState(resendNotificationTimeout);\r\n\r\n const [reservationBlock, setReservationBlock] = useState<any>({});\r\n const showSms = true;\r\n\r\n useEffect(() => {\r\n setLoading(true);\r\n\r\n micrositeService\r\n .getReservationBlockById(micrositeId, reservationBlockId)\r\n .then((value) => {\r\n setReservationBlock(value);\r\n })\r\n .catch((error) => {\r\n ToastHelpers.error(error);\r\n })\r\n .finally(() => {\r\n setLoading(false);\r\n });\r\n }, [reservationBlockId, micrositeId]);\r\n\r\n useEffect(() => {\r\n if (counter > 0) {\r\n const timer = setInterval(() => setCounter((prev) => prev - 1), 1000);\r\n return () => clearInterval(timer); // Cleanup on unmount or before re-running effect\r\n }\r\n }, [counter]); // Depend on counter\r\n\r\n if (loading) {\r\n return <LoadingComponent loading={loading} />;\r\n }\r\n\r\n const meta = reservationBlock?.meta;\r\n const codeType = meta?.[CodeType] ? reservationBlock.meta[CodeType] : \"none\";\r\n\r\n return (\r\n <div className=\"container page orders-page\">\r\n <div className=\"col-12 offset-lg-2 col-lg-8\">\r\n <div className=\"card\">\r\n <div className=\"card-header align-items-center\">\r\n <div className=\"d-inline-block\">\r\n <h2>{t(\"micro-site-reserve-locker.title\")}</h2>\r\n </div>\r\n <button className=\"btn-close float-end\" onClick={() => history.push(`/sites/${micrositeId}`)}></button>\r\n </div>\r\n <div className=\"card-body\">\r\n {linkSent && (\r\n <div className=\"mb-3\">\r\n {isEmail && <div>{t(\"micro-site-reserve-locker.verification-sent-email\")}</div>}\r\n {!isEmail && <div>{t(\"micro-site-reserve-locker.verification-sent-phone\")}</div>}\r\n <div>{t(\"micro-site-reserve-locker.please-finalise\")}</div>\r\n <br></br>\r\n\r\n {isEmail && (\r\n <div>\r\n {t(\"micro-site-reserve-locker.verify-sent-email\")}: <b>{email}</b>\r\n </div>\r\n )}\r\n {!isEmail && (\r\n <div>\r\n {t(\"micro-site-reserve-locker.verify-sent-phone\")}: <b>{phone}</b>\r\n </div>\r\n )}\r\n <button className=\"btn btn-primary\" onClick={() => resendNotification()} disabled={counter > 0}>\r\n {t(\"micro-site-reserve-locker.resend-notification\")} {counter > 0 && \"(\" + counter + \")\"}\r\n </button>\r\n </div>\r\n )}\r\n {!linkSent && (\r\n <>\r\n {showSms && (\r\n <>\r\n <div className=\"mb-3\">{t(\"micro-site-reserve-locker.signup\")}</div>\r\n <div className=\"mb-3\">\r\n <input type=\"radio\" id=\"byEmail\" name=\"email\" value=\"email\" checked={isEmail} onClick={() => setIsEmail(true)} />\r\n <label htmlFor=\"byEmail\" className=\"ms-2\" onClick={() => setIsEmail(true)}>\r\n {t(\"micro-site-reserve-locker.enter-email\")}\r\n </label>\r\n </div>\r\n\r\n <div className=\"mb-3\">\r\n <input type=\"radio\" id=\"byPhone\" name=\"phone\" value=\"phone\" checked={!isEmail} onClick={() => setIsEmail(false)} />\r\n <label htmlFor=\"byPhone\" className=\"ms-2\" onClick={() => setIsEmail(false)}>\r\n {t(\"micro-site-reserve-locker.enter-phone\")}\r\n </label>\r\n </div>\r\n </>\r\n )}\r\n {!showSms && <div className=\"mb-3\">{t(\"micro-site-reserve-locker.signup-email-only\")}</div>}\r\n <form>\r\n {!showSms && (\r\n <InputComponent\r\n value={email}\r\n setValue={setEmail}\r\n regExp={StringHelpers.getEmailRegExp()}\r\n msgError={emailError}\r\n onMsgErrorChanged={setEmailError}\r\n type={\"email\"}\r\n labelText={t(\"common.email\") + \"*\"}\r\n required={true}\r\n />\r\n )}\r\n {showSms &&\r\n (isEmail ? (\r\n <div className=\"mb-3\">\r\n <InputComponent\r\n value={email}\r\n setValue={setEmail}\r\n regExp={StringHelpers.getEmailRegExp()}\r\n msgError={emailError}\r\n onMsgErrorChanged={setEmailError}\r\n type={\"email\"}\r\n labelText={t(\"common.email\") + \"*\"}\r\n required={true}\r\n />\r\n </div>\r\n ) : (\r\n <PhoneFormComponent\r\n value={phone}\r\n setValue={setPhone}\r\n onMsgErrorChanged={setPhoneError}\r\n msgError={phoneError}\r\n label={t(\"common.phone\") + \"*\"}\r\n />\r\n ))}\r\n\r\n {codeType === \"6-digit\" && (\r\n <InputComponent\r\n labelText={t(\"input-component.code-label-6digits\")}\r\n type=\"code-6digits\"\r\n value={code}\r\n setValue={setCode}\r\n msgError={codeError}\r\n onMsgErrorChanged={setCodeError}\r\n required={true}\r\n regExp={/^[0-9]{6}$/}\r\n />\r\n )}\r\n {codeType === \"1-to-4\" && (\r\n <InputComponent\r\n labelText={t(\"input-component.code-label\")}\r\n type=\"code-sl5c\"\r\n value={code}\r\n setValue={setCode}\r\n msgError={codeError}\r\n onMsgErrorChanged={setCodeError}\r\n required={true}\r\n regExp={/^[1-4]{6}$/}\r\n />\r\n )}\r\n <div className=\"mb-4 mt-3\">\r\n <button type=\"submit\" className=\"btn btn-primary\" onClick={() => validate()} disabled={isBtnDisabled()}>\r\n {t(\"micro-site-reserve-locker.validate-button\")}\r\n </button>\r\n </div>\r\n </form>\r\n </>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n\r\n function isBtnDisabled(): boolean {\r\n if (isEmail)\r\n return emailError !== undefined || loading || codeError !== undefined || !email || (!code && reservationBlock.codeSpecified);\r\n return phoneError !== undefined || loading || codeError !== undefined || !phone || (!code && reservationBlock.codeSpecified);\r\n }\r\n async function validate() {\r\n let newEmail = email;\r\n let newPhone = phone;\r\n if (isEmail) {\r\n newPhone = \"\";\r\n if (email && emailError) {\r\n return;\r\n }\r\n } else {\r\n newEmail = \"\";\r\n if (phone && phoneError) {\r\n return;\r\n }\r\n }\r\n\r\n createOrder(newPhone, newEmail);\r\n }\r\n\r\n function resendNotification() {\r\n setLoading(true);\r\n micrositeService\r\n .resendNotification(micrositeId, reservationBlockId, orderId, phone, email, undefined)\r\n .then((res) => {\r\n if (!res) {\r\n ToastHelpers.error(t(\"create-order-page.error-no-availability\"));\r\n }\r\n })\r\n .catch((error) => {\r\n if (error?.response?.status === 409) {\r\n ToastHelpers.error(t(\"create-order-page.error-conflict\"));\r\n } else {\r\n if (reservationBlock.codeSpecified) {\r\n ToastHelpers.error(t(\"create-order-page.error-generic-change-code\"));\r\n }\r\n ToastHelpers.error(t(\"common.error-generic\"));\r\n }\r\n })\r\n .finally(() => {\r\n setCounter(resendNotificationTimeout * 1.5);\r\n setLoading(false);\r\n });\r\n }\r\n\r\n function createOrder(phone: string, email: string) {\r\n setLoading(true);\r\n let end = undefined;\r\n if (reservationBlock.meta?.[ResetTime]) {\r\n let date = DateHelpers.getNextDayWithTime(reservationBlock.meta[ResetTime], DateHelpers.UserTimeZone);\r\n end = DateHelpers.toApiDate(date);\r\n }\r\n\r\n let allowOffline = micrositeId === \"osheaga2024\" || micrositeId === \"ilesoniq2024\" || micrositeId === \"lasso2024\";\r\n\r\n micrositeService\r\n .createOrder(\r\n micrositeId,\r\n reservationBlockId,\r\n false,\r\n phone,\r\n email,\r\n undefined,\r\n undefined,\r\n undefined,\r\n code,\r\n undefined,\r\n end,\r\n allowOffline\r\n )\r\n .then((value) => {\r\n if (value) {\r\n setLinkSent(true);\r\n setCounter(resendNotificationTimeout);\r\n setOrderId(value);\r\n } else {\r\n ToastHelpers.error(t(\"create-order-page.error-no-availability\"));\r\n }\r\n })\r\n .catch((error) => {\r\n if (error?.response?.status === 409) {\r\n ToastHelpers.error(t(\"create-order-page.error-conflict\"));\r\n } else {\r\n if (reservationBlock.codeSpecified) {\r\n ToastHelpers.error(t(\"create-order-page.error-generic-change-code\"));\r\n }\r\n ToastHelpers.error(t(\"common.error-generic\"));\r\n }\r\n })\r\n .finally(() => {\r\n setLoading(false);\r\n });\r\n }\r\n}\r\n","interface EmailProps {\r\n address: string;\r\n subject?: string;\r\n body?: string;\r\n }\r\n \r\n const EmailLink: React.FC<EmailProps> = ({ address, subject, body }) => {\r\n \r\n const mailtoLink = `mailto:${address}?subject=${encodeURIComponent(\r\n subject || ''\r\n )}&body=${encodeURIComponent(body || '')}`;\r\n \r\n return (\r\n <a href={mailtoLink}>\r\n {address}\r\n </a>\r\n );\r\n };\r\n\r\n export default EmailLink;","import { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\r\nimport { Trans, useTranslation } from \"react-i18next\";\r\nimport { AssetColors } from \"../../assets/assets-colors\";\r\nimport { HeaderIcon } from \"../../components/header\";\r\nimport authService from \"../../services/auth/auth-service\";\r\nimport EmailLink from \"../../components/email-link-component\";\r\nimport { useEffect, useState } from \"react\";\r\nimport memberService from \"../../services/member/member-service\";\r\nimport Member from \"../../services/member/member\";\r\nimport ToastHelpers from \"../../services/core/toast-helpers\";\r\nimport LoadingComponent from \"../../components/loading-component\";\r\n\r\ninterface HomeNotRegisteredPageProps {\r\n member: Member;\r\n changeLanguage: any;\r\n changeMember: any;\r\n}\r\n\r\nexport default function HomeNotRegisteredPage(props: HomeNotRegisteredPageProps) {\r\n const { member, changeLanguage, changeMember } = props;\r\n const { t } = useTranslation();\r\n\r\n const [loading, setLoading] = useState(true);\r\n\r\n function reload() {\r\n window.location.reload();\r\n }\r\n\r\n async function logout(): Promise<void> {\r\n await authService.logout();\r\n changeMember(null);\r\n }\r\n\r\n useEffect(() => {\r\n memberService\r\n .createMember(member)\r\n .then(() => {\r\n changeMember(member);\r\n })\r\n .catch(() => {\r\n ToastHelpers.error(t(\"common.error-generic\"));\r\n })\r\n .finally(() => {\r\n setLoading(false);\r\n });\r\n }, [member]);\r\n\r\n if (loading) {\r\n return <LoadingComponent loading />;\r\n }\r\n\r\n return (\r\n <>\r\n <header>\r\n <div className=\"container\">\r\n <div className=\"row\">\r\n <div className=\"col-12 col-md-10 col-lg-8 offset-md-1 offset-lg-2\">\r\n <nav className=\"navbar reset\">\r\n <ul className=\"navbar-nav align-items-center ms-auto\">\r\n <li className=\"nav-item\">\r\n <button className=\"nav-link\" onClick={changeLanguage}>\r\n <FontAwesomeIcon className=\"me-2\" icon={[\"fas\", \"globe\"]} />\r\n {t(\"language.display-long\")}\r\n </button>\r\n </li>\r\n </ul>\r\n </nav>\r\n </div>\r\n </div>\r\n </div>\r\n </header>\r\n\r\n <div className=\"container page sign-up-page pt-5\">\r\n <div className=\"row\">\r\n <div className=\"col-12 col-md-10 col-lg-8 offset-md-1 offset-lg-2\">\r\n <div className=\"card card-full\">\r\n <div className=\"logo\">\r\n <HeaderIcon logo={AssetColors.Blue} />\r\n </div>\r\n\r\n <div className=\"card-left\">\r\n <div className=\"card-body\">\r\n <h5>{t(\"home-not-registered.oups\")}</h5>\r\n <h6>{t(\"home-not-registered.title\")}</h6>\r\n <h6 className=\"mb-0\">\r\n <Trans\r\n i18nKey=\"home-not-registered.contact-support\"\r\n components={{\r\n EmailLink: <EmailLink address=\"support@locketgo.com\" subject={t(\"home-not-registered.contact-support-title\")} />,\r\n }}\r\n />\r\n </h6>\r\n <div className=\"sub-info mb-5\">{t(\"home-not-registered.info\")}</div>\r\n\r\n <button className=\"mt-2 me-4 btn btn-lg btn-primary\" onClick={async () => reload()}>\r\n {t(\"home-not-registered.retry\")}\r\n </button>\r\n\r\n <button className=\"mt-2 btn btn-lg btn-danger\" onClick={async () => await logout()}>\r\n {t(\"home-not-registered.logout\")}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </>\r\n );\r\n}\r\n","import ServicesApiBaseService from \"../services-api-base-service\";\r\nimport Microsite from \"../micro-site/microsite\";\r\n\r\nclass AdminService extends ServicesApiBaseService {\r\n async deleteMicrosite(micrositeId: string) {\r\n const res = await this.deleteObject(`${this.apiUrl}/admin/deleteMicrosite/${micrositeId}`);\r\n return res;\r\n }\r\n async updateMicrosite(\r\n micrositeId: string,\r\n nameFr: string | undefined,\r\n nameEn: string | undefined,\r\n micrositeIdState: string | undefined,\r\n logoUrl: string | undefined,\r\n countryCode: string,\r\n currency: string,\r\n organizationId: string,\r\n hubIds: Array<String>\r\n ): Promise<any> {\r\n const res = await this.postObject<any, any>(`${this.apiUrl}/admin/updateMicrosite`, {\r\n id: micrositeId, // Can be changed through the cascade\r\n name: {\r\n fr: nameFr,\r\n en: nameEn,\r\n },\r\n micrositeId: micrositeIdState,\r\n logoUrl: logoUrl,\r\n countryCode: countryCode,\r\n currency: currency,\r\n organizationId: organizationId,\r\n hubIds: hubIds.join(\",\"),\r\n });\r\n return res;\r\n }\r\n\r\n async createMicrosite(\r\n nameFr: string | undefined,\r\n nameEn: string | undefined,\r\n micrositeIdState: string | undefined,\r\n logoUrl: string | undefined,\r\n countryCode: string,\r\n currency: string,\r\n organizationId: string,\r\n hubIds: Array<String>\r\n ): Promise<any> {\r\n const res = await this.postObject<any, any>(`${this.apiUrl}/admin/createMicrosite`, {\r\n id: \"\",\r\n name: {\r\n fr: nameFr,\r\n en: nameEn,\r\n },\r\n micrositeId: micrositeIdState,\r\n logoUrl: logoUrl,\r\n countryCode: countryCode,\r\n currency: currency,\r\n organizationId: organizationId,\r\n hubIds: hubIds.join(\",\"),\r\n });\r\n return res;\r\n }\r\n}\r\n\r\nconst adminService = new AdminService();\r\nexport default adminService;\r\n","import React, { useEffect, useState } from \"react\";\r\nimport OrganizationHubAssociation from \"../../../services/organization/organization-hub-association\";\r\nimport \"../hub-permission-table.scss\";\r\n\r\ninterface Iprops {\r\n hubs: Array<OrganizationHubAssociation>;\r\n currentHubs: Array<string> | undefined;\r\n setHubsIds: Function;\r\n}\r\n\r\nexport default function HubInclusionTable(props: Iprops) {\r\n const { hubs, setHubsIds, currentHubs } = props;\r\n const [selectedOptions, setSelectedOptions] = useState<{ [hubId: string]: boolean }>({});\r\n\r\n useEffect(() => {\r\n var initialSelections: any = {};\r\n\r\n currentHubs?.forEach((hub) => {\r\n initialSelections[hub] = true;\r\n });\r\n\r\n setSelectedOptions(initialSelections);\r\n }, []);\r\n\r\n useEffect(() => {\r\n var newHubs: Array<string> = [];\r\n hubs.forEach((hub) => {\r\n if (selectedOptions[hub.hubId]) newHubs.push(hub.hubId);\r\n });\r\n\r\n setHubsIds(newHubs);\r\n }, [selectedOptions, setHubsIds]);\r\n\r\n const handleOptionChange = (hubId: string, option: boolean) => {\r\n setSelectedOptions((prev) => {\r\n const updatedOptions = { ...prev, [hubId]: option };\r\n return updatedOptions;\r\n });\r\n };\r\n\r\n return (\r\n <div className=\"mt-5 mb-5\">\r\n {hubs.map((hub) => (\r\n <div key={hub.hubId}>\r\n <span>\r\n <b>{hub.hubId}</b>\r\n </span>\r\n <div className=\"permission-radio-group\">\r\n <label>\r\n <input\r\n type=\"radio\"\r\n name={`hub-${hub.hubId}`}\r\n value=\"include\"\r\n checked={selectedOptions[hub.hubId]}\r\n onChange={() => handleOptionChange(hub.hubId, true)}\r\n />\r\n Include\r\n </label>\r\n <label>\r\n <input\r\n type=\"radio\"\r\n name={`hub-${hub.hubId}`}\r\n value=\"exclude\"\r\n checked={!selectedOptions[hub.hubId]}\r\n onChange={() => handleOptionChange(hub.hubId, false)}\r\n />\r\n Exclude\r\n </label>\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n );\r\n}\r\n","import React, { useCallback, useEffect, useState } from \"react\";\r\nimport { useHistory, useParams } from \"react-router-dom\";\r\nimport { InputComponent } from \"../../../components/input\";\r\nimport { ActionButtonComponent, DeleteButtonComponent } from \"../../../components/button-component\";\r\nimport micrositeService from \"../../../services/micro-site/microsite-service\";\r\nimport LoadingComponent from \"../../../components/loading-component\";\r\nimport adminService from \"../../../services/admin/admin-service\";\r\nimport HubInclusionTable from \"./hub-inclusion-table\";\r\nimport Organization from \"../../../services/organization/organization\";\r\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\r\n\r\ninterface IParamTypes {\r\n organizationId: string;\r\n micrositeId: string;\r\n}\r\n\r\ninterface Props {\r\n chosenOrg: Organization;\r\n}\r\n\r\nexport default function MicrositeAdminPage(props: Props) {\r\n const { organizationId, micrositeId } = useParams<IParamTypes>();\r\n const { chosenOrg } = props;\r\n\r\n const [nameFr, setNameFr] = useState<string | undefined>(undefined);\r\n const [nameEn, setNameEn] = useState<string | undefined>(undefined);\r\n const [hubIds, setHubsIds] = useState<Array<string> | undefined>(undefined);\r\n const [micrositeIdState, setMicrositeIdState] = useState<string | undefined>(undefined);\r\n const [logoUrl, setLogoUrl] = useState<string | undefined>(undefined);\r\n const [countryCode, setCountryCode] = useState<string | undefined>(\"\");\r\n const [currency, setCurrency] = useState<string | undefined>(\"\");\r\n const [loading, setLoading] = useState<boolean>(false);\r\n\r\n const history = useHistory();\r\n useEffect(() => {\r\n async function fetchMicrosite() {\r\n if (micrositeId === \"NEWMICROSITE\") return;\r\n setLoading(true);\r\n await micrositeService\r\n .getMicrosite(micrositeId)\r\n .then((micrositeData) => {\r\n var nameMap: Map<string, string> = micrositeData?.name;\r\n setNameFr(nameMap.get(\"fr\"));\r\n setNameEn(nameMap.get(\"en\"));\r\n setMicrositeIdState(micrositeData?.id);\r\n setLogoUrl(micrositeData?.logoUrl);\r\n setCountryCode(micrositeData?.countryCode);\r\n setCurrency(micrositeData?.currency);\r\n setHubsIds(micrositeData?.hubIds);\r\n })\r\n .catch((error) => {\r\n console.error(\"Failed to fetch microsite data\", error);\r\n });\r\n setLoading(false);\r\n }\r\n fetchMicrosite();\r\n }, [micrositeId]);\r\n\r\n const handleSubmit = async () => {\r\n setLoading(true);\r\n try {\r\n if (micrositeId === \"NEWMICROSITE\") {\r\n await adminService.createMicrosite(\r\n nameFr,\r\n nameEn,\r\n micrositeIdState,\r\n logoUrl,\r\n countryCode ?? \"\",\r\n currency ?? \"\",\r\n organizationId,\r\n hubIds ?? []\r\n );\r\n } else {\r\n await adminService.updateMicrosite(\r\n micrositeId,\r\n nameFr,\r\n nameEn,\r\n micrositeIdState,\r\n logoUrl,\r\n countryCode ?? \"\",\r\n currency ?? \"\",\r\n organizationId,\r\n hubIds ?? []\r\n );\r\n }\r\n history.push(`/organizations/${organizationId}/microsites`);\r\n } catch (error) {\r\n console.error(\"Failed to submit microsite data\", error);\r\n }\r\n setLoading(false);\r\n };\r\n\r\n const handleDelete = async () => {\r\n setLoading(true);\r\n try {\r\n await adminService.deleteMicrosite(micrositeId);\r\n history.push(`/organizations/${organizationId}/microsites`);\r\n } catch (error) {\r\n console.error(\"Failed to delete\", error);\r\n }\r\n setLoading(false);\r\n };\r\n\r\n if (loading) {\r\n return <LoadingComponent loading={loading} />;\r\n }\r\n\r\n return (\r\n <div className=\"container page admin-page pt-5\">\r\n <div className=\"col-12 offset-lg-2 col-lg-8\">\r\n <h2 className=\"mb-3\">Microsite Database Admin</h2>\r\n <div className=\"card\">\r\n <div className=\"card-body\">\r\n <form className=\"row g-3\" onSubmit={(ev) => ev.preventDefault()}>\r\n <div className=\"col-md-6\">\r\n <InputComponent\r\n labelText={\"Microsite Id (only lowercase and - )\"}\r\n setValue={(value: string) => setMicrositeIdState(value)}\r\n value={micrositeIdState ? micrositeIdState : \"\"}\r\n disabled={false}\r\n regExp={/^[a-z0-9-]+$/}\r\n />\r\n </div>\r\n <div className=\"col-md-6\">\r\n <InputComponent\r\n labelText={\"Country Code (CA or US)\"}\r\n setValue={(value: string) => setCountryCode(value)}\r\n value={countryCode ?? \"\"}\r\n disabled={false}\r\n regExp={/^(CA|US)$/}\r\n />\r\n </div>\r\n <div className=\"col-md-6\">\r\n <InputComponent\r\n labelText={\"NameEn\"}\r\n setValue={(value: string) => setNameEn(value)}\r\n value={nameEn ? nameEn : \"\"}\r\n disabled={false}\r\n />\r\n </div>\r\n <div className=\"col-md-6\">\r\n <InputComponent\r\n labelText={\"Currency (CAD or USD)\"}\r\n setValue={(value: string) => setCurrency(value)}\r\n value={currency ?? \"\"}\r\n disabled={false}\r\n regExp={/^(CAD|USD)$/}\r\n />\r\n </div>\r\n <div className=\"col-md-6\">\r\n <InputComponent\r\n labelText={\"NameFr\"}\r\n setValue={(value: string) => setNameFr(value)}\r\n value={nameFr ? nameFr : \"\"}\r\n disabled={false}\r\n />\r\n </div>\r\n <div className=\"col-md-6\">\r\n <InputComponent\r\n labelText={\"Logo URL\"}\r\n setValue={(value: string) => setLogoUrl(value)}\r\n value={logoUrl ? logoUrl : \"\"}\r\n disabled={false}\r\n />\r\n </div>\r\n <HubInclusionTable hubs={chosenOrg.associatedHubs} setHubsIds={setHubsIds} currentHubs={hubIds} />\r\n <div className=\"col-md-6\">\r\n <ActionButtonComponent\r\n type=\"submit\"\r\n title={micrositeId === \"NEWMICROSITE\" ? \"Create\" : \"Update\"}\r\n onClick={() => {\r\n handleSubmit();\r\n }}\r\n className=\"btn btn-primary\"\r\n disabled={false}\r\n />\r\n\r\n <button\r\n className=\"btn btn-md btn-primary-outline\"\r\n type=\"submit\"\r\n style={{ marginLeft: 20 }}\r\n onClick={() => history.push(`/organizations/${organizationId}/microsites`)}\r\n >\r\n {\"Cancel\"}\r\n </button>\r\n {micrositeId !== \"NEWMICROSITE\" && (\r\n <button\r\n className={`btn btn-danger`}\r\n style={{ marginLeft: 20 }}\r\n onClick={() => {\r\n handleDelete();\r\n }}\r\n >\r\n <FontAwesomeIcon icon={[\"fas\", \"trash-alt\"]} /> {\"Delete\"}\r\n </button>\r\n )}\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import OrganizationHubAssociation from \"./organization-hub-association\";\r\n\r\nexport default class Organization {\r\n id: string = \"\";\r\n name: string = \"\";\r\n\r\n streetNumber: string = \"\";\r\n street: string = \"\";\r\n city: string = \"\";\r\n state: string = \"\";\r\n country: string = \"\";\r\n postalCode: string = \"\";\r\n lat: number | null = null;\r\n lng: number | null = null;\r\n\r\n active: boolean = true;\r\n associatedHubs: Array<OrganizationHubAssociation> = [];\r\n}\r\n","import { FormEvent, MouseEvent, useEffect, useState } from \"react\";\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { useHistory } from \"react-router-dom\";\r\nimport memberService from \"../../services/member/member-service\";\r\nimport Organization from \"../../services/organization/organization\";\r\nimport Member from \"../../services/member/member\";\r\nimport { Hub } from \"../../services/hub/hub\";\r\nimport hubService from \"../../services/hub/hub-service\";\r\nimport OrganizationHubAssociation from \"../../services/organization/organization-hub-association\";\r\nimport { InputComponent } from \"../../components/input\";\r\nimport organizationService from \"../../services/member/organization-service\";\r\nimport { PhoneFormComponent } from \"../../components/customer-information-components/phone-component\";\r\nimport WaitingComponent from \"../../components/waiting-component\";\r\n\r\ntype Props = {\r\n member: Member;\r\n changeMember: any;\r\n};\r\n\r\nexport default function CreateOrganizationPage(props: Props) {\r\n const { member, changeMember } = props;\r\n const [hubs, setHubs] = useState<Array<Hub>>([]);\r\n const history = useHistory();\r\n const { t } = useTranslation();\r\n\r\n const [step, setStep] = useState<number>(1);\r\n\r\n const [phone, setPhone] = useState<string>(member?.phone || \"\");\r\n const [phoneExtension, setPhoneExtension] = useState<number | undefined>(member?.phoneExtension);\r\n const [phoneError, setPhoneError] = useState<string>();\r\n const [phoneExtentionError, setPhoneExtensionError] = useState<string>();\r\n\r\n const [orgName, setOrgName] = useState<string>(\"\");\r\n const [orgAddressStreetNumber, setOrgAddressStreetNumber] = useState<string>(\"\");\r\n const [orgAddressStreet, setOrgAddressStreet] = useState<string>(\"\");\r\n const [orgAddressCity, setOrgAddressCity] = useState<string>(\"\");\r\n const [orgAddressPostalCode, setOrgAddressPostalCode] = useState<string>(\"\");\r\n const [orgAddressState, setOrgAddressState] = useState<string>(\"\");\r\n const [orgAddressCountry, setOrgAddressCountry] = useState<string>(\"\");\r\n const [orgAssociatedHubs, setOrgAssociatedHubs] = useState<Array<OrganizationHubAssociation>>([]);\r\n const [loading, setLoading] = useState<boolean>(false);\r\n\r\n useEffect(() => {\r\n hubService.getHubs().then((hubs) => {\r\n setHubs(hubs);\r\n });\r\n }, []);\r\n\r\n const optsNextMarchantOrg: any = {};\r\n if (!orgName || orgAssociatedHubs.length === 0) {\r\n optsNextMarchantOrg[\"disabled\"] = \"disabled\";\r\n }\r\n\r\n const optsNextMarchantMember: any = {};\r\n if (!phone) {\r\n optsNextMarchantMember[\"disabled\"] = \"disabled\";\r\n }\r\n\r\n if (loading) {\r\n return <WaitingComponent />;\r\n }\r\n\r\n return (\r\n <div className=\"container pt-3\">\r\n <div className=\"row mt-5\">\r\n <div className=\"col-12 offset-lg-2 col-lg-8\">\r\n {step === 1 && (\r\n <div className=\"card\">\r\n <div className=\"card-header align-items-center\">\r\n <div className=\"d-inline-block\">\r\n <h2>Create Organization</h2>\r\n </div>\r\n </div>\r\n\r\n <div className=\"card-body\">\r\n <p>{t(\"create-org.creation-message1\")}</p>\r\n <p>{t(\"create-org.creation-message2\")}</p>\r\n <button className=\"btn btn-outline-primary me-2\" onClick={onPreviousStep}>\r\n {t(\"common.previous\")}\r\n </button>\r\n <button className=\"btn btn-primary\" onClick={onNextStep}>\r\n {t(\"create-org.start-creation\")}\r\n </button>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {step === 2 && (\r\n <div className=\"card\">\r\n <div className=\"card-header align-items-center\">\r\n <div className=\"d-inline-block\">\r\n <h2>{t(\"create-org.finalize-profile\")}</h2>\r\n </div>\r\n </div>\r\n\r\n <div className=\"card-body\">\r\n <p>Put the phone number of the person in charge of that Organization</p>\r\n <div className=\"mb-3 row\">\r\n <div className=\"col-8\">\r\n <PhoneFormComponent\r\n value={phone}\r\n setValue={setPhone}\r\n onMsgErrorChanged={setPhoneError}\r\n msgError={phoneError}\r\n label={t(\"create-merchant-org.enter-phone\")}\r\n required={false}\r\n />\r\n </div>\r\n <div className=\"col-4\">\r\n <InputComponent\r\n labelText={t(\"member-profile.extension\")}\r\n regExp={/^[0-9]*$/}\r\n type=\"extension\"\r\n value={phoneExtension ? phoneExtension.toString() : \"\"}\r\n setValue={(value: number) => setPhoneExtension(value)}\r\n msgError={phoneExtentionError}\r\n onMsgErrorChanged={setPhoneExtensionError}\r\n required={false}\r\n />\r\n </div>\r\n </div>\r\n\r\n <button className=\"btn btn-outline-primary me-2\" onClick={onPreviousStep}>\r\n {t(\"common.previous\")}\r\n </button>\r\n <button className=\"btn btn-primary\" {...optsNextMarchantMember} onClick={onNextStep}>\r\n {t(\"common.next\")}\r\n </button>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {step === 3 && (\r\n <div className=\"card\">\r\n <div className=\"card-header align-items-center\">\r\n <div className=\"d-inline-block\">\r\n <h2>{t(\"create-org.organization-information\")}</h2>\r\n </div>\r\n </div>\r\n\r\n <div className=\"card-body\">\r\n <div className=\"mb-3\">\r\n <label htmlFor=\"orgname\" className=\"form-label\">\r\n {t(\"create-org.orgName\")}*\r\n </label>\r\n <input\r\n className=\"form-control\"\r\n value={orgName}\r\n onChange={(event: FormEvent<HTMLInputElement>) => setOrgName(event.currentTarget.value)}\r\n />\r\n </div>\r\n\r\n <p className=\"fw-bold\">{t(\"create-org.address\")}</p>\r\n <div className=\"mb-3\">\r\n <label className=\"form-label\">{t(\"create-org.streetNumber\")}</label>\r\n <input\r\n className=\"form-control\"\r\n value={orgAddressStreetNumber}\r\n onChange={(event: FormEvent<HTMLInputElement>) => setOrgAddressStreetNumber(event.currentTarget.value)}\r\n />\r\n </div>\r\n <div className=\"mb-3\">\r\n <label className=\"form-label\">{t(\"create-org.street\")}</label>\r\n <input\r\n className=\"form-control\"\r\n value={orgAddressStreet}\r\n onChange={(event: FormEvent<HTMLInputElement>) => setOrgAddressStreet(event.currentTarget.value)}\r\n />\r\n </div>\r\n <div className=\"mb-3\">\r\n <label className=\"form-label\">{t(\"create-org.city\")}</label>\r\n <input\r\n className=\"form-control\"\r\n value={orgAddressCity}\r\n onChange={(event: FormEvent<HTMLInputElement>) => setOrgAddressCity(event.currentTarget.value)}\r\n />\r\n </div>\r\n <div className=\"mb-3\">\r\n <label className=\"form-label\">{t(\"create-org.postal-code\")}</label>\r\n <input\r\n className=\"form-control\"\r\n value={orgAddressPostalCode}\r\n onChange={(event: FormEvent<HTMLInputElement>) => setOrgAddressPostalCode(event.currentTarget.value)}\r\n />\r\n </div>\r\n <div className=\"mb-3\">\r\n <label className=\"form-label\">{t(\"create-org.state\")}</label>\r\n <input\r\n className=\"form-control\"\r\n value={orgAddressState}\r\n onChange={(event: FormEvent<HTMLInputElement>) => setOrgAddressState(event.currentTarget.value)}\r\n />\r\n </div>\r\n <div className=\"mb-3\">\r\n <label className=\"form-label\">{t(\"create-org.country\")}</label>\r\n <input\r\n className=\"form-control\"\r\n value={orgAddressCountry}\r\n onChange={(event: FormEvent<HTMLInputElement>) => setOrgAddressCountry(event.currentTarget.value)}\r\n />\r\n </div>\r\n\r\n <p className=\"fw-bold\">{t(\"create-org.locations\")}</p>\r\n {hubs.map((hub) => {\r\n let address = \"\";\r\n if (hub.address) {\r\n address = `${hub.address.streetNumber} ${hub.address.street}, ${hub.address.city}, ${hub.address.state} ${hub.address.country}, ${hub.address.postalCode}`;\r\n }\r\n return (\r\n <div className=\"mb-3 form-check\" key={hub.id}>\r\n <input type=\"checkbox\" className=\"form-check-input\" onChange={() => onHubSelectionChange(hub.id)} />\r\n <label className=\"form-check-label\" key={hub.id}>\r\n <strong>{hub.name}</strong> {address}\r\n </label>\r\n </div>\r\n );\r\n })}\r\n\r\n <div className=\"mt-4\">\r\n <button className=\"btn btn-outline-primary me-2\" onClick={onPreviousStep}>\r\n {t(\"common.previous\")}\r\n </button>\r\n <button className=\"btn btn-primary\" {...optsNextMarchantOrg} onClick={onNextStep}>\r\n {t(\"create-org.create-org\")}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {step === 4 && (\r\n <div className=\"card\">\r\n <div className=\"card-header align-items-center\">\r\n <div className=\"d-inline-block\">\r\n <h2>\r\n {t(\"create-org.organization-created-title\", {\r\n name: orgName,\r\n })}\r\n </h2>\r\n </div>\r\n </div>\r\n\r\n <div className=\"card-body\">\r\n <p className=\"fw-bold\">{t(\"create-org.organization-created-message\")}</p>\r\n\r\n <div className=\"mt-4\">\r\n <button\r\n className=\"btn btn-primary\"\r\n onClick={() => {\r\n history.push(\"/\");\r\n }}\r\n >\r\n {t(\"create-org.return-menu\")}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n\r\n function onPreviousStep(event: MouseEvent) {\r\n event.preventDefault();\r\n setStep(step - 1);\r\n }\r\n\r\n async function onNextStep(event: MouseEvent) {\r\n event.preventDefault();\r\n\r\n if (step === 3) {\r\n setLoading(true);\r\n const organization = new Organization();\r\n organization.name = orgName;\r\n organization.streetNumber = orgAddressStreetNumber;\r\n organization.street = orgAddressStreet;\r\n organization.city = orgAddressCity;\r\n organization.postalCode = orgAddressPostalCode;\r\n organization.state = orgAddressState;\r\n organization.country = orgAddressCountry;\r\n organization.associatedHubs = orgAssociatedHubs;\r\n\r\n await organizationService.createOrganization(organization);\r\n changeMember(await memberService.getMemberMe());\r\n setLoading(false);\r\n }\r\n\r\n setStep(step + 1);\r\n }\r\n\r\n async function onHubSelectionChange(hubId: string) {\r\n let newLocations = [...orgAssociatedHubs];\r\n const index = orgAssociatedHubs.findIndex((associatedHub) => associatedHub.hubId === hubId);\r\n if (index >= 0) {\r\n newLocations.splice(index, 1);\r\n } else {\r\n newLocations.push({\r\n hubId: hubId,\r\n state: \"Approved\",\r\n });\r\n }\r\n setOrgAssociatedHubs(newLocations);\r\n }\r\n}\r\n","import { useEffect, useState } from \"react\";\r\nimport \"./App.scss\";\r\nimport { Route, useHistory, withRouter } from \"react-router-dom\";\r\nimport SignUpPage from \"./pages/account/signup-page\";\r\nimport OrdersPage from \"./pages/orders/orders-page\";\r\nimport DatabaseAdminPage from \"./pages/admin/database-admin-page\";\r\nimport CustomersPage from \"./pages/customers/customers-page\";\r\nimport OrderPage from \"./pages/orders/order-page\";\r\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\r\nimport { ApplicationInsights } from \"@microsoft/applicationinsights-web\";\r\nimport { ReactPlugin } from \"@microsoft/applicationinsights-react-js\";\r\nimport { createBrowserHistory } from \"history\";\r\nimport { useTranslation } from \"react-i18next\";\r\nimport languageService from \"./services/core/language-service\";\r\nimport authService from \"./services/auth/auth-service\";\r\nimport Member from \"./services/member/member\";\r\nimport { HeaderNavbar } from \"./components/header\";\r\nimport MemberRoleOrganization from \"./services/member/member-role-organization\";\r\nimport OrganizationsPage from \"./pages/account/organizations-page\";\r\nimport OrganizationPage from \"./pages/account/organization-page\";\r\nimport MemberPage from \"./pages/account/member-page\";\r\nimport CreateOrderPage from \"./pages/orders/create-order-page\";\r\nimport { AuthenticatedTemplate, UnauthenticatedTemplate } from \"@azure/msal-react\";\r\nimport NoConnectionPage from \"./pages/home/no-connection-page\";\r\nimport WaitingComponent from \"./components/waiting-component\";\r\nimport DelayCompoment from \"./components/delay-component\";\r\nimport { Toaster } from \"react-hot-toast\";\r\nimport { CreateCustomerPage } from \"./pages/customers/create-customer-page\";\r\nimport { EditCustomerPage } from \"./pages/customers/edit-customer-page\";\r\nimport MicroSitePage from \"./pages/micro-site/micro-site-page\";\r\nimport ReserveLockerPage from \"./pages/micro-site/reserve-locker\";\r\nimport HubsPage from \"./pages/hubs/hubs-page\";\r\nimport HubPage from \"./pages/hubs/hub-page\";\r\nimport MyReservationsPage from \"./pages/reservations/my-reservations-page\";\r\nimport OrderExpiredPage from \"./pages/micro-site/order-expired-page\";\r\nimport memberService from \"./services/member/member-service\";\r\nimport DashboardPage from \"./pages/dashboard/dashboard-page\";\r\nimport MicrositesPage from \"./pages/events/microsites-page\";\r\nimport EventsPage from \"./pages/events/events-page\";\r\nimport EventPage from \"./pages/events/event-page\";\r\nimport ContributorReserveLockerPage from \"./pages/micro-site/contributor-reserve-locker-page\";\r\nimport RelocatePage from \"./pages/orders/relocate-page\";\r\nimport EventSettlementReportPage from \"./pages/events/event-settlement-report\";\r\nimport { HubActivitiesPage } from \"./pages/hubs/hub-activities-page\";\r\nimport GetLocketgoLogoSource, { AssetColors } from \"./assets/assets-colors\";\r\nimport ReserveLockerSignInPage from \"./pages/micro-site/reserve-locker-signin\";\r\nimport HomeNotRegisteredPage from \"./pages/home/home-not-registered-page\";\r\nimport MicrositeAdminPage from \"./pages/admin/microsite-cms/microsite-admin\";\r\nimport CreateOrganizationPage from \"./pages/account/create-organization\";\r\n\r\n/* \r\n AppInsights\r\n */\r\nconst browserHistory = createBrowserHistory({ basename: \"\" });\r\nconst reactPlugin = new ReactPlugin();\r\nconst appInsights = new ApplicationInsights({\r\n config: {\r\n instrumentationKey: \"cb42ef3d-5c2a-41fe-9f34-477a50329b27\",\r\n extensions: [reactPlugin],\r\n extensionConfig: {\r\n [reactPlugin.identifier]: { history: browserHistory },\r\n },\r\n },\r\n});\r\nappInsights.loadAppInsights();\r\nexport { reactPlugin, appInsights };\r\n\r\n/* \r\n The Application \r\n*/\r\nfunction App() {\r\n const [loading, setLoading] = useState<boolean>(true);\r\n const [isSquareLoaded, setSquareLoaded] = useState(false);\r\n const [member, setMember] = useState<Member | null>(null);\r\n const [activeOrganization, setActiveOrganization] = useState<MemberRoleOrganization | null>(null);\r\n const [, setLanguage] = useState<string>(languageService.getLanguage());\r\n const [delayExpired, setDelayExpired] = useState<boolean>(false);\r\n const [noConnection, setNoConnection] = useState<boolean>(false);\r\n const logo = GetLocketgoLogoSource(AssetColors.Black);\r\n\r\n const { t, i18n } = useTranslation();\r\n const history = useHistory();\r\n\r\n const isMicrosite: boolean =\r\n browserHistory.location.pathname.includes(\"/sites/\") ||\r\n browserHistory.location.pathname.includes(\"/my-reservations\") ||\r\n browserHistory.location.pathname.includes(\"/my-orders\");\r\n\r\n document.title = t(\"common.appTitle\");\r\n\r\n useEffect(() => {\r\n console.log(\"App.useEffect start. [autologinRedirectUri=\" + localStorage.getItem(\"autologinRedirectUri\") + \"]\");\r\n\r\n const autoLogin = async () => {\r\n const loginResponse = await authService.autoLogin();\r\n setNoConnection(loginResponse.error);\r\n changeMember(loginResponse.member);\r\n\r\n setLoading(false);\r\n console.log(\"App.useEffect autologin done.\");\r\n\r\n let autologinRedirectUri = localStorage.getItem(\"autologinRedirectUri\");\r\n if (loginResponse.member && autologinRedirectUri) {\r\n console.log(\"autologinRedirectUri\", autologinRedirectUri);\r\n localStorage.removeItem(\"autologinRedirectUri\");\r\n history.push(autologinRedirectUri);\r\n }\r\n };\r\n autoLogin();\r\n\r\n authService.registerCallback(() => {\r\n console.log(\"App.registerCallback\");\r\n autoLogin();\r\n });\r\n\r\n let interval = setTimeout(() => {\r\n setDelayExpired(true);\r\n }, 3000);\r\n\r\n if (!isSquareLoaded) {\r\n let sqPaymentScript = document.createElement(\"script\");\r\n sqPaymentScript.src = process.env.REACT_APP_SQUARE_SCRIPT || \"\";\r\n sqPaymentScript.type = \"text/javascript\";\r\n sqPaymentScript.async = false;\r\n sqPaymentScript.onload = () => {\r\n console.log(\"PaymentLib loaded.\");\r\n setSquareLoaded(true);\r\n };\r\n document.getElementsByTagName(\"head\")[0].appendChild(sqPaymentScript);\r\n }\r\n\r\n console.log(\"App.useEffect end.\");\r\n\r\n return () => clearInterval(interval);\r\n }, []);\r\n\r\n if (loading) {\r\n return (\r\n <DelayCompoment waitBeforeShow={750}>\r\n <WaitingComponent />\r\n </DelayCompoment>\r\n );\r\n }\r\n\r\n const orgContributor = memberService.isOrganizationContributor(member, activeOrganization?.entity?.id);\r\n const isHubContributor = memberService.isHubContributor(member, undefined);\r\n const isOrganizationContributor = memberService.isOrganizationContributor(member, undefined);\r\n const isConcierge = memberService.isConcierge(member);\r\n\r\n if (noConnection) {\r\n return <>{delayExpired && <NoConnectionPage changeLanguage={changeLanguage} />}</>;\r\n }\r\n\r\n if (noConnection) {\r\n return <>{delayExpired && <NoConnectionPage changeLanguage={changeLanguage} />}</>;\r\n }\r\n\r\n return (\r\n <>\r\n <Toaster position={\"top-right\"} />\r\n {isMicrosite && (\r\n <div className=\"container container-site mb-3 mb-lg-5\">\r\n <div className=\"row\">\r\n <div className=\"col-12 offset-lg-2 col-lg-8\">\r\n <img src={logo} alt=\"\" className=\"img-logo img-logo-locketgo\" />\r\n <button className=\"nav-link float-end\" onClick={changeLanguage}>\r\n <FontAwesomeIcon className=\"me-2\" icon={[\"fas\", \"globe\"]} />\r\n {t(\"language.display-long\")}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n\r\n <UnauthenticatedTemplate>\r\n {!member && (\r\n <>\r\n <Route exact path=\"/\">\r\n <SignUpPage changeMember={changeMember} changeLanguage={changeLanguage} />\r\n </Route>\r\n <Route exact path=\"/signup\">\r\n <SignUpPage changeMember={changeMember} changeLanguage={changeLanguage} />\r\n </Route>\r\n\r\n <Route exact path=\"/my-reservations/:token\">\r\n <MyReservationsPage />\r\n </Route>\r\n </>\r\n )}\r\n </UnauthenticatedTemplate>\r\n\r\n <AuthenticatedTemplate>\r\n {!isMicrosite && member && activeOrganization && (\r\n <header>\r\n <HeaderNavbar\r\n member={member}\r\n activeOrganization={activeOrganization}\r\n changeLanguage={changeLanguage}\r\n changeMember={changeMember}\r\n />\r\n </header>\r\n )}\r\n\r\n {!isMicrosite && member && isConcierge && !activeOrganization && (\r\n <header>\r\n <div className=\"container container-site mb-3 mb-lg-5\">\r\n <div className=\"row\">\r\n <div className=\"col-12\">\r\n <img src={logo} alt=\"\" className=\"img-logo img-logo-locketgo\" />\r\n <button className=\"nav-link float-end\" onClick={changeLanguage}>\r\n <FontAwesomeIcon className=\"me-2\" icon={[\"fas\", \"globe\"]} />\r\n {t(\"language.display-long\")}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </header>\r\n )}\r\n\r\n {/* Root page */}\r\n {member && (isHubContributor || isOrganizationContributor) && (\r\n <Route exact path=\"/\">\r\n <DashboardPage member={member} />\r\n </Route>\r\n )}\r\n\r\n {/* No Associations */}\r\n {member &&\r\n !isHubContributor &&\r\n !isOrganizationContributor &&\r\n (!isConcierge ? (\r\n <Route exact path=\"/\">\r\n <HomeNotRegisteredPage member={member} changeLanguage={changeLanguage} changeMember={changeMember} />\r\n </Route>\r\n ) : (\r\n <Route exact path=\"/\">\r\n <HubsPage member={member} />\r\n </Route>\r\n ))}\r\n\r\n {member && activeOrganization && (\r\n <>\r\n {orgContributor && (\r\n <>\r\n <Route exact path=\"/organizations/:organizationId\">\r\n <OrganizationPage member={member} changeMember={changeMember} />\r\n </Route>\r\n <Route exact path=\"/organizations/:organizationId/microsites\">\r\n <MicrositesPage member={member} />\r\n </Route>\r\n <Route exact path=\"/organizations/:organizationId/microsites/:micrositeId/reservationBlocks\">\r\n <EventsPage member={member} />\r\n </Route>\r\n <Route exact path=\"/organizations/:organizationId/microsites/:micrositeId/reservationBlocks/:eventId\">\r\n <EventPage member={member} />\r\n </Route>\r\n <Route exact path=\"/organizations/:organizationId/microsites/:micrositeId/reservationBlocks/:eventId/sales-report\">\r\n <EventSettlementReportPage member={member} />\r\n </Route>\r\n <Route\r\n exact\r\n path=\"/organizations/:organizationId/microsites/:micrositeId/reservationBlocks/:reservationBlockId/reserve-locker\"\r\n >\r\n <ContributorReserveLockerPage member={member} setNoConnection={setNoConnection} />\r\n </Route>\r\n\r\n {activeOrganization.entity && (\r\n <>\r\n <Route exact path=\"/orders\">\r\n <OrdersPage organization={activeOrganization.entity} member={member} />\r\n </Route>\r\n <Route exact path=\"/orders/:orderId\">\r\n <OrderPage organization={activeOrganization.entity} member={member} />\r\n </Route>\r\n <Route exact path=\"/orders/:orderId/items/:itemId/relocate\">\r\n <RelocatePage organizationId={activeOrganization.entity?.id} member={member} />\r\n </Route>\r\n <Route exact path=\"/create-order\">\r\n <CreateOrderPage organization={activeOrganization.entity} member={member}></CreateOrderPage>\r\n </Route>\r\n <Route exact path=\"/create-return\">\r\n <CreateOrderPage isReturn={true} organization={activeOrganization.entity} member={member}></CreateOrderPage>\r\n </Route>\r\n\r\n <Route exact path=\"/customers\">\r\n <CustomersPage organization={activeOrganization.entity} />\r\n </Route>\r\n {memberService.isLocketgoAdmin(member) && (\r\n <>\r\n <Route exact path=\"/database-admin\">\r\n <DatabaseAdminPage member={member} />\r\n </Route>\r\n <Route exact path=\"/database-admin/microsite/:organizationId/:micrositeId\">\r\n <MicrositeAdminPage chosenOrg={activeOrganization.entity} />\r\n </Route>\r\n <Route exact path=\"/create-organization\">\r\n <CreateOrganizationPage member={member} changeMember={changeMember} />\r\n </Route>\r\n <Route path=\"/customers/:customerId\">\r\n {<EditCustomerPage organization={activeOrganization.entity} user={member} />}\r\n </Route>\r\n <Route exact path=\"/create-customer\">\r\n <CreateCustomerPage organization={activeOrganization.entity} />\r\n </Route>\r\n </>\r\n )}\r\n </>\r\n )}\r\n </>\r\n )}\r\n\r\n <Route exact path=\"/organizations\">\r\n <OrganizationsPage\r\n member={member}\r\n activeOrganization={activeOrganization}\r\n changeActiveOrganization={changeActiveOrganization}\r\n />\r\n </Route>\r\n </>\r\n )}\r\n\r\n {member && (\r\n <>\r\n {member.associatedHubs?.length > 0 && (\r\n <>\r\n <Route exact path=\"/hubs\">\r\n {<HubsPage member={member} />}\r\n </Route>\r\n\r\n <Route path=\"/hubs/:hubId/activities\">\r\n <HubActivitiesPage member={member} />\r\n </Route>\r\n\r\n <Route exact path=\"/hubs/:hubId/\">\r\n <HubPage member={member} />\r\n </Route>\r\n </>\r\n )}\r\n <Route exact path=\"/member-profile\">\r\n {<MemberPage member={member} changeMember={changeMember} />}\r\n </Route>\r\n {/**\r\n <Route exact path=\"/create-organization\">\r\n <CreateMerchantOrganizationPage member={member} changeMember={changeMember} />\r\n { {<CreateOrganizationPage member={member} changeMember={changeMember} />} }\r\n </Route>\r\n <Route exact path=\"/my-reservations\">\r\n <MyReservationsPage />\r\n </Route>\r\n **/}\r\n </>\r\n )}\r\n </AuthenticatedTemplate>\r\n\r\n <Route exact path=\"/sites/:micrositeId\">\r\n {<MicroSitePage member={member} setNoConnection={setNoConnection} />}\r\n </Route>\r\n <Route exact path=\"/sites/reservation-expired/:micrositeId\">\r\n {<OrderExpiredPage />}\r\n </Route>\r\n <Route exact path=\"/sites/:micrositeId/signin-reserve-locker/:reservationBlockId\">\r\n {<ReserveLockerSignInPage />}\r\n </Route>\r\n <Route exact path=\"/sites/:micrositeId/reserve-locker/:reservationBlockId/token/:token\">\r\n {<ReserveLockerPage />}\r\n </Route>\r\n <Route exact path=\"/my-orders/:token\">\r\n <MyReservationsPage />\r\n </Route>\r\n\r\n {/* <Route exact path=\"/admin-debug\">\r\n <AdminPage />\r\n </Route> */}\r\n </>\r\n );\r\n\r\n function changeLanguage() {\r\n const newLanguage = languageService.changeLanguage();\r\n i18n.changeLanguage(newLanguage);\r\n setLanguage(newLanguage);\r\n document.title = t(\"common.appTitle\");\r\n }\r\n\r\n function changeMember(newMember: Member | null) {\r\n setMember(newMember);\r\n\r\n if (newMember && newMember.associatedOrganizations.length > 0) {\r\n let organizationId = localStorage.getItem(\"organizationId\");\r\n\r\n if (organizationId) {\r\n let temp = newMember.associatedOrganizations.find((org: MemberRoleOrganization) => org.entity?.id === organizationId);\r\n\r\n if (temp) {\r\n changeActiveOrganization(temp);\r\n } else {\r\n changeActiveOrganization(newMember.associatedOrganizations[0]);\r\n }\r\n } else {\r\n changeActiveOrganization(newMember.associatedOrganizations[0]);\r\n }\r\n } else {\r\n changeActiveOrganization(null);\r\n }\r\n\r\n return member;\r\n }\r\n\r\n function changeActiveOrganization(newActiveOrganization: MemberRoleOrganization | null) {\r\n setActiveOrganization(newActiveOrganization);\r\n newActiveOrganization?.entity?.id && localStorage.setItem(\"organizationId\", newActiveOrganization?.entity?.id);\r\n }\r\n}\r\n\r\nexport default withRouter(App);\r\n","import { ReportHandler } from 'web-vitals';\r\n\r\nconst reportWebVitals = (onPerfEntry?: ReportHandler) => {\r\n if (onPerfEntry && onPerfEntry instanceof Function) {\r\n import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {\r\n getCLS(onPerfEntry);\r\n getFID(onPerfEntry);\r\n getFCP(onPerfEntry);\r\n getLCP(onPerfEntry);\r\n getTTFB(onPerfEntry);\r\n });\r\n }\r\n};\r\n\r\nexport default reportWebVitals;\r\n","import i18n from \"i18next\";\r\nimport Backend from \"i18next-http-backend\";\r\n//import LanguageDetector from \"i18next-browser-languagedetector\";\r\nimport { initReactI18next } from \"react-i18next\";\r\nimport languageService from \"./services/core/language-service\";\r\n\r\ni18n\r\n // load translation using http -> see /public/locales\r\n // learn more: https://github.com/i18next/i18next-http-backend\r\n .use(Backend)\r\n // detect user language\r\n // learn more: https://github.com/i18next/i18next-browser-languageDetector\r\n //.use(LanguageDetector)\r\n // pass the i18n instance to react-i18next.\r\n .use(initReactI18next)\r\n // init i18next\r\n // for all options read: https://www.i18next.com/overview/configuration-options\r\n .init({\r\n fallbackLng: languageService.getLanguage(),\r\n debug: true,\r\n\r\n interpolation: {\r\n escapeValue: false, // not needed for react as it escapes by default\r\n },\r\n });\r\n\r\nexport default i18n;\r\n","import React, { Suspense } from \"react\";\r\nimport { createRoot } from \"react-dom/client\";\r\nimport App from \"./App\";\r\nimport reportWebVitals from \"./reportWebVitals\";\r\nimport { IconDefinition, library } from \"@fortawesome/fontawesome-svg-core\";\r\nimport \"./i18n.ts\"; // import i18n (needs to be bundled ;))\r\nimport \"bootstrap\";\r\nimport { MsalProvider } from \"@azure/msal-react\";\r\nimport msalInstance from \"./services/auth/msal-instance\";\r\nimport \"./styles/index.scss\";\r\n/* \r\n Font Awesome icons that could be used in the solution\r\n https://fontawesome.com/v5.15/how-to-use/on-the-web/using-with/react\r\n*/\r\nimport {\r\n faAngleDoubleLeft,\r\n faAngleDoubleRight,\r\n faAngleDown,\r\n faAngleLeft,\r\n faAngleRight,\r\n faAngleUp,\r\n faBars,\r\n faBox,\r\n faCheckCircle,\r\n faCircle,\r\n faClock,\r\n faCog,\r\n faEdit,\r\n faExclamationTriangle,\r\n faFileExport,\r\n faGlobe,\r\n faInfo,\r\n faInfoCircle,\r\n faLock,\r\n faLockOpen,\r\n faMapMarkerAlt,\r\n faMinusCircle,\r\n faPen,\r\n faPlus,\r\n faSearch,\r\n faSpinner,\r\n faSquare,\r\n faSync,\r\n faTrashAlt,\r\n faUser,\r\n faUserLock,\r\n faUsers,\r\n faPaperPlane,\r\n faBan,\r\n faBell,\r\n faCreditCard,\r\n faTag,\r\n faFileInvoiceDollar,\r\n faExternalLinkSquareAlt,\r\n faArrowLeft,\r\n faCube,\r\n} from \"@fortawesome/free-solid-svg-icons\";\r\nimport { faSquare as faSquareRegular } from \"@fortawesome/free-regular-svg-icons\";\r\nimport moment from \"moment\";\r\nimport WaitingComponent from \"./components/waiting-component\";\r\nimport { BrowserRouter } from \"react-router-dom\";\r\n\r\nlibrary.add(\r\n faBox as IconDefinition,\r\n faUser as IconDefinition,\r\n faUsers as IconDefinition,\r\n faPlus as IconDefinition,\r\n faMapMarkerAlt as IconDefinition,\r\n faPen as IconDefinition,\r\n faTrashAlt as IconDefinition,\r\n faAngleDown as IconDefinition,\r\n faAngleUp as IconDefinition,\r\n faCircle as IconDefinition,\r\n faLock as IconDefinition,\r\n faLockOpen as IconDefinition,\r\n faCog as IconDefinition,\r\n faSearch as IconDefinition,\r\n faSpinner as IconDefinition,\r\n faAngleLeft as IconDefinition,\r\n faAngleRight as IconDefinition,\r\n faAngleDoubleLeft as IconDefinition,\r\n faAngleDoubleRight as IconDefinition,\r\n faCheckCircle as IconDefinition,\r\n faClock as IconDefinition,\r\n faMinusCircle as IconDefinition,\r\n faInfo as IconDefinition,\r\n faExclamationTriangle as IconDefinition,\r\n faBars as IconDefinition,\r\n faSync as IconDefinition,\r\n faSquare as IconDefinition,\r\n faSquareRegular as IconDefinition,\r\n faGlobe as IconDefinition,\r\n faInfoCircle as IconDefinition,\r\n faEdit as IconDefinition,\r\n faUserLock as IconDefinition,\r\n faPaperPlane as IconDefinition,\r\n faBan as IconDefinition,\r\n faBell as IconDefinition,\r\n faEdit as IconDefinition,\r\n faFileExport as IconDefinition,\r\n faCreditCard as IconDefinition,\r\n faTag as IconDefinition,\r\n faAngleRight as IconDefinition,\r\n faFileInvoiceDollar as IconDefinition,\r\n faExternalLinkSquareAlt as IconDefinition,\r\n faArrowLeft as IconDefinition,\r\n faCube as IconDefinition\r\n);\r\n\r\nmoment.locale(\"fr\", {\r\n months: \"janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre\".split(\"_\"),\r\n monthsShort: \"janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.\".split(\"_\"),\r\n monthsParseExact: true,\r\n weekdays: \"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi\".split(\"_\"),\r\n weekdaysShort: \"dim._lun._mar._mer._jeu._ven._sam.\".split(\"_\"),\r\n weekdaysMin: \"Di_Lu_Ma_Me_Je_Ve_Sa\".split(\"_\"),\r\n weekdaysParseExact: true,\r\n longDateFormat: {\r\n LT: \"HH:mm\",\r\n LTS: \"HH:mm:ss\",\r\n L: \"DD/MM/YYYY\",\r\n LL: \"D MMMM YYYY\",\r\n LLL: \"D MMMM YYYY HH:mm\",\r\n LLLL: \"dddd D MMMM YYYY HH:mm\",\r\n },\r\n calendar: {\r\n sameDay: \"[Aujourd'hui à ] LT\",\r\n nextDay: \"[Demain à ] LT\",\r\n nextWeek: \"dddd [à ] LT\",\r\n lastDay: \"[Hier à ] LT\",\r\n lastWeek: \"dddd [dernier à ] LT\",\r\n sameElse: \"L\",\r\n },\r\n relativeTime: {\r\n future: \"dans %s\",\r\n past: \"il y a %s\",\r\n s: \"quelques secondes\",\r\n m: \"une minute\",\r\n mm: \"%d minutes\",\r\n h: \"une heure\",\r\n hh: \"%d heures\",\r\n d: \"un jour\",\r\n dd: \"%d jours\",\r\n M: \"un mois\",\r\n MM: \"%d mois\",\r\n y: \"un an\",\r\n yy: \"%d ans\",\r\n },\r\n dayOfMonthOrdinalParse: /\\d{1,2}(er|e)/,\r\n ordinal: function (number) {\r\n return number + (number === 1 ? \"er\" : \"e\");\r\n },\r\n meridiemParse: /PD|MD/,\r\n isPM: function (input) {\r\n return input.charAt(0) === \"M\";\r\n },\r\n // In case the meridiem units are not separated around 12, then implement\r\n // this function (look at locale/id.js for an example).\r\n // meridiemHour : function (hour, meridiem) {\r\n // return /* 0-23 hour, given meridiem token and hour 1-12 */ ;\r\n // },\r\n meridiem: function (hours, minutes, isLower) {\r\n return hours < 12 ? \"PD\" : \"MD\";\r\n },\r\n week: {\r\n dow: 1, // Monday is the first day of the week.\r\n doy: 4, // Used to determine first week of the year.\r\n },\r\n});\r\n\r\nfunction AppLoadingComponent() {\r\n return (\r\n <div className=\"container page\">\r\n <div className=\"app\">\r\n <div className=\"loader\">\r\n <WaitingComponent />\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\ncreateRoot(document.getElementById(\"root\") as HTMLElement).render(\r\n <Suspense fallback={<AppLoadingComponent />}>\r\n <React.StrictMode>\r\n <MsalProvider instance={msalInstance}>\r\n <BrowserRouter>\r\n <App />\r\n </BrowserRouter>\r\n </MsalProvider>\r\n </React.StrictMode>\r\n </Suspense>\r\n);\r\n\r\n// If you want to start measuring performance in your app, pass a function\r\n// to log results (for example: reportWebVitals(console.log))\r\n// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals\r\nreportWebVitals();\r\n"],"sourceRoot":""}