use-bluesky
Version:
React hooks to interact with the Bluesky API
334 lines (319 loc) • 12.1 kB
JavaScript
/*! 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