import React, { useEffect, useMemo, useState } from 'react' import { Container, PageBody, Text, Color, TableV2, Layout, StringSubstitute, Icon, FontVariation, FlexExpander, Utils } from '@harness/uicore' import { useHistory } from 'react-router-dom' import { useGet } from 'restful-react' import type { CellProps, Column } from 'react-table' import { Case, Match, Render, Truthy } from 'react-jsx-match' import ReactTimeago from 'react-timeago' import { makeDiffRefs, PullRequestFilterOption } from 'utils/GitUtils' import { useAppContext } from 'AppContext' import { useGetRepositoryMetadata } from 'hooks/useGetRepositoryMetadata' import { useStrings } from 'framework/strings' import { RepositoryPageHeader } from 'components/RepositoryPageHeader/RepositoryPageHeader' import { voidFn, getErrorMessage, LIST_FETCHING_LIMIT, permissionProps, PageBrowserProps } from 'utils/Utils' import { usePageIndex } from 'hooks/usePageIndex' import { useGetSpaceParam } from 'hooks/useGetSpaceParam' import { useUpdateQueryParams } from 'hooks/useUpdateQueryParams' import { useQueryParams } from 'hooks/useQueryParams' import type { TypesPullReq, TypesRepository } from 'services/code' import { ResourceListingPagination } from 'components/ResourceListingPagination/ResourceListingPagination' import { UserPreference, useUserPreference } from 'hooks/useUserPreference' import { NoResultCard } from 'components/NoResultCard/NoResultCard' import { PipeSeparator } from 'components/PipeSeparator/PipeSeparator' import { GitRefLink } from 'components/GitRefLink/GitRefLink' import { PullRequestStateLabel } from 'components/PullRequestStateLabel/PullRequestStateLabel' import { LoadingSpinner } from 'components/LoadingSpinner/LoadingSpinner' import { ExecutionStatusLabel } from 'components/ExecutionStatusLabel/ExecutionStatusLabel' import { PullRequestsContentHeader } from './PullRequestsContentHeader/PullRequestsContentHeader' import css from './PullRequests.module.scss' export default function PullRequests() { const { getString } = useStrings() const history = useHistory() const { routes } = useAppContext() const [searchTerm, setSearchTerm] = useState('') const [filter, setFilter] = useUserPreference( UserPreference.PULL_REQUESTS_FILTER_SELECTED_OPTIONS, PullRequestFilterOption.OPEN ) const space = useGetSpaceParam() const { updateQueryParams } = useUpdateQueryParams() const pageBrowser = useQueryParams() const pageInit = pageBrowser.page ? parseInt(pageBrowser.page) : 1 const [page, setPage] = usePageIndex(pageInit) useEffect(() => { updateQueryParams({ page: page.toString() }) }, [setPage]) const { repoMetadata, error, loading, refetch } = useGetRepositoryMetadata() const { data, error: prError, loading: prLoading, response } = useGet({ path: `/api/v1/repos/${repoMetadata?.path}/+/pullreq`, queryParams: { limit: String(LIST_FETCHING_LIMIT), page, sort: filter == PullRequestFilterOption.MERGED ? 'merged' : 'number', order: 'desc', query: searchTerm, state: filter == PullRequestFilterOption.ALL ? '' : filter }, lazy: !repoMetadata }) const { standalone } = useAppContext() const { hooks } = useAppContext() const permPushResult = hooks?.usePermissionTranslate?.( { resource: { resourceType: 'CODE_REPOSITORY' }, permissions: ['code_repo_push'] }, [space] ) const columns: Column[] = useMemo( () => [ { id: 'title', width: '100%', Cell: ({ row }: CellProps) => { return ( {row.original.title} {row.original.stats?.conversations} {row.original.state}, number: {row.original.number}, time: ( ), user: {row.original.author?.display_name} }} /> {/* TODO: Pass proper state when check api is fully implemented */} ) } } ], [getString] ) return ( { setFilter(_filter) setPage(1) }} onSearchTermChanged={value => { setSearchTerm(value) setPage(1) }} /> <> className={css.table} hideHeaders columns={columns} data={data || []} getRowClassName={() => css.row} onRowClick={row => { history.push( routes.toCODEPullRequest({ repoPath: repoMetadata?.path as string, pullRequestId: String(row.number) }) ) }} /> history.push( routes.toCODECompare({ repoPath: repoMetadata?.path as string, diffRefs: makeDiffRefs(repoMetadata?.default_branch as string, '') }) ) } permissionProp={permissionProps(permPushResult, standalone)} /> ) }