@singi-labs/sifa-sdk 0.9.19 → 0.9.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/dist/feed-DHTy7fUN.d.cts +254 -0
  2. package/dist/feed-DHTy7fUN.d.ts +254 -0
  3. package/dist/{index-DCpMh2Ny.d.cts → index-DYUYJxOs.d.cts} +1 -1
  4. package/dist/{index-DCpMh2Ny.d.ts → index-DYUYJxOs.d.ts} +1 -1
  5. package/dist/index.cjs +132 -4
  6. package/dist/index.cjs.map +1 -1
  7. package/dist/index.d.cts +4 -3
  8. package/dist/index.d.ts +4 -3
  9. package/dist/index.js +121 -5
  10. package/dist/index.js.map +1 -1
  11. package/dist/keys-D-vNPzXx.d.ts +1085 -0
  12. package/dist/keys-DRD79nDE.d.cts +1085 -0
  13. package/dist/query/fetchers/index.cjs +155 -1
  14. package/dist/query/fetchers/index.cjs.map +1 -1
  15. package/dist/query/fetchers/index.d.cts +6 -933
  16. package/dist/query/fetchers/index.d.ts +6 -933
  17. package/dist/query/fetchers/index.js +146 -2
  18. package/dist/query/fetchers/index.js.map +1 -1
  19. package/dist/query/hooks/index.cjs +2268 -0
  20. package/dist/query/hooks/index.cjs.map +1 -0
  21. package/dist/query/hooks/index.d.cts +479 -0
  22. package/dist/query/hooks/index.d.ts +479 -0
  23. package/dist/query/hooks/index.js +2178 -0
  24. package/dist/query/hooks/index.js.map +1 -0
  25. package/dist/query/index.cjs +340 -1
  26. package/dist/query/index.cjs.map +1 -1
  27. package/dist/query/index.d.cts +9 -352
  28. package/dist/query/index.d.ts +9 -352
  29. package/dist/query/index.js +322 -3
  30. package/dist/query/index.js.map +1 -1
  31. package/dist/schemas/index.cjs +102 -1
  32. package/dist/schemas/index.cjs.map +1 -1
  33. package/dist/schemas/index.d.cts +28 -2
  34. package/dist/schemas/index.d.ts +28 -2
  35. package/dist/schemas/index.js +91 -2
  36. package/dist/schemas/index.js.map +1 -1
  37. package/package.json +11 -1
@@ -631,6 +631,141 @@ async function fetchFollowing(config, opts = {}) {
631
631
  return { follows: [] };
632
632
  }
633
633
  }
634
+ function followUser(config, handle, opts = {}) {
635
+ const { note, ...rest } = opts;
636
+ return apiWrite(
637
+ config,
638
+ `/api/follow/${encodeURIComponent(handle)}`,
639
+ "POST",
640
+ {
641
+ body: note !== void 0 ? { note } : void 0,
642
+ ...rest
643
+ }
644
+ );
645
+ }
646
+ function unfollowUser(config, handle, opts = {}) {
647
+ return apiWrite(config, `/api/follow/${encodeURIComponent(handle)}`, "DELETE", opts);
648
+ }
649
+ function buildListPath(prefix, opts) {
650
+ const params = new URLSearchParams();
651
+ if (opts.cursor) params.set("cursor", opts.cursor);
652
+ if (opts.limit) params.set("limit", String(opts.limit));
653
+ const qs = params.toString();
654
+ return `${prefix}${qs ? `?${qs}` : ""}`;
655
+ }
656
+ async function getFollowers(config, handle, opts = {}) {
657
+ const headers = { ...opts.headers ?? {} };
658
+ if (opts.cookieHeader) headers.cookie = opts.cookieHeader;
659
+ try {
660
+ const res = await apiFetch(
661
+ config,
662
+ buildListPath(`/api/profile/${encodeURIComponent(handle)}/followers`, opts),
663
+ { credentials: "include", cache: "no-store", ...opts, headers }
664
+ );
665
+ return { follows: res.follows, cursor: res.cursor ?? null };
666
+ } catch {
667
+ return { follows: [], cursor: null };
668
+ }
669
+ }
670
+ async function getFollowing(config, handle, opts = {}) {
671
+ const headers = { ...opts.headers ?? {} };
672
+ if (opts.cookieHeader) headers.cookie = opts.cookieHeader;
673
+ try {
674
+ const res = await apiFetch(
675
+ config,
676
+ buildListPath(`/api/profile/${encodeURIComponent(handle)}/following`, opts),
677
+ { credentials: "include", cache: "no-store", ...opts, headers }
678
+ );
679
+ return { follows: res.follows, cursor: res.cursor ?? null };
680
+ } catch {
681
+ return { follows: [], cursor: null };
682
+ }
683
+ }
684
+ async function getFollowingFeed(config, opts = {}) {
685
+ const params = new URLSearchParams();
686
+ if (opts.cursor) params.set("cursor", opts.cursor);
687
+ if (opts.limit) params.set("limit", String(opts.limit));
688
+ if (opts.categories && opts.categories.length > 0) {
689
+ params.set("categories", opts.categories.join(","));
690
+ }
691
+ const qs = params.toString();
692
+ const headers = { ...opts.headers ?? {} };
693
+ if (opts.cookieHeader) headers.cookie = opts.cookieHeader;
694
+ try {
695
+ const res = await apiFetch(
696
+ config,
697
+ `/api/following/feed${qs ? `?${qs}` : ""}`,
698
+ { credentials: "include", cache: "no-store", ...opts, headers }
699
+ );
700
+ return { items: res.items ?? [], cursor: res.cursor ?? null };
701
+ } catch {
702
+ return { items: [], cursor: null };
703
+ }
704
+ }
705
+
706
+ // src/query/fetchers/follow-extras.ts
707
+ function buildListPath2(prefix, opts) {
708
+ const params = new URLSearchParams();
709
+ if (opts.cursor) params.set("cursor", opts.cursor);
710
+ if (opts.limit) params.set("limit", String(opts.limit));
711
+ const qs = params.toString();
712
+ return `${prefix}${qs ? `?${qs}` : ""}`;
713
+ }
714
+ async function fetchFollowProfilePage(config, path, opts) {
715
+ const headers = { ...opts.headers ?? {} };
716
+ if (opts.cookieHeader) headers.cookie = opts.cookieHeader;
717
+ try {
718
+ const res = await apiFetch(
719
+ config,
720
+ path,
721
+ { credentials: "include", cache: "no-store", ...opts, headers }
722
+ );
723
+ return { items: res.items ?? [], cursor: res.cursor ?? null };
724
+ } catch {
725
+ return { items: [], cursor: null };
726
+ }
727
+ }
728
+ async function getMutuals(config, handleOrDid, opts = {}) {
729
+ return fetchFollowProfilePage(
730
+ config,
731
+ buildListPath2(`/api/profile/${encodeURIComponent(handleOrDid)}/mutuals`, opts),
732
+ opts
733
+ );
734
+ }
735
+ async function getBlueskySuggestions(config, opts = {}) {
736
+ return fetchFollowProfilePage(config, buildListPath2("/api/me/bluesky-suggestions", opts), opts);
737
+ }
738
+
739
+ // src/query/fetchers/admin-feature-allowlists.ts
740
+ async function listFeatureAllowlist(config, flag, opts = {}) {
741
+ const headers = { ...opts.headers ?? {} };
742
+ if (opts.cookieHeader) headers.cookie = opts.cookieHeader;
743
+ try {
744
+ const res = await apiFetch(
745
+ config,
746
+ `/api/admin/feature-allowlists/${encodeURIComponent(flag)}`,
747
+ { credentials: "include", cache: "no-store", ...opts, headers }
748
+ );
749
+ return { items: res.items ?? [] };
750
+ } catch {
751
+ return { items: [] };
752
+ }
753
+ }
754
+ function addFeatureAllowlist(config, flag, did, opts = {}) {
755
+ const { note, ...rest } = opts;
756
+ return apiWrite(config, `/api/admin/feature-allowlists/${encodeURIComponent(flag)}`, "POST", {
757
+ body: note !== void 0 ? { did, note } : { did },
758
+ ...rest
759
+ });
760
+ }
761
+ function removeFeatureAllowlist(config, flag, did, opts = {}) {
762
+ return apiWrite(
763
+ config,
764
+ `/api/admin/feature-allowlists/${encodeURIComponent(flag)}/${encodeURIComponent(did)}`,
765
+ "DELETE",
766
+ opts
767
+ );
768
+ }
634
769
 
635
770
  // src/query/fetchers/activity.ts
636
771
  async function fetchHeatmapData(config, handleOrDid, days, options = {}) {
@@ -946,7 +1081,16 @@ var sifaQueryKeys = {
946
1081
  },
947
1082
  follow: {
948
1083
  all: () => ["sifa", "follow"],
949
- following: (opts) => ["sifa", "follow", "following", opts]
1084
+ following: (opts) => ["sifa", "follow", "following", opts],
1085
+ followers: (handle) => ["sifa", "follow", "followers", handle],
1086
+ followingOf: (handle) => ["sifa", "follow", "following-of", handle],
1087
+ feed: (opts) => ["sifa", "follow", "feed", opts],
1088
+ mutuals: (handle) => ["sifa", "follow", "mutuals", handle],
1089
+ blueskySuggestions: () => ["sifa", "follow", "bluesky-suggestions"]
1090
+ },
1091
+ admin: {
1092
+ all: () => ["sifa", "admin"],
1093
+ featureAllowlist: (flag) => ["sifa", "admin", "feature-allowlist", flag]
950
1094
  },
951
1095
  stats: {
952
1096
  all: () => ["sifa", "stats"],
@@ -1717,6 +1861,181 @@ function useFollowing(opts = {}, options) {
1717
1861
  ...options
1718
1862
  });
1719
1863
  }
1864
+ function useFollow(options) {
1865
+ const config = useSifaConfig();
1866
+ const queryClient = reactQuery.useQueryClient();
1867
+ return reactQuery.useMutation({
1868
+ mutationFn: ({ handle, note }) => followUser(config, handle, { note }),
1869
+ onSuccess: async (result, variables, onMutateResult, context) => {
1870
+ if (result.success) {
1871
+ await queryClient.invalidateQueries({ queryKey: sifaQueryKeys.follow.all() });
1872
+ }
1873
+ await options?.onSuccess?.(result, variables, onMutateResult, context);
1874
+ },
1875
+ onError: async (error, variables, onMutateResult, context) => {
1876
+ await queryClient.invalidateQueries({ queryKey: sifaQueryKeys.follow.all() });
1877
+ await options?.onError?.(error, variables, onMutateResult, context);
1878
+ },
1879
+ ...options
1880
+ });
1881
+ }
1882
+ function useUnfollow(options) {
1883
+ const config = useSifaConfig();
1884
+ const queryClient = reactQuery.useQueryClient();
1885
+ return reactQuery.useMutation({
1886
+ mutationFn: ({ handle }) => unfollowUser(config, handle),
1887
+ onSuccess: async (result, variables, onMutateResult, context) => {
1888
+ if (result.success) {
1889
+ await queryClient.invalidateQueries({ queryKey: sifaQueryKeys.follow.all() });
1890
+ }
1891
+ await options?.onSuccess?.(result, variables, onMutateResult, context);
1892
+ },
1893
+ onError: async (error, variables, onMutateResult, context) => {
1894
+ await queryClient.invalidateQueries({ queryKey: sifaQueryKeys.follow.all() });
1895
+ await options?.onError?.(error, variables, onMutateResult, context);
1896
+ },
1897
+ ...options
1898
+ });
1899
+ }
1900
+ function useFollowers(handle, opts = {}, options) {
1901
+ const config = useSifaConfig();
1902
+ return reactQuery.useInfiniteQuery({
1903
+ queryKey: sifaQueryKeys.follow.followers(handle),
1904
+ queryFn: ({ pageParam }) => getFollowers(config, handle, { ...opts, cursor: pageParam }),
1905
+ initialPageParam: void 0,
1906
+ getNextPageParam: (lastPage) => lastPage.cursor ?? void 0,
1907
+ enabled: handle.length > 0,
1908
+ ...options
1909
+ });
1910
+ }
1911
+ function useFollowingList(handle, opts = {}, options) {
1912
+ const config = useSifaConfig();
1913
+ return reactQuery.useInfiniteQuery({
1914
+ queryKey: sifaQueryKeys.follow.followingOf(handle),
1915
+ queryFn: ({ pageParam }) => getFollowing(config, handle, { ...opts, cursor: pageParam }),
1916
+ initialPageParam: void 0,
1917
+ getNextPageParam: (lastPage) => lastPage.cursor ?? void 0,
1918
+ enabled: handle.length > 0,
1919
+ ...options
1920
+ });
1921
+ }
1922
+ function useFollowingFeed(opts = {}, options) {
1923
+ const config = useSifaConfig();
1924
+ const keyOpts = {
1925
+ limit: opts.limit,
1926
+ categories: opts.categories
1927
+ };
1928
+ return reactQuery.useInfiniteQuery({
1929
+ queryKey: sifaQueryKeys.follow.feed(keyOpts),
1930
+ queryFn: ({ pageParam }) => getFollowingFeed(config, { ...opts, cursor: pageParam }),
1931
+ initialPageParam: void 0,
1932
+ getNextPageParam: (lastPage) => lastPage.cursor ?? void 0,
1933
+ ...options
1934
+ });
1935
+ }
1936
+ function useMutuals(handleOrDid, opts = {}, options) {
1937
+ const config = useSifaConfig();
1938
+ return reactQuery.useInfiniteQuery({
1939
+ queryKey: sifaQueryKeys.follow.mutuals(handleOrDid),
1940
+ queryFn: ({ pageParam }) => getMutuals(config, handleOrDid, { ...opts, cursor: pageParam }),
1941
+ initialPageParam: void 0,
1942
+ getNextPageParam: (lastPage) => lastPage.cursor ?? void 0,
1943
+ enabled: handleOrDid.length > 0,
1944
+ ...options
1945
+ });
1946
+ }
1947
+ function useBlueskySuggestions(opts = {}, options) {
1948
+ const config = useSifaConfig();
1949
+ return reactQuery.useInfiniteQuery({
1950
+ queryKey: sifaQueryKeys.follow.blueskySuggestions(),
1951
+ queryFn: ({ pageParam }) => getBlueskySuggestions(config, { ...opts, cursor: pageParam }),
1952
+ initialPageParam: void 0,
1953
+ getNextPageParam: (lastPage) => lastPage.cursor ?? void 0,
1954
+ ...options
1955
+ });
1956
+ }
1957
+ function useFeatureAllowlist(flag, options) {
1958
+ const config = useSifaConfig();
1959
+ return reactQuery.useQuery({
1960
+ queryKey: sifaQueryKeys.admin.featureAllowlist(flag),
1961
+ queryFn: () => listFeatureAllowlist(config, flag),
1962
+ ...options
1963
+ });
1964
+ }
1965
+ function useAddFeatureAllowlist(flag, options) {
1966
+ const config = useSifaConfig();
1967
+ const queryClient = reactQuery.useQueryClient();
1968
+ const key = sifaQueryKeys.admin.featureAllowlist(flag);
1969
+ return reactQuery.useMutation({
1970
+ mutationFn: ({ did, note }) => addFeatureAllowlist(config, flag, did, { note }),
1971
+ onMutate: async ({ did, note }) => {
1972
+ await queryClient.cancelQueries({ queryKey: key });
1973
+ const previous = queryClient.getQueryData(key);
1974
+ const optimisticEntry = {
1975
+ did,
1976
+ addedAt: (/* @__PURE__ */ new Date()).toISOString(),
1977
+ note: note ?? null
1978
+ };
1979
+ const next = previous ? { items: [optimisticEntry, ...previous.items.filter((e) => e.did !== did)] } : { items: [optimisticEntry] };
1980
+ queryClient.setQueryData(key, next);
1981
+ return { previous };
1982
+ },
1983
+ onSuccess: async (result, variables, onMutateResult, context) => {
1984
+ if (!result.success && onMutateResult?.previous) {
1985
+ queryClient.setQueryData(key, onMutateResult.previous);
1986
+ }
1987
+ await options?.onSuccess?.(result, variables, onMutateResult, context);
1988
+ },
1989
+ onError: async (error, variables, onMutateResult, context) => {
1990
+ if (onMutateResult?.previous) {
1991
+ queryClient.setQueryData(key, onMutateResult.previous);
1992
+ }
1993
+ await options?.onError?.(error, variables, onMutateResult, context);
1994
+ },
1995
+ onSettled: async (result, error, variables, onMutateResult, context) => {
1996
+ await queryClient.invalidateQueries({ queryKey: key });
1997
+ await options?.onSettled?.(result, error, variables, onMutateResult, context);
1998
+ },
1999
+ ...options
2000
+ });
2001
+ }
2002
+ function useRemoveFeatureAllowlist(flag, options) {
2003
+ const config = useSifaConfig();
2004
+ const queryClient = reactQuery.useQueryClient();
2005
+ const key = sifaQueryKeys.admin.featureAllowlist(flag);
2006
+ return reactQuery.useMutation(
2007
+ {
2008
+ mutationFn: ({ did }) => removeFeatureAllowlist(config, flag, did),
2009
+ onMutate: async ({ did }) => {
2010
+ await queryClient.cancelQueries({ queryKey: key });
2011
+ const previous = queryClient.getQueryData(key);
2012
+ if (previous) {
2013
+ queryClient.setQueryData(key, {
2014
+ items: previous.items.filter((e) => e.did !== did)
2015
+ });
2016
+ }
2017
+ return { previous };
2018
+ },
2019
+ onSuccess: async (result, variables, onMutateResult, context) => {
2020
+ if (!result.success && onMutateResult?.previous) {
2021
+ queryClient.setQueryData(key, onMutateResult.previous);
2022
+ }
2023
+ await options?.onSuccess?.(result, variables, onMutateResult, context);
2024
+ },
2025
+ onError: async (error, variables, onMutateResult, context) => {
2026
+ if (onMutateResult?.previous) {
2027
+ queryClient.setQueryData(key, onMutateResult.previous);
2028
+ }
2029
+ await options?.onError?.(error, variables, onMutateResult, context);
2030
+ },
2031
+ onSettled: async (result, error, variables, onMutateResult, context) => {
2032
+ await queryClient.invalidateQueries({ queryKey: key });
2033
+ await options?.onSettled?.(result, error, variables, onMutateResult, context);
2034
+ },
2035
+ ...options
2036
+ }
2037
+ );
2038
+ }
1720
2039
  function useHeatmapData(handleOrDid, days, options) {
1721
2040
  const config = useSifaConfig();
1722
2041
  return reactQuery.useQuery({
@@ -1888,6 +2207,7 @@ exports.HIDDEN_ITEM_SOURCES = HIDDEN_ITEM_SOURCES;
1888
2207
  exports.HIDDEN_ITEM_TYPES = HIDDEN_ITEM_TYPES;
1889
2208
  exports.QUOTED_POSTS_BATCH_MAX = QUOTED_POSTS_BATCH_MAX;
1890
2209
  exports.SifaProvider = SifaProvider;
2210
+ exports.addFeatureAllowlist = addFeatureAllowlist;
1891
2211
  exports.apiFetch = apiFetch;
1892
2212
  exports.apiFetchOrNull = apiFetchOrNull;
1893
2213
  exports.apiWrite = apiWrite;
@@ -1939,6 +2259,12 @@ exports.fetchSkillSuggestions = fetchSkillSuggestions;
1939
2259
  exports.fetchStats = fetchStats;
1940
2260
  exports.fetchSuggestionCount = fetchSuggestionCount;
1941
2261
  exports.fetchSuggestions = fetchSuggestions;
2262
+ exports.followUser = followUser;
2263
+ exports.getBlueskySuggestions = getBlueskySuggestions;
2264
+ exports.getFollowers = getFollowers;
2265
+ exports.getFollowing = getFollowing;
2266
+ exports.getFollowingFeed = getFollowingFeed;
2267
+ exports.getMutuals = getMutuals;
1942
2268
  exports.hideKeytraceClaim = hideKeytraceClaim;
1943
2269
  exports.hideOrcidPublication = hideOrcidPublication;
1944
2270
  exports.hideProfileItem = hideProfileItem;
@@ -1947,8 +2273,10 @@ exports.hideStandardPublication = hideStandardPublication;
1947
2273
  exports.initiateNetworkMapGeneration = initiateNetworkMapGeneration;
1948
2274
  exports.isNetworkMapResponse = isNetworkMapResponse;
1949
2275
  exports.linkSkillToPosition = linkSkillToPosition;
2276
+ exports.listFeatureAllowlist = listFeatureAllowlist;
1950
2277
  exports.refreshOrcidPublications = refreshOrcidPublications;
1951
2278
  exports.refreshPds = refreshPds;
2279
+ exports.removeFeatureAllowlist = removeFeatureAllowlist;
1952
2280
  exports.resetProfile = resetProfile;
1953
2281
  exports.resolveQuotedPosts = resolveQuotedPosts;
1954
2282
  exports.retractRoadmapVote = retractRoadmapVote;
@@ -1956,6 +2284,7 @@ exports.searchSkills = searchSkills;
1956
2284
  exports.setExternalAccountPrimary = setExternalAccountPrimary;
1957
2285
  exports.setPositionPrimary = setPositionPrimary;
1958
2286
  exports.sifaQueryKeys = sifaQueryKeys;
2287
+ exports.unfollowUser = unfollowUser;
1959
2288
  exports.unhideKeytraceClaim = unhideKeytraceClaim;
1960
2289
  exports.unhideOrcidPublication = unhideOrcidPublication;
1961
2290
  exports.unhideProfileItem = unhideProfileItem;
@@ -1975,9 +2304,11 @@ exports.updateSkill = updateSkill;
1975
2304
  exports.uploadAvatar = uploadAvatar;
1976
2305
  exports.useActivityFeed = useActivityFeed;
1977
2306
  exports.useActivityTeaser = useActivityTeaser;
2307
+ exports.useAddFeatureAllowlist = useAddFeatureAllowlist;
1978
2308
  exports.useAppAccountCheck = useAppAccountCheck;
1979
2309
  exports.useAppsRegistry = useAppsRegistry;
1980
2310
  exports.useAtFundLink = useAtFundLink;
2311
+ exports.useBlueskySuggestions = useBlueskySuggestions;
1981
2312
  exports.useBulkHideProfileItems = useBulkHideProfileItems;
1982
2313
  exports.useBulkHideStandardPublications = useBulkHideStandardPublications;
1983
2314
  exports.useBulkUnhideProfileItems = useBulkUnhideProfileItems;
@@ -2003,8 +2334,13 @@ exports.useDeleteRecord = useDeleteRecord;
2003
2334
  exports.useDeleteSkill = useDeleteSkill;
2004
2335
  exports.useEndorsementCount = useEndorsementCount;
2005
2336
  exports.useExternalAccounts = useExternalAccounts;
2337
+ exports.useFeatureAllowlist = useFeatureAllowlist;
2006
2338
  exports.useFeaturedProfile = useFeaturedProfile;
2339
+ exports.useFollow = useFollow;
2340
+ exports.useFollowers = useFollowers;
2007
2341
  exports.useFollowing = useFollowing;
2342
+ exports.useFollowingFeed = useFollowingFeed;
2343
+ exports.useFollowingList = useFollowingList;
2008
2344
  exports.useHeatmapData = useHeatmapData;
2009
2345
  exports.useHiddenApps = useHiddenApps;
2010
2346
  exports.useHideKeytraceClaim = useHideKeytraceClaim;
@@ -2013,12 +2349,14 @@ exports.useHideProfileItem = useHideProfileItem;
2013
2349
  exports.useHideSifaPublication = useHideSifaPublication;
2014
2350
  exports.useHideStandardPublication = useHideStandardPublication;
2015
2351
  exports.useLinkSkillToPosition = useLinkSkillToPosition;
2352
+ exports.useMutuals = useMutuals;
2016
2353
  exports.useMyRoadmapVotes = useMyRoadmapVotes;
2017
2354
  exports.useNetworkStreamCount = useNetworkStreamCount;
2018
2355
  exports.useProfile = useProfile;
2019
2356
  exports.useReactionStatus = useReactionStatus;
2020
2357
  exports.useRefreshOrcidPublications = useRefreshOrcidPublications;
2021
2358
  exports.useRefreshPds = useRefreshPds;
2359
+ exports.useRemoveFeatureAllowlist = useRemoveFeatureAllowlist;
2022
2360
  exports.useResetProfile = useResetProfile;
2023
2361
  exports.useRetractRoadmapVote = useRetractRoadmapVote;
2024
2362
  exports.useRoadmapVotes = useRoadmapVotes;
@@ -2032,6 +2370,7 @@ exports.useSkillSuggestions = useSkillSuggestions;
2032
2370
  exports.useStats = useStats;
2033
2371
  exports.useSuggestionCount = useSuggestionCount;
2034
2372
  exports.useSuggestions = useSuggestions;
2373
+ exports.useUnfollow = useUnfollow;
2035
2374
  exports.useUnhideKeytraceClaim = useUnhideKeytraceClaim;
2036
2375
  exports.useUnhideOrcidPublication = useUnhideOrcidPublication;
2037
2376
  exports.useUnhideProfileItem = useUnhideProfileItem;