diff --git a/apps/main/src/App.tsx b/apps/main/src/App.tsx index 3033d57..2f8feff 100644 --- a/apps/main/src/App.tsx +++ b/apps/main/src/App.tsx @@ -3,6 +3,7 @@ import { ThemeProvider } from "@xtablo/shared/contexts/ThemeContext"; import { Toaster } from "@xtablo/ui/components/sonner"; import { BrowserRouter as Router, useRoutes } from "react-router-dom"; import { routes } from "./lib/routes"; +import { publicRoutes } from "./lib/publicRoutes"; import { supabase } from "./lib/supabase"; import { DatadogRumProvider } from "./providers/DatadogRumProvider"; import { UserStoreProvider } from "./providers/UserStoreProvider"; @@ -12,18 +13,25 @@ const AppRoutes = () => { return element; }; +const PublicRoutes = () => { + const element = useRoutes(publicRoutes); + return element; +}; + export const App = () => { return ( - - - - -
+ + + +
+ + - -
-
-
- + +
+
+
); diff --git a/apps/main/src/lib/publicRoutes.tsx b/apps/main/src/lib/publicRoutes.tsx new file mode 100644 index 0000000..53dd6c1 --- /dev/null +++ b/apps/main/src/lib/publicRoutes.tsx @@ -0,0 +1,22 @@ +import { RouteObject } from "react-router-dom"; +import { LandingPage } from "../pages/landing"; +import { PublicBookingPage } from "../pages/PublicBookingPage"; +import { PublicNotePage } from "../pages/PublicNotePage"; + +export const publicRoutes: RouteObject[] = [ + // Landing page + { + path: "/landing", + element: , + }, + // Public booking routes + { + path: "/book/:user_info/:event_type_standard_name", + element: , + }, + // Public notes route (unauthenticated access) + { + path: "/notes/public/:noteId", + element: , + }, +]; diff --git a/apps/main/src/lib/routes.tsx b/apps/main/src/lib/routes.tsx index 1df0551..fe6d761 100644 --- a/apps/main/src/lib/routes.tsx +++ b/apps/main/src/lib/routes.tsx @@ -9,13 +9,10 @@ import { ChatPage } from "../pages/chat"; import { EventsPage } from "../pages/events"; import { FeedbackPage } from "../pages/feedback"; import { JoinPage } from "../pages/join"; -import { LandingPage } from "../pages/landing"; import { LoginPage } from "../pages/login"; import { NotFoundPage } from "../pages/NotFoundPage"; import NotesPage from "../pages/notes"; import { OAuthSigninPage } from "../pages/oauth-signin"; -import { PublicBookingPage } from "../pages/PublicBookingPage"; -import { PublicNotePage } from "../pages/PublicNotePage"; import { PlanningPage } from "../pages/planning"; import { ResetPasswordPage } from "../pages/reset-password"; import SettingsPage from "../pages/settings"; @@ -126,21 +123,6 @@ export const routes: RouteObject[] = [ path: "/login-with-oauth", element: , }, - // Landing page - { - path: "/landing", - element: , - }, - // Public booking routes - { - path: "/book/:user_info/:event_type_standard_name", - element: , - }, - // Public notes route (unauthenticated access) - { - path: "/notes/public/:noteId", - element: , - }, // Authentication pages (redirected to "/" if user is authenticated) { path: "/", diff --git a/apps/main/src/pages/PublicBookingPage.tsx b/apps/main/src/pages/PublicBookingPage.tsx index 02afc67..0e07236 100644 --- a/apps/main/src/pages/PublicBookingPage.tsx +++ b/apps/main/src/pages/PublicBookingPage.tsx @@ -1,6 +1,5 @@ import { useQueryClient } from "@tanstack/react-query"; import { CustomModal } from "@ui/components/CustomModal"; -import { LoadingSpinner } from "@ui/components/LoadingSpinner"; import { useCreateTabloWithOwner } from "@xtablo/shared"; import { useSession } from "@xtablo/shared/contexts/SessionContext"; import { useTheme } from "@xtablo/shared/contexts/ThemeContext"; @@ -34,7 +33,6 @@ import { useNavigate, useParams } from "react-router-dom"; import { twMerge } from "tailwind-merge"; import { api } from "../lib/api"; import { supabase } from "../lib/supabase"; -import { useMaybeUser } from "../providers/UserStoreProvider"; export function PublicBookingPage() { const { user_info, event_type_standard_name } = useParams<{ @@ -43,9 +41,11 @@ export function PublicBookingPage() { }>(); const queryClient = useQueryClient(); const navigate = useNavigate(); - const { mutateAsync: signUpWithoutPassword } = useSignUpWithoutPassword(supabase, api); + const { mutateAsync: signUpWithoutPassword, isPending: isSigningUpWithoutPassword } = + useSignUpWithoutPassword(supabase, api); const { session } = useSession(); - const user = useMaybeUser(); + const user = session ? session.user : null; + const shortUserId = user_info?.substring(user_info.lastIndexOf("-") + 1); const { data: publicSlots, isLoading: isLoadingSlots } = usePublicSlots( @@ -58,10 +58,12 @@ export function PublicBookingPage() { useCreateTabloWithOwner(api, (data) => { queryClient.invalidateQueries({ queryKey: ["tablos"] }); invalidatePublicSlots(); - navigate(`/chat/${data.id}`, { replace: true }); + navigate(`/tablos/${data.id}`, { replace: true }); navigate(0); }); + const isPending = isSigningUpWithoutPassword || isCreatingTabloWithOwner; + const userProfile = publicSlots?.user; const eventType = publicSlots?.eventType; const slotsData = publicSlots?.slots || {}; @@ -88,6 +90,7 @@ export function PublicBookingPage() { // Loading messages rotation const loadingMessages = [ "Nous créons votre rendez-vous, veuillez patienter", + "Creation de votre compte, ...", "Préparation de votre réservation...", "Configuration de votre appel...", "Finalisation de votre créneau...", @@ -96,14 +99,14 @@ export function PublicBookingPage() { useEffect(() => { setCurrentMessageIndex(0); - if (isCreatingTabloWithOwner) { + if (isPending) { const interval = setInterval(() => { setCurrentMessageIndex((prev) => (prev + 1) % loadingMessages.length); }, 1000); return () => clearInterval(interval); } - }, [isCreatingTabloWithOwner]); + }, [isPending]); // Theme const { theme, setTheme } = useTheme(); @@ -217,17 +220,6 @@ export function PublicBookingPage() { return date.toLocaleDateString("fr-FR", { month: "long", year: "numeric" }); }; - if (isLoadingSlots) { - return ( -
-
- -

Chargement des disponibilités...

-
-
- ); - } - const formatDuration = (minutes: number) => { if (minutes < 60) { return `${minutes} min`; @@ -459,7 +451,20 @@ export function PublicBookingPage() { {/* Right Panel - Calendar & Time Slots */} -
+
+ {/* Loading Overlay for Calendar/Slots */} + {isLoadingSlots && ( +
+
+
+ + Chargement des disponibilités... + +
+
+
+ )} +
{/* Calendar */}
@@ -589,7 +594,7 @@ export function PublicBookingPage() {
{/* Loading Overlay */} - {isCreatingTabloWithOwner && ( + {isPending && (
@@ -666,7 +671,11 @@ export function PublicBookingPage() { id="name" type="text" placeholder="Votre nom complet" - value={user?.name || formData.name} + value={ + user + ? `${user.user_metadata.first_name} ${user.user_metadata.last_name}` + : formData.name + } onChange={(e) => setFormData((prev) => ({ ...prev, name: e.target.value }))} disabled={!!user} /> diff --git a/apps/main/stats.html b/apps/main/stats.html index 8e3ac52..5c4a58a 100644 --- a/apps/main/stats.html +++ b/apps/main/stats.html @@ -4929,7 +4929,7 @@ var drawChart = (function (exports) {