import React, { useState } from "react"; import { View, Text, TextInput, ScrollView, TouchableOpacity, Modal, StyleSheet, } from "react-native"; import Checkbox from "expo-checkbox"; import { issueConfig } from "@/constants/config"; import CloseIcon from "@/assets/icons/close.svg"; interface IssueSelectorModalProps { visible: boolean; onClose: () => void; onSelect: (selectedValues: string[]) => void; initialSelectedValues?: string[]; // Previously saved selections } export default function IssueSelectorModal({ visible, onClose, onSelect, initialSelectedValues = [], }: IssueSelectorModalProps) { const [selectedValues, setSelectedValues] = useState( initialSelectedValues ); const [search, setSearch] = useState(""); const toggleValue = (value: string) => { setSelectedValues((prev) => prev.includes(value) ? prev.filter((v) => v !== value) : [...prev, value] ); }; const filteredConfig = issueConfig .map((group) => ({ ...group, options: group.options.filter((option) => option.label.toLowerCase().includes(search.toLowerCase()) ), })) .filter((group) => group.options.length > 0); const clearSelection = () => setSelectedValues([]); const hasSelection = selectedValues.length > 0; const handleSelect = () => { if (hasSelection) { onSelect(selectedValues); onClose(); } }; const handleClose = () => { // Reset to initial values when closing without saving setSelectedValues(initialSelectedValues); setSearch(""); // Also clear search onClose(); }; // Reset selectedValues when modal becomes visible with new initial values React.useEffect(() => { if (visible) { setSelectedValues(initialSelectedValues); setSearch(""); } }, [visible, initialSelectedValues]); return ( {/* Header */} Select Issue {`${selectedValues.length}/23 Selected`} Clear {filteredConfig.map((group) => ( {group.category} {group.options.map((option) => ( toggleValue(option.value)} > toggleValue(option.value)} color={ selectedValues.includes(option.value) ? "#252A34" : undefined } /> {option.label} ))} ))} Cancel Select ); } const styles = StyleSheet.create({ buttonsContainer: { flexDirection: "row", justifyContent: "space-between", alignItems: "center", paddingHorizontal: 16, paddingVertical: 20, backgroundColor: "#FCFCFC", height: 80, borderTopWidth: 1, borderTopColor: "#E5E9F0", }, headerBar: { flexDirection: "row", justifyContent: "space-between", alignItems: "center", paddingHorizontal: 16, paddingVertical: 12, backgroundColor: "#F9F9F9", }, cancelButton: { flex: 1, height: 40, borderWidth: 1, borderColor: "#D8DDE7", backgroundColor: "#F3F5F8", borderRadius: 4, justifyContent: "center", alignItems: "center", marginRight: 8, }, doneButton: { flex: 1, height: 40, borderRadius: 4, justifyContent: "center", alignItems: "center", backgroundColor: "#00875F", // primary green marginLeft: 8, }, doneButtonDisabled: { backgroundColor: "#E5E9F0", // disabled gray background }, doneText: { fontSize: 14, fontWeight: "600", color: "#FFFFFF", }, doneTextDisabled: { color: "#ADB4BD", // disabled gray text }, cancelText: { fontSize: 14, fontWeight: "600", color: "#252A34", }, clearText: { fontSize: 14, color: "#ADB4BD", }, clearTextDisabled: { color: "#D8DDE7", // more muted when disabled }, container: { flex: 1, backgroundColor: "#fff" }, header: { paddingHorizontal: 16, paddingVertical: 12, backgroundColor: "#FCFCFC", }, searchBar: { backgroundColor: "#fff", borderColor: "#D8DDE6", borderWidth: 1, borderRadius: 4, paddingHorizontal: 12, height: 36, fontSize: 14, color: "#252A34", }, counterBar: { flexDirection: "row", justifyContent: "space-between", paddingHorizontal: 20, paddingVertical: 12, backgroundColor: "#FCFCFC", }, divider: { height: 1, backgroundColor: "#E5E9F0", }, counterText: { fontSize: 14, color: "#555", fontWeight: "600", }, scrollArea: { paddingHorizontal: 0, backgroundColor: "#FCFCFC" }, category: { fontSize: 14, color: "#252A34", paddingVertical: 12, paddingHorizontal: 16, backgroundColor: "#F9F9F9", }, itemRow: { flexDirection: "row", alignItems: "center", paddingVertical: 8, paddingHorizontal: 16, backgroundColor: "#FCFCFC", }, itemLabel: { marginLeft: 12, fontSize: 12, color: "#252A34", }, });