import {Fragment, useState} from 'react'; import styled from '@emotion/styled'; import {Location} from 'history'; import pick from 'lodash/pick'; import {Client} from 'sentry/api'; import Button from 'sentry/components/button'; import ButtonBar from 'sentry/components/buttonBar'; import {SectionHeading} from 'sentry/components/charts/styles'; import DiscoverButton from 'sentry/components/discoverButton'; import GroupList from 'sentry/components/issues/groupList'; import {normalizeDateTimeParams} from 'sentry/components/organizations/pageFilters/parse'; import Pagination from 'sentry/components/pagination'; import {Panel, PanelBody} from 'sentry/components/panels'; import {DEFAULT_RELATIVE_PERIODS, DEFAULT_STATS_PERIOD} from 'sentry/constants'; import {URL_PARAM} from 'sentry/constants/pageFilters'; import {t, tct} from 'sentry/locale'; import space from 'sentry/styles/space'; import {Organization} from 'sentry/types'; import {trackAnalyticsEvent} from 'sentry/utils/analytics'; import {decodeScalar} from 'sentry/utils/queryString'; import NoGroupsHandler from '../issueList/noGroupsHandler'; type Props = { api: Client; location: Location; organization: Organization; projectId: number; query?: string; }; function ProjectIssues({organization, location, projectId, query, api}: Props) { const [pageLinks, setPageLinks] = useState(); const [onCursor, setOnCursor] = useState<(() => void) | undefined>(); function handleOpenInIssuesClick() { trackAnalyticsEvent({ eventKey: 'project_detail.open_issues', eventName: 'Project Detail: Open issues from project detail', organization_id: parseInt(organization.id, 10), }); } function handleOpenInDiscoverClick() { trackAnalyticsEvent({ eventKey: 'project_detail.open_discover', eventName: 'Project Detail: Open discover from project detail', organization_id: parseInt(organization.id, 10), }); } function handleFetchSuccess(groupListState, cursorHandler) { setPageLinks(groupListState.pageLinks); setOnCursor(() => cursorHandler); } function getDiscoverUrl() { return { pathname: `/organizations/${organization.slug}/discover/results/`, query: { name: t('Frequent Unhandled Issues'), field: ['issue', 'title', 'count()', 'count_unique(user)', 'project'], sort: ['-count'], query: ['event.type:error error.unhandled:true', query].join(' ').trim(), display: 'top5', ...normalizeDateTimeParams(pick(location.query, [...Object.values(URL_PARAM)])), }, }; } const endpointPath = `/organizations/${organization.slug}/issues/`; const issueQuery = ['is:unresolved error.unhandled:true ', query].join(' ').trim(); const queryParams = { limit: 5, ...normalizeDateTimeParams( pick(location.query, [...Object.values(URL_PARAM), 'cursor']) ), query: issueQuery, sort: 'freq', }; const issueSearch = { pathname: endpointPath, query: queryParams, }; function renderEmptyMessage() { const selectedTimePeriod = location.query.start ? null : DEFAULT_RELATIVE_PERIODS[ decodeScalar(location.query.statsPeriod, DEFAULT_STATS_PERIOD) ]; const displayedPeriod = selectedTimePeriod ? selectedTimePeriod.toLowerCase() : t('given timeframe'); return ( ); } return ( {t('Frequent Unhandled Issues')} {t('Open in Discover')} ); } const ControlsWrapper = styled('div')` display: flex; align-items: center; justify-content: space-between; margin-bottom: ${space(1)}; flex-wrap: wrap; @media (max-width: ${p => p.theme.breakpoints[0]}) { display: block; } `; const StyledPagination = styled(Pagination)` margin: 0; `; export default ProjectIssues;