import React, {useEffect, useState} from 'react'; import {View} from 'react-native'; import {RefreshControl, useWindowDimensions} from 'react-native'; import {useSafeAreaInsets} from 'react-native-safe-area-context'; import {DataProvider, LayoutProvider, RecyclerListView} from 'recyclerlistview'; import {useTracked} from '../../provider'; import {DDS} from '../../services/DeviceDetection'; import {eSendEvent} from '../../services/EventManager'; import Navigation from '../../services/Navigation'; import SettingsService from '../../services/SettingsService'; import Sync from '../../services/Sync'; import {dHeight} from '../../utils'; import {COLORS_NOTE} from '../../utils/Colors'; import {eScrollEvent} from '../../utils/Events'; import {sleep} from '../../utils/TimeUtils'; import {NotebookWrapper} from '../NotebookItem/wrapper'; import {NoteWrapper} from '../NoteItem/wrapper'; import TagItem from '../TagItem'; import {Announcement} from './announcement'; import {Empty} from './empty'; import {Footer} from './footer'; import {Header} from './header'; import {SectionHeader} from './section-header'; const header = { type: 'MAIN_HEADER', }; const SimpleList = ({ listData, type, customRefresh, customRefreshing, refreshCallback, sortMenuButton, scrollRef, jumpToDialog, placeholderData, loading, headerProps = { heading: 'Home', }, }) => { const [state] = useTracked(); const {colors, deviceMode, messageBoardState} = state; const [_loading, setLoading] = useState(true); const [loaded, setLoaded] = useState(false); const [dataProvider, setDataProvider] = useState( new DataProvider((r1, r2) => { return r1 !== r2; }), ); const insets = useSafeAreaInsets(); const {width, fontScale} = useWindowDimensions(); const refreshing = false; const dataType = type; useEffect(() => { if (loading) { setDataProvider(dataProvider.cloneWithRows([header, {type: 'empty'}])); setLoaded(false); } if (!loading) { setDataProvider( dataProvider.cloneWithRows( !listData || listData.length === 0 ? [header, {type: 'empty'}] : [header].concat(listData), ), ); setLoading(false); setTimeout( () => { setLoaded(true); }, Navigation.getCurrentScreen() === SettingsService.get().homepage ? 1000 : 150, ); } }, [listData, deviceMode, loading]); const _onRefresh = async () => { await Sync.run(); if (refreshCallback) { refreshCallback(); } }; const _onScroll = event => { if (!event) return; let y = event.nativeEvent.contentOffset.y; eSendEvent(eScrollEvent, y); }; const _layoutProvider = new LayoutProvider( index => { return dataProvider.getDataForIndex(index).type; }, (type, dim) => { switch (type) { case 'note': dim.width = width; dim.height = 100 * fontScale; break; case 'notebook': dim.width = width; dim.height = 110 * fontScale; break; case 'trash': dim.width = width; dim.height = 110 * fontScale; break; case 'empty': dim.width = width; dim.height = dHeight - 250 - insets.top; break; case 'topic': dim.width = width; dim.height = 80 * fontScale; break; case 'tag': dim.width = width; dim.height = 80 * fontScale; break; case 'header': dim.width = width; dim.height = 40 * fontScale; break; case 'MAIN_HEADER': dim.width = width; dim.height = dataType === 'search' ? 0 : DDS.isLargeTablet() ? messageBoardState.visible ? 50 : 0 : 195; break; default: dim.width = width; dim.height = 0; } }, ); const _renderRow = (type, data, index) => { switch (type) { case 'note': return ; case 'notebook': return ( ); case 'tag': return ; case 'topic': return ( ); case 'trash': return data.itemType === 'note' ? ( ) : ( ); case 'MAIN_HEADER': return (
); case 'header': return ( ); case 'empty': return ( ); } }; let scrollProps = React.useMemo(() => { return { refreshControl: ( ), overScrollMode: 'always', contentContainerStyle: { width: '100%', alignSelf: 'center', minHeight: '100%', }, testID: 'list-' + type, }; }, [colors.accent, type, customRefresh]); let styles = { height: '100%', backgroundColor: colors.bg, width: '100%', }; return ( <> {loaded && !loading ? null : ( <>
)} {_loading ? null : ( <> )} ); }; export default SimpleList;