Cập nhật thứ tự cảnh báo trong tab cảnh báo, sửa lại reload danh sách chuyến đi ( vuốt lên )
This commit is contained in:
@@ -41,6 +41,7 @@ export default function diary() {
|
|||||||
const [allTrips, setAllTrips] = useState<any[]>([]);
|
const [allTrips, setAllTrips] = useState<any[]>([]);
|
||||||
const [isLoadingMore, setIsLoadingMore] = useState(false);
|
const [isLoadingMore, setIsLoadingMore] = useState(false);
|
||||||
const [hasMore, setHasMore] = useState(true);
|
const [hasMore, setHasMore] = useState(true);
|
||||||
|
const [refreshing, setRefreshing] = useState(false);
|
||||||
const isInitialLoad = useRef(true);
|
const isInitialLoad = useRef(true);
|
||||||
const flatListRef = useRef<FlatList>(null);
|
const flatListRef = useRef<FlatList>(null);
|
||||||
|
|
||||||
@@ -330,8 +331,9 @@ export default function diary() {
|
|||||||
}, 100);
|
}, 100);
|
||||||
}, [payloadTrips, getTripsList]);
|
}, [payloadTrips, getTripsList]);
|
||||||
|
|
||||||
// Handle reload - gọi lại API
|
// Handle refresh - pull-to-refresh
|
||||||
const handleReload = useCallback(() => {
|
const handleRefresh = useCallback(() => {
|
||||||
|
setRefreshing(true);
|
||||||
isInitialLoad.current = true;
|
isInitialLoad.current = true;
|
||||||
setAllTrips([]);
|
setAllTrips([]);
|
||||||
setHasMore(true);
|
setHasMore(true);
|
||||||
@@ -340,12 +342,9 @@ export default function diary() {
|
|||||||
offset: 0,
|
offset: 0,
|
||||||
};
|
};
|
||||||
setPayloadTrips(resetPayload);
|
setPayloadTrips(resetPayload);
|
||||||
getTripsList(resetPayload);
|
getTripsList(resetPayload).finally(() => {
|
||||||
|
setRefreshing(false);
|
||||||
// Scroll FlatList lên đầu
|
});
|
||||||
setTimeout(() => {
|
|
||||||
flatListRef.current?.scrollToOffset({ offset: 0, animated: true });
|
|
||||||
}, 100);
|
|
||||||
}, [payloadTrips, getTripsList]);
|
}, [payloadTrips, getTripsList]);
|
||||||
|
|
||||||
// Dynamic styles based on theme
|
// Dynamic styles based on theme
|
||||||
@@ -436,21 +435,6 @@ export default function diary() {
|
|||||||
<Text style={[styles.titleText, themedStyles.titleText]}>
|
<Text style={[styles.titleText, themedStyles.titleText]}>
|
||||||
{t("diary.title")}
|
{t("diary.title")}
|
||||||
</Text>
|
</Text>
|
||||||
<TouchableOpacity
|
|
||||||
style={[
|
|
||||||
styles.reloadButton,
|
|
||||||
{ backgroundColor: colors.backgroundSecondary },
|
|
||||||
]}
|
|
||||||
onPress={handleReload}
|
|
||||||
activeOpacity={0.7}
|
|
||||||
disabled={loading}
|
|
||||||
>
|
|
||||||
{loading && allTrips.length === 0 ? (
|
|
||||||
<ActivityIndicator size="small" color={colors.primary} />
|
|
||||||
) : (
|
|
||||||
<Ionicons name="reload" size={20} color={colors.primary} />
|
|
||||||
)}
|
|
||||||
</TouchableOpacity>
|
|
||||||
</View>
|
</View>
|
||||||
|
|
||||||
{/* Filter & Add Button Row */}
|
{/* Filter & Add Button Row */}
|
||||||
@@ -489,6 +473,8 @@ export default function diary() {
|
|||||||
showsVerticalScrollIndicator={false}
|
showsVerticalScrollIndicator={false}
|
||||||
onEndReached={handleLoadMore}
|
onEndReached={handleLoadMore}
|
||||||
onEndReachedThreshold={0.5}
|
onEndReachedThreshold={0.5}
|
||||||
|
refreshing={refreshing}
|
||||||
|
onRefresh={handleRefresh}
|
||||||
ListFooterComponent={renderFooter}
|
ListFooterComponent={renderFooter}
|
||||||
ListEmptyComponent={renderEmpty}
|
ListEmptyComponent={renderEmpty}
|
||||||
removeClippedSubviews={true}
|
removeClippedSubviews={true}
|
||||||
@@ -544,13 +530,6 @@ const styles = StyleSheet.create({
|
|||||||
alignItems: "center",
|
alignItems: "center",
|
||||||
marginBottom: 10,
|
marginBottom: 10,
|
||||||
},
|
},
|
||||||
reloadButton: {
|
|
||||||
width: 36,
|
|
||||||
height: 36,
|
|
||||||
borderRadius: 18,
|
|
||||||
justifyContent: "center",
|
|
||||||
alignItems: "center",
|
|
||||||
},
|
|
||||||
actionRow: {
|
actionRow: {
|
||||||
flexDirection: "row",
|
flexDirection: "row",
|
||||||
justifyContent: "space-between",
|
justifyContent: "space-between",
|
||||||
|
|||||||
@@ -85,11 +85,11 @@ const WarningScreen = () => {
|
|||||||
const slice = resp.data?.alarms ?? [];
|
const slice = resp.data?.alarms ?? [];
|
||||||
|
|
||||||
// Sort alarms by level descending (higher level first: SOS > Danger > Warning > Info)
|
// Sort alarms by level descending (higher level first: SOS > Danger > Warning > Info)
|
||||||
const sortedSlice = [...slice].sort(
|
// When appending, we need to sort the entire combined list, not just the new slice
|
||||||
(a, b) => (b.level ?? 0) - (a.level ?? 0)
|
setAlarms((prev) => {
|
||||||
);
|
const combined = append ? [...prev, ...slice] : slice;
|
||||||
|
return combined.sort((a, b) => (b.level ?? 0) - (a.level ?? 0));
|
||||||
setAlarms((prev) => (append ? [...prev, ...sortedSlice] : sortedSlice));
|
});
|
||||||
setOffset(nextOffset);
|
setOffset(nextOffset);
|
||||||
setHasMore(nextOffset + PAGE_SIZE < resp.data?.total!);
|
setHasMore(nextOffset + PAGE_SIZE < resp.data?.total!);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
|||||||
Reference in New Issue
Block a user