소스 검색

feat(workout-sessions): add WorkoutSessionsSynchronizer component to sync sessions on sign-in and remove unused sync logic
fix(auth): update callback URLs to include signin query parameter for better navigation after authentication

Mathias 1 개월 전
부모
커밋
486fef37b1

+ 2 - 0
app/[locale]/layout.tsx

@@ -7,6 +7,7 @@ import { cn } from "@/shared/lib/utils";
 import { getServerUrl } from "@/shared/lib/server-url";
 import { FB_PIXEL_ID } from "@/shared/lib/facebook/fb-pixel";
 import { SiteConfig } from "@/shared/config/site-config";
+import { WorkoutSessionsSynchronizer } from "@/features/workout-session/ui/workout-sessions-synchronizer";
 import { ThemeSynchronizer } from "@/features/theme/ui/ThemeSynchronizer";
 import { Header } from "@/features/layout/Header";
 import { Footer } from "@/features/layout/Footer";
@@ -150,6 +151,7 @@ export default async function RootLayout({ params, children }: RootLayoutProps)
           suppressHydrationWarning
         >
           <Providers locale={locale}>
+            <WorkoutSessionsSynchronizer />
             <ThemeSynchronizer />
             <NextTopLoader color="#FF5722" delay={100} showSpinner={false} />
 

+ 1 - 0
app/[locale]/profile/page.tsx

@@ -18,6 +18,7 @@ export default function ProfilePage() {
   const [sessions, setSessions] = useState<WorkoutSession[]>([]);
   const { getAll } = useWorkoutSessionService();
   const { data: session } = useSession();
+
   useEffect(() => {
     const loadSessions = async () => {
       const loadedSessions = await getAll();

+ 1 - 1
src/features/auth/signin/model/useSignIn.ts

@@ -11,7 +11,7 @@ export const useSignIn = () => {
     const response = await authClient.signIn.email({
       email: values.email,
       password: values.password,
-      callbackURL: `/${paths.root}`,
+      callbackURL: `/${paths.root}?signin=true`,
     });
 
     if (response?.error) {

+ 1 - 1
src/features/auth/signup/model/useSignUp.ts

@@ -31,7 +31,7 @@ export const useSignUp = () => {
     },
 
     onSuccess: (res) => {
-      router.push(`/${paths.verifyEmail}`);
+      router.push(`/${paths.verifyEmail}?signin=true`);
 
       event(LogEvents.Registered.facebookNativeName, {
         email: res?.data?.user.email || "",

+ 1 - 1
src/features/auth/ui/ProviderButton.tsx

@@ -35,7 +35,7 @@ export const ProviderButton = (props: ProviderButtonProps) => {
     mutationFn: async () => {
       await authClient.signIn.social({
         provider: "google",
-        callbackURL: searchParams.get("callbackUrl") ?? `${getServerUrl()}/`,
+        callbackURL: searchParams.get("callbackUrl") ?? `${getServerUrl()}/?signin=true`,
       });
     },
   });

+ 0 - 12
src/features/workout-session/model/use-sync-workout-sessions.ts

@@ -4,7 +4,6 @@ import { useEffect, useState } from "react";
 
 import { workoutSessionLocal } from "@/shared/lib/workout-session/workout-session.local";
 import { useSession } from "@/features/auth/lib/auth-client";
-import { brandedToast } from "@/components/ui/toast";
 
 import { syncWorkoutSessionAction } from "../actions/sync-workout-sessions.action";
 
@@ -66,23 +65,12 @@ export function useSyncWorkoutSessions() {
         isSyncing: false,
         lastSyncAt: new Date(),
       }));
-
-      brandedToast({
-        title: "Synchronisation réussie",
-        subtitle: `${localSessions.length} sessions synchronisées`,
-      });
     } catch (error) {
       setSyncState((prev) => ({
         ...prev,
         isSyncing: false,
         error: error as Error,
       }));
-
-      brandedToast({
-        title: "Erreur de synchronisation",
-        subtitle: "Certaines sessions n'ont pas pu être synchronisées",
-        variant: "error",
-      });
     }
   };
 

+ 12 - 1
src/features/workout-session/ui/workout-sessions-synchronizer.tsx

@@ -1,13 +1,24 @@
 "use client";
 
+import { useEffect } from "react";
+import { useSearchParams } from "next/navigation";
+
 import { useSyncWorkoutSessions } from "../model/use-sync-workout-sessions";
 
 export const WorkoutSessionsSynchronizer = () => {
   const { isSyncing, syncSessions } = useSyncWorkoutSessions();
+  const searchParams = useSearchParams();
+  const isSigninParam = searchParams.get("signin") === "true";
+
+  useEffect(() => {
+    if (isSigninParam) {
+      syncSessions();
+    }
+  }, [isSigninParam]);
 
   if (isSyncing) {
     return <div>Synchronizing...</div>;
   }
 
-  return <button onClick={() => syncSessions()}>Sync</button>;
+  return null;
 };

+ 0 - 19
src/shared/lib/workout-session/workout-session.sync.ts

@@ -1,19 +0,0 @@
-import { brandedToast } from "@/components/ui/toast";
-
-import { workoutSessionLocal } from "./workout-session.local";
-import { workoutSessionApi } from "./workout-session.api";
-
-export async function syncLocalWorkoutSessions() {
-  const localSessions = workoutSessionLocal.getAll().filter((s) => s.status !== "synced");
-
-  for (const session of localSessions) {
-    try {
-      const { id: serverId } = await workoutSessionApi.create(session);
-      workoutSessionLocal.markSynced(session.id, serverId);
-    } catch (error) {
-      console.error(error);
-      brandedToast({ title: "SYNC ERROR", variant: "error" });
-    }
-  }
-  workoutSessionLocal.purgeSynced();
-}