Elevate / routes / app / context / storage / tasks / taskContext.js
taskContext.js
Raw
import React, { createContext, useReducer, useEffect } from "react";
import { TaskReducer } from "./taskReducer";
import { v4 as uuidv4 } from "uuid";
import AsyncStorage from "@react-native-async-storage/async-storage";

const getExistingTasks = async () => {
  try {
    const tasks = await AsyncStorage.getItem("tasks");
    console.log(tasks, "Obtained existing classes from AsyncStorage!");
    return tasks ? JSON.parse(tasks) : [];
  } catch (e) {
    console.log("Failed to fetch task data from AsyncStorage!");
    error.log(e);
  }
};

export const TaskContext = createContext();

export const TaskContextProvider = (props) => {
  const [contextTasks, dispatch] = useReducer(TaskReducer, []);

  useEffect(() => {
    async function fetchExistingTasks() {
      const existingTasks = await getExistingTasks();
      Object.keys(existingTasks).forEach((key) => {
        dispatch({
          type: "RELOAD_TASK",
          task: {
            id: existingTasks[key]["id"],
            taskName: existingTasks[key]["taskName"],
            taskSchedule: existingTasks[key]["taskSchedule"],
            taskPriority: existingTasks[key]["taskPriority"],
            taskDesc: existingTasks[key]["taskDesc"],
            taskTags: existingTasks[key]["taskTags"],
          },
        });
      });
    }
    fetchExistingTasks();
  }, []);

  useEffect(() => {
    if (contextTasks) {
      AsyncStorage.setItem("tasks", JSON.stringify(contextTasks));
    }
  }, [contextTasks]);

  return (
    <TaskContext.Provider value={{ contextTasks, dispatch }}>
      {props.children}
    </TaskContext.Provider>
  );
};