mirror of
https://github.com/Unleash/unleash.git
synced 2025-03-18 00:19:49 +01:00
chore: integration events hook (#7641)
https://linear.app/unleash/issue/2-2440/create-new-integration-event-hooks Adds a frontend hook for integration events, allowing us to easily fetch paginated integration events for a specific integration configuration id.
This commit is contained in:
parent
1d6dc9b195
commit
cf4435ca2d
@ -0,0 +1,74 @@
|
||||
import { useContext } from 'react';
|
||||
import useSWRInfinite, {
|
||||
type SWRInfiniteConfiguration,
|
||||
type SWRInfiniteKeyLoader,
|
||||
} from 'swr/infinite';
|
||||
import { formatApiPath } from 'utils/formatPath';
|
||||
import type { IntegrationEvents } from 'interfaces/integrationEvent';
|
||||
import { useUiFlag } from 'hooks/useUiFlag';
|
||||
import AccessContext from 'contexts/AccessContext';
|
||||
import handleErrorResponses from '../httpErrorResponseHandler';
|
||||
|
||||
const fetcher = async (url: string) => {
|
||||
const response = await fetch(url);
|
||||
await handleErrorResponses('Integration events')(response);
|
||||
return response.json();
|
||||
};
|
||||
|
||||
export const useIntegrationEvents = (
|
||||
integrationId?: number,
|
||||
limit = 50,
|
||||
options: SWRInfiniteConfiguration = {},
|
||||
) => {
|
||||
const { isAdmin } = useContext(AccessContext);
|
||||
const integrationEventsEnabled = useUiFlag('integrationEvents');
|
||||
|
||||
const getKey: SWRInfiniteKeyLoader = (
|
||||
pageIndex: number,
|
||||
previousPageData: IntegrationEvents,
|
||||
) => {
|
||||
// Does not meet conditions
|
||||
if (!integrationId || !isAdmin || !integrationEventsEnabled)
|
||||
return null;
|
||||
|
||||
// Reached the end
|
||||
if (previousPageData && !previousPageData.integrationEvents.length)
|
||||
return null;
|
||||
|
||||
return formatApiPath(
|
||||
`api/admin/addons/${integrationId}/events?limit=${limit}&offset=${
|
||||
pageIndex * limit
|
||||
}`,
|
||||
);
|
||||
};
|
||||
|
||||
const { data, error, size, setSize, mutate } =
|
||||
useSWRInfinite<IntegrationEvents>(getKey, fetcher, {
|
||||
...options,
|
||||
revalidateAll: true,
|
||||
});
|
||||
|
||||
const integrationEvents = data
|
||||
? data.flatMap(({ integrationEvents }) => integrationEvents)
|
||||
: [];
|
||||
|
||||
const isLoadingInitialData = !data && !error;
|
||||
const isLoadingMore = size > 0 && !data?.[size - 1];
|
||||
const loading = isLoadingInitialData || isLoadingMore;
|
||||
|
||||
const hasMore = data?.[size - 1]?.integrationEvents.length === limit;
|
||||
|
||||
const loadMore = () => {
|
||||
if (loading || !hasMore) return;
|
||||
setSize(size + 1);
|
||||
};
|
||||
|
||||
return {
|
||||
integrationEvents,
|
||||
hasMore,
|
||||
loadMore,
|
||||
loading,
|
||||
refetch: () => mutate(),
|
||||
error,
|
||||
};
|
||||
};
|
15
frontend/src/interfaces/integrationEvent.ts
Normal file
15
frontend/src/interfaces/integrationEvent.ts
Normal file
@ -0,0 +1,15 @@
|
||||
import type { IEvent } from './event';
|
||||
|
||||
export type IntegrationEvent = {
|
||||
id: string;
|
||||
integrationId: number;
|
||||
createdAt: string;
|
||||
state: 'success' | 'failed' | 'successWithErrors';
|
||||
stateDetails: string;
|
||||
event: IEvent;
|
||||
details: Record<string, unknown>;
|
||||
};
|
||||
|
||||
export type IntegrationEvents = {
|
||||
integrationEvents: IntegrationEvent[];
|
||||
};
|
@ -93,6 +93,7 @@ export type UiFlags = {
|
||||
resourceLimits?: boolean;
|
||||
insightsV2?: boolean;
|
||||
featureCollaborators?: boolean;
|
||||
integrationEvents?: boolean;
|
||||
};
|
||||
|
||||
export interface IVersionInfo {
|
||||
|
Loading…
Reference in New Issue
Block a user