Git Product home page Git Product logo

Comments (8)

cwomack avatar cwomack commented on June 14, 2024 1

Updating this issue to be a bug and we are actively investigating this further. It looks like the root problem is with the UpdateEndpoint util in core where we are using a fallback value that changes what is set when calling an API like identifyUser().

We'll update this issue as we make progress.

from amplify-js.

cshfang avatar cshfang commented on June 14, 2024 1

Hi @nigelAt8Seats

Amplify JS v6.3.1 has just been released. It should contain the following fixes:
#13174
#13353

We believe these fixes should resolve your issue of the endpoint being overwritten by the device registration. Could you please help us by verifying if this is indeed the case by updating to the latest Amplify version? Thank you

from amplify-js.

cwomack avatar cwomack commented on June 14, 2024

Hey there, @nigelAt8Seats and thank you for opening this issue. To better understand what's happening here, do you have some frontend code you can share that details how/where you're calling identitfyUser()? And is this happening with every user within your app or just intermittently after you tried to remove Analytics?

from amplify-js.

nigelAt8Seats avatar nigelAt8Seats commented on June 14, 2024

Hiya,
I believe our code is the equivalent to that in the react-native documentation.


const CognitoUserProvider = ({ children }: { children: ReactNode }) => {
  const [cognitoUser, setCognitoUser] = useState<AuthUser | undefined>();
  const { showNoConnection } = useShowNoConnection(cognitoUser);

  const { deviceToken } = useContext(DeviceTokenContext);

  const checkForLoggedInUser = useCallback(async () => {
    const user = await getCurrentUser().catch(() => null);
    logger.debug('>>>>>>>>> user::', user);
    if (user) {
      setCognitoUser(user);
      logger.debug('bootstrapping user session successful.');
    } else {
      setCognitoUser(undefined);
    }
  }, [setCognitoUser]);

  useEffect(() => {
    if (cognitoUser) {
      const identifyUserInput: IdentifyUserInput = {
        // E.g. user-id
        options: {
          address: deviceToken,
          optOut: 'NONE', // Either ALL or NONE
        },
        userId: cognitoUser.userId,
        userProfile: {},
      };

      identifyUser(identifyUserInput);
      postHogTrack('New Device Token Received', {
        user: cognitoUser?.userId ?? '',
        token: deviceToken ?? '',
      });
      logger.debug('identifying user successful');
    }
  }, [cognitoUser, deviceToken]);

  useEffect(() => {
    checkForLoggedInUser()
      .catch((err: any) => {
        logger.warn('warn::checkForLoggedInUser::', err);
        setCognitoUser(undefined);
      })
      .finally(() => {
        BootSplash.hide({ fade: true });
      });
  }, [checkForLoggedInUser]);

  return (
    <CognitoUserContext.Provider
      value={{
        checkForLoggedInUser,
        cognitoUser,
        setCognitoUser,
      }}>
      {showNoConnection ? <NoConnection /> : children}
    </CognitoUserContext.Provider>
  );
};

export default CognitoUserProvider;

We have a cognito user provider.

export const DeviceTokenContext = createContext<{
  deviceToken?: string;
}>({
  deviceToken: undefined,
});

export const DeviceTokenProvider = ({ children }: { children: ReactNode }) => {
  const [deviceToken, setDeviceToken] = useState<string | undefined>();

  useEffect(() => {
    const tokenListener = onTokenReceived(async token => {
      logger.debug('deviceTokenProvider:: token received:', token);

      setDeviceToken(token);
    });

    return () => {
      tokenListener.remove();
    };
  }, [setDeviceToken]);

  return (
    <DeviceTokenContext.Provider value={{ deviceToken }}>
      {children}
    </DeviceTokenContext.Provider>
  );
};
#also

  const initSignIn = async () => {
    const user = await getCurrentUser();
    logger.debug('user', user);

    const localUserId = await AsyncStorage.getItem('8seats::userId');
    if (localUserId !== user.userId) {
      await DataStore.clear();
      await AsyncStorage.setItem('8seats::userId', user.userId);
    }

    const identifyUserInput: IdentifyUserInput = {
      // E.g. user-id
      options: {
        optOut: 'NONE', // Either ALL or NONE
      },
      userId: user.userId,
      userProfile: {},
    };

    await identifyUser(identifyUserInput);
    return user;
  };

The problem has existed for months... Turning off Analytics has made it less frequent; but still possible.

from amplify-js.

nigelAt8Seats avatar nigelAt8Seats commented on June 14, 2024

Disabling analytics

disable(); // analytics

Amplify.configure(amplifyconfig); # << I took all the analytics stuff out of the config too. 

configureAutoTrack({
  enable: false,
  type: 'session', # << react native so autotracking is only for session 
});

initializePushNotifications();

// also called when the process is Terminated
onNotificationReceivedInBackground(
  NotificationsService.onNotificationReceivedInBackgroundOrTerminatedHandler,
);

from amplify-js.

cwomack avatar cwomack commented on June 14, 2024

@nigelAt8Seats, appreciate the sample code. Just to confirm, is this all areas where identifyUser() is called?

from amplify-js.

nigelAt8Seats avatar nigelAt8Seats commented on June 14, 2024

We moved to using firebase cloud messaging instead of pinpoint to avoid the issue entirely.

from amplify-js.

cwomack avatar cwomack commented on June 14, 2024

@nigelAt8Seats, we appreciate the follow up comment and will close the issue as resolved at this point. Feel free to let us know if you're able to validate fixes and come back to Analytics/Pinpoint at any time!

from amplify-js.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.