@data-client/react
Version:
Async State Management without the Management. REST, GraphQL, SSE, Websockets, Fetch
25 lines (22 loc) • 3.28 kB
JavaScript
'use client';
import { useEffect } from 'react';
import useController from './useController.js';
/**
* Keeps a resource fresh by subscribing to updates.
* @see https://dataclient.io/docs/api/useSubscription
*/
export default function useSubscription(endpoint, ...args) {
const controller = useController();
const key = args[0] !== null ? endpoint.key(...args) : '';
useEffect(() => {
if (!key) return;
// typescript cannot infer truthy key means args is not null
const cleanedArgs = args;
controller.subscribe(endpoint, ...cleanedArgs);
return () => {
controller.unsubscribe(endpoint, ...cleanedArgs);
};
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [controller, key]);
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ1c2VFZmZlY3QiLCJ1c2VDb250cm9sbGVyIiwidXNlU3Vic2NyaXB0aW9uIiwiZW5kcG9pbnQiLCJhcmdzIiwiY29udHJvbGxlciIsImtleSIsImNsZWFuZWRBcmdzIiwic3Vic2NyaWJlIiwidW5zdWJzY3JpYmUiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvaG9va3MvdXNlU3Vic2NyaXB0aW9uLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIGNsaWVudCc7XG5pbXBvcnQge1xuICBFbmRwb2ludEludGVyZmFjZSxcbiAgU2NoZW1hLFxuICBGZXRjaEZ1bmN0aW9uLFxuICBOSSxcbn0gZnJvbSAnQGRhdGEtY2xpZW50L2NvcmUnO1xuaW1wb3J0IHsgdXNlRWZmZWN0IH0gZnJvbSAncmVhY3QnO1xuXG5pbXBvcnQgdXNlQ29udHJvbGxlciBmcm9tICcuL3VzZUNvbnRyb2xsZXIuanMnO1xuXG4vKipcbiAqIEtlZXBzIGEgcmVzb3VyY2UgZnJlc2ggYnkgc3Vic2NyaWJpbmcgdG8gdXBkYXRlcy5cbiAqIEBzZWUgaHR0cHM6Ly9kYXRhY2xpZW50LmlvL2RvY3MvYXBpL3VzZVN1YnNjcmlwdGlvblxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VTdWJzY3JpcHRpb248XG4gIEUgZXh0ZW5kcyBFbmRwb2ludEludGVyZmFjZTxcbiAgICBGZXRjaEZ1bmN0aW9uLFxuICAgIFNjaGVtYSB8IHVuZGVmaW5lZCxcbiAgICB1bmRlZmluZWQgfCBmYWxzZVxuICA+LFxuPihlbmRwb2ludDogRSwgLi4uYXJnczogcmVhZG9ubHkgWy4uLlBhcmFtZXRlcnM8RT5dIHwgcmVhZG9ubHkgW251bGxdKSB7XG4gIGNvbnN0IGNvbnRyb2xsZXIgPSB1c2VDb250cm9sbGVyKCk7XG5cbiAgY29uc3Qga2V5ID0gYXJnc1swXSAhPT0gbnVsbCA/IGVuZHBvaW50LmtleSguLi5hcmdzKSA6ICcnO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFrZXkpIHJldHVybjtcbiAgICAvLyB0eXBlc2NyaXB0IGNhbm5vdCBpbmZlciB0cnV0aHkga2V5IG1lYW5zIGFyZ3MgaXMgbm90IG51bGxcbiAgICBjb25zdCBjbGVhbmVkQXJncyA9IGFyZ3MgYXMgcmVhZG9ubHkgWy4uLlBhcmFtZXRlcnM8RT5dO1xuXG4gICAgY29udHJvbGxlci5zdWJzY3JpYmUoZW5kcG9pbnQsIC4uLmNsZWFuZWRBcmdzKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgY29udHJvbGxlci51bnN1YnNjcmliZShlbmRwb2ludCwgLi4uY2xlYW5lZEFyZ3MpO1xuICAgIH07XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaG9va3MvZXhoYXVzdGl2ZS1kZXBzXG4gIH0sIFtjb250cm9sbGVyLCBrZXldKTtcbn1cbiJdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTs7QUFPWixTQUFTQSxTQUFTLFFBQVEsT0FBTztBQUVqQyxPQUFPQyxhQUFhLE1BQU0sb0JBQW9COztBQUU5QztBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsU0FBU0MsZUFBZUEsQ0FNckNDLFFBQVcsRUFBRSxHQUFHQyxJQUFtRCxFQUFFO0VBQ3JFLE1BQU1DLFVBQVUsR0FBR0osYUFBYSxDQUFDLENBQUM7RUFFbEMsTUFBTUssR0FBRyxHQUFHRixJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxHQUFHRCxRQUFRLENBQUNHLEdBQUcsQ0FBQyxHQUFHRixJQUFJLENBQUMsR0FBRyxFQUFFO0VBRXpESixTQUFTLENBQUMsTUFBTTtJQUNkLElBQUksQ0FBQ00sR0FBRyxFQUFFO0lBQ1Y7SUFDQSxNQUFNQyxXQUFXLEdBQUdILElBQW1DO0lBRXZEQyxVQUFVLENBQUNHLFNBQVMsQ0FBQ0wsUUFBUSxFQUFFLEdBQUdJLFdBQVcsQ0FBQztJQUM5QyxPQUFPLE1BQU07TUFDWEYsVUFBVSxDQUFDSSxXQUFXLENBQUNOLFFBQVEsRUFBRSxHQUFHSSxXQUFXLENBQUM7SUFDbEQsQ0FBQzs7SUFFRDtFQUNGLENBQUMsRUFBRSxDQUFDRixVQUFVLEVBQUVDLEdBQUcsQ0FBQyxDQUFDO0FBQ3ZCIiwiaWdub3JlTGlzdCI6W119