use-workout-session.service.ts 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. import { nullToUndefined } from "@/shared/lib/format";
  2. import { syncWorkoutSessionAction } from "@/features/workout-session/actions/sync-workout-sessions.action";
  3. import { getWorkoutSessionsAction } from "@/features/workout-session/actions/get-workout-sessions.action";
  4. import { useSession } from "@/features/auth/lib/auth-client";
  5. import { workoutSessionLocal } from "./workout-session.local";
  6. import type { WorkoutSession } from "./types/workout-session";
  7. // This is an abstraction layer to handle the local storage and/or the API calls.
  8. // He's the orchestrator.
  9. export const useWorkoutSessionService = () => {
  10. const { data: session } = useSession();
  11. const userId = session?.user?.id;
  12. const getAll = async (): Promise<WorkoutSession[]> => {
  13. if (userId) {
  14. const result = await getWorkoutSessionsAction({ userId });
  15. if (result?.serverError) throw new Error(result.serverError);
  16. const serverSessions = (result?.data?.sessions || []).map((session) => ({
  17. ...session,
  18. startedAt: session.startedAt instanceof Date ? session.startedAt.toISOString() : session.startedAt,
  19. endedAt:
  20. session.endedAt instanceof Date
  21. ? session.endedAt.toISOString()
  22. : typeof session.endedAt === "string"
  23. ? session.endedAt
  24. : undefined,
  25. duration: nullToUndefined(session.duration),
  26. exercises: session.exercises.map(({ exercise, order, sets }) => ({
  27. ...exercise,
  28. order,
  29. sets: sets.map((set) => {
  30. return {
  31. ...set,
  32. units: nullToUndefined(set.units),
  33. };
  34. }),
  35. })),
  36. }));
  37. const localSessions = workoutSessionLocal.getAll().filter((s) => s.status !== "synced");
  38. return [...localSessions, ...serverSessions].sort((a, b) => new Date(b.startedAt).getTime() - new Date(a.startedAt).getTime());
  39. }
  40. return workoutSessionLocal.getAll().sort((a, b) => {
  41. const dateA = typeof a.startedAt === "string" ? new Date(a.startedAt) : a.startedAt;
  42. const dateB = typeof b.startedAt === "string" ? new Date(b.startedAt) : b.startedAt;
  43. return dateB.getTime() - dateA.getTime();
  44. });
  45. };
  46. const add = async (session: WorkoutSession) => {
  47. if (userId) {
  48. // Utiliser l'action de synchronisation
  49. const result = await syncWorkoutSessionAction({
  50. session: {
  51. ...session,
  52. userId: "current-user-id", // TODO: passer le vrai userId
  53. status: "synced",
  54. },
  55. });
  56. if (result?.serverError) throw new Error(result.serverError);
  57. if (result?.data?.data) {
  58. workoutSessionLocal.markSynced(session.id, result.data.data.id);
  59. }
  60. }
  61. return workoutSessionLocal.add(session);
  62. };
  63. const update = async (id: string, data: Partial<WorkoutSession>) => {
  64. // if (userId) {
  65. // // TODO: Créer une action updateWorkoutSessionAction
  66. // const result = await updateWorkoutSessionAction({ id, data });
  67. // if (result.serverError) throw new Error(result.serverError);
  68. // }
  69. // return workoutSessionLocal.update(id, data);
  70. };
  71. const complete = async (id: string) => {
  72. // const data = {
  73. // status: "completed" as const,
  74. // endedAt: new Date().toISOString(),
  75. // };
  76. // if (isUserLoggedIn()) {
  77. // const result = await completeWorkoutSessionAction({ id });
  78. // if (result.serverError) throw new Error(result.serverError);
  79. // }
  80. // return workoutSessionLocal.update(id, data);
  81. };
  82. const remove = async (id: string) => {
  83. // if (isUserLoggedIn()) {
  84. // // TODO: Créer une action deleteWorkoutSessionAction
  85. // const result = await deleteWorkoutSessionAction({ id });
  86. // if (result.serverError) throw new Error(result.serverError);
  87. // }
  88. // workoutSessionLocal.remove(id);
  89. };
  90. return { getAll, add, update, complete, remove };
  91. };