From 499bd76f5e0104bc1686be452860d593eb67e87b Mon Sep 17 00:00:00 2001 From: MinhNN Date: Tue, 30 Dec 2025 14:52:46 +0700 Subject: [PATCH] =?UTF-8?q?C=E1=BA=ADp=20nh=E1=BA=ADt=20th=E1=BB=A9=20t?= =?UTF-8?q?=E1=BB=B1=20c=E1=BA=A3nh=20b=C3=A1o=20trong=20tab=20c=E1=BA=A3n?= =?UTF-8?q?h=20b=C3=A1o,=20s=E1=BB=ADa=20l=E1=BA=A1i=20reload=20danh=20s?= =?UTF-8?q?=C3=A1ch=20chuy=E1=BA=BFn=20=C4=91i=20(=20vu=E1=BB=91t=20l?= =?UTF-8?q?=C3=AAn=20)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/(tabs)/diary.tsx | 39 +++++++++------------------------------ app/(tabs)/warning.tsx | 10 +++++----- 2 files changed, 14 insertions(+), 35 deletions(-) diff --git a/app/(tabs)/diary.tsx b/app/(tabs)/diary.tsx index b11a74f..4abafe2 100644 --- a/app/(tabs)/diary.tsx +++ b/app/(tabs)/diary.tsx @@ -41,6 +41,7 @@ export default function diary() { const [allTrips, setAllTrips] = useState([]); const [isLoadingMore, setIsLoadingMore] = useState(false); const [hasMore, setHasMore] = useState(true); + const [refreshing, setRefreshing] = useState(false); const isInitialLoad = useRef(true); const flatListRef = useRef(null); @@ -330,8 +331,9 @@ export default function diary() { }, 100); }, [payloadTrips, getTripsList]); - // Handle reload - gọi lại API - const handleReload = useCallback(() => { + // Handle refresh - pull-to-refresh + const handleRefresh = useCallback(() => { + setRefreshing(true); isInitialLoad.current = true; setAllTrips([]); setHasMore(true); @@ -340,12 +342,9 @@ export default function diary() { offset: 0, }; setPayloadTrips(resetPayload); - getTripsList(resetPayload); - - // Scroll FlatList lên đầu - setTimeout(() => { - flatListRef.current?.scrollToOffset({ offset: 0, animated: true }); - }, 100); + getTripsList(resetPayload).finally(() => { + setRefreshing(false); + }); }, [payloadTrips, getTripsList]); // Dynamic styles based on theme @@ -436,21 +435,6 @@ export default function diary() { {t("diary.title")} - - {loading && allTrips.length === 0 ? ( - - ) : ( - - )} - {/* Filter & Add Button Row */} @@ -489,6 +473,8 @@ export default function diary() { showsVerticalScrollIndicator={false} onEndReached={handleLoadMore} onEndReachedThreshold={0.5} + refreshing={refreshing} + onRefresh={handleRefresh} ListFooterComponent={renderFooter} ListEmptyComponent={renderEmpty} removeClippedSubviews={true} @@ -544,13 +530,6 @@ const styles = StyleSheet.create({ alignItems: "center", marginBottom: 10, }, - reloadButton: { - width: 36, - height: 36, - borderRadius: 18, - justifyContent: "center", - alignItems: "center", - }, actionRow: { flexDirection: "row", justifyContent: "space-between", diff --git a/app/(tabs)/warning.tsx b/app/(tabs)/warning.tsx index 592fb2c..2bc0985 100644 --- a/app/(tabs)/warning.tsx +++ b/app/(tabs)/warning.tsx @@ -85,11 +85,11 @@ const WarningScreen = () => { const slice = resp.data?.alarms ?? []; // Sort alarms by level descending (higher level first: SOS > Danger > Warning > Info) - const sortedSlice = [...slice].sort( - (a, b) => (b.level ?? 0) - (a.level ?? 0) - ); - - setAlarms((prev) => (append ? [...prev, ...sortedSlice] : sortedSlice)); + // When appending, we need to sort the entire combined list, not just the new slice + setAlarms((prev) => { + const combined = append ? [...prev, ...slice] : slice; + return combined.sort((a, b) => (b.level ?? 0) - (a.level ?? 0)); + }); setOffset(nextOffset); setHasMore(nextOffset + PAGE_SIZE < resp.data?.total!); } catch (error) {