UNPKG

use-bluesky

Version:

React hooks to interact with the Bluesky API

334 lines (319 loc) 12.1 kB
/*! use-bluesky v0.0.4 !*/ 'use strict'; var react = require('react'); var jsxRuntime = require('react/jsx-runtime'); var reactQuery = require('@tanstack/react-query'); var axios = require('axios'); var BlueskyContext = /*#__PURE__*/react.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 reactQuery.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 = react.useMemo(function () { return queryClientProp !== null && queryClientProp !== void 0 ? queryClientProp : queryClient; }, [queryClientProp]); return jsxRuntime.jsx(BlueskyContext.Provider, { value: { baseUrl: baseUrl, session: session, token: token }, children: jsxRuntime.jsx(reactQuery.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 reactQuery.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 = react.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 = react.useMemo(function () { return token ? { Authorization: "Bearer ".concat(token) } : undefined; }, [token]); var _useMutation = reactQuery.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 = reactQuery.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 = react.useCallback(function () { return followMutation(did); }, [did, followMutation]); var unfollow = react.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 reactQuery.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 reactQuery.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 reactQuery.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 reactQuery.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 reactQuery.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 reactQuery.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(); }); } }); }; exports.ACTOR_STARTER_PACKS_ROUTE = ACTOR_STARTER_PACKS_ROUTE; exports.BLUESKY_API_URL = BLUESKY_API_URL; exports.BlueskyContext = BlueskyContext; exports.BlueskyProvider = BlueskyProvider; exports.FOLLOWERS_ROUTE = FOLLOWERS_ROUTE; exports.FOLLOWS_ROUTE = FOLLOWS_ROUTE; exports.FOLLOW_ROUTE = FOLLOW_ROUTE; exports.LIST_ROUTE = LIST_ROUTE; exports.PROFILE_ROUTE = PROFILE_ROUTE; exports.RESOLVE_HANDLE_ROUTE = RESOLVE_HANDLE_ROUTE; exports.SEARCH_ACTORS_ROUTE = SEARCH_ACTORS_ROUTE; exports.STARTER_PACK_ROUTE = STARTER_PACK_ROUTE; exports.UNFOLLOW_ROUTE = UNFOLLOW_ROUTE; exports.useActorStarterPacks = useActorStarterPacks; exports.useBluesky = useBluesky; exports.useFollow = useFollow; exports.useFollowers = useFollowers; exports.useFollows = useFollows; exports.useList = useList; exports.useProfile = useProfile; exports.useSearchActors = useSearchActors; exports.useStarterPack = useStarterPack; /* https://github.com/ryanhefner/use-bluesky | Ryan Hefner <hi@ryanhefner.com> (https://www.ryanhefner.com) */ //# sourceMappingURL=index.cjs.map