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 &amp; Barbuda","Argentina","Armenia","Aruba","Australia","Austria","Azerbaijan","Bahamas","Bahrain","Bangladesh","Barbados","Belarus","Belgium","Belize","Benin","Bermuda","Bhutan","Bolivia","Bosnia &amp; 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 &amp; Miquelon","Samoa","San Marino","Satellite","Saudi Arabia","Senegal","Serbia","Seychelles","Sierra Leone","Singapore","Slovakia","Slovenia","South Africa","South Korea","Spain","Sri Lanka","St Kitts &amp; Nevis","St Lucia","St Vincent","St. Lucia","Sudan","Suriname","Swaziland","Sweden","Switzerland","Syria","Taiwan","Tajikistan","Tanzania","Thailand","Timor L'Este","Togo","Tonga","Trinidad &amp; Tobago","Tunisia","Turkey","Turkmenistan","Turks &amp; 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.

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 Ebert
      Tenetur mollitia voluptas.
      Dec 05, 2020, 6:30 AM
    • Eric Krajcik V
      quidem
      Dec 05, 2020, 5:30 AM
    • Sheryl Bahringer
      sequi quidem qui
      Dec 05, 2020, 4:30 AM
    • Zachary Lebsack
      Assumenda tempore est neque omnis molestias voluptatem voluptatem rerum est.
      Dec 05, 2020, 3:30 AM
    • Dorothy Kris
      Occaecati 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 Bergstrom
      Asperiores perspiciatis hic et optio itaque.
      Dec 05, 2020, 1:30 AM
    • Jana Watsica
      Voluptatibus 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 Rutherford
      Nesciunt eaque ipsam sapiente accusantium eaque necessitatibus. Error iure numquam.
      Dec 04, 2020, 11:30 PM
    • Nancy Rolfson
      Unde 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 Ruecker
      Omnis 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 III
      Qui 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 Mitchell
      dicta
      Dec 03, 2020, 4:44 AM
    • Janie Romaguera
      enim
      Dec 03, 2020, 3:44 AM
    • Ellen Stoltenberg
      Explicabo 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 Metz
      Nulla 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 Collins
      Quidem 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 Schroeder
      Pariatur 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 Bernier
      Quibusdam sunt voluptatum alias provident.
      Dec 02, 2020, 10:44 PM
    • Kristina Sawayn
      Atque nihil eum placeat ea enim unde nisi.
      Dec 02, 2020, 9:44 PM
    • Annette Harber
      Impedit 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 IV
      fugiat sint rerum
      Aug 09, 2020, 2:45 PM
    • Julie Bashirian
      Ab 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 Lueilwitz
      corrupti
      Aug 09, 2020, 12:45 PM
    • Mrs. Jack Zemlak
      Animi 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 Harvey
      Est eum ut aliquam ducimus nobis sequi exercitationem aspernatur harum.
      Aug 09, 2020, 10:45 AM
    • Tonya Lehner
      nesciunt
      Aug 09, 2020, 9:45 AM
    • Flora Hahn
      Rem 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 Bernier
      Fugiat 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 Durgan
      Nostrum minima occaecati repellendus laudantium cupiditate.
      Aug 09, 2020, 6:45 AM
    • Mr. Willie DuBuque
      maxime illo et
      Aug 09, 2020, 5:45 AM
  • Aug 03, 2020
    • Daniel Gleichner
      Quisquam enim fuga architecto sint sunt ab aut. Rerum nihil ut assumenda aut rem occaecati vitae ratione.
      Aug 03, 2020, 3:51 AM
    • Mr. Marion Hauck
      Doloremque 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 Keebler
      Praesentium 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 Parker
      Et quasi est quis.
      Aug 03, 2020, 12:51 AM
  • Aug 02, 2020
    • Carol Pacocha
      Neque 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 Stanton
      Suscipit eum odit ea aliquid quasi odio eveniet. Modi quis amet quas tempore omnis vel sapiente.
      Aug 02, 2020, 10:51 PM
    • Glen Reinger
      quibusdam
      Aug 02, 2020, 9:51 PM
    • Andre Murphy I
      Debitis 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 Weissnat
      ad
      Aug 02, 2020, 7:51 PM
    • Elaine Runte
      placeat
      Aug 02, 2020, 6:51 PM
  • Jul 30, 2020
    • Lucia Morissette
      Pariatur est velit et aliquam.
      Jul 30, 2020, 5:21 PM
    • Angelica O'Kon
      non corrupti quibusdam
      Jul 30, 2020, 4:21 PM
    • Joan Lubowitz
      Ipsa occaecati et.
      Jul 30, 2020, 3:21 PM
    • Terrence Auer
      Et 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 Cormier
      Non 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 Green
      Quaerat 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 Conroy
      facilis
      Jul 30, 2020, 11:21 AM
    • Sherri Rosenbaum
      Dicta 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 Price
      Dolores iusto velit. Aliquid dolorem aut maxime eaque repellendus. Voluptatibus voluptatibus ipsam id.
      Jul 30, 2020, 9:21 AM
    • Danny Emard
      Beatae 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'Conner
      Consequatur dolorem non eos. Fugit sint quas veritatis enim quibusdam commodi et incidunt aspernatur.
      Jul 19, 2020, 6:36 AM
    • Mrs. Carrie Douglas
      Fugiat 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 Haley
      Sunt 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 Smith
      Nostrum 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 Hills
      Nam 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 Brown
      Ea 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 Renner
      Maiores illum eligendi dicta.
      Jul 19, 2020, 12:36 AM
  • Jul 18, 2020
    • Ebony Kuhlman
      vero
      Jul 18, 2020, 11:36 PM
    • Arlene Spinka II
      Iste doloribus et aperiam ipsum. Iure saepe culpa voluptate.
      Jul 18, 2020, 10:36 PM
    • Lawrence Osinski
      Possimus 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 Legros
      ea itaque rem
      Jun 23, 2020, 8:56 AM
    • Hilda Morissette
      Voluptas veritatis aliquid tenetur aut.
      Jun 23, 2020, 7:56 AM
    • Raul Kutch
      Et 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 Rodriguez
      tenetur
      Jun 23, 2020, 5:56 AM
    • Terrence Hettinger
      Tempore qui sit et dolor magni.
      Jun 23, 2020, 4:56 AM
    • Jacqueline Rempel
      Perspiciatis sint consequuntur illum voluptate laboriosam dolor officia.
      Jun 23, 2020, 3:56 AM
    • Patty Russel
      Omnis 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 Doyle
      Deleniti et commodi iure adipisci iusto assumenda accusantium nobis.
      Jun 23, 2020, 1:56 AM
    • Ruben Marks
      voluptatem
      Jun 23, 2020, 12:56 AM
  • Jun 22, 2020
    • Miss Van Sipes
      Necessitatibus 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 Robel
      Quae nisi necessitatibus. Molestias voluptas assumenda quaerat tempore sapiente quas. Quidem reprehenderit aspernatur.
      Jun 19, 2020, 3:30 AM
    • Janie Stiedemann
      omnis earum provident
      Jun 19, 2020, 2:30 AM
    • Crystal Beer
      Ut 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 Herzog
      natus
      Jun 19, 2020, 12:30 AM
  • Jun 18, 2020
    • Norma Swaniawski
      Quam amet modi dolor corporis officia.
      Jun 18, 2020, 11:30 PM
    • Alvin Fritsch
      Fuga 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 Haley
      Fugiat 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 Fritsch
      optio minus numquam
      Jun 18, 2020, 8:30 PM
    • Randy Bernier
      In perspiciatis odit veniam quibusdam ducimus dolores esse.
      Jun 18, 2020, 7:30 PM
    • Forrest Oberbrunner
      Consequatur 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 Haag
      Ducimus 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 Fadel
      Commodi 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 Hilpert
      Dolorum 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 Kshlerin
      ea
      May 15, 2020, 12:23 PM
    • Wilbert Rohan
      alias
      May 15, 2020, 11:23 AM
    • Stella Rutherford
      Officia 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 Weissnat
      Asperiores occaecati nemo aut. Autem veniam qui similique quaerat accusamus eos porro tempore et.
      May 15, 2020, 9:23 AM
    • Sheila Cronin PhD
      alias accusantium enim
      May 15, 2020, 8:23 AM
    • Danielle Hoppe
      In incidunt optio.
      May 15, 2020, 7:23 AM
    • Melba O'Connell
      cumque
      May 15, 2020, 6:23 AM
  • Mar 11, 2020
    • Emanuel Smitham
      consequatur quo ea
      Mar 11, 2020, 12:15 PM
    • Harold Cummerata
      Laudantium 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 McKenzie
      alias
      Mar 11, 2020, 10:15 AM
    • George Heaney
      Praesentium 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 Rempel
      est velit quo
      Mar 11, 2020, 8:15 AM
    • Ms. Opal Kulas
      quaerat voluptates aliquid
      Mar 11, 2020, 7:15 AM
    • Preston Rosenbaum PhD
      Id 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 Schroeder
      Incidunt fuga aut. Cupiditate aut optio deleniti nulla magni nobis asperiores enim. In quod nobis dolore commodi natus.
      Mar 11, 2020, 5:15 AM
    • Jenny Wunsch
      Et 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 Kunde
      Rerum 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)