mirror of
https://github.com/streetwriters/notesnook.git
synced 2025-12-23 15:09:33 +01:00
optimize loading screen in list
This commit is contained in:
@@ -1,27 +1,30 @@
|
|||||||
import React, { useEffect, useState } from 'react';
|
import React, {useEffect, useState} from 'react';
|
||||||
import { RefreshControl, useWindowDimensions } from 'react-native';
|
import {RefreshControl, useWindowDimensions} from 'react-native';
|
||||||
import { useSafeAreaInsets } from 'react-native-safe-area-context';
|
import {useSafeAreaInsets} from 'react-native-safe-area-context';
|
||||||
import { DataProvider, LayoutProvider, RecyclerListView } from 'recyclerlistview';
|
import {DataProvider, LayoutProvider, RecyclerListView} from 'recyclerlistview';
|
||||||
import { useTracked } from '../../provider';
|
import {useTracked} from '../../provider';
|
||||||
import { DDS } from '../../services/DeviceDetection';
|
import {DDS} from '../../services/DeviceDetection';
|
||||||
import { eSendEvent } from '../../services/EventManager';
|
import {eSendEvent} from '../../services/EventManager';
|
||||||
import Sync from '../../services/Sync';
|
import Sync from '../../services/Sync';
|
||||||
import { dHeight } from '../../utils';
|
import {dHeight} from '../../utils';
|
||||||
import { eScrollEvent } from '../../utils/Events';
|
import {eScrollEvent} from '../../utils/Events';
|
||||||
import { NotebookWrapper } from '../NotebookItem/wrapper';
|
import {NotebookWrapper} from '../NotebookItem/wrapper';
|
||||||
import { NoteWrapper } from '../NoteItem/wrapper';
|
import {NoteWrapper} from '../NoteItem/wrapper';
|
||||||
import TagItem from '../TagItem';
|
import TagItem from '../TagItem';
|
||||||
import { Empty } from './empty';
|
import {Empty} from './empty';
|
||||||
import { Footer } from './footer';
|
import {Footer} from './footer';
|
||||||
import { Header } from './header';
|
import {Header} from './header';
|
||||||
import { SectionHeader } from './section-header';
|
import {SectionHeader} from './section-header';
|
||||||
|
|
||||||
const header = {
|
const header = {
|
||||||
type: 'MAIN_HEADER',
|
type: 'MAIN_HEADER',
|
||||||
};
|
};
|
||||||
|
const emptyData = new DataProvider((r1, r2) => {
|
||||||
|
return r1 !== r2;
|
||||||
|
}).cloneWithRows([header, {type: 'empty'}]);
|
||||||
|
|
||||||
const SimpleList = ({
|
const SimpleList = ({
|
||||||
data,
|
listData,
|
||||||
type,
|
type,
|
||||||
customRefresh,
|
customRefresh,
|
||||||
customRefreshing,
|
customRefreshing,
|
||||||
@@ -37,29 +40,40 @@ const SimpleList = ({
|
|||||||
}) => {
|
}) => {
|
||||||
const [state] = useTracked();
|
const [state] = useTracked();
|
||||||
const {colors, deviceMode} = state;
|
const {colors, deviceMode} = state;
|
||||||
|
const [_loading, setLoading] = useState(true);
|
||||||
const [dataProvider, setDataProvider] = useState(
|
const [dataProvider, setDataProvider] = useState(
|
||||||
new DataProvider((r1, r2) => {
|
new DataProvider((r1, r2) => {
|
||||||
return r1 !== r2;
|
return r1 !== r2;
|
||||||
}).cloneWithRows([header, {type: 'empty'}]),
|
}).cloneWithRows(
|
||||||
|
!listData || listData.length === 0
|
||||||
|
? [header, {type: 'empty'}]
|
||||||
|
: [header].concat(listData),
|
||||||
|
),
|
||||||
);
|
);
|
||||||
|
|
||||||
const insets = useSafeAreaInsets();
|
const insets = useSafeAreaInsets();
|
||||||
const {width, fontScale} = useWindowDimensions();
|
const {width, fontScale} = useWindowDimensions();
|
||||||
const refreshing = false;
|
const refreshing = false;
|
||||||
const listData = data;
|
|
||||||
const dataType = type;
|
const dataType = type;
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (loading) return;
|
setDataProvider(
|
||||||
loadData();
|
dataProvider.cloneWithRows(
|
||||||
}, [data, loading, deviceMode]);
|
!listData || listData.length === 0
|
||||||
|
? [header, {type: 'empty'}]
|
||||||
|
: [header].concat(listData),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
setLoading(false);
|
||||||
|
}, [listData, deviceMode]);
|
||||||
|
|
||||||
|
/*
|
||||||
const loadData = () => {
|
const loadData = () => {
|
||||||
let mainData = [header, {type: 'empty'}];
|
let mainData = [header, {type: 'empty'}];
|
||||||
mainData =
|
mainData =
|
||||||
!listData || listData.length === 0 ? mainData : [header, ...listData];
|
!listData || listData.length === 0 ? mainData : [header].concat(listData);
|
||||||
setDataProvider(dataProvider.cloneWithRows(mainData));
|
setDataProvider(dataProvider.cloneWithRows(mainData));
|
||||||
};
|
}; */
|
||||||
|
|
||||||
const _onRefresh = async () => {
|
const _onRefresh = async () => {
|
||||||
await Sync.run();
|
await Sync.run();
|
||||||
@@ -74,6 +88,29 @@ const SimpleList = ({
|
|||||||
eSendEvent(eScrollEvent, y);
|
eSendEvent(eScrollEvent, y);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const emptyLayoutProvider = new LayoutProvider(
|
||||||
|
(index) => {
|
||||||
|
return emptyData.getDataForIndex(index).type;
|
||||||
|
},
|
||||||
|
(type, dim) => {
|
||||||
|
|
||||||
|
switch (type) {
|
||||||
|
case 'empty':
|
||||||
|
dim.width = width;
|
||||||
|
dim.height = dHeight - 250 - insets.top;
|
||||||
|
break;
|
||||||
|
case 'MAIN_HEADER':
|
||||||
|
dim.width = width;
|
||||||
|
dim.height =
|
||||||
|
dataType === 'search' ? 0 : DDS.isLargeTablet() ? 50 : 195;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
dim.width = width;
|
||||||
|
dim.height = 0;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
const _layoutProvider = new LayoutProvider(
|
const _layoutProvider = new LayoutProvider(
|
||||||
(index) => {
|
(index) => {
|
||||||
return dataProvider.getDataForIndex(index).type;
|
return dataProvider.getDataForIndex(index).type;
|
||||||
@@ -165,7 +202,12 @@ const SimpleList = ({
|
|||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
case 'empty':
|
case 'empty':
|
||||||
return <Empty loading={loading} placeholderData={placeholderData} />;
|
return (
|
||||||
|
<Empty
|
||||||
|
loading={loading || _loading}
|
||||||
|
placeholderData={placeholderData}
|
||||||
|
/>
|
||||||
|
);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -184,6 +226,7 @@ const SimpleList = ({
|
|||||||
refreshing={customRefresh ? customRefreshing : refreshing}
|
refreshing={customRefresh ? customRefreshing : refreshing}
|
||||||
/>
|
/>
|
||||||
),
|
),
|
||||||
|
|
||||||
overScrollMode: 'always',
|
overScrollMode: 'always',
|
||||||
contentContainerStyle: {
|
contentContainerStyle: {
|
||||||
width: '100%',
|
width: '100%',
|
||||||
@@ -199,20 +242,17 @@ const SimpleList = ({
|
|||||||
backgroundColor: colors.bg,
|
backgroundColor: colors.bg,
|
||||||
width: '100%',
|
width: '100%',
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<RecyclerListView
|
<RecyclerListView
|
||||||
ref={scrollRef}
|
ref={scrollRef}
|
||||||
layoutProvider={_layoutProvider}
|
layoutProvider={
|
||||||
dataProvider={dataProvider}
|
loading || _loading ? emptyLayoutProvider : _layoutProvider
|
||||||
|
}
|
||||||
|
dataProvider={loading || _loading ? emptyData : dataProvider}
|
||||||
rowRenderer={_renderRow}
|
rowRenderer={_renderRow}
|
||||||
onScroll={_onScroll}
|
onScroll={_onScroll}
|
||||||
canChangeSize={true}
|
canChangeSize={true}
|
||||||
optimizeForInsertDeleteAnimations
|
renderFooter={Footer}
|
||||||
//forceNonDeterministicRendering
|
|
||||||
renderFooter={ Footer}
|
|
||||||
scrollViewProps={scrollProps}
|
scrollViewProps={scrollProps}
|
||||||
style={styles}
|
style={styles}
|
||||||
/>
|
/>
|
||||||
|
|||||||
Reference in New Issue
Block a user