eletrotupi / tcc/ frontend/components/ui/DatePickerField.tsx19a4d910605b887720e8df1e86ba782bbbaba23f
2.4 KB | 102 lines Raw
1
import { useState, useEffect } from "react";
2
import { View, Pressable, StyleSheet } from "react-native";
3
import { Text } from "@/components/ui/Text";
4
import DateTimePicker, {
5
  DateTimePickerEvent,
6
} from "@react-native-community/datetimepicker";
7
import { format } from "date-fns";
8
import { MaterialIcons } from "@expo/vector-icons";
9
import { Colors } from "@/constants/theme";
10
import { Label } from "@/components/ui/Input";
11

12
interface DatePickerProps {
13
  label: string;
14
  initialDate?: Date;
15
  onChange: (date: Date) => void;
16
  minimumDate?: Date;
17
  maximumDate?: Date;
18
}
19

20
export const DatePickerField: React.FC<DatePickerProps> = ({
21
  label,
22
  initialDate = new Date(),
23
  onChange,
24
  minimumDate,
25
  maximumDate,
26
}) => {
27
  const [date, setDate] = useState(initialDate);
28
  const [show, setShow] = useState(false);
29

30
  useEffect(() => {
31
    setDate(initialDate);
32
  }, [initialDate]);
33

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

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

39
    if (selectedDate) {
40
      setDate(selectedDate);
41
      if (onChange) onChange(selectedDate);
42
    }
43
  };
44

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

47
  return (
48
    <View>
49
      <Label text={label} />
50

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

59
      {show && (
60
        <DateTimePicker
61
          value={date}
62
          mode="date"
63
          display={"default"}
64
          onChange={handleChange}
65
          minimumDate={minimumDate}
66
          maximumDate={maximumDate}
67
        />
68
      )}
69
    </View>
70
  );
71
};
72

73
const styles = StyleSheet.create({
74
  label: {
75
    fontWeight: "500",
76
    color: Colors.light.textSecondary,
77
    fontSize: 12,
78
    marginBottom: 8,
79
    letterSpacing: 0.5,
80
    textTransform: "uppercase",
81
  },
82
  container: {
83
    flexDirection: "row",
84
    alignItems: "center",
85
    justifyContent: "space-between",
86
    backgroundColor: "#F3F4F6", // light gray pill
87
    paddingVertical: 14,
88
    paddingHorizontal: 16,
89
    borderRadius: 10,
90
    borderWidth: 0.5,
91
    borderColor: "#E5E7EB",
92
    minWidth: 220,
93
  },
94
  pressed: {
95
    opacity: 0.8,
96
  },
97
  dateText: {
98
    color: "#111827",
99
    fontSize: 16,
100
    fontWeight: "600",
101
  },
102
});