eletrotupi / tcc / frontend/components/ui/DatePickerField.tsx master
2.3 KB Raw
import { useState, useEffect } from "react";
import { View, Text, Pressable, StyleSheet } from "react-native";
import DateTimePicker, {
  DateTimePickerEvent,
} from "@react-native-community/datetimepicker";
import { format } from "date-fns";
import { MaterialIcons } from "@expo/vector-icons";
import { Colors } from "@/constants/theme";
import { Label } from "@/components/ui/Input";

interface DatePickerProps {
  label: string;
  initialDate?: Date;
  onChange: (date: Date) => void;
  minimumDate?: Date;
  maximumDate?: Date;
}

export const DatePickerField: React.FC<DatePickerProps> = ({
  label,
  initialDate = new Date(),
  onChange,
  minimumDate,
  maximumDate,
}) => {
  const [date, setDate] = useState(initialDate);
  const [show, setShow] = useState(false);

  useEffect(() => {
    setDate(initialDate);
  }, [initialDate]);

  const openPicker = () => setShow(true);

  const handleChange = (event: DateTimePickerEvent, selectedDate?: Date) => {
    setShow(false);

    if (selectedDate) {
      setDate(selectedDate);
      if (onChange) onChange(selectedDate);
    }
  };

  const formatted = format(date, "dd/MM/yyyy");

  return (
    <View>
      <Label text={label} />

      <Pressable
        onPress={openPicker}
        style={({ pressed }) => [styles.container, pressed && styles.pressed]}
      >
        <Text style={styles.dateText}>{formatted}</Text>
        <MaterialIcons name="calendar-month" size={22} color="#6B7280" />
      </Pressable>

      {show && (
        <DateTimePicker
          value={date}
          mode="date"
          display={"default"}
          onChange={handleChange}
          minimumDate={minimumDate}
          maximumDate={maximumDate}
        />
      )}
    </View>
  );
};

const styles = StyleSheet.create({
  label: {
    fontWeight: "500",
    color: Colors.light.textSecondary,
    fontSize: 12,
    marginBottom: 8,
    letterSpacing: 0.5,
    textTransform: "uppercase",
  },
  container: {
    flexDirection: "row",
    alignItems: "center",
    justifyContent: "space-between",
    backgroundColor: "#F3F4F6", // light gray pill
    paddingVertical: 14,
    paddingHorizontal: 16,
    borderRadius: 10,
    borderWidth: 0.5,
    borderColor: "#E5E7EB",
    minWidth: 220,
  },
  pressed: {
    opacity: 0.8,
  },
  dateText: {
    color: "#111827",
    fontSize: 16,
    fontWeight: "600",
  },
});