import React, { useState } from 'react'; import { createRoot } from 'react-dom/client'; import { __ } from '@wordpress/i18n'; import { LocationWithRole } from '../../../types/location.entity'; import { UserRoleType } from '../../../types/user.entity'; import { InviteOwnerDialog } from './dialogs/invite-owner-dialog'; import { App } from '../../../app'; import { ActionItem } from './components/action-item/action-item'; import { apiService } from '../../../services/api.service'; import { LocationHeader } from '../location-header/location-header'; import { AuthFooter } from '../../auth/auth-footer/auth-footer'; interface OverviewProps { locationWithRole: LocationWithRole; bookingAppUrl: string; embedsPageUrl: string; } function Overview({ locationWithRole, bookingAppUrl, embedsPageUrl }: OverviewProps): JSX.Element { const { location, roles, ownerExpert } = locationWithRole; const role = roles[0]; const [isInviteDialogOpen, setIsInviteDialogOpen] = useState(false); const [inviteButtonText, setInviteButtonText] = useState(__('Invite Owner', 'timetailor-salon-booking')); const [isInviteButtonDisabled, setIsInviteButtonDisabled] = useState(false); const [locationAuthLinkLoading, setLocationAuthLinkLoading] = useState(false); const [userAuthLinkLoading, setUserAuthLinkLoading] = useState(false); const handleInviteSuccess = (): void => { setInviteButtonText(__('Invitation sent', 'timetailor-salon-booking')); setIsInviteButtonDisabled(true); window.setTimeout(() => { setInviteButtonText(__('Invite Owner', 'timetailor-salon-booking')); setIsInviteButtonDisabled(false); }, 5000); }; const handleGetLocationAuthLink = async (): Promise => { setLocationAuthLinkLoading(true); try { const result = await apiService.getLocationAuthLink(location.id); if (result?.authLink) { window.open(result.authLink, '_blank'); } } catch (err) { alert(__('Failed to get dashboard link. Please try again.', 'timetailor-salon-booking')); } finally { setLocationAuthLinkLoading(false); } }; const handleGetUserAuthLink = async (): Promise => { setUserAuthLinkLoading(true); try { const result = await apiService.getUserAuthLink(); if (result?.authLink) { window.open(result.authLink, '_blank'); } } catch (err) { alert(__('Failed to get auth link. Please try again.', 'timetailor-salon-booking')); } finally { setUserAuthLinkLoading(false); } }; return ( <>

{__('Things to do next', 'timetailor-salon-booking')}

{__('Test Booking', 'timetailor-salon-booking')} } /> {role === UserRoleType.LocationOwner && ( {locationAuthLinkLoading ? __('Loading...', 'timetailor-salon-booking') : __('Complete Setup', 'timetailor-salon-booking')} } /> )} {__('Embed Widget', 'timetailor-salon-booking')} } /> {role === UserRoleType.PartnerOwner && ( <> setIsInviteDialogOpen(true)} disabled={isInviteButtonDisabled} > {inviteButtonText} } /> {userAuthLinkLoading ? __('Loading...', 'timetailor-salon-booking') : __('Open PartnerHub', 'timetailor-salon-booking')} } /> )}
setIsInviteDialogOpen(false)} locationId={location.id} expertId={ownerExpert.id} defaultFirstName={ownerExpert.firstName || ''} onSuccess={handleInviteSuccess} /> ); } function initOverview(): void { const container = document.getElementById('ttsbs-overview-root'); if (!container) { return; } // init the app App.bootstrap({ ajaxUrl: container.dataset.ajaxUrl || '', nonce: container.dataset.nonce || '', bookingAppUrl: container.dataset.bookingAppUrl || '', }); const locationWithRole = JSON.parse(container.dataset.locationWithRole || '{}') as LocationWithRole; const bookingAppUrl = container.dataset.bookingAppUrl || ''; const embedsPageUrl = container.dataset.embedsPageUrl || ''; const root = createRoot(container); root.render( <>
, ); } if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', initOverview); } else { initOverview(); }