UNPKG

use-bluesky

Version:

React hooks to interact with the Bluesky API

311 lines (297 loc) 11.5 kB
/*! use-bluesky v0.0.4 !*/ import { createContext, useMemo, useContext, useCallback } from 'react'; import { jsx } from 'react/jsx-runtime'; import { QueryClient, QueryClientProvider, useInfiniteQuery, useMutation, useQuery } from '@tanstack/react-query'; import axios from 'axios'; var BlueskyContext = /*#__PURE__*/createContext(undefined); // Bluesky API URL var BLUESKY_API_URL = 'https://public.api.bsky.app'; // Routes var ACTOR_STARTER_PACKS_ROUTE = '/xrpc/app.bsky.graph.getActorStarterPacks'; var PROFILE_ROUTE = '/xrpc/app.bsky.actor.getProfile'; var FOLLOWERS_ROUTE = '/xrpc/app.bsky.graph.getFollowers'; var FOLLOWS_ROUTE = '/xrpc/app.bsky.graph.getFollows'; var LIST_ROUTE = '/xrpc/app.bsky.graph.getList'; var RESOLVE_HANDLE_ROUTE = '/xrpc/com.atproto.identity.resolveHandle'; var STARTER_PACK_ROUTE = '/xrpc/app.bsky.graph.getStarterPack'; var SEARCH_ACTORS_ROUTE = '/xrpc/app.bsky.actor.searchActors'; // Mutation Routes var FOLLOW_ROUTE = '/follow'; var UNFOLLOW_ROUTE = '/unfollow'; var queryClient = new QueryClient(); var BlueskyProvider = function BlueskyProvider(_ref) { var children = _ref.children, _ref$baseUrl = _ref.baseUrl, baseUrl = _ref$baseUrl === void 0 ? BLUESKY_API_URL : _ref$baseUrl, queryClientProp = _ref.queryClient, session = _ref.session, token = _ref.token; var localQueryClient = useMemo(function () { return queryClientProp !== null && queryClientProp !== void 0 ? queryClientProp : queryClient; }, [queryClientProp]); return jsx(BlueskyContext.Provider, { value: { baseUrl: baseUrl, session: session, token: token }, children: jsx(QueryClientProvider, { client: localQueryClient, children: children }) }); }; var useActorStarterPacks = function useActorStarterPacks(options) { var actor = options.actor, cursor = options.cursor, _options$enabled = options.enabled, enabled = _options$enabled === void 0 ? true : _options$enabled, initialData = options.initialData, limit = options.limit, _options$refetchOnMou = options.refetchOnMount, refetchOnMount = _options$refetchOnMou === void 0 ? false : _options$refetchOnMou; return useInfiniteQuery({ enabled: !!actor && enabled, queryKey: ['starter-packs', actor, limit, cursor], queryFn: function queryFn(_ref) { var _ref$pageParam = _ref.pageParam, pageParam = _ref$pageParam === void 0 ? '' : _ref$pageParam; return fetch("".concat(BLUESKY_API_URL).concat(ACTOR_STARTER_PACKS_ROUTE, "?actor=").concat(encodeURIComponent(actor !== null && actor !== void 0 ? actor : '')).concat(limit ? "&limit=".concat(limit) : '').concat(pageParam ? "&cursor=".concat(pageParam) : '')).then(function (res) { return res.json(); }); }, getNextPageParam: function getNextPageParam(lastPage, pages) { return lastPage.cursor; }, initialData: initialData ? { pageParams: [cursor !== null && cursor !== void 0 ? cursor : ''], pages: [initialData] } : undefined, initialPageParam: cursor, refetchOnMount: refetchOnMount || !initialData }); }; var useBluesky = function useBluesky() { var _useContext; var context = (_useContext = useContext(BlueskyContext)) !== null && _useContext !== void 0 ? _useContext : { baseUrl: BLUESKY_API_URL }; return context; }; var useFollow = function useFollow(_ref) { var did = _ref.did, onSuccess = _ref.onSuccess, followUri = _ref.followUri; var _useBluesky = useBluesky(), baseUrl = _useBluesky.baseUrl, token = _useBluesky.token; var headers = useMemo(function () { return token ? { Authorization: "Bearer ".concat(token) } : undefined; }, [token]); var _useMutation = useMutation({ mutationFn: function mutationFn(did) { return axios.post("".concat(baseUrl).concat(FOLLOW_ROUTE), { actors: [did] }, { headers: headers }); }, onSuccess: onSuccess }), followMutation = _useMutation.mutate, isFollowing = _useMutation.isPending; var _useMutation2 = useMutation({ mutationFn: function mutationFn(followUri) { return axios.post("".concat(baseUrl).concat(UNFOLLOW_ROUTE), { uris: [followUri] }, { headers: headers }); }, onSuccess: onSuccess }), unfollowMutation = _useMutation2.mutate, isUnfollowing = _useMutation2.isPending; var follow = useCallback(function () { return followMutation(did); }, [did, followMutation]); var unfollow = useCallback(function () { return unfollowMutation(followUri); }, [followUri, unfollowMutation]); return { follow: follow, isPending: !!(isFollowing !== null && isFollowing !== void 0 ? isFollowing : isUnfollowing), unfollow: unfollow }; }; var useFollowers = function useFollowers(options) { var _useBluesky = useBluesky(), baseUrl = _useBluesky.baseUrl, token = _useBluesky.token; var actor = options.actor, _options$cursor = options.cursor, cursor = _options$cursor === void 0 ? '' : _options$cursor, initialData = options.initialData, _options$limit = options.limit, limit = _options$limit === void 0 ? 100 : _options$limit, refetchOnMount = options.refetchOnMount; return useInfiniteQuery({ enabled: !!actor, initialData: initialData, queryKey: ['followers', baseUrl, actor, limit, token], queryFn: function queryFn(_ref) { var _ref$pageParam = _ref.pageParam, pageParam = _ref$pageParam === void 0 ? '' : _ref$pageParam; var headers = token ? { Authorization: "Bearer ".concat(token) } : undefined; return fetch("".concat(baseUrl).concat(FOLLOWERS_ROUTE, "?actor=").concat(actor, "&limit=").concat(limit).concat(pageParam ? "&cursor=".concat(pageParam) : ''), { headers: headers }).then(function (res) { return res.json(); }); }, getNextPageParam: function getNextPageParam(lastPage, pages) { return lastPage.cursor; }, initialPageParam: cursor, refetchOnMount: refetchOnMount }); }; var useFollows = function useFollows(options) { var _useBluesky = useBluesky(), baseUrl = _useBluesky.baseUrl, token = _useBluesky.token; var actor = options.actor, _options$cursor = options.cursor, cursor = _options$cursor === void 0 ? '' : _options$cursor, initialData = options.initialData, _options$limit = options.limit, limit = _options$limit === void 0 ? 100 : _options$limit, refetchOnMount = options.refetchOnMount; return useInfiniteQuery({ enabled: !!actor, initialData: initialData, queryKey: ['follows', baseUrl, actor, limit, token], queryFn: function queryFn(_ref) { var _ref$pageParam = _ref.pageParam, pageParam = _ref$pageParam === void 0 ? '' : _ref$pageParam; var headers = token ? { Authorization: "Bearer ".concat(token) } : undefined; return fetch("".concat(baseUrl).concat(FOLLOWS_ROUTE, "?actor=").concat(actor, "&limit=").concat(limit).concat(pageParam ? "&cursor=".concat(pageParam) : ''), { headers: headers }).then(function (res) { return res.json(); }); }, getNextPageParam: function getNextPageParam(lastPage, pages) { return lastPage.cursor; }, initialPageParam: cursor, refetchOnMount: refetchOnMount }); }; var useList = function useList(options) { var _useBluesky = useBluesky(), baseUrl = _useBluesky.baseUrl, token = _useBluesky.token; var initialData = options.initialData, _options$initialPageP = options.initialPageParam, initialPageParam = _options$initialPageP === void 0 ? '' : _options$initialPageP, list = options.list, _options$limit = options.limit, limit = _options$limit === void 0 ? 100 : _options$limit, refetchOnMount = options.refetchOnMount; return useInfiniteQuery({ enabled: !!list, initialData: initialData, initialPageParam: initialPageParam, queryKey: ['list', baseUrl, list, limit], queryFn: function queryFn(_ref) { var _ref$pageParam = _ref.pageParam, pageParam = _ref$pageParam === void 0 ? '' : _ref$pageParam; var headers = token ? { Authorization: "Bearer ".concat(token) } : undefined; return fetch("".concat(baseUrl).concat(LIST_ROUTE, "?list=").concat(encodeURIComponent(list !== null && list !== void 0 ? list : ''), "&limit=").concat(limit).concat(pageParam ? "&cursor=".concat(pageParam) : ''), { headers: headers }).then(function (res) { return res.json(); }); }, getNextPageParam: function getNextPageParam(lastPage, pages) { return lastPage.cursor; }, refetchOnMount: refetchOnMount }); }; var useProfile = function useProfile(_ref) { var actor = _ref.actor, _ref$enabled = _ref.enabled, enabled = _ref$enabled === void 0 ? true : _ref$enabled; var _useBluesky = useBluesky(), baseUrl = _useBluesky.baseUrl, token = _useBluesky.token; return useQuery({ enabled: enabled && !!actor, queryKey: ['profile', baseUrl, actor], queryFn: function queryFn() { var headers = token ? { Authorization: "Bearer ".concat(token) } : undefined; return fetch("".concat(baseUrl).concat(PROFILE_ROUTE, "?actor=").concat(encodeURIComponent(actor !== null && actor !== void 0 ? actor : '')), { headers: headers }).then(function (res) { return res.json(); }); } }); }; var useSearchActors = function useSearchActors(_ref) { var cursor = _ref.cursor, limit = _ref.limit, search = _ref.search; var _useBluesky = useBluesky(), baseUrl = _useBluesky.baseUrl, token = _useBluesky.token; return useQuery({ queryKey: ['search', 'actor', baseUrl, cursor, limit, search], queryFn: function queryFn() { var headers = token ? { Authorization: "Bearer ".concat(token) } : undefined; return fetch("".concat(baseUrl).concat(SEARCH_ACTORS_ROUTE, "?q=", "".concat(search, "*"), "&limit=").concat(limit).concat(cursor ? "&cursor=".concat(cursor) : ''), { headers: headers }).then(function (res) { return res.json(); }); } }); }; var useStarterPack = function useStarterPack(_ref) { var _ref$enabled = _ref.enabled, enabled = _ref$enabled === void 0 ? true : _ref$enabled, uri = _ref.uri; var _useBluesky = useBluesky(), baseUrl = _useBluesky.baseUrl, token = _useBluesky.token; return useQuery({ enabled: enabled && !!uri, queryKey: ['starter-pack', baseUrl, uri], queryFn: function queryFn() { return fetch("".concat(baseUrl).concat(STARTER_PACK_ROUTE, "?starterPack=").concat(encodeURIComponent(uri)), { headers: token ? { Authorization: "Bearer ".concat(token) } : undefined }).then(function (res) { return res.json(); }); } }); }; export { ACTOR_STARTER_PACKS_ROUTE, BLUESKY_API_URL, BlueskyContext, BlueskyProvider, FOLLOWERS_ROUTE, FOLLOWS_ROUTE, FOLLOW_ROUTE, LIST_ROUTE, PROFILE_ROUTE, RESOLVE_HANDLE_ROUTE, SEARCH_ACTORS_ROUTE, STARTER_PACK_ROUTE, UNFOLLOW_ROUTE, useActorStarterPacks, useBluesky, useFollow, useFollowers, useFollows, useList, useProfile, useSearchActors, useStarterPack }; /* https://github.com/ryanhefner/use-bluesky | Ryan Hefner <hi@ryanhefner.com> (https://www.ryanhefner.com) */ //# sourceMappingURL=index.mjs.map