Skip to content

Commit 7bceb0c

Browse files
committed
WiP on infinite scroll
1 parent b53c029 commit 7bceb0c

File tree

3 files changed

+33
-10
lines changed

3 files changed

+33
-10
lines changed

client/browser/FileSelectDialog.tsx

Lines changed: 25 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import React, {
77
useRef,
88
useState,
99
} from 'react';
10+
import {InView} from 'react-intersection-observer';
1011
import {Tooltip} from 'react-tooltip';
1112
import FigureLabels from '../common/FigureLabels';
1213
import FileUploader from '../common/FileUploader';
@@ -50,25 +51,40 @@ function Figure(props) {
5051

5152

5253
const FilesList = memo((props: any) => {
53-
const {files, selectFile} = props;
54+
const {files, numFiles, selectFile} = props;
55+
const [{offset, limit}, setOffset] = useState({offset: 0, limit: 10});
5456

55-
console.log('FolderList', files);
57+
console.log('FolderList', numFiles, files);
58+
59+
function loadMore(inView, entry) {
60+
if (inView) {
61+
console.log('load more:', entry.target);
62+
}
63+
}
5664

5765
return (
5866
<ul className="files-browser">{
5967
files.length === 0 ?
60-
<li className="status">{gettext("Empty folder")}</li> :
61-
files.map(file => (
68+
<li className="status">{gettext("Empty folder")}</li> : (
69+
<>{files.map(file => (
6270
<li key={file.id} onClick={() => selectFile(file)}><Figure {...file} /></li>
63-
))}
64-
</ul>
71+
))}
72+
{numFiles > files.length && <InView as="li" onChange={loadMore} />}
73+
</>
74+
)}</ul>
6575
);
6676
});
6777

6878

6979
export default function FileSelectDialog(props) {
7080
const {realm, baseUrl, csrfToken, selectFile} = props;
71-
const [structure, setStructure] = useState({root_folder: null, last_folder: null, files: null, labels: []});
81+
const [structure, setStructure] = useState({
82+
root_folder: null,
83+
last_folder: null,
84+
files: null,
85+
num_files: 0,
86+
labels: [],
87+
});
7288
const [uploadedFile, setUploadedFile] = useState(null);
7389
const ref = useRef(null);
7490
const uploaderRef = useRef(null);
@@ -115,6 +131,7 @@ export default function FileSelectDialog(props) {
115131
root_folder: structure.root_folder,
116132
last_folder: folderId,
117133
files: null,
134+
num_files: 0,
118135
labels: structure.labels,
119136
};
120137
const response = await fetch(fetchUrl);
@@ -170,7 +187,7 @@ export default function FileSelectDialog(props) {
170187
>{
171188
structure.files === null ?
172189
<div className="status">{gettext("Loading files…")}</div> :
173-
<FilesList files={structure.files} selectFile={selectFile} />
190+
<FilesList files={structure.files} numFiles={structure.num_files} selectFile={selectFile} />
174191
}</FileUploader>
175192
</div>
176193
</>}

finder/browser/views.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -134,13 +134,18 @@ def list(self, request, folder_id):
134134
"""
135135
List all the files of the given folder.
136136
"""
137-
folder = FolderModel.objects.get(id=folder_id)
138137
request.session['finder.last_folder'] = str(folder_id)
138+
offset = int(request.GET.get('offset', 0))
139+
limit = int(request.GET.get('limit', 10))
139140
lookup = lookup_by_label(request)
140141
unified_queryset = FileModel.objects.filter_unified(parent_id=folder_id, is_folder=False, **lookup)
142+
num_files = unified_queryset.count()
141143
unified_queryset = sort_by_attribute(request, unified_queryset)
142144
annotate_unified_queryset(unified_queryset)
143-
return {'files': list(unified_queryset)}
145+
return {
146+
'files': list(unified_queryset), # [offset:limit]
147+
'num_files': num_files,
148+
}
144149

145150
def search(self, request, folder_id):
146151
"""

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
"esbuild-plugin-svgr": "^2.1.0",
2121
"react-h5-audio-player": "^3.9.3",
2222
"react-image-crop": "^11.0.7",
23+
"react-intersection-observer": "^9.13.1",
2324
"react-player": "^2.16.0",
2425
"react-tooltip": "^5.28.0",
2526
"request": "^2.88.2",

0 commit comments

Comments
 (0)