Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 20 additions & 1 deletion src/shared/ListRepo/RepoTitleLink/RepoTitleLink.jsx
Original file line number Diff line number Diff line change
@@ -1,13 +1,20 @@
import PropTypes from 'prop-types'

import AppLink from 'shared/AppLink'
import { transformStringToLocalStorageKey } from 'shared/utils/transformStringToLocalStorageKey'
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

any taste for converting this file to TS? Hopefully not too bad since its only 100 lines (famous last words)

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I actually started the conversion. All of the repo fields started complaining so I tabled it for now haha

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

lol fair enough, some of those can be pretty annoying

import Icon from 'ui/Icon'
import Label from 'ui/Label'

const getRepoIconName = ({ activated, isRepoPrivate, active }) =>
!activated && active ? 'ban' : isRepoPrivate ? 'lock-closed' : 'globe-alt'

function RepoTitleLink({ repo, showRepoOwner, pageName, disabledLink }) {
function RepoTitleLink({
repo,
showRepoOwner,
pageName,
disabledLink,
isRecentlyVisited,
}) {
const options = {
owner: repo.author.username,
repo: repo.name,
Expand Down Expand Up @@ -49,6 +56,12 @@ function RepoTitleLink({ repo, showRepoOwner, pageName, disabledLink }) {
pageName={pageName}
options={options}
className="flex items-center text-ds-gray-quinary hover:underline"
onClick={() => {
if (repo?.name && repo?.author?.username && repo?.active) {
const key = transformStringToLocalStorageKey(repo.author.username)
localStorage.setItem(`${key}_recently_visited`, repo.name)
}
}}
>
<Icon
size="sm"
Expand All @@ -75,6 +88,11 @@ function RepoTitleLink({ repo, showRepoOwner, pageName, disabledLink }) {
System generated
</Label>
)}
{isRecentlyVisited && (
<Label variant="plain" className="ml-2">
Recently visited
</Label>
)}
</div>
)
}
Expand All @@ -93,6 +111,7 @@ RepoTitleLink.propTypes = {
showRepoOwner: PropTypes.bool.isRequired,
pageName: PropTypes.string.isRequired,
disabledLink: PropTypes.bool.isRequired,
isRecentlyVisited: PropTypes.bool,
}

export default RepoTitleLink
94 changes: 94 additions & 0 deletions src/shared/ListRepo/ReposTable/ReposTable.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ import { setupServer } from 'msw/node'
import { mockIsIntersecting } from 'react-intersection-observer/test-utils'
import { MemoryRouter, Route } from 'react-router-dom'

import { transformStringToLocalStorageKey } from 'shared/utils/transformStringToLocalStorageKey'

import ReposTable from './ReposTable'

const mockRepositories = (
Expand Down Expand Up @@ -1212,4 +1214,96 @@ describe('ReposTable', () => {
expect(demoLink.length).toBe(0)
})
})

describe('handles recently visited repo', () => {
beforeEach(() => {
setup({})
localStorage.clear()
localStorage.setItem(
`${transformStringToLocalStorageKey('owner1')}_recently_visited`,
'gazebo'
)
server.use(
graphql.query('ReposForOwner', async (info) => {
const recentlyVisitedRepo = [
{
node: {
private: false,
activated: true,
author: {
username: 'owner1',
},
name: 'gazebo',
latestCommitAt: subDays(new Date(), 3).toISOString(),
coverageAnalytics: {
percentCovered: 0,
lines: 123,
},
active: true,
updatedAt: '2020-08-25T16:36:19.67986800:00',
repositoryConfig: null,
coverageEnabled: true,
bundleAnalysisEnabled: true,
},
},
]

const myRepos = [
{
node: {
private: false,
activated: false,
author: {
username: 'owner1',
},
name: 'Repo name 1',
latestCommitAt: subDays(new Date(), 3).toISOString(),
coverageAnalytics: {
percentCovered: 10,
lines: 123,
},
active: true,
updatedAt: '2020-08-25T16:36:19.67986800:00',
repositoryConfig: null,
coverageEnabled: true,
bundleAnalysisEnabled: false,
},
},
]

let reposToReturn = myRepos.filter(
(repo) =>
!info.variables.filters.term ||
repo.node.name.includes(info.variables.filters.term)
)

if (info.variables.filters.repoNames) {
reposToReturn = recentlyVisitedRepo
}

return HttpResponse.json({
data: {
owner: {
repositories: {
edges: reposToReturn,
pageInfo: {
hasNextPage: false,
endCursor: '3',
},
},
},
},
})
})
)
})

it('shows recently visited repo', async () => {
render(<ReposTable searchValue="" owner="owner1" />, {
wrapper: wrapper('/github/owner1', '/:provider/:owner'),
})
const recentlyVisitedRepo = await screen.findByText(/Recently visited/)
expect(recentlyVisitedRepo).toBeInTheDocument()
})
})
})
33 changes: 32 additions & 1 deletion src/shared/ListRepo/ReposTable/ReposTable.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@ import {
import { useIsTeamPlan } from 'services/useIsTeamPlan'
import { useOwner, useUser } from 'services/user'
import { DEMO_REPO, formatDemoRepos, isNotNull } from 'shared/utils/demo'
import { getFilteredRecentlyVisitedRepo } from 'shared/utils/getFilteredRecentlyVisitedRepo'
import { transformStringToLocalStorageKey } from 'shared/utils/transformStringToLocalStorageKey'
import Icon from 'ui/Icon'
import Spinner from 'ui/Spinner'

Expand Down Expand Up @@ -147,6 +149,18 @@ const ReposTable = ({
})
)

const recentlyVisitedRepoName = localStorage.getItem(
`${transformStringToLocalStorageKey(owner)}_recently_visited`
)

const { data: recentlyVisitedRepoData } = useInfiniteQueryV5(
ReposQueryOpts({
provider,
owner,
repoNames: recentlyVisitedRepoName ? [recentlyVisitedRepoName] : [],
})
)

const isMyOwnerPage = currentUser?.user?.username === owner

const tableData = useMemo(() => {
Expand All @@ -168,13 +182,30 @@ const ReposTable = ({
? formatDemoRepos(demoReposData, searchValue)
: []

return [...demoRepos, ...repos]
const filteredRecentlyVisitedRepo = getFilteredRecentlyVisitedRepo(
recentlyVisitedRepoData?.pages[0]?.repos,
searchValue,
owner
)
// only filter out the recently visited repo from the repos list if we are including it
const filteredRepos = filteredRecentlyVisitedRepo
? repos.filter((repo) => recentlyVisitedRepoName !== repo.name)
: repos

return [
...demoRepos,
...(filteredRecentlyVisitedRepo ? [filteredRecentlyVisitedRepo] : []),
...filteredRepos,
]
}, [
reposData?.pages,
demoReposData,
searchValue,
isMyOwnerPage,
mayIncludeDemo,
recentlyVisitedRepoData,
recentlyVisitedRepoName,
owner,
])

useEffect(() => {
Expand Down
7 changes: 7 additions & 0 deletions src/shared/ListRepo/ReposTable/getReposColumnsHelper.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import { createColumnHelper } from '@tanstack/react-table'

import { RepositoryResult } from 'services/repos/ReposQueryOpts'
import { formatTimeToNow } from 'shared/utils/dates'
import { transformStringToLocalStorageKey } from 'shared/utils/transformStringToLocalStorageKey'
import TotalsNumber from 'ui/TotalsNumber'

import NoRepoCoverage from './NoRepoCoverage'
Expand All @@ -18,6 +19,9 @@ export const getReposColumnsHelper = ({
const columnHelper = createColumnHelper<
RepositoryResult & { isDemo?: boolean }
>()
const recentlyVisitedRepoName = localStorage.getItem(
`${transformStringToLocalStorageKey(owner)}_recently_visited`
)
const nameColumn = columnHelper.accessor('name', {
header: 'Name',
id: 'name',
Expand All @@ -39,6 +43,9 @@ export const getReposColumnsHelper = ({
showRepoOwner={!owner}
pageName={pageName}
disabledLink={!isCurrentUserPartOfOrg && !repo?.active}
isRecentlyVisited={
!!recentlyVisitedRepoName && recentlyVisitedRepoName === repo?.name
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

similar question here with !!recentlyVisitedRepoName

}
/>
)
},
Expand Down
Loading