Skip to content

Commit 7d31fc6

Browse files
author
Roshan Jossy
authored
Merge pull request #22 from firstcontributions/issue-page
2 parents 76ef9d5 + 2893666 commit 7d31fc6

File tree

4 files changed

+537
-17
lines changed

4 files changed

+537
-17
lines changed

src/components/issue/Issue.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ const Issue = ({ issue }: IssueProps) => {
2020
issue
2121
)
2222
return (
23-
<div className="flex flex-col p-6 rounded-lg shadow-lg hover:shadow-md bg-white dark:bg-dark-700">
23+
<div className="w-96 flex flex-col p-6 rounded-lg shadow-lg hover:shadow-md bg-white dark:bg-dark-700">
2424
<a href={data.url} target="_blank" rel="noopener noreferrer">
2525
<div className="flex flex-row">
2626
<img

src/components/issue/IssuesFromLastRepo.tsx

Lines changed: 58 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
1-
import React from 'react'
1+
import React, { useCallback, useEffect } from 'react'
22
import { graphql, usePaginationFragment } from 'react-relay'
33
import { IssuesFromLastRepo$key } from '../../queries/__generated__/IssuesFromLastRepo.graphql'
4-
import { IssuesFromLastRepo_Query } from '../../queries/__generated__/IssuesFromLastRepo_Query.graphql'
5-
import { UserDetails_user$key } from '../../queries/__generated__/UserDetails_user.graphql'
4+
import { FaChevronRight } from '@react-icons/all-files/fa/FaChevronRight'
65
import Issue from './Issue'
76

87
type IssuesFromLastRepoProps = {
@@ -32,27 +31,70 @@ const IssuesFromLastRepo = ({ user }: IssuesFromLastRepoProps) => {
3231
user
3332
)
3433

34+
const scrollableElement = React.useRef<HTMLDivElement>(null)
35+
36+
enum scrollDirection {
37+
Left = -1,
38+
Right = 1,
39+
}
40+
41+
const scrollHorizontally = useCallback((direction: scrollDirection) => {
42+
scrollableElement.current &&
43+
(scrollableElement.current.scrollLeft += direction * 550)
44+
}, [])
45+
46+
const handleScrollRight = () => {
47+
if (hasNext) {
48+
loadNext(2)
49+
}
50+
scrollHorizontally(scrollDirection.Right)
51+
}
52+
53+
useEffect(() => {
54+
console.log('IssuesFromLastRepo: useEffect', data.issuesFromLastRepo.edges)
55+
scrollHorizontally(scrollDirection.Right)
56+
}, [data.issuesFromLastRepo.edges, scrollHorizontally, scrollDirection.Right])
57+
3558
if (!data || data.issuesFromLastRepo.edges.length === 0) {
3659
return <></>
3760
}
3861

3962
return (
4063
<div className="mt-10">
4164
<h3 className="font-bold text-gray-500 text-lg">Issues from last repo</h3>
42-
<div className="grid grid-cols-2 xl:grid-cols-2 gap-4 mt-4">
43-
{data.issuesFromLastRepo.edges.map(
44-
(issue) => issue && <Issue issue={issue.node} key={issue.node.id} />
45-
)}
46-
{hasNext ? (
47-
<button
48-
onClick={() => {
49-
loadNext(3)
50-
}}
51-
>
52-
Load more
53-
</button>
54-
) : null}
65+
<div className="relative">
66+
<div
67+
className=" flex overflow-x-auto space-x-4 no-scrollbar scroll-smooth"
68+
ref={scrollableElement}
69+
>
70+
{data.issuesFromLastRepo.edges.map(
71+
(issue) => issue && <Issue issue={issue.node} key={issue.node.id} />
72+
)}
73+
</div>
74+
<button
75+
className="absolute right-8 bottom-0 mr-4 mt-4"
76+
onClick={() => scrollHorizontally(scrollDirection.Left)}
77+
>
78+
<FaChevronRight className="b-0 w-6 h-6 rotate-180 dark:text-gray-300 bg-gray-300 dark:bg-dark-900 rounded-full p-1 font-bold" />
79+
</button>
80+
<button
81+
className="absolute right-0 bottom-0 mr-4 mt-4"
82+
onClick={() => handleScrollRight()}
83+
>
84+
<FaChevronRight className="b-0 w-6 h-6 dark:text-gray-300 bg-gray-300 dark:bg-dark-900 rounded-full p-1 font-bold" />
85+
</button>
5586
</div>
87+
<style jsx>
88+
{`
89+
.no-scrollbar::-webkit-scrollbar {
90+
display: none;
91+
}
92+
.no-scrollbar {
93+
-ms-overflow-style: none; /* IE and Edge */
94+
scrollbar-width: none;
95+
}
96+
`}
97+
</style>
5698
</div>
5799
)
58100
}

src/pages/issues/index.tsx

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
import { NextPageContext } from 'next'
2+
import { graphql, usePreloadedQuery } from 'react-relay'
3+
import { RelayProps, withRelay } from 'relay-nextjs'
4+
import Layout from '../../components/Layout'
5+
import { getClientEnvironment } from '../../lib/client_environment'
6+
import Card from '../../components/Card'
7+
import RelayModernEnvironment from 'relay-runtime/lib/store/RelayModernEnvironment'
8+
import IssuesFromLastRepo from '../../components/issue/IssuesFromLastRepo'
9+
import IssuesFromRecentRepos from '../../components/issue/IssuesFromRecentRepo'
10+
import RelevantIssues from '../../components/issue/RelevantIssues'
11+
import { issuesQuery } from '../../queries/__generated__/issuesQuery.graphql'
12+
import UserDetails from '../../components/UserDetails/UserDetails'
13+
14+
const IssuesQuery = graphql`
15+
query issuesQuery {
16+
viewer {
17+
handle
18+
...UserDetails_user
19+
...RelevantIssues
20+
...IssuesFromLastRepo
21+
...IssuesFromRecentRepos
22+
}
23+
}
24+
`
25+
26+
const Issues = ({
27+
preloadedQuery,
28+
}: RelayProps<Record<string, never>, issuesQuery>) => {
29+
const query = usePreloadedQuery(IssuesQuery, preloadedQuery)
30+
31+
return (
32+
<div>
33+
{query.viewer && (
34+
<Layout
35+
sidebarContentRight={query.viewer.handle}
36+
sidebarContentLeft={
37+
<Card>
38+
<UserDetails user={query.viewer} />
39+
</Card>
40+
}
41+
>
42+
<IssuesFromLastRepo user={query.viewer} />
43+
<IssuesFromRecentRepos user={query.viewer} />
44+
<RelevantIssues user={query.viewer} />
45+
</Layout>
46+
)}
47+
</div>
48+
)
49+
}
50+
51+
export default withRelay(Issues, IssuesQuery, {
52+
createClientEnvironment: () =>
53+
getClientEnvironment() as RelayModernEnvironment,
54+
createServerEnvironment: async (ctx: NextPageContext) => {
55+
const { createServerEnvironment } = await import(
56+
'../../lib/server/server_environment'
57+
)
58+
59+
return createServerEnvironment(ctx)
60+
},
61+
})

0 commit comments

Comments
 (0)