easy-peasy icon indicating copy to clipboard operation
easy-peasy copied to clipboard

Using custom storage engine on React Native

Open ghost opened this issue 3 years ago • 13 comments

For some reason I cannot seem to be able to make my custom storage engine working on RN. What works in a clean CRA web project doesn't in a clean CRNA project.

I have created a new project by running expo init and choosing the Bare workflow with minimal settings. I've installed the easy-peasy package (4.0.1) and modified the App.js as such:

import React from "react";
import { Button, StyleSheet, View } from "react-native";
import {
  action,
  createStore,
  persist,
  StoreProvider,
  useStoreActions
} from "easy-peasy";

const store = createStore(
  persist(
    {
      count: 1,
      add: action(state => {
        state.count += 1;
        console.log("STATE CHANGE", state.count);
      })
    },
    {
      storage: {
        getItem: key => {
          console.log("GET_ITEM", key);
        },
        setItem: (key, value) => {
          console.log("SET_ITEM", key, value);
        },
        removeItem: key => {
          console.log("REMOVE_ITEM", key);
        }
      },
      allow: ["count"]
    }
  )
);

const MyButton = () => {
  const add = useStoreActions(actions => actions.add);
  return <Button title="Press" onPress={() => add()} />;
};

export default function App() {
  return (
    <StoreProvider store={store}>
      <View style={styles.container}>
        <MyButton title="Press" />
      </View>
    </StoreProvider>
  );
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    alignItems: "center",
    justifyContent: "center"
  }
});

As I launch the project in my iOS simulator, GET_ITEM [EasyPeasyStore][0] is logged. As I press the button, STATE CHANGE 2 is logged. However, SET_ITEM never gets logged.

As mentioned, the same code on a web project works fine and SET_ITEM... is logged.

Any ideas?

ghost avatar Nov 10 '20 13:11 ghost

Same issue after upgrading to v4.0.1, setItem() of custom storage isn't called when changing persisted state on RN 0.63.3.

yixuan98 avatar Nov 10 '20 16:11 yixuan98

I can confirm the same and also AsyncStorage doesn't seem to work. On v4.1.0-beta.4 also not working with RN 0.63.3.

luziczek avatar Nov 11 '20 17:11 luziczek

Same here with Easy Peasy 4.0.1

Thram avatar Nov 23 '20 03:11 Thram

Same. Just tried to switch over to easy-peasy's persist. It seems so much easier but kept running into issues before finding this thread. Should have searched first!

GollyJer avatar Jan 14 '21 06:01 GollyJer

Does anyone know why setItem isn't being called? I'm trying to create a local patch but looking at the code I don't quite understand what's causing it to not be called.

GollyJer avatar Jan 14 '21 18:01 GollyJer

Hey all;

Apologies for the lack of response on this. I've had to take some personal time.

I would appreciate it if someone could share a basic repo that I could use to test this. I have an upcoming version that I feel may address this issue.

💜

ctrlplusb avatar Jan 14 '21 20:01 ctrlplusb

removed useless post

GollyJer avatar Jan 14 '21 21:01 GollyJer

Hi @ctrlplusb I had to switch back to redux-persist for now.

This is an iOS issue. Here is a Snack reproduction. easy-peasy-persist-bug

Run it with the Android emulator and SET_ITEM is logged. Run it with the iOS emulator and SET_ITEM is never logged.

GollyJer avatar Jan 16 '21 23:01 GollyJer

Thanks for posting @GollyJer 🙏

ctrlplusb avatar Jan 17 '21 07:01 ctrlplusb

This is caused by an issue of RN 0.62.2, so requestIdleCallback is never called on iOS.

Before it is fixed, you can add this line before your createStore(), so easy-peasy will use requestAnimationFrame instead of requestIdleCallback

window.requestIdleCallback = null;

duygiangdg avatar Feb 18 '21 10:02 duygiangdg

Thanks for the info @duygiangdg!

You can see your workaround in affect by running the iOS simulator here. easy-peasy-persist-bug-workaround

👍

GollyJer avatar Feb 18 '21 19:02 GollyJer

It solved the issue for me! Thanks :)

luziczek avatar Feb 19 '21 08:02 luziczek

any update on this issue ?

6thpath avatar Jul 19 '21 04:07 6thpath

Hi @ctrlplusb I had to switch back to redux-persist for now.

This is an iOS issue. Here is a Snack reproduction. easy-peasy-persist-bug

Run it with the Android emulator and SET_ITEM is logged. Run it with the iOS emulator and SET_ITEM is never logged.

Thanks for the reproduction Snack, @GollyJer! As I don't have a mac to test on, this really helped troubleshooting the issue. This should now be fixed in 6.0.1. Sorry it's taken a while!

jmyrland avatar Jun 14 '23 15:06 jmyrland

I mean, what's 2 years amongst friends. 😛 Thanks!!

GollyJer avatar Jun 16 '23 22:06 GollyJer