Documentation
Get Started
React List is a simple, easy to use React component to create different kind of lists. It supports:
virtual list
infinite scroll
index to browse the list easily
grouping with sticky headers
reverse list
To start, install react-lists in your React project.
1npm install react-lists
If you are using yarn.
1yarn add react-lists
Simple usage example.
- Afghanistan
- Albania
- Algeria
- Andorra
- Angola
- Anguilla
- Antigua & Barbuda
- Argentina
- Armenia
- Aruba
- Australia
- Austria
- Azerbaijan
- Bahamas
- Bahrain
- Bangladesh
- Barbados
- Belarus
- Belgium
- Belize
- Benin
- Bermuda
- Bhutan
- Bolivia
- Bosnia & Herzegovina
- Botswana
- Brazil
- British Virgin Islands
- Brunei
- Bulgaria
- Burkina Faso
- Burundi
- Cambodia
- Cameroon
- Cape Verde
- Cayman Islands
- Chad
- Chile
- China
- Colombia
- Congo
- Cook Islands
- Costa Rica
- Cote D Ivoire
- Croatia
- Cruise Ship
- Cuba
- Cyprus
- Czech Republic
- Denmark
- Djibouti
- Dominica
- Dominican Republic
- Ecuador
- Egypt
- El Salvador
- Equatorial Guinea
- Estonia
- Ethiopia
- Falkland Islands
- Faroe Islands
- Fiji
- Finland
- France
- French Polynesia
- French West Indies
- Gabon
- Gambia
- Georgia
- Germany
- Ghana
- Gibraltar
- Greece
- Greenland
- Grenada
- Guam
- Guatemala
- Guernsey
- Guinea
- Guinea Bissau
- Guyana
- Haiti
- Honduras
- Hong Kong
- Hungary
- Iceland
- India
- Indonesia
- Iran
- Iraq
- Ireland
- Isle of Man
- Israel
- Italy
- Jamaica
- Japan
- Jersey
- Jordan
- Kazakhstan
- Kenya
- Kuwait
- Kyrgyz Republic
- Laos
- Latvia
- Lebanon
- Lesotho
- Liberia
- Libya
- Liechtenstein
- Lithuania
- Luxembourg
- Macau
- Macedonia
- Madagascar
- Malawi
- Malaysia
- Maldives
- Mali
- Malta
- Mauritania
- Mauritius
- Mexico
- Moldova
- Monaco
- Mongolia
- Montenegro
- Montserrat
- Morocco
- Mozambique
- Namibia
- Nepal
- Netherlands
- Netherlands Antilles
- New Caledonia
- New Zealand
- Nicaragua
- Niger
- Nigeria
- Norway
- Oman
- Pakistan
- Palestine
- Panama
- Papua New Guinea
- Paraguay
- Peru
- Philippines
- Poland
- Portugal
- Puerto Rico
- Qatar
- Reunion
- Romania
- Russia
- Rwanda
- Saint Pierre & Miquelon
- Samoa
- San Marino
- Satellite
- Saudi Arabia
- Senegal
- Serbia
- Seychelles
- Sierra Leone
- Singapore
- Slovakia
- Slovenia
- South Africa
- South Korea
- Spain
- Sri Lanka
- St Kitts & Nevis
- St Lucia
- St Vincent
- St. Lucia
- Sudan
- Suriname
- Swaziland
- Sweden
- Switzerland
- Syria
- Taiwan
- Tajikistan
- Tanzania
- Thailand
- Timor L'Este
- Togo
- Tonga
- Trinidad & Tobago
- Tunisia
- Turkey
- Turkmenistan
- Turks & Caicos
- Uganda
- Ukraine
- United Arab Emirates
- United Kingdom
- Uruguay
- Uzbekistan
- Venezuela
- Vietnam
- Virgin Islands (US)
- Yemen
- Zambia
- Zimbabwe
1import React from 'react'
2 import { List } from '@react-lists/core'
3
4 export default function SampleList() {
5 return (
6 <List
7 listHeight={400}
8 items={["Afghanistan","Albania","Algeria","Andorra","Angola","Anguilla","Antigua & Barbuda","Argentina","Armenia","Aruba","Australia","Austria","Azerbaijan","Bahamas","Bahrain","Bangladesh","Barbados","Belarus","Belgium","Belize","Benin","Bermuda","Bhutan","Bolivia","Bosnia & Herzegovina","Botswana","Brazil","British Virgin Islands","Brunei","Bulgaria","Burkina Faso","Burundi","Cambodia","Cameroon","Cape Verde","Cayman Islands","Chad","Chile","China","Colombia","Congo","Cook Islands","Costa Rica","Cote D Ivoire","Croatia","Cruise Ship","Cuba","Cyprus","Czech Republic","Denmark","Djibouti","Dominica","Dominican Republic","Ecuador","Egypt","El Salvador","Equatorial Guinea","Estonia","Ethiopia","Falkland Islands","Faroe Islands","Fiji","Finland","France","French Polynesia","French West Indies","Gabon","Gambia","Georgia","Germany","Ghana","Gibraltar","Greece","Greenland","Grenada","Guam","Guatemala","Guernsey","Guinea","Guinea Bissau","Guyana","Haiti","Honduras","Hong Kong","Hungary","Iceland","India","Indonesia","Iran","Iraq","Ireland","Isle of Man","Israel","Italy","Jamaica","Japan","Jersey","Jordan","Kazakhstan","Kenya","Kuwait","Kyrgyz Republic","Laos","Latvia","Lebanon","Lesotho","Liberia","Libya","Liechtenstein","Lithuania","Luxembourg","Macau","Macedonia","Madagascar","Malawi","Malaysia","Maldives","Mali","Malta","Mauritania","Mauritius","Mexico","Moldova","Monaco","Mongolia","Montenegro","Montserrat","Morocco","Mozambique","Namibia","Nepal","Netherlands","Netherlands Antilles","New Caledonia","New Zealand","Nicaragua","Niger","Nigeria","Norway","Oman","Pakistan","Palestine","Panama","Papua New Guinea","Paraguay","Peru","Philippines","Poland","Portugal","Puerto Rico","Qatar","Reunion","Romania","Russia","Rwanda","Saint Pierre & Miquelon","Samoa","San Marino","Satellite","Saudi Arabia","Senegal","Serbia","Seychelles","Sierra Leone","Singapore","Slovakia","Slovenia","South Africa","South Korea","Spain","Sri Lanka","St Kitts & Nevis","St Lucia","St Vincent","St. Lucia","Sudan","Suriname","Swaziland","Sweden","Switzerland","Syria","Taiwan","Tajikistan","Tanzania","Thailand","Timor L'Este","Togo","Tonga","Trinidad & Tobago","Tunisia","Turkey","Turkmenistan","Turks & Caicos","Uganda","Ukraine","United Arab Emirates","United Kingdom","Uruguay","Uzbekistan","Venezuela","Vietnam","Virgin Islands (US)","Yemen","Zambia","Zimbabwe"]}
9 itemRenderer={({ item }) => {
10 return item
11 }}
12 />
13 )
14 }
API Reference
The package exports two components that you can use to create your lists.
List
1//...
2import { List } from '@react-lists/core'
3//...
Attributes:
items: object|string[]
Items to be rendered.itemRenderer: (item) => ReactNode
Function to determine how the item will be rendered.listHeight: number
The height of the list in pixels. Try to use the height of the parent element or the window to have it dynamically.loadingRenderer: () => ReactNode
Function to determine how the loading will be rendered.reverse: boolean
Render the list in reverse.displayLoading: boolean
Display a loading component when onLoadMore function is executed.onBottomReached: () => void
Callback function executed whenever the list reaches the end.onItemClick: (item: object) => void
Callback function executed whenever the user click on an item.onLoadMore: () => void
Callback function executed whenever the list reaches the bottom, or the top if it is a reverse list.onTopReached: () => void
Callback function executed whenever the list reaches the beginning.
GroupList
Attributes:
The GroupList component has the same attributes as the List Component, plus the following:displayIndexMenu: boolean
Display a index menu to navigate bettween the grouped list.displaySubHeaders: boolean
Display sub headers for the groups.stickySubHeaders: boolean
Make the sub headers sticky.subHeaderRenderer: (text: string) => ReactNode
Function to determine how the sub header will be rendered.
1//...
2import { GroupList } from '@react-lists/core'
3//...
Styles
Examples
Simple List
1import React from 'react'
2import faker from 'faker'
3import PropTypes from 'prop-types'
4import { makeStyles } from '@material-ui/core'
5import { List } from '@react-lists/core'
6
7const useStyles = makeStyles(theme => ({
8 animal: {
9 marginBottom: theme.spacing(2),
10 width: '100%'
11 }
12}))
13
14const animals = Array(20).fill({}).map((item, index) => ({
15 id: faker.random.uuid(),
16 url: `${faker.image.animals()}?v=${index}`
17}))
18
19const AnimalRenderer = ({ url }) => {
20 const classes = useStyles()
21
22 return <img className={classes.animal} src={url} />
23}
24
25AnimalRenderer.propTypes = {
26 url: PropTypes.string.isRequired
27}
28
29export default function SimpleList() {
30 return (
31 <List
32 listHeight={400}
33 items={animals}
34 itemRenderer={AnimalRenderer}
35 />
36 )
37}
100.000 Items
Render thousands of items without affecting the performance of your application using virtual lists.
Combo Box
Easy customization whether using your own components or overwriting CSS styles.
News Feed
It also supports infinite scroll. You can load your data asynchronously and be free to implement all the logic of how, what and when load more and more data.
- Alma Lockman IApr 30, 2020
In quod esse libero.
- Judith GrahamMay 01, 2020
Sunt voluptas officiis consequatur et adipisci esse molestiae autem placeat.
- Miss Carol HaagJul 26, 2020
Quod ullam voluptates maiores reiciendis molestiae.
- Mike OlsonFeb 29, 2020
Id eum quia esse rerum autem enim earum rerum.
- Kelli FraneckiNov 07, 2020
Modi voluptas earum non in odit.
- Orlando KautzerMar 16, 2020
Deleniti distinctio odio maxime odit incidunt hic consequatur.
- Rosa WindlerSep 01, 2020
Sed aut laboriosam facilis amet.
- Tanya BotsfordFeb 17, 2020
Consequatur fugiat minus numquam.
- Adam GreenfelderJun 07, 2020
In repellendus maxime ut nobis.
- Mrs. Kristine McKenzieSep 21, 2020
Incidunt illum ducimus excepturi explicabo natus vero eum quia.
- Bridget VeumApr 27, 2020
Maiores eveniet vitae enim sed.
- Randall HaneMar 07, 2020
Repudiandae dolorem qui facere nihil.
- Mr. Hugo UptonJan 22, 2020
Mollitia est nobis saepe et.
- Spencer SawaynNov 17, 2020
Ab et provident aspernatur rerum ipsum voluptatem sunt quasi.
- Miss Owen ParkerApr 21, 2020
Iste reiciendis hic id qui omnis magni est quae molestiae.
- Tasha HandJun 22, 2020
Illo officiis quisquam alias qui.
- Spencer CristMay 15, 2020
Dolor sunt nihil est maxime laudantium.
- Lena RutherfordJan 20, 2020
Delectus facilis quae id dolorem perspiciatis eum non dolor.
- Sarah HagenesOct 26, 2020
Eius rerum ea ducimus optio qui aut.
- Mrs. Ken CreminJun 06, 2020
Sequi voluptatem quod et voluptatum impedit.
1import React from 'react'
2import faker from 'faker'
3import PropTypes from 'prop-types'
4import {
5 Avatar,
6 Card,
7 CardHeader,
8 CardMedia,
9 CardContent,
10 CardActions,
11 IconButton,
12 Typography,
13 makeStyles
14} from '@material-ui/core'
15import {
16 Favorite as FavoriteIcon,
17 MoreVert as MoreVertIcon,
18 Share as ShareIcon
19} from '@material-ui/icons'
20import { red } from '@material-ui/core/colors'
21import { List } from '@react-lists/core'
22
23const useStyles = makeStyles(theme => ({
24 root: {
25 margin: '0 auto',
26 marginBottom: theme.spacing(3),
27 width: '80%'
28 },
29 media: {
30 height: 0,
31 paddingTop: '56.25%'
32 },
33 avatar: {
34 backgroundColor: red[500]
35 }
36}))
37
38const DEFAULT_QUANTITY = 20
39
40const fakeData = (quantity = DEFAULT_QUANTITY) => {
41 return Array(quantity).fill({}).map((item, index) => ({
42 id: faker.random.uuid(),
43 user: {
44 name: faker.name.findName()
45 },
46 content: faker.lorem.sentence,
47 imageUrl: `${faker.image.animals()}?v=${index}`,
48 date: new Intl.DateTimeFormat('en', {
49 day: '2-digit',
50 month: 'short',
51 year: 'numeric'
52 }).format(faker.date.past())
53 }))
54}
55
56const initialNews = fakeData()
57
58const NewsRenderer = ({
59 content,
60 date,
61 user,
62 imageUrl
63}) => {
64 const classes = useStyles()
65
66 return (
67 <Card className={classes.root}>
68 <CardHeader
69 avatar={
70 <Avatar className={classes.avatar} src={imageUrl} />
71 }
72 action={
73 <IconButton aria-label="settings">
74 <MoreVertIcon />
75 </IconButton>
76 }
77 title={user.name}
78 subheader={date}
79 />
80 <CardMedia
81 className={classes.media}
82 image={imageUrl}
83 />
84 <CardContent>
85 <Typography variant="body2" color="textSecondary" component="p">
86 {content}
87 </Typography>
88 </CardContent>
89 <CardActions disableSpacing>
90 <IconButton aria-label="add to favorites">
91 <FavoriteIcon />
92 </IconButton>
93 <IconButton aria-label="share">
94 <ShareIcon />
95 </IconButton>
96 </CardActions>
97 </Card>
98 )
99}
100
101NewsRenderer.propTypes = {
102 content: PropTypes.string.isRequired,
103 date: PropTypes.string.isRequired,
104 imageUrl: PropTypes.string.isRequired,
105 user: PropTypes.shape({
106 name: PropTypes.string.isRequired
107 }).isRequired
108}
109
110export default function InfiniteScrollList() {
111 const [news, setNewsFeed] = React.useState(initialNews)
112 const [hasMoreItems, setHasMoreItems] = React.useState(true)
113 const [displayLoading, setDisplayLoading] = React.useState(false)
114
115 const loadMore = () => {
116 if (!hasMoreItems) {
117 return
118 }
119
120 setDisplayLoading(true)
121
122 setTimeout(() => {
123 const newNews = fakeData()
124
125 setNewsFeed(oldNews => {
126 const newssUpdated = [...oldNews, ...newNews]
127
128 setHasMoreItems(newssUpdated.length < DEFAULT_QUANTITY * 4)
129 setDisplayLoading(false)
130
131 return newssUpdated
132 })
133 }, 2000)
134 }
135
136 return (
137 <List
138 displayLoading={displayLoading}
139 items={news}
140 itemRenderer={NewsRenderer}
141 listHeight={600}
142 onLoadMore={loadMore}
143 />
144 )
145}
Contacts
Create grouped lists, make the headers sticky and show the index menu.
- A
- B
- C
- D
- E
- F
- G
- H
- I
- J
- K
- L
- M
- N
- O
- P
- R
- S
- T
- V
- W
1import React from 'react'
2import faker from 'faker'
3import PropTypes from 'prop-types'
4import { makeStyles } from '@material-ui/core'
5import { GroupList } from '@react-lists/core'
6
7const useStyles = makeStyles(theme => ({
8 contact: {
9 marginBottom: theme.spacing(2),
10 width: '100%'
11 },
12 name: {
13 fontSize: theme.typography.pxToRem(14),
14 fontWeight: 'bold',
15 paddingBottom: 5
16 },
17 phone: {
18 fontSize: theme.typography.pxToRem(16),
19 fontWeight: 'normal',
20 paddingBottom: 5
21 },
22 email: {
23 fontSize: theme.typography.pxToRem(12),
24 fontWeight: 'normal'
25 },
26 listSubHeader: {
27 background: '#fafafa',
28 borderBottom: '1px solid #cccccc'
29 }
30}))
31
32const contacts = Array(100).fill({}).map(() => ({
33 id: faker.random.uuid(),
34 name: faker.name.findName(),
35 phone: faker.phone.phoneNumberFormat(),
36 email: faker.internet.email()
37}))
38.sort((contactA, contactB) => contactA.name.localeCompare(contactB.name))
39.reduce((list, contact) => {
40 const firstChar = contact.name[0].toUpperCase()
41
42 if (!list.hasOwnProperty(firstChar)) {
43 list[firstChar] = {
44 data: [],
45 header: firstChar
46 }
47 }
48
49 list[firstChar].data.push(contact)
50
51 return list
52}, {})
53
54const ContactRenderer = ({ email, name, phone }) => {
55 const classes = useStyles()
56
57 return (
58 <div className={classes.contact}>
59 <div className={classes.name}>{name}</div>
60 <div className={classes.phone}>{phone}</div>
61 <div className={classes.email}>
62 <a href={`mailto:${email}`}>{email}</a>
63 </div>
64 </div>
65 )
66}
67
68ContactRenderer.propTypes = {
69 email: PropTypes.string.isRequired,
70 name: PropTypes.string.isRequired,
71 phone: PropTypes.string.isRequired
72}
73
74const SubHeaderRenderer = ({ text }) => {
75 const classes = useStyles()
76 return <div className={classes.listSubHeader}>{text}</div>
77}
78
79SubHeaderRenderer.propTypes = {
80 text: PropTypes.string.isRequired
81}
82
83export default function ContactGroupedList() {
84 return (
85 <GroupList
86 displayIndexMenu
87 items={contacts}
88 itemRenderer={ContactRenderer}
89 listHeight={500}
90 subHeaderRenderer={SubHeaderRenderer}
91 />
92 )
93}
Chat Messages
Reverse your all list passing just one simple parameter.
- Dec 05, 2020
- Lance EbertTenetur mollitia voluptas.Dec 05, 2020, 6:30 AM
- Eric Krajcik VquidemDec 05, 2020, 5:30 AM
- Sheryl Bahringersequi quidem quiDec 05, 2020, 4:30 AM
- Zachary LebsackAssumenda tempore est neque omnis molestias voluptatem voluptatem rerum est.Dec 05, 2020, 3:30 AM
- Dorothy KrisOccaecati blanditiis sit blanditiis et aliquam in. Dignissimos molestiae veniam ut blanditiis et cumque voluptatem voluptatibus voluptatem. In quod qui iure. Vero aut nulla sit illo voluptas corporis voluptatibus. Aut a debitis similique neque.Dec 05, 2020, 2:30 AM
- Stephen BergstromAsperiores perspiciatis hic et optio itaque.Dec 05, 2020, 1:30 AM
- Jana WatsicaVoluptatibus dolores accusantium harum illum. Et quo neque eos ut similique. Voluptatem possimus ea est. Quos porro ut repellendus excepturi qui fuga est qui voluptas.Dec 05, 2020, 12:30 AM
- Dec 04, 2020
- Gustavo RutherfordNesciunt eaque ipsam sapiente accusantium eaque necessitatibus. Error iure numquam.Dec 04, 2020, 11:30 PM
- Nancy RolfsonUnde rerum est ipsum qui. Vero recusandae saepe ullam ea quae rerum ea vitae aut. At quo doloribus provident omnis architecto repudiandae est dolor. Sunt quia odit. Praesentium quidem qui.Dec 04, 2020, 10:30 PM
- Miss Reginald RueckerOmnis modi sint dolore dolor nemo nostrum nisi quia. Praesentium voluptates explicabo deserunt nisi praesentium id esse. Voluptates accusamus voluptates distinctio vero illum accusantium labore corrupti. At repudiandae ad voluptatibus facere sunt magnam qui sit. Ex velit et sed accusantium repellat quis iusto sapiente. Illum occaecati omnis aperiam quam eum voluptatem et quidem.Dec 04, 2020, 9:30 PM
- Dec 03, 2020
- Shelia Goodwin IIIQui laborum et vero unde recusandae eos. Voluptatem ad quis impedit. Omnis nostrum asperiores nemo impedit officia quos architecto cumque. Velit veritatis ut amet. Repellat eligendi voluptas.Dec 03, 2020, 5:44 AM
- Mrs. Jon MitchelldictaDec 03, 2020, 4:44 AM
- Janie RomagueraenimDec 03, 2020, 3:44 AM
- Ellen StoltenbergExplicabo corporis reiciendis dolore quia. Labore officia adipisci quas eveniet repudiandae non nobis numquam. Esse odio autem sapiente voluptas hic. Dolor voluptatem ducimus explicabo dolorem accusantium fugiat. Quibusdam facilis nemo aut nam quia eaque aut tenetur voluptas. Ut iure deleniti accusamus dolorem commodi dolorem impedit debitis. Nesciunt saepe eaque necessitatibus aut in quia. Amet unde ex ad quae id maiores beatae reiciendis. Animi dolores dolorum maiores aspernatur pariatur eum consectetur ex tempora. Dolore et dolores ea natus voluptatem recusandae qui. Velit dicta repellendus hic neque asperiores earum dolores blanditiis.Dec 03, 2020, 2:44 AM
- Stephen MetzNulla est dolore. Harum dolorum excepturi et assumenda aut. Asperiores incidunt ratione. Doloribus aut nulla aut optio non. Repellat beatae tempora porro. Illo nobis officiis consequatur laborum recusandae sint aut iusto cumque. Perspiciatis magnam quia quo voluptas. Reprehenderit qui dolor corrupti natus qui perspiciatis nobis. Eos aperiam quibusdam velit laudantium temporibus deserunt odit expedita. Et iste magni. Ab vel molestiae et veniam possimus perferendis. Modi eos consequatur et sed. Doloremque et qui. Id laborum esse nam. Ut eveniet debitis. Facilis pariatur accusamus libero nemo accusantium odio ut qui.Dec 03, 2020, 1:44 AM
- Calvin CollinsQuidem ea corrupti enim magni sint porro et aliquam ut. Qui incidunt et excepturi culpa perferendis fugit iste quasi. Voluptatibus quia et molestias et aut nihil dicta accusamus. Quis error provident non numquam mollitia et eum. Culpa ut ipsa. Debitis at voluptatem voluptatem ut eos.Dec 03, 2020, 12:44 AM
- Dec 02, 2020
- Francis SchroederPariatur laudantium omnis quibusdam distinctio. Eligendi voluptas nostrum. Magni autem iste cupiditate voluptas. Temporibus ab eum suscipit molestiae non ut ipsum modi. Ad facere aperiam velit qui commodi. Dolore optio iste distinctio quos quia nihil quia rerum. Repellat aut et esse deserunt voluptatem expedita enim maxime. Et recusandae quibusdam quos corrupti facere sed aperiam. Ab corporis labore quibusdam harum id vitae dolorum. Qui pariatur molestiae distinctio possimus nihil occaecati dolores. Asperiores et molestiae qui velit repellendus aliquam odit dolorem error.Dec 02, 2020, 11:44 PM
- Ernest BernierQuibusdam sunt voluptatum alias provident.Dec 02, 2020, 10:44 PM
- Kristina SawaynAtque nihil eum placeat ea enim unde nisi.Dec 02, 2020, 9:44 PM
- Annette HarberImpedit aspernatur fuga eaque quae itaque molestiae incidunt non velit. Quia provident exercitationem eligendi quae omnis veniam dolore aut. Aut totam et vel debitis quo autem qui. Distinctio modi dolorem nisi.Dec 02, 2020, 8:44 PM
- Aug 09, 2020
- Randall Altenwerth IVfugiat sint rerumAug 09, 2020, 2:45 PM
- Julie BashirianAb voluptas sit. Nihil dolores autem qui quibusdam dolorem et quisquam. Voluptatem adipisci et. Qui est ratione hic harum omnis accusamus. Est vitae soluta ut enim quos ipsam.Aug 09, 2020, 1:45 PM
- Sonya LueilwitzcorruptiAug 09, 2020, 12:45 PM
- Mrs. Jack ZemlakAnimi aspernatur qui labore dolor. Quia ut quas alias quibusdam reprehenderit. Saepe minima voluptatum odio ut voluptatem similique facilis. Sit tenetur vero quibusdam doloremque minima.Aug 09, 2020, 11:45 AM
- Richard HarveyEst eum ut aliquam ducimus nobis sequi exercitationem aspernatur harum.Aug 09, 2020, 10:45 AM
- Tonya LehnernesciuntAug 09, 2020, 9:45 AM
- Flora HahnRem et in ducimus ratione minus omnis ex modi. Eveniet possimus modi laudantium ullam. Soluta similique qui aspernatur voluptatem corrupti. Possimus ut in. Explicabo sit rem totam. Non nihil voluptate fuga ut doloribus.Aug 09, 2020, 8:45 AM
- Viola BernierFugiat impedit quae perferendis. Nihil odit earum ut. Pariatur aut qui consequuntur autem reprehenderit ipsa nemo nesciunt doloribus. Quisquam et deserunt corporis dicta quae. Provident temporibus molestiae dolores ut in qui omnis. Molestias vel voluptatem libero architecto alias. Accusamus quo perspiciatis quia voluptatem et non inventore. Sapiente mollitia voluptas atque magnam vero sunt est ea. Qui impedit tempore consequuntur omnis provident quod eveniet ut. Necessitatibus expedita laboriosam cupiditate ad earum sapiente id non quia. Necessitatibus nihil et voluptas necessitatibus impedit ex. Voluptatem autem eum. Qui eos maiores dolorum qui quis cumque minus distinctio. Excepturi saepe consectetur nulla. Aspernatur quo aliquam dolorem enim ea et nemo officiis.Aug 09, 2020, 7:45 AM
- Lindsey DurganNostrum minima occaecati repellendus laudantium cupiditate.Aug 09, 2020, 6:45 AM
- Mr. Willie DuBuquemaxime illo etAug 09, 2020, 5:45 AM
- Aug 03, 2020
- Daniel GleichnerQuisquam enim fuga architecto sint sunt ab aut. Rerum nihil ut assumenda aut rem occaecati vitae ratione.Aug 03, 2020, 3:51 AM
- Mr. Marion HauckDoloremque accusamus sed vel dolor sed doloribus ut. Et vero similique qui eos non est suscipit. Ipsam explicabo consequatur. Occaecati fugiat molestiae tempora quia fugiat. Quia quaerat cumque suscipit excepturi repellat. Excepturi nobis id corrupti aperiam totam unde rerum aut at.Aug 03, 2020, 2:51 AM
- Mark KeeblerPraesentium perferendis est quibusdam. Suscipit ex ipsum non possimus voluptas voluptate commodi. Dolores rerum culpa. Sed minima totam molestias sint. Quia eum aut sit voluptatibus illum suscipit atque labore et. Est nisi maiores laborum ipsum voluptas eum.Aug 03, 2020, 1:51 AM
- Laverne ParkerEt quasi est quis.Aug 03, 2020, 12:51 AM
- Aug 02, 2020
- Carol PacochaNeque quod ipsum ut similique corrupti a. Facere pariatur eos. Earum sint voluptas voluptatibus voluptates incidunt laborum et et. Sunt accusamus et. Suscipit est magnam aliquam ipsam et odit.Aug 02, 2020, 11:51 PM
- Allan StantonSuscipit eum odit ea aliquid quasi odio eveniet. Modi quis amet quas tempore omnis vel sapiente.Aug 02, 2020, 10:51 PM
- Glen ReingerquibusdamAug 02, 2020, 9:51 PM
- Andre Murphy IDebitis sit voluptatibus consectetur. Repellat aliquam rem nihil laudantium dignissimos harum facilis non consequatur. Sunt a magni et necessitatibus occaecati saepe a blanditiis enim. Qui neque quo. Molestias ab odio exercitationem esse a ut unde.Aug 02, 2020, 8:51 PM
- Hubert WeissnatadAug 02, 2020, 7:51 PM
- Elaine RunteplaceatAug 02, 2020, 6:51 PM
- Jul 30, 2020
- Lucia MorissettePariatur est velit et aliquam.Jul 30, 2020, 5:21 PM
- Angelica O'Konnon corrupti quibusdamJul 30, 2020, 4:21 PM
- Joan LubowitzIpsa occaecati et.Jul 30, 2020, 3:21 PM
- Terrence AuerEt eos in occaecati vel sint libero tempora ullam. Odit placeat repudiandae ea similique autem dignissimos dolorum ullam. Alias sit aut.Jul 30, 2020, 2:21 PM
- Philip CormierNon est corporis. Rem quia cumque laudantium omnis provident neque quos vel quibusdam. Tenetur laudantium ut ipsum non autem maxime. Rerum quasi architecto accusantium quo quam nemo. Officia vel sed consectetur. Consequatur illum ducimus nihil vel vel.Jul 30, 2020, 1:21 PM
- Leslie GreenQuaerat quod hic non. Voluptas dolorem et quia impedit sint et modi numquam. At dolor neque autem fugiat voluptas illo.Jul 30, 2020, 12:21 PM
- Marcella ConroyfacilisJul 30, 2020, 11:21 AM
- Sherri RosenbaumDicta aut assumenda vitae suscipit aut dolores. Neque tempora illum excepturi. Consectetur repellat rerum consequatur eos nam quidem et voluptatibus adipisci. Et molestias sint. Quisquam omnis veritatis tenetur dolorem. Voluptatibus eligendi ipsa.Jul 30, 2020, 10:21 AM
- Patrick PriceDolores iusto velit. Aliquid dolorem aut maxime eaque repellendus. Voluptatibus voluptatibus ipsam id.Jul 30, 2020, 9:21 AM
- Danny EmardBeatae non rerum. Deleniti molestiae natus. Quisquam atque dolores rem debitis qui commodi earum nobis. Earum velit et maxime aut aut et.Jul 30, 2020, 8:21 AM
- Jul 19, 2020
- Mrs. Orlando O'ConnerConsequatur dolorem non eos. Fugit sint quas veritatis enim quibusdam commodi et incidunt aspernatur.Jul 19, 2020, 6:36 AM
- Mrs. Carrie DouglasFugiat quaerat cumque quis maiores error qui. Sequi est ducimus et porro saepe. Ducimus laboriosam suscipit sunt quo et est modi et necessitatibus. Et deleniti mollitia alias impedit molestiae corrupti ut sapiente est. Culpa quibusdam officia placeat mollitia fuga rerum corrupti placeat.Jul 19, 2020, 5:36 AM
- Martin HaleySunt odit blanditiis. Deserunt ea id voluptatem quia qui tenetur repellat aperiam eum. Fugiat qui fuga tempore nam consequatur quia. Nesciunt itaque aut cupiditate repudiandae similique odio quam. Nihil velit labore aut ut omnis. Unde aut recusandae voluptas nihil. Ratione dicta magnam quam. Omnis cumque officia non et et. Exercitationem qui aut velit vel facere quia vel. Enim quaerat sunt sunt nihil expedita maxime recusandae et. Deserunt dolor voluptatibus perferendis qui in.Jul 19, 2020, 4:36 AM
- Delbert SmithNostrum error laborum eius nesciunt optio quia et. Sed aut beatae et quae dolor culpa sed. Dolorem aut dolorem est quas necessitatibus. In aut esse.Jul 19, 2020, 3:36 AM
- Miss Frances HillsNam quo blanditiis expedita libero. Quasi corrupti incidunt quaerat ex exercitationem et culpa sit. Voluptates dolorem ea iure consequatur libero ullam voluptas nobis. Et voluptate eaque laborum.Jul 19, 2020, 2:36 AM
- Sammy BrownEa distinctio harum ut ut sit et consequatur perspiciatis. Molestiae voluptatum rem. Accusamus ratione saepe illum ex molestias incidunt.Jul 19, 2020, 1:36 AM
- Merle RennerMaiores illum eligendi dicta.Jul 19, 2020, 12:36 AM
- Jul 18, 2020
- Ebony KuhlmanveroJul 18, 2020, 11:36 PM
- Arlene Spinka IIIste doloribus et aperiam ipsum. Iure saepe culpa voluptate.Jul 18, 2020, 10:36 PM
- Lawrence OsinskiPossimus laboriosam velit odit. Quisquam vitae fugiat aut vitae amet ut deserunt. Quis totam maiores consectetur officiis.Jul 18, 2020, 9:36 PM
- Jun 23, 2020
- Miss Pedro Legrosea itaque remJun 23, 2020, 8:56 AM
- Hilda MorissetteVoluptas veritatis aliquid tenetur aut.Jun 23, 2020, 7:56 AM
- Raul KutchEt ab animi aut quo dolores facere velit. Commodi libero sint nihil libero quia harum. Placeat non magni corrupti cupiditate maiores quas doloribus nostrum. Mollitia voluptas id officia delectus laborum recusandae doloremque qui omnis. Commodi officia deserunt.Jun 23, 2020, 6:56 AM
- Angelina RodriguezteneturJun 23, 2020, 5:56 AM
- Terrence HettingerTempore qui sit et dolor magni.Jun 23, 2020, 4:56 AM
- Jacqueline RempelPerspiciatis sint consequuntur illum voluptate laboriosam dolor officia.Jun 23, 2020, 3:56 AM
- Patty RusselOmnis eaque dolor. Est nemo consequatur illo est inventore iste ea repellat accusamus. Molestiae suscipit a minima totam ea odit quis quis quia. Ipsam ut velit. Sed aut maiores consequatur voluptatem voluptates. Quis perspiciatis adipisci laudantium iure qui. Possimus incidunt ex voluptas at ut sequi repellendus commodi est. Beatae accusantium officia quas qui nulla ut fugiat. Fuga eligendi quas veniam. Tenetur autem ut porro dicta et ea recusandae placeat. Minima facilis harum autem temporibus dolorum consequatur et animi. Cum cum maxime voluptatibus laudantium et earum. Non fugit aspernatur sapiente odit.Jun 23, 2020, 2:56 AM
- Willard DoyleDeleniti et commodi iure adipisci iusto assumenda accusantium nobis.Jun 23, 2020, 1:56 AM
- Ruben MarksvoluptatemJun 23, 2020, 12:56 AM
- Jun 22, 2020
- Miss Van SipesNecessitatibus maiores rerum consequatur aliquid nostrum reiciendis incidunt qui. Provident et sint quisquam ea quo. Et quidem dolor. Quo maxime possimus voluptatem inventore. Quia eos minus in alias dolorem et. Veniam consequuntur inventore dolores qui est quod quae quo. Nostrum consequatur id enim porro asperiores et aut temporibus earum. Dolor et repudiandae placeat numquam. Consequatur nihil eligendi. Aspernatur ex rem reiciendis excepturi quo sunt alias aut. Ex cupiditate sunt in voluptatem vero. Consequatur quasi dolores omnis vitae beatae culpa. Et aut quas itaque voluptatum iste exercitationem. Nesciunt mollitia dolores.Jun 22, 2020, 11:56 PM
- Jun 19, 2020
- Mrs. Rickey RobelQuae nisi necessitatibus. Molestias voluptas assumenda quaerat tempore sapiente quas. Quidem reprehenderit aspernatur.Jun 19, 2020, 3:30 AM
- Janie Stiedemannomnis earum providentJun 19, 2020, 2:30 AM
- Crystal BeerUt temporibus ipsa. Esse ratione et ut quod ullam et id maxime omnis. Velit iste consequatur laboriosam quo repellendus ut veritatis qui consequuntur.Jun 19, 2020, 1:30 AM
- Mrs. Willie HerzognatusJun 19, 2020, 12:30 AM
- Jun 18, 2020
- Norma SwaniawskiQuam amet modi dolor corporis officia.Jun 18, 2020, 11:30 PM
- Alvin FritschFuga quo autem ipsum. Saepe molestiae porro omnis rerum eius nulla. Aut qui et cupiditate natus iste harum doloremque. Voluptatem soluta nostrum aliquid vero possimus a voluptas facere. Aut eveniet eum. Aliquam nisi aut odit et sint. Tempora autem eos est accusantium dolore id placeat aut in. Dolor unde porro ducimus voluptates. Eveniet sed eligendi libero iste quia et fugiat consectetur. Ex et iste temporibus commodi rem laborum voluptatem eligendi dicta. Reiciendis quos possimus tenetur consequatur dignissimos tenetur qui dolor. Similique dolores eaque. Eos est debitis nihil. Fugiat corporis totam aliquid non voluptates non.Jun 18, 2020, 10:30 PM
- Colin HaleyFugiat modi delectus provident inventore et saepe quis qui repudiandae. Nesciunt sed ut. Illo impedit enim cupiditate eos aut similique et. Quaerat sapiente quos voluptatibus rerum adipisci ullam eveniet est.Jun 18, 2020, 9:30 PM
- Adrienne Fritschoptio minus numquamJun 18, 2020, 8:30 PM
- Randy BernierIn perspiciatis odit veniam quibusdam ducimus dolores esse.Jun 18, 2020, 7:30 PM
- Forrest OberbrunnerConsequatur velit illo doloribus. Dolorem eaque sequi dolorem rerum. Ex et atque eos qui. Officiis possimus qui optio in magni rem. Qui molestias et aperiam autem. Error cupiditate quaerat mollitia iste enim.Jun 18, 2020, 6:30 PM
- May 15, 2020
- Rene HaagDucimus harum ut. Modi suscipit in quam qui hic sed dolorem. Autem aliquid eligendi quidem. Esse alias maiores ut soluta quaerat natus. Reiciendis eius cupiditate fuga similique tenetur itaque odio itaque nesciunt. Et temporibus neque nesciunt error ea modi iste ratione vero.May 15, 2020, 3:23 PM
- Tonya FadelCommodi magnam harum quia occaecati. Esse ipsa ut. Accusantium qui sit. Temporibus cumque in sequi odit autem reiciendis ea id. Totam nemo optio numquam quasi sint dolore ut harum. Laboriosam excepturi voluptatem libero velit quas qui enim aperiam vitae.May 15, 2020, 2:23 PM
- Orville HilpertDolorum molestiae debitis voluptatem totam suscipit magnam. Consectetur quis tenetur ipsa vel. Voluptas dolor adipisci laborum sunt. Non suscipit inventore aperiam molestiae facilis error voluptate in voluptas.May 15, 2020, 1:23 PM
- Teresa KshlerineaMay 15, 2020, 12:23 PM
- Wilbert RohanaliasMay 15, 2020, 11:23 AM
- Stella RutherfordOfficia tenetur eos placeat sit voluptate vel perspiciatis deserunt. Ullam saepe rem commodi odit quam quia. Inventore molestiae et voluptatem vel nulla dolores. Nihil laboriosam quia et nemo sit aut quam. Ad fugit facere consequatur sed aut.May 15, 2020, 10:23 AM
- Mr. Pauline WeissnatAsperiores occaecati nemo aut. Autem veniam qui similique quaerat accusamus eos porro tempore et.May 15, 2020, 9:23 AM
- Sheila Cronin PhDalias accusantium enimMay 15, 2020, 8:23 AM
- Danielle HoppeIn incidunt optio.May 15, 2020, 7:23 AM
- Melba O'ConnellcumqueMay 15, 2020, 6:23 AM
- Mar 11, 2020
- Emanuel Smithamconsequatur quo eaMar 11, 2020, 12:15 PM
- Harold CummerataLaudantium cum qui fugit in voluptates sint. Aut maxime repellat. Tempora nam in cum aut eos. Nesciunt assumenda soluta quo. Sit maiores enim quo assumenda qui. Molestiae quis accusantium.Mar 11, 2020, 11:15 AM
- Susie McKenziealiasMar 11, 2020, 10:15 AM
- George HeaneyPraesentium in quas et. Voluptatem eos non voluptate dicta totam consequuntur. Necessitatibus quibusdam totam omnis ut aperiam. Rerum nemo sunt est soluta quia nostrum eaque ut temporibus. Laborum ratione repellendus ullam architecto quia facere. Qui temporibus iusto. Esse non eius. Eius et atque. Porro quaerat minus et tempore quo aliquid. Rem omnis esse asperiores qui quae ipsum officiis ut et. Aliquid et omnis iste mollitia voluptates ea ab amet. Quidem ipsa nesciunt sunt fuga. Aut tempore est laboriosam.Mar 11, 2020, 9:15 AM
- Evelyn Rempelest velit quoMar 11, 2020, 8:15 AM
- Ms. Opal Kulasquaerat voluptates aliquidMar 11, 2020, 7:15 AM
- Preston Rosenbaum PhDId ea voluptas dolores modi nostrum. Aspernatur id quos dolor. Et blanditiis sed ea suscipit id commodi nesciunt vel officiis. Aliquam et repellat ut qui accusamus ut. Voluptatum aut quia nam.Mar 11, 2020, 6:15 AM
- Silvia SchroederIncidunt fuga aut. Cupiditate aut optio deleniti nulla magni nobis asperiores enim. In quod nobis dolore commodi natus.Mar 11, 2020, 5:15 AM
- Jenny WunschEt dolorem labore quisquam saepe. Veniam qui non officiis blanditiis et aut vitae. Omnis alias illum. Perspiciatis corporis illum cum eaque. Itaque error maiores et qui pariatur doloremque. Aliquam consectetur dolorum est unde in quia eos.Mar 11, 2020, 4:15 AM
- Salvador KundeRerum voluptas aut autem. Consequatur unde ut beatae fugit placeat rerum aut. Debitis explicabo molestias. Suscipit quis velit.Mar 11, 2020, 3:15 AM
1import React from 'react'
2import faker from 'faker'
3import PropTypes from 'prop-types'
4import { makeStyles } from '@material-ui/core'
5import { GroupList } from '@react-lists/core'
6
7const useStyles = makeStyles(theme => ({
8 message: {
9 background: '#f1f1f1',
10 borderRadius: 7.5,
11 color: '#4a4a4a',
12 maxWidth: 'max-content',
13 minWidth: '40%',
14 margin: '10px',
15 padding: '10px 15px',
16 width: '80%'
17 },
18 messageSender: {
19 background: '#dcf8c6',
20 marginLeft: 'auto'
21 },
22 header: {
23 fontWeight: 'bold',
24 fontSize: theme.typography.pxToRem(14),
25 marginBottom: theme.spacing(2),
26 textAlign: 'left'
27 },
28 body: {
29 fontWeight: 'normal',
30 fontSize: theme.typography.pxToRem(14),
31 marginBottom: theme.spacing(2)
32 },
33 footer: {
34 fontWeight: 'normal',
35 fontSize: theme.typography.pxToRem(12),
36 textAlign: 'right'
37 },
38 listSubHeader: {
39 paddingTop: 10
40 },
41 listSubHeaderContent: {
42 background: 'rgba(225, 245, 254, 0.92)',
43 borderRadius: 7.5,
44 fontWeight: 'bold',
45 margin: '5px auto',
46 padding: '10px 15px',
47 width: 'max-content'
48 }
49}))
50
51let date = faker.date.past()
52const DEFAULT_QUANTITY = 100
53
54const mapMessages = (item, index) => {
55 if (index % 10 === 0) {
56 date = faker.date.past()
57 } else {
58 const newDate = date.getTime() + 1 * 60 * 60 * 1000
59 date.setTime(newDate)
60 }
61
62 return {
63 id: faker.random.uuid(),
64 text: faker.lorem.text(),
65 sender: {
66 id: Math.floor(Math.random() * (10 - 1 + 1)) + 1,
67 name: faker.name.findName()
68 },
69 date: new Intl.DateTimeFormat('en', {
70 day: '2-digit',
71 month: 'short',
72 year: 'numeric'
73 }).format(date),
74 datetime: new Intl.DateTimeFormat('en', {
75 day: '2-digit',
76 month: 'short',
77 year: 'numeric',
78 hour: 'numeric',
79 minute: 'numeric'
80 }).format(date),
81 timestemp: date.getTime()
82 }
83}
84
85const sortMessages = (a, b) => b.timestemp - a.timestemp
86
87const groupMessagesByDate = (groupByDate, message) => {
88 if (!groupByDate[message.date]) {
89 groupByDate[message.date] = {
90 header: message.date,
91 data: []
92 }
93 }
94
95 groupByDate[message.date].data.push(message)
96
97 return groupByDate
98}
99
100const fakeMessages = () => Array(DEFAULT_QUANTITY).fill({}).map(mapMessages)
101
102const MessageRenderer = ({ text, sender, datetime }) => {
103 const classes = useStyles()
104 let messageStyles = classes.message
105
106 if (sender.id === 1) {
107 messageStyles += ` ${classes.messageSender}`
108 }
109
110 return (
111 <div className={messageStyles}>
112 <div className={classes.header}>{sender.name}</div>
113 <div className={classes.body}>{text}</div>
114 <div className={classes.footer}>{datetime}</div>
115 </div>
116 )
117}
118
119MessageRenderer.propTypes = {
120 datetime: PropTypes.string.isRequired,
121 text: PropTypes.string.isRequired,
122 sender: PropTypes.shape({
123 id: PropTypes.number.isRequired,
124 name: PropTypes.string.isRequired
125 }).isRequired
126}
127
128const SubHeaderRenderer = ({ text }) => {
129 const classes = useStyles()
130 return (
131 <div className={classes.listSubHeader}>
132 <div className={classes.listSubHeaderContent}>
133 {text}
134 </div>
135 </div>
136 )
137}
138
139SubHeaderRenderer.propTypes = {
140 text: PropTypes.string.isRequired
141}
142
143const initialMessages = fakeMessages()
144
145export default function ChatMessagesReverseList() {
146 const [messages, setMessages] = React.useState(initialMessages)
147 const [hasMoreItems, setHasMoreItems] = React.useState(true)
148 const [displayLoading, setDisplayLoading] = React.useState(false)
149
150 const loadMore = () => {
151 if (!hasMoreItems) {
152 return
153 }
154
155 setDisplayLoading(true)
156
157 setTimeout(() => {
158 const newMessages = fakeMessages()
159
160 setMessages(oldMessages => {
161 const messagesUpdated = [...oldMessages, ...newMessages]
162
163 setHasMoreItems(messagesUpdated.length < DEFAULT_QUANTITY * 2)
164 setDisplayLoading(false)
165
166 return messagesUpdated
167 })
168 }, 2000)
169 }
170
171return (
172 <GroupList
173 displayLoading={displayLoading}
174 items={messages.sort(sortMessages).reduce(groupMessagesByDate, {})}
175 itemRenderer={MessageRenderer}
176 listHeight={400}
177 reverse
178 subHeaderRenderer={SubHeaderRenderer}
179 onLoadMore={loadMore}
180 />
181)