Untitled

 avatar
unknown
plain_text
22 days ago
5.9 kB
3
Indexable
import React, { useState, useEffect } from 'react';
import { View, Text, TextInput, Button, FlatList, StyleSheet, TouchableOpacity, Modal } from 'react-native';
import DateTimePicker from '@react-native-community/datetimepicker';
import { format, differenceInDays } from 'date-fns';

const TodoApp = () => {
  const [todos, setTodos] = useState([]);
  const [description, setDescription] = useState('');
  const [date, setDate] = useState(new Date());
  const [showDatePicker, setShowDatePicker] = useState(false);
  const [isModalVisible, setIsModalVisible] = useState(false);
  const [currentTodo, setCurrentTodo] = useState(null);

  useEffect(() => {
    const sortedTodos = [...todos].sort((a, b) => new Date(a.date) - new Date(b.date));
    setTodos(sortedTodos);
  }, [todos]);

  const addTodo = () => {
    if (description && date) {
      setTodos([...todos, { description, date, completed: false }]);
      setDescription('');
      setDate(new Date());
    }
  };

  const editTodo = (index) => {
    setCurrentTodo({ ...todos[index], index });
    setDescription(todos[index].description);
    setDate(new Date(todos[index].date));
    setIsModalVisible(true);
  };

  const saveTodo = () => {
    const updatedTodos = [...todos];
    updatedTodos[currentTodo.index] = { ...currentTodo, description, date };
    setTodos(updatedTodos);
    setIsModalVisible(false);
    setDescription('');
    setDate(new Date());
  };

  const toggleComplete = (index) => {
    const updatedTodos = [...todos];
    updatedTodos[index].completed = !updatedTodos[index].completed;
    setTodos(updatedTodos);
  };

  const renderItem = ({ item, index }) => {
    const daysLeft = differenceInDays(new Date(item.date), new Date());
    const isClose = daysLeft <= 3;

    return (
      <View style={[styles.todoItem, isClose && styles.closeDeadline, item.completed && styles.completed]}>
        <Text>{item.description}</Text>
        <Text>{format(new Date(item.date), 'yyyy-MM-dd')}</Text>
        <View style={styles.icons}>
          <TouchableOpacity onPress={() => editTodo(index)}>
            <Text style={styles.icon}>✏️</Text>
          </TouchableOpacity>
          <TouchableOpacity onPress={() => toggleComplete(index)}>
            <Text style={styles.icon}>{item.completed ? '✅' : '⬜'}</Text>
          </TouchableOpacity>
        </View>
      </View>
    );
  };

  return (
    <View style={styles.container}>
      <TextInput
        style={styles.input}
        placeholder="Description"
        value={description}
        onChangeText={setDescription}
      />
      <TouchableOpacity onPress={() => setShowDatePicker(true)}>
        <TextInput
          style={styles.input}
          placeholder="Select Date"
          value={format(date, 'yyyy-MM-dd')}
          editable={false}
        />
      </TouchableOpacity>
      {showDatePicker && (
        <DateTimePicker
          value={date}
          mode="date"
          display="default"
          onChange={(event, selectedDate) => {
            setShowDatePicker(false);
            if (selectedDate) {
              setDate(selectedDate);
            }
          }}
        />
      )}
      <TouchableOpacity style={styles.button} onPress={addTodo}>
        <Text style={styles.buttonText}>Add Todo</Text>
      </TouchableOpacity>
      <FlatList
        data={todos}
        renderItem={renderItem}
        keyExtractor={(item, index) => index.toString()}
        style={styles.todoList}
      />
      <Modal visible={isModalVisible} animationType="slide">
        <View style={styles.modalContent}>
          <TextInput
            style={styles.input}
            placeholder="Description"
            value={description}
            onChangeText={setDescription}
          />
          <TouchableOpacity onPress={() => setShowDatePicker(true)}>
            <TextInput
              style={styles.input}
              placeholder="Select Date"
              value={format(date, 'yyyy-MM-dd')}
              editable={false}
            />
          </TouchableOpacity>
          {showDatePicker && (
            <DateTimePicker
              value={date}
              mode="date"
              display="default"
              onChange={(event, selectedDate) => {
                setShowDatePicker(false);
                if (selectedDate) {
                  setDate(selectedDate);
                }
              }}
            />
          )}
          <TouchableOpacity style={styles.button} onPress={saveTodo}>
            <Text style={styles.buttonText}>Save</Text>
          </TouchableOpacity>
          <TouchableOpacity style={styles.button} onPress={() => setIsModalVisible(false)}>
            <Text style={styles.buttonText}>Cancel</Text>
          </TouchableOpacity>
        </View>
      </Modal>
    </View>
  );
};

const styles = StyleSheet.create({
  container: {
    flex: 1,
    padding: 20,
    backgroundColor: '#fff',
  },
  input: {
    height: 40,
    borderColor: 'gray',
    borderWidth: 1,
    marginBottom: 10,
    paddingHorizontal: 10,
    borderRadius: 10,
  },
  button: {
    backgroundColor: 'blue',
    padding: 10,
    borderRadius: 10,
    alignItems: 'center',
    marginVertical: 10,
  },
  buttonText: {
    color: '#fff',
    fontSize: 16,
  },
  todoList: {
    marginTop: 20,
  },
  todoItem: {
    padding: 15,
    marginVertical: 5,
    backgroundColor: '#fff',
    borderRadius: 10,
    borderWidth: 2,
    borderColor: 'blue',
    flexDirection: 'row',
    justifyContent: 'space-between',
    alignItems: 'center',
  },
  closeDeadline: {
    borderColor: 'red',
  },
  completed: {
    textDecorationLine: 'line-through',
  },
  icons: {
    flexDirection: 'row',
  },
  icon: {
    marginLeft: 10,
    fontSize: 18,
  },
  modalContent: {
    flex: 1,
    justifyContent: 'center',
    padding: 20,
  },
});

export default TodoApp;
Leave a Comment