/* eslint-disable no-console */
/* eslint-disable react/jsx-props-no-spreading */
/* eslint-disable no-underscore-dangle */
import React from "react";
import { Divider, List, Layout } from "@ui-kitten/components";
import { useFocusEffect } from "@react-navigation/native";
import { useModel } from "flooks";
import { initDataState, DataListReducer } from "../Redux/DataListRedux";
import EmptyComponent from "./EmptyComponent";
export default function ListComponent(props) {
const { clearLoading } = useModel("loadingModel");
const [state, dispatch] = React.useReducer(DataListReducer, initDataState);
const { page, size, loading, refreshing, dataList } = state;
const {
getInfo,
renderItem,
ListHeaderComponent,
style,
separatorStyle,
ListFooterComponent,
showEmpty,
emptyEvent,
showList,
extraData,
delId,
startState, // 父级调刷新
initialNumToRender,
saveList, // 保持状态
list$,
} = props;
function setList(newList) {
dispatch({
type: "setInfo",
payload: { list: newList, finish: true },
});
}
if (list$) {
list$.useSubscription(info => {
const list = [...dataList];
let newList = [];
newList = info.changeEvent(list, info.list, info.type, info.extra);
setList(newList);
});
}
function getList() {
if (getInfo != null) {
return getInfo(page, size).then(res => {
if (emptyEvent) {
if (res.numberOfElements === 0) {
emptyEvent(true);
} else {
emptyEvent(false);
}
}
dispatch({
type: "setInfo",
payload: { list: res.content, finish: res.last },
});
});
}
return Promise.reject();
}
React.useEffect(() => {
if (delId) {
const list = [...dataList];
const Index = list.findIndex(item => {
return item.id === delId;
});
if (Index !== -1) {
dispatch({
type: "remove",
payload: { index: Index },
});
}
}
}, [delId]);
// 刷新接口
function onRefresh() {
dispatch({ type: "startRefresh" });
getList()
.then(() => {
dispatch({ type: "refreshSuccess" });
})
.catch(e => {
dispatch({
type: "refreshError",
payload: { error: e.message },
});
})
.finally(() => {
clearLoading();
});
}
// 到页面底部加载更多
function gotEnd() {
dispatch({ type: "startPageMore" });
getList()
.then(() => {
dispatch({ type: "pageMoreSuccess" });
})
.catch(e => {
dispatch({
type: "pageMoreError",
payload: { error: e.message },
});
})
.finally(() => {
clearLoading();
});
}
useFocusEffect(
React.useCallback(() => {
if (saveList !== true) {
dispatch({
type: "clear",
});
}
if (startState !== false) {
onRefresh();
}
}, [])
);
React.useEffect(() => {
if (startState) {
onRefresh();
}
}, [startState]);
const changePorps = React.useMemo(() => {
let _props = { renderItem: () => };
if (showList !== false) {
_props = { renderItem };
if (extraData) {
_props = {
..._props,
extraData,
};
}
}
return _props;
}, [showList, extraData]);
const ListEmptyComponent = React.useMemo(() => {
if (showEmpty && !refreshing && !loading) {
return EmptyComponent;
}
return <>>;
}, [showEmpty, refreshing, loading]);
return (
}
onEndReachedThreshold={gotEnd}
ListFooterComponent={ListFooterComponent}
{...changePorps}
/>
);
}