{"version":3,"file":"InfiniteScroll-BV5IC4og.js","sources":["../../Client/legacy/Components/InfiniteScroll.tsx"],"sourcesContent":["import * as React from 'react';\r\nimport Component from './Component';\r\n\r\nexport interface IInfiniteScrollProps {\r\n initialCount?: number | undefined;\r\n count: number;\r\n get: (start: number, count: number) => Promise<any[]>;\r\n build: (model: any, index?: number) => JSX.Element;\r\n missingData?: JSX.Element;\r\n loading?: JSX.Element;\r\n skipInitialUpdate?: boolean;\r\n}\r\n\r\ninterface IInfiniteScrollState {\r\n models: any[];\r\n loading: boolean;\r\n}\r\n\r\nexport default class InfiniteScroll extends Component<IInfiniteScrollProps, IInfiniteScrollState> {\r\n onScrollHandler: () => {};\r\n start: number;\r\n count: number;\r\n loading: boolean;\r\n more: boolean;\r\n mounted: boolean;\r\n\r\n constructor(props) {\r\n super(props);\r\n\r\n this.onScrollHandler = this.onScroll.bind(this);\r\n\r\n this.state = {\r\n models: [],\r\n loading: false,\r\n };\r\n }\r\n\r\n getModels() {\r\n return this.state.models;\r\n }\r\n\r\n setModels(models: any[]) {\r\n // This is done to stop InfiniteScroll's subscription to the scroll event, otherwise setting the state would throw a warning.\r\n window.removeEventListener('scroll', this.onScrollHandler);\r\n this.mounted = false;\r\n\r\n this.setState({\r\n models: models,\r\n });\r\n\r\n // Resume the subscription\r\n window.addEventListener('scroll', this.onScrollHandler);\r\n this.mounted = true;\r\n }\r\n\r\n componentDidMount() {\r\n window.addEventListener('scroll', this.onScrollHandler);\r\n\r\n this.mounted = true;\r\n if (!this.props.skipInitialUpdate) this.update();\r\n }\r\n\r\n componentWillUnmount() {\r\n window.removeEventListener('scroll', this.onScrollHandler);\r\n\r\n this.mounted = false;\r\n }\r\n\r\n async update(force: boolean = false) {\r\n this.start = 0;\r\n this.count = this.props.initialCount || this.props.count;\r\n this.more = true;\r\n\r\n await this.get(true, force);\r\n }\r\n\r\n async refresh() {\r\n let oldCount = this.count,\r\n oldStart = this.start,\r\n oldMore = this.more;\r\n\r\n this.count = this.more ? this.start : this.start + this.count;\r\n this.start = 0;\r\n this.more = true;\r\n\r\n await this.get(true);\r\n\r\n this.more = oldMore;\r\n this.count = oldCount;\r\n this.start = oldStart;\r\n }\r\n\r\n async onScroll() {\r\n let body = document.body,\r\n html = document.documentElement;\r\n\r\n if (!html) return;\r\n\r\n let pageHeight = Math.max(\r\n body.scrollHeight,\r\n body.offsetHeight,\r\n html.clientHeight,\r\n html.scrollHeight,\r\n html.offsetHeight,\r\n );\r\n\r\n if (pageHeight - window.scrollY >= 2000) return;\r\n\r\n this.count = this.props.count;\r\n await this.get();\r\n }\r\n\r\n async get(clear: boolean = false, force: boolean = false) {\r\n if (!force && (this.state.loading || !this.more || !this.props.get)) return;\r\n\r\n this.setState({ loading: true, models: clear ? [] : this.state.models });\r\n this.setFooterVisibility(false);\r\n\r\n let models = await this.props.get(this.start, this.count);\r\n\r\n this.mounted &&\r\n this.setState(\r\n {\r\n models: clear ? models : this.state.models.concat(models),\r\n loading: false,\r\n },\r\n () => {\r\n this.more = models.length === this.count;\r\n if (this.more) this.start = (isNaN(this.start) ? 0 : this.start) + this.count;\r\n this.setFooterVisibility(true);\r\n },\r\n );\r\n }\r\n\r\n setFooterVisibility(visible: boolean) {\r\n const footer = document.getElementById('footer');\r\n\r\n if (footer) {\r\n footer.classList.toggle('hidden', !visible);\r\n }\r\n }\r\n\r\n render() {\r\n return (\r\n <React.Fragment>\r\n {this.state.models &&\r\n this.state.models.length > 0 &&\r\n this.state.models.map(this.props.build.bind(this))}\r\n {this.state.loading && (this.props.loading || <div key='loading'>Loading...</div>)}\r\n {this.state.models.length === 0 &&\r\n !this.state.loading &&\r\n (this.props.missingData || <div key='missing-data'>No data found.</div>)}\r\n </React.Fragment>\r\n );\r\n }\r\n}\r\n"],"names":["InfiniteScroll","Component","props","__publicField","models","force","oldCount","oldStart","oldMore","body","html","clear","visible","footer","jsxs","React.Fragment","jsx"],"mappings":"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"}