Skip to content

Commit 046068d

Browse files
committed
feed: use virtuoso for virtualising feed
1 parent 7d31fc6 commit 046068d

File tree

7 files changed

+68
-26
lines changed

7 files changed

+68
-26
lines changed

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
"react-dom": "^18.2.0",
3434
"react-error-boundary": "^3.1.4",
3535
"react-relay": "^13.0.2",
36+
"react-virtuoso": "^2.18.0",
3637
"relay-nextjs": "^0.6.0",
3738
"relay-runtime": "^13.0.2",
3839
"simple-oauth2": "^4.3.0",

src/components/feed/Feed.tsx

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1+
import { useEffect, useState } from 'react'
12
import { graphql, usePaginationFragment } from 'react-relay'
3+
import { Virtuoso } from 'react-virtuoso'
24
import { FeedsQuery$key } from '../../queries/__generated__/FeedsQuery.graphql'
35
import StoryPreview from './StoryPreview'
46

@@ -7,12 +9,12 @@ type FeedProps = {
79
}
810

911
const Feed = ({ root }: FeedProps) => {
10-
const { data } = usePaginationFragment(
12+
const { data, loadNext } = usePaginationFragment(
1113
graphql`
1214
fragment FeedsQuery on Query
1315
@refetchable(queryName: "FeedsRoot_Query")
1416
@argumentDefinitions(
15-
count: { type: "Int", defaultValue: 10 }
17+
count: { type: "Int", defaultValue: 4 }
1618
cursor: { type: "String" }
1719
) {
1820
feeds(first: $count, after: $cursor)
@@ -31,9 +33,25 @@ const Feed = ({ root }: FeedProps) => {
3133

3234
return (
3335
<>
34-
{data.feeds.edges.map(
35-
(edge) => edge && <StoryPreview story={edge?.node} key={edge.node.id} />
36-
)}
36+
<Virtuoso
37+
className="min-h-screen virtuoso-container"
38+
data={data.feeds.edges}
39+
endReached={loadNext}
40+
overscan={200}
41+
itemContent={(index, edge) => {
42+
return (
43+
edge?.node && <StoryPreview story={edge?.node} key={edge.node.id} />
44+
)
45+
}}
46+
/>
47+
<style jsx>
48+
{`
49+
// hide scrollbar
50+
-webkit-scrollbar {
51+
display: none;
52+
}
53+
`}
54+
</style>
3755
</>
3856
)
3957
}

src/pages/index.tsx

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,13 +43,9 @@ const Home = ({
4343
sidebarContentLeft={leftSidebar}
4444
sidebarContentRight={<div>Promoted</div>}
4545
>
46-
<Card>Posts</Card>
4746
{query.viewer && (
4847
<>
4948
<Feed root={query} />
50-
<IssuesFromLastRepo user={query.viewer} />
51-
<IssuesFromRecentRepos user={query.viewer} />
52-
<RelevantIssues user={query.viewer} />
5349
</>
5450
)}
5551
</Layout>

src/queries/__generated__/FeedsQuery.graphql.ts

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/queries/__generated__/FeedsRoot_Query.graphql.ts

Lines changed: 5 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/queries/__generated__/pages_UserQuery.graphql.ts

Lines changed: 16 additions & 9 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

yarn.lock

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -451,6 +451,18 @@
451451
"@typescript-eslint/types" "5.28.0"
452452
eslint-visitor-keys "^3.3.0"
453453

454+
"@virtuoso.dev/react-urx@^0.2.12":
455+
version "0.2.13"
456+
resolved "https://registry.yarnpkg.com/@virtuoso.dev/react-urx/-/react-urx-0.2.13.tgz#e2cfc42d259d2a002695e7517d34cb97b64ee9c4"
457+
integrity sha512-MY0ugBDjFb5Xt8v2HY7MKcRGqw/3gTpMlLXId2EwQvYJoC8sP7nnXjAxcBtTB50KTZhO0SbzsFimaZ7pSdApwA==
458+
dependencies:
459+
"@virtuoso.dev/urx" "^0.2.13"
460+
461+
"@virtuoso.dev/urx@^0.2.12", "@virtuoso.dev/urx@^0.2.13":
462+
version "0.2.13"
463+
resolved "https://registry.yarnpkg.com/@virtuoso.dev/urx/-/urx-0.2.13.tgz#a65e7e8d923cb03397ac876bfdd45c7f71c8edf1"
464+
integrity sha512-iirJNv92A1ZWxoOHHDYW/1KPoi83939o83iUBQHIim0i3tMeSKEh+bxhJdTHQ86Mr4uXx9xGUTq69cp52ZP8Xw==
465+
454466
acorn-jsx@^5.3.2:
455467
version "5.3.2"
456468
resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz"
@@ -2621,6 +2633,14 @@ react-relay@^13.0.2:
26212633
nullthrows "^1.1.1"
26222634
relay-runtime "13.0.2"
26232635

2636+
react-virtuoso@^2.18.0:
2637+
version "2.18.0"
2638+
resolved "https://registry.yarnpkg.com/react-virtuoso/-/react-virtuoso-2.18.0.tgz#42f8a7cb632aaf0bb2812bbbd4b5f2583d3d53ec"
2639+
integrity sha512-BxMW9as2dPOP4YFkry/oNjQMEn3cOgEjHLb7Fg8oubOgRAfiukp1Co41QFD9ZMXZBNBZNTI2E5BwC5pol31mTg==
2640+
dependencies:
2641+
"@virtuoso.dev/react-urx" "^0.2.12"
2642+
"@virtuoso.dev/urx" "^0.2.12"
2643+
26242644
react@^18.2.0:
26252645
version "18.2.0"
26262646
resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5"

0 commit comments

Comments
 (0)