Elevate / routes / app / context / storage / classes / classContext.js
classContext.js
Raw
import React, { createContext, useReducer, useEffect } from "react";
import { ClassReducer } from "./classReducer";
import { v4 as uuidv4 } from "uuid";
import AsyncStorage from "@react-native-async-storage/async-storage";

const getExistingClasses = async () => {
  try {
    const classes = await AsyncStorage.getItem("classes");
    console.log(classes);
    return classes ? JSON.parse(classes) : [];
  } catch (e) {
    console.log("Failed to fetch class data from storage");
  }
};
export const ClassContext = createContext();

export const ClassContextProvider = (props) => {
  const [contextClasses, dispatch] = useReducer(ClassReducer, []);

  // Loading initial state
  useEffect(() => {
    async function fetchExistingClasses() {
      const existingClasses = await getExistingClasses();
      Object.keys(existingClasses).forEach((key) => {
        dispatch({
          type: "RELOAD_CLASS",
          class: {
            id: existingClasses[key]["id"],
            className: existingClasses[key]["className"],
            classNum: existingClasses[key]["classNum"],
            roomNum: existingClasses[key]["roomNum"],
            college: existingClasses[key]["college"],
            addDatesArr: existingClasses[key]["classTimes"],
          },
        });
      });
    }
    fetchExistingClasses();
  }, []);

  //Add to AsyncStorage
  useEffect(() => {
    if (contextClasses) {
      AsyncStorage.setItem("classes", JSON.stringify(contextClasses));
    }
  }, [contextClasses]);

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

const loadClassesAsyncStorage = async () => {
  const existingClasses = await AsyncStorage.getItem("classes");
  let classes = await existingClasses;
  console.log(classes, "CLASSES FROM ASYNCSTORAGE");
};