mirror of
https://github.com/stefanpejcic/openpanel
synced 2025-06-26 18:28:26 +00:00
83 lines
2.2 KiB
TypeScript
83 lines
2.2 KiB
TypeScript
import { LiveProvider } from "@refinedev/core";
|
|
import { Client } from "graphql-ws";
|
|
|
|
import {
|
|
generateUseListSubscription,
|
|
generateUseManySubscription,
|
|
generateUseOneSubscription,
|
|
} from "../utils";
|
|
|
|
const subscriptions = {
|
|
useList: generateUseListSubscription,
|
|
useOne: generateUseOneSubscription,
|
|
useMany: generateUseManySubscription,
|
|
};
|
|
|
|
export const liveProvider = (client: Client): LiveProvider => {
|
|
return {
|
|
subscribe: ({ callback, params }) => {
|
|
const {
|
|
resource,
|
|
meta,
|
|
pagination,
|
|
sorters,
|
|
filters,
|
|
subscriptionType,
|
|
id,
|
|
ids,
|
|
} = params ?? {};
|
|
|
|
if (!meta) {
|
|
throw new Error(
|
|
"[useSubscription]: `meta` is required in `params` for graphql subscriptions",
|
|
);
|
|
}
|
|
|
|
if (!subscriptionType) {
|
|
throw new Error(
|
|
"[useSubscription]: `subscriptionType` is required in `params` for graphql subscriptions",
|
|
);
|
|
}
|
|
|
|
if (!resource) {
|
|
throw new Error(
|
|
"[useSubscription]: `resource` is required in `params` for graphql subscriptions",
|
|
);
|
|
}
|
|
|
|
const genereteSubscription = subscriptions[subscriptionType];
|
|
|
|
const { query, variables, operation } = genereteSubscription({
|
|
ids,
|
|
id,
|
|
resource,
|
|
filters,
|
|
meta,
|
|
pagination,
|
|
sorters,
|
|
});
|
|
|
|
const onNext = (payload: any) => {
|
|
callback(payload.data[operation]);
|
|
};
|
|
|
|
const unsubscribe = client.subscribe(
|
|
{
|
|
query,
|
|
variables,
|
|
},
|
|
{
|
|
next: onNext,
|
|
error: () => null,
|
|
complete: () => null,
|
|
},
|
|
);
|
|
|
|
return unsubscribe;
|
|
},
|
|
unsubscribe: (unsubscribe) => {
|
|
unsubscribe();
|
|
},
|
|
};
|
|
};
|