{"version":3,"file":"use-mysite-portal-BCcNoszb.cjs","names":[],"sources":["../../../mysite/core/src/mysite-api-context.ts","../../../mysite/ui/src/portal/hooks/use-mysite-portal.ts"],"sourcesContent":["import { createContext, use } from \"react\";\nimport type { MySiteApi } from \"./mysite-api\";\n\nconst MySiteApiContext = createContext<MySiteApi | null>(null);\n\nexport const MySiteApiProvider = MySiteApiContext.Provider;\n\nexport function useMySiteApi(): MySiteApi {\n  const api = use(MySiteApiContext);\n  if (!api) {\n    throw new Error(\"useMySiteApi must be used within a MySiteApiProvider\");\n  }\n  return api;\n}\n","\"use client\";\n\nimport { useQuery, useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport { useMySiteApi } from \"@fluid-app/mysite-core/mysite-api-context\";\nimport type {\n  MySiteProfile,\n  MySiteLink,\n  MySiteFavorite,\n  MySiteTheme,\n  CreateLinkBody,\n  UpdateLinkBody,\n  UpdateProfileBody,\n  UpdateSettingsBody,\n  AddFavoriteBody,\n} from \"@fluid-app/mysite-core/mysite-api-types\";\n\n// ---------------------------------------------------------------------------\n// Query keys — session-scoped, no userId/affiliateId needed\n// ---------------------------------------------------------------------------\n\nexport const PORTAL_MYSITE_KEYS = {\n  profile: () => [\"portal-mysite\", \"profile\"] as const,\n  links: () => [\"portal-mysite\", \"links\"] as const,\n  favorites: () => [\"portal-mysite\", \"favorites\"] as const,\n  themes: () => [\"portal-mysite\", \"themes\"] as const,\n};\n\n// ---------------------------------------------------------------------------\n// Profile hooks\n// ---------------------------------------------------------------------------\n\nexport function usePortalMySiteProfile() {\n  const api = useMySiteApi();\n  return useQuery<MySiteProfile>({\n    queryKey: PORTAL_MYSITE_KEYS.profile(),\n    queryFn: () => api.fetchProfile(),\n  });\n}\n\nexport function usePortalUpdateProfile(options?: { onSuccess?: () => void }) {\n  const api = useMySiteApi();\n  const queryClient = useQueryClient();\n\n  return useMutation({\n    mutationFn: (body: UpdateProfileBody) => api.updateProfile(body),\n    onSuccess: (data) => {\n      queryClient.setQueryData(PORTAL_MYSITE_KEYS.profile(), data);\n      queryClient.invalidateQueries({\n        queryKey: PORTAL_MYSITE_KEYS.profile(),\n      });\n      options?.onSuccess?.();\n    },\n  });\n}\n\nexport function usePortalUpdateSettings(options?: {\n  onSuccess?: (body: UpdateSettingsBody) => void | Promise<void>;\n}) {\n  const api = useMySiteApi();\n  const queryClient = useQueryClient();\n\n  return useMutation({\n    mutationFn: (body: UpdateSettingsBody) => api.updateSettings(body),\n    // Awaited so the mutation stays pending until the refetches land. Callers\n    // otherwise show a success toast over the slug the user just replaced.\n    onSuccess: async (_data, body) => {\n      await queryClient.invalidateQueries({\n        queryKey: PORTAL_MYSITE_KEYS.profile(),\n      });\n      await options?.onSuccess?.(body);\n    },\n  });\n}\n\n// ---------------------------------------------------------------------------\n// Links hooks\n// ---------------------------------------------------------------------------\n\nexport function usePortalLinks() {\n  const api = useMySiteApi();\n  return useQuery<MySiteLink[]>({\n    queryKey: PORTAL_MYSITE_KEYS.links(),\n    queryFn: () => api.listLinks(),\n  });\n}\n\nexport function usePortalCreateLink() {\n  const api = useMySiteApi();\n  const queryClient = useQueryClient();\n\n  return useMutation({\n    mutationFn: (body: CreateLinkBody) => api.createLink(body),\n    onSuccess: () => {\n      queryClient.invalidateQueries({\n        queryKey: PORTAL_MYSITE_KEYS.links(),\n      });\n    },\n  });\n}\n\nexport function usePortalUpdateLink() {\n  const api = useMySiteApi();\n  const queryClient = useQueryClient();\n\n  return useMutation({\n    mutationFn: ({ linkId, body }: { linkId: number; body: UpdateLinkBody }) =>\n      api.updateLink(linkId, body),\n    onSuccess: () => {\n      queryClient.invalidateQueries({\n        queryKey: PORTAL_MYSITE_KEYS.links(),\n      });\n    },\n  });\n}\n\nexport function usePortalDeleteLink() {\n  const api = useMySiteApi();\n  const queryClient = useQueryClient();\n\n  return useMutation({\n    mutationFn: (linkId: number) => api.deleteLink(linkId),\n    onSuccess: () => {\n      queryClient.invalidateQueries({\n        queryKey: PORTAL_MYSITE_KEYS.links(),\n      });\n    },\n  });\n}\n\nexport function usePortalReorderLinks() {\n  const api = useMySiteApi();\n  const queryClient = useQueryClient();\n\n  return useMutation({\n    mutationFn: ({\n      orderedIds,\n    }: {\n      orderedIds: number[];\n      optimisticItems: MySiteLink[];\n    }) => api.reorderLinks(orderedIds),\n    onMutate: async ({ optimisticItems }) => {\n      await queryClient.cancelQueries({\n        queryKey: PORTAL_MYSITE_KEYS.links(),\n      });\n      const previousData = queryClient.getQueryData<MySiteLink[]>(\n        PORTAL_MYSITE_KEYS.links(),\n      );\n      queryClient.setQueryData(PORTAL_MYSITE_KEYS.links(), optimisticItems);\n      return { previousData };\n    },\n    onError: (_err, _vars, context) => {\n      if (context?.previousData) {\n        queryClient.setQueryData(\n          PORTAL_MYSITE_KEYS.links(),\n          context.previousData,\n        );\n      }\n    },\n    onSettled: () => {\n      queryClient.invalidateQueries({\n        queryKey: PORTAL_MYSITE_KEYS.links(),\n      });\n    },\n  });\n}\n\n// ---------------------------------------------------------------------------\n// Favorites hooks\n// ---------------------------------------------------------------------------\n\nexport function usePortalFavorites() {\n  const api = useMySiteApi();\n  return useQuery<MySiteFavorite[]>({\n    queryKey: PORTAL_MYSITE_KEYS.favorites(),\n    queryFn: () => api.listFavorites(),\n  });\n}\n\nexport function usePortalAddFavorite() {\n  const api = useMySiteApi();\n  const queryClient = useQueryClient();\n\n  return useMutation({\n    mutationFn: (body: AddFavoriteBody) => api.addFavorite(body),\n    onSuccess: () => {\n      queryClient.invalidateQueries({\n        queryKey: PORTAL_MYSITE_KEYS.favorites(),\n      });\n    },\n  });\n}\n\nexport function usePortalDeleteFavorite() {\n  const api = useMySiteApi();\n  const queryClient = useQueryClient();\n\n  return useMutation({\n    mutationFn: (favoriteId: number) => api.deleteFavorite(favoriteId),\n    onSuccess: () => {\n      queryClient.invalidateQueries({\n        queryKey: PORTAL_MYSITE_KEYS.favorites(),\n      });\n    },\n  });\n}\n\nexport function usePortalReorderFavorites() {\n  const api = useMySiteApi();\n  const queryClient = useQueryClient();\n\n  return useMutation({\n    mutationFn: ({\n      orderedIds,\n    }: {\n      orderedIds: number[];\n      optimisticItems: MySiteFavorite[];\n    }) => api.reorderFavorites(orderedIds),\n    onMutate: async ({ optimisticItems }) => {\n      await queryClient.cancelQueries({\n        queryKey: PORTAL_MYSITE_KEYS.favorites(),\n      });\n      const previousData = queryClient.getQueryData<MySiteFavorite[]>(\n        PORTAL_MYSITE_KEYS.favorites(),\n      );\n      queryClient.setQueryData(PORTAL_MYSITE_KEYS.favorites(), optimisticItems);\n      return { previousData };\n    },\n    onError: (_err, _vars, context) => {\n      if (context?.previousData) {\n        queryClient.setQueryData(\n          PORTAL_MYSITE_KEYS.favorites(),\n          context.previousData,\n        );\n      }\n    },\n    onSettled: () => {\n      queryClient.invalidateQueries({\n        queryKey: PORTAL_MYSITE_KEYS.favorites(),\n      });\n    },\n  });\n}\n\n// ---------------------------------------------------------------------------\n// Themes hook\n// ---------------------------------------------------------------------------\n\nexport function usePortalMySiteThemes() {\n  const api = useMySiteApi();\n  return useQuery<MySiteTheme[]>({\n    queryKey: PORTAL_MYSITE_KEYS.themes(),\n    queryFn: () => api.listThemes(),\n  });\n}\n"],"mappings":"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"}