mirror of
https://github.com/hanzoai/sentinel.git
synced 2026-09-29 22:34:33 +00:00
91 lines
2.4 KiB
TypeScript
91 lines
2.4 KiB
TypeScript
import * as Sentry from '@sentry/react';
|
|
import type {Location} from 'history';
|
|
|
|
import type {Client} from 'sentry/api';
|
|
import {ALL_ACCESS_PROJECTS} from 'sentry/constants/pageFilters';
|
|
import type {Organization} from 'sentry/types';
|
|
import type EventView from 'sentry/utils/discover/eventView';
|
|
import {mapResponseToReplayRecord} from 'sentry/utils/replays/replayDataUtils';
|
|
import type RequestError from 'sentry/utils/requestError/requestError';
|
|
import type {ReplayListRecord} from 'sentry/views/replays/types';
|
|
|
|
export const DEFAULT_SORT = '-started_at';
|
|
|
|
type State = {
|
|
fetchError: undefined | RequestError;
|
|
pageLinks: null | string;
|
|
replays: undefined | ReplayListRecord[];
|
|
};
|
|
|
|
type Result = State;
|
|
|
|
type Props = {
|
|
api: Client;
|
|
eventView: EventView;
|
|
location: Location;
|
|
organization: Organization;
|
|
perPage?: number;
|
|
queryReferrer?: 'issueReplays';
|
|
};
|
|
|
|
async function fetchReplayList({
|
|
api,
|
|
organization,
|
|
location,
|
|
eventView,
|
|
queryReferrer,
|
|
perPage,
|
|
}: Props): Promise<Result> {
|
|
try {
|
|
const path = `/organizations/${organization.slug}/replays/`;
|
|
|
|
const payload = eventView.getEventsAPIPayload(location);
|
|
|
|
// HACK!!! Because the sort field needs to be in the eventView, but I cannot
|
|
// ask the server for compound fields like `os.name`.
|
|
payload.field = payload.field.map(field => field.split('.')[0]);
|
|
if (perPage) {
|
|
payload.per_page = perPage;
|
|
}
|
|
|
|
// unique list
|
|
payload.field = Array.from(new Set(payload.field));
|
|
|
|
const [{data}, _textStatus, resp] = await api.requestPromise(path, {
|
|
includeAllArgs: true,
|
|
query: {
|
|
...payload,
|
|
cursor: location.query.cursor,
|
|
// when queryReferrer === 'issueReplays' we override the global view check on the backend
|
|
// we also require a project param otherwise we won't yield results
|
|
queryReferrer,
|
|
project: queryReferrer === 'issueReplays' ? ALL_ACCESS_PROJECTS : payload.project,
|
|
},
|
|
});
|
|
|
|
const pageLinks = resp?.getResponseHeader('Link') ?? '';
|
|
|
|
return {
|
|
fetchError: undefined,
|
|
pageLinks,
|
|
replays: data.map(mapResponseToReplayRecord),
|
|
};
|
|
} catch (error) {
|
|
if (error.responseJSON?.detail) {
|
|
return {
|
|
fetchError: error.responseJSON.detail,
|
|
pageLinks: null,
|
|
replays: [],
|
|
};
|
|
}
|
|
Sentry.captureException(error);
|
|
return {
|
|
fetchError: error,
|
|
pageLinks: null,
|
|
replays: [],
|
|
};
|
|
}
|
|
}
|
|
|
|
export default fetchReplayList;
|