[NEW] Pull to refresh RoomsList (#1701)

This commit is contained in:
Djorkaeff Alexandre 2020-02-11 17:13:44 -03:00 committed by GitHub
parent ebe36cdc00
commit 42a53b4c9d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 63 additions and 17 deletions

View File

@ -22,6 +22,7 @@ export const SHARE = createRequestTypes('SHARE', [
export const USER = createRequestTypes('USER', ['SET']);
export const ROOMS = createRequestTypes('ROOMS', [
...defaultTypes,
'REFRESH',
'SET_SEARCH',
'CLOSE_SERVER_DROPDOWN',
'TOGGLE_SERVER_DROPDOWN',

View File

@ -1,9 +1,10 @@
import * as types from './actionsTypes';
export function roomsRequest() {
export function roomsRequest(params = { allData: false }) {
return {
type: types.ROOMS.REQUEST
type: types.ROOMS.REQUEST,
params
};
}
@ -20,6 +21,12 @@ export function roomsFailure(err) {
};
}
export function roomsRefresh() {
return {
type: types.ROOMS.REFRESH
};
}
export function setSearch(searchText) {
return {
type: types.ROOMS.SET_SEARCH,

View File

@ -2,6 +2,7 @@ import * as types from '../actions/actionsTypes';
const initialState = {
isFetching: false,
refreshing: false,
failure: false,
errorMessage: {},
searchText: '',
@ -23,15 +24,23 @@ export default function login(state = initialState, action) {
case types.ROOMS.SUCCESS:
return {
...state,
isFetching: false
isFetching: false,
refreshing: false
};
case types.ROOMS.FAILURE:
return {
...state,
isFetching: false,
refreshing: false,
failure: true,
errorMessage: action.err
};
case types.ROOMS.REFRESH:
return {
...state,
isFetching: true,
refreshing: true
};
case types.ROOMS.SET_SEARCH:
return {
...state,

View File

@ -6,7 +6,7 @@ import { Q } from '@nozbe/watermelondb';
import { sanitizedRaw } from '@nozbe/watermelondb/RawRecord';
import * as types from '../actions/actionsTypes';
import { roomsSuccess, roomsFailure } from '../actions/rooms';
import { roomsSuccess, roomsFailure, roomsRefresh } from '../actions/rooms';
import database from '../lib/database';
import log from '../utils/log';
import mergeSubscriptionsRooms from '../lib/methods/helpers/mergeSubscriptionsRooms';
@ -26,15 +26,20 @@ const updateRooms = function* updateRooms({ server, newRoomsUpdatedAt }) {
});
};
const handleRoomsRequest = function* handleRoomsRequest() {
const handleRoomsRequest = function* handleRoomsRequest({ params }) {
try {
const serversDB = database.servers;
yield RocketChat.subscribeRooms();
RocketChat.subscribeRooms();
const newRoomsUpdatedAt = new Date();
let roomsUpdatedAt;
const server = yield select(state => state.server.server);
const serversCollection = serversDB.collections.get('servers');
const serverRecord = yield serversCollection.find(server);
const { roomsUpdatedAt } = serverRecord;
if (params.allData) {
yield put(roomsRefresh());
} else {
const serversCollection = serversDB.collections.get('servers');
const serverRecord = yield serversCollection.find(server);
({ roomsUpdatedAt } = serverRecord);
}
const [subscriptionsResult, roomsResult] = yield RocketChat.getRooms(roomsUpdatedAt);
const { subscriptions } = mergeSubscriptionsRooms(subscriptionsResult, roomsResult);

View File

@ -1,5 +1,5 @@
import React from 'react';
import { FlatList, InteractionManager } from 'react-native';
import { FlatList, InteractionManager, RefreshControl } from 'react-native';
import PropTypes from 'prop-types';
import orderBy from 'lodash/orderBy';
import { Q } from '@nozbe/watermelondb';
@ -15,6 +15,7 @@ import { isIOS } from '../../utils/deviceInfo';
import { animateNextTransition } from '../../utils/layoutAnimation';
import ActivityIndicator from '../../containers/ActivityIndicator';
import debounce from '../../utils/debounce';
import { themes } from '../../constants/colors';
class List extends React.Component {
static propTypes = {
@ -237,8 +238,13 @@ class List extends React.Component {
maxToRenderPerBatch={5}
windowSize={10}
ListFooterComponent={this.renderFooter}
onRefresh={this.onRefresh}
refreshing={refreshing}
refreshControl={(
<RefreshControl
refreshing={refreshing}
onRefresh={this.onRefresh}
tintColor={themes[theme].auxiliaryText}
/>
)}
{...scrollPersistTaps}
/>
</>

View File

@ -6,7 +6,8 @@ import {
BackHandler,
Text,
Keyboard,
Dimensions
Dimensions,
RefreshControl
} from 'react-native';
import { connect } from 'react-redux';
import { isEqual, orderBy } from 'lodash';
@ -87,7 +88,8 @@ const shouldUpdateProps = [
'StoreLastMessage',
'appState',
'theme',
'split'
'split',
'refreshing'
];
const getItemLayout = (data, index) => ({
length: ROW_HEIGHT,
@ -163,6 +165,7 @@ class RoomsListView extends React.Component {
groupByType: PropTypes.bool,
showFavorites: PropTypes.bool,
showUnread: PropTypes.bool,
refreshing: PropTypes.bool,
StoreLastMessage: PropTypes.bool,
appState: PropTypes.string,
theme: PropTypes.string,
@ -672,6 +675,11 @@ class RoomsListView extends React.Component {
}
};
onRefresh = () => {
const { roomsRequest } = this.props;
roomsRequest({ allData: true });
}
getScrollRef = ref => (this.scroll = ref);
renderListHeader = () => {
@ -757,8 +765,10 @@ class RoomsListView extends React.Component {
}
renderScroll = () => {
const { loading, chats, search } = this.state;
const { theme } = this.props;
const {
loading, chats, search
} = this.state;
const { theme, refreshing } = this.props;
if (loading) {
return <ActivityIndicator theme={theme} />;
@ -778,6 +788,13 @@ class RoomsListView extends React.Component {
removeClippedSubviews={isIOS}
keyboardShouldPersistTaps='always'
initialNumToRender={INITIAL_NUM_TO_RENDER}
refreshControl={(
<RefreshControl
refreshing={refreshing}
onRefresh={this.onRefresh}
tintColor={themes[theme].auxiliaryText}
/>
)}
windowSize={9}
/>
);
@ -825,6 +842,7 @@ const mapStateToProps = state => ({
loadingServer: state.server.loading,
showServerDropdown: state.rooms.showServerDropdown,
showSortDropdown: state.rooms.showSortDropdown,
refreshing: state.rooms.refreshing,
sortBy: state.sortPreferences.sortBy,
groupByType: state.sortPreferences.groupByType,
showFavorites: state.sortPreferences.showFavorites,
@ -839,7 +857,7 @@ const mapDispatchToProps = dispatch => ({
openSearchHeader: () => dispatch(openSearchHeaderAction()),
closeSearchHeader: () => dispatch(closeSearchHeaderAction()),
appStart: () => dispatch(appStartAction()),
roomsRequest: () => dispatch(roomsRequestAction()),
roomsRequest: params => dispatch(roomsRequestAction(params)),
selectServerRequest: server => dispatch(selectServerRequestAction(server)),
closeServerDropdown: () => dispatch(closeServerDropdownAction())
});