210 lines
5.4 KiB
TypeScript
210 lines
5.4 KiB
TypeScript
import { queryGpsData } from "@/controller/DeviceController";
|
|
import {
|
|
queryStartNewHaul,
|
|
queryUpdateTripState,
|
|
} from "@/controller/TripController";
|
|
import {
|
|
showErrorToast,
|
|
showSuccessToast,
|
|
showWarningToast,
|
|
} from "@/services/toast_service";
|
|
import { useTrip } from "@/state/use-trip";
|
|
import { AntDesign } from "@expo/vector-icons";
|
|
import React, { useEffect, useState } from "react";
|
|
import { Alert, StyleSheet, View } from "react-native";
|
|
import IconButton from "./IconButton";
|
|
import CreateOrUpdateHaulModal from "./tripInfo/modal/CreateOrUpdateHaulModal";
|
|
|
|
interface StartButtonProps {
|
|
gpsData?: Model.GPSResponse;
|
|
onPress?: () => void;
|
|
}
|
|
|
|
const ButtonCreateNewHaulOrTrip: React.FC<StartButtonProps> = ({
|
|
gpsData,
|
|
onPress,
|
|
}) => {
|
|
const [isStarted, setIsStarted] = useState(false);
|
|
const [isFinishHaulModalOpen, setIsFinishHaulModalOpen] = useState(false);
|
|
|
|
const { trip, getTrip } = useTrip();
|
|
useEffect(() => {
|
|
getTrip();
|
|
}, [trip === null]);
|
|
|
|
const checkHaulFinished = () => {
|
|
return trip?.fishing_logs?.some((h) => h.status === 0);
|
|
};
|
|
|
|
const handlePress = () => {
|
|
if (isStarted) {
|
|
Alert.alert(
|
|
"Kết thúc mẻ lưới",
|
|
"Bạn có chắc chắn muốn kết thúc mẻ lưới này?",
|
|
[
|
|
{
|
|
text: "Hủy",
|
|
style: "cancel",
|
|
},
|
|
{
|
|
text: "Kết thúc",
|
|
onPress: () => {
|
|
setIsStarted(false);
|
|
Alert.alert("Thành công", "Đã kết thúc mẻ lưới!");
|
|
},
|
|
},
|
|
]
|
|
);
|
|
} else {
|
|
Alert.alert("Bắt đầu mẻ lưới", "Bạn có muốn bắt đầu mẻ lưới mới?", [
|
|
{
|
|
text: "Hủy",
|
|
style: "cancel",
|
|
},
|
|
{
|
|
text: "Bắt đầu",
|
|
onPress: () => {
|
|
setIsStarted(true);
|
|
Alert.alert("Thành công", "Đã bắt đầu mẻ lưới mới!");
|
|
},
|
|
},
|
|
]);
|
|
}
|
|
|
|
if (onPress) {
|
|
onPress();
|
|
}
|
|
};
|
|
|
|
const handleStartTrip = async (state: number, note?: string) => {
|
|
if (trip?.trip_status !== 2) {
|
|
showWarningToast("Chuyến đi đã được bắt đầu hoặc hoàn thành.");
|
|
return;
|
|
}
|
|
try {
|
|
const resp = await queryUpdateTripState({
|
|
status: state,
|
|
note: note || "",
|
|
});
|
|
if (resp.status === 200) {
|
|
showSuccessToast("Bắt đầu chuyến đi thành công!");
|
|
getTrip();
|
|
}
|
|
} catch (error) {
|
|
console.error("Error stating trip :", error);
|
|
showErrorToast("");
|
|
}
|
|
};
|
|
|
|
const createNewHaul = async () => {
|
|
if (trip?.fishing_logs?.some((f) => f.status === 0)) {
|
|
showWarningToast(
|
|
"Vui lòng kết thúc mẻ lưới hiện tại trước khi bắt đầu mẻ mới"
|
|
);
|
|
return;
|
|
}
|
|
if (!gpsData) {
|
|
const response = await queryGpsData();
|
|
gpsData = response.data;
|
|
}
|
|
try {
|
|
const body: Model.NewFishingLogRequest = {
|
|
trip_id: trip?.id || "",
|
|
start_at: new Date(),
|
|
start_lat: gpsData.lat,
|
|
start_lon: gpsData.lon,
|
|
weather_description: "Nắng đẹp",
|
|
};
|
|
|
|
const resp = await queryStartNewHaul(body);
|
|
if (resp.status === 200) {
|
|
showSuccessToast("Bắt đầu mẻ lưới mới thành công!");
|
|
getTrip();
|
|
} else {
|
|
showErrorToast("Tạo mẻ lưới mới thất bại!");
|
|
}
|
|
} catch (error) {
|
|
console.log(error);
|
|
// showErrorToast("Tạo mẻ lưới mới thất bại!");
|
|
}
|
|
};
|
|
|
|
// Không render gì nếu trip đã hoàn thành hoặc bị hủy
|
|
if (trip?.trip_status === 4 || trip?.trip_status === 5) {
|
|
return null;
|
|
}
|
|
|
|
return (
|
|
<View>
|
|
{trip?.trip_status === 2 ? (
|
|
<IconButton
|
|
icon={<AntDesign name="plus" />}
|
|
type="primary"
|
|
style={{ backgroundColor: "green", borderRadius: 10 }}
|
|
onPress={async () => handleStartTrip(3)}
|
|
>
|
|
Bắt đầu chuyến đi
|
|
</IconButton>
|
|
) : checkHaulFinished() ? (
|
|
<IconButton
|
|
icon={<AntDesign name="plus" color={"white"} />}
|
|
type="primary"
|
|
style={{ borderRadius: 10 }}
|
|
onPress={() => setIsFinishHaulModalOpen(true)}
|
|
>
|
|
Kết thúc mẻ lưới
|
|
</IconButton>
|
|
) : (
|
|
<IconButton
|
|
icon={<AntDesign name="plus" color={"white"} />}
|
|
type="primary"
|
|
style={{ borderRadius: 10 }}
|
|
onPress={async () => {
|
|
createNewHaul();
|
|
}}
|
|
>
|
|
Bắt đầu mẻ lưới
|
|
</IconButton>
|
|
)}
|
|
<CreateOrUpdateHaulModal
|
|
isVisible={isFinishHaulModalOpen}
|
|
onClose={function (): void {
|
|
setIsFinishHaulModalOpen(false);
|
|
}}
|
|
/>
|
|
</View>
|
|
);
|
|
};
|
|
|
|
const styles = StyleSheet.create({
|
|
button: {
|
|
backgroundColor: "#4ecdc4", // màu ngọc lam
|
|
borderRadius: 8,
|
|
paddingVertical: 10,
|
|
paddingHorizontal: 16,
|
|
alignSelf: "flex-start",
|
|
shadowColor: "#000",
|
|
shadowOpacity: 0.15,
|
|
shadowRadius: 3,
|
|
shadowOffset: { width: 0, height: 2 },
|
|
elevation: 3, // hiệu ứng nổi trên Android
|
|
},
|
|
buttonActive: {
|
|
backgroundColor: "#e74c3c", // màu đỏ khi đang hoạt động
|
|
},
|
|
content: {
|
|
flexDirection: "row",
|
|
alignItems: "center",
|
|
},
|
|
icon: {
|
|
marginRight: 6,
|
|
},
|
|
text: {
|
|
color: "#fff",
|
|
fontSize: 16,
|
|
fontWeight: "600",
|
|
},
|
|
});
|
|
|
|
export default ButtonCreateNewHaulOrTrip;
|