import React, { useState } from "react"; import { View, Text, Modal, TouchableOpacity, StyleSheet, Platform, ScrollView, } from "react-native"; import { Ionicons } from "@expo/vector-icons"; import StatusDropdown from "./StatusDropdown"; import DateRangePicker from "./DateRangePicker"; import ShipDropdown from "./ShipDropdown"; import { TripStatus } from "./types"; import { useI18n } from "@/hooks/use-i18n"; // Map status number to string - now uses i18n export function useMapStatusNumberToString() { const { t } = useI18n(); return (status: TripStatus | null): string => { switch (status) { case 0: return t("diary.tripStatus.created"); case 1: return t("diary.tripStatus.pending"); case 2: return t("diary.tripStatus.approved"); case 3: return t("diary.tripStatus.departed"); case 4: return t("diary.tripStatus.completed"); case 5: return t("diary.tripStatus.cancelled"); default: return "-"; } }; } interface FilterModalProps { visible: boolean; onClose: () => void; onApply: (filters: FilterValues) => void; } export interface ShipOption { id: string; shipName: string; } export interface FilterValues { status: TripStatus | null; // number (0-5) hoặc null startDate: Date | null; endDate: Date | null; selectedShip: ShipOption | null; // Tàu được chọn } export default function FilterModal({ visible, onClose, onApply, }: FilterModalProps) { const { t } = useI18n(); const mapStatusNumberToString = useMapStatusNumberToString(); const [status, setStatus] = useState(null); const [startDate, setStartDate] = useState(null); const [endDate, setEndDate] = useState(null); const [selectedShip, setSelectedShip] = useState(null); const handleReset = () => { setStatus(null); setStartDate(null); setEndDate(null); setSelectedShip(null); }; const handleApply = () => { onApply({ status, startDate, endDate, selectedShip }); onClose(); }; const hasFilters = status !== null || startDate !== null || endDate !== null || selectedShip !== null; return ( e.stopPropagation()} > {/* Header */} {t("diary.filter")} {/* Content */} {/* Filter Results Preview */} {hasFilters && ( {t("diary.selectedFilters")} {status !== null && ( {t("diary.statusLabel")} {mapStatusNumberToString(status)} )} {startDate && ( {t("diary.fromLabel")} {startDate.toLocaleDateString("vi-VN")} )} {endDate && ( {t("diary.toLabel")} {endDate.toLocaleDateString("vi-VN")} )} {selectedShip && ( {t("diary.shipLabel")} {selectedShip.shipName} )} )} {/* Footer */} {t("diary.reset")} {t("diary.apply")} ); } const styles = StyleSheet.create({ overlay: { flex: 1, backgroundColor: "rgba(0, 0, 0, 0.5)", justifyContent: "flex-end", }, modalContainer: { backgroundColor: "#FFFFFF", borderTopLeftRadius: 24, borderTopRightRadius: 24, maxHeight: "80%", shadowColor: "#000", shadowOffset: { width: 0, height: -4, }, shadowOpacity: 0.1, shadowRadius: 12, elevation: 8, }, header: { flexDirection: "row", alignItems: "center", justifyContent: "space-between", paddingHorizontal: 20, paddingVertical: 16, borderBottomWidth: 1, borderBottomColor: "#F3F4F6", }, closeButton: { padding: 4, }, title: { fontSize: 18, fontWeight: "700", color: "#111827", fontFamily: Platform.select({ ios: "System", android: "Roboto", default: "System", }), }, placeholder: { width: 32, }, content: { padding: 20, }, previewContainer: { marginTop: 20, padding: 16, backgroundColor: "#F9FAFB", borderRadius: 12, }, previewTitle: { fontSize: 14, fontWeight: "600", color: "#6B7280", marginBottom: 12, fontFamily: Platform.select({ ios: "System", android: "Roboto", default: "System", }), }, filterTag: { backgroundColor: "#EFF6FF", paddingHorizontal: 12, paddingVertical: 6, borderRadius: 16, marginBottom: 8, alignSelf: "flex-start", }, filterTagText: { fontSize: 14, color: "#3B82F6", fontFamily: Platform.select({ ios: "System", android: "Roboto", default: "System", }), }, footer: { flexDirection: "row", gap: 12, padding: 20, borderTopWidth: 1, borderTopColor: "#F3F4F6", }, resetButton: { flex: 1, backgroundColor: "#F3F4F6", paddingVertical: 14, borderRadius: 12, alignItems: "center", }, resetButtonText: { fontSize: 16, fontWeight: "600", color: "#6B7280", fontFamily: Platform.select({ ios: "System", android: "Roboto", default: "System", }), }, applyButton: { flex: 1, backgroundColor: "#3B82F6", paddingVertical: 14, borderRadius: 12, alignItems: "center", }, applyButtonText: { fontSize: 16, fontWeight: "600", color: "#FFFFFF", fontFamily: Platform.select({ ios: "System", android: "Roboto", default: "System", }), }, });