I’m trying to use Google AUTH using Clerk, When clicking on the button the Google sign in page successfully opens, and I can choose an account to sign in with, but on the redirect the createdSessionId
is an empty string and the user is null.
import { Colors } from "@/constants/Colors";
import { StyleSheet, TouchableOpacity } from "react-native";
import { Icon } from "../shared/icon";
import { OAuthStrategy } from "@clerk/types";
import { useOAuth } from "@clerk/clerk-expo";
import { useCallback } from "react";
import * as Linking from "expo-linking";
import Toast from "react-native-toast-message";
interface AuthBtnProps {
isOAuthLoading: boolean;
setIsOAuthLoading: React.Dispatch<React.SetStateAction<boolean>>;
buttonIcon: string;
strategy: OAuthStrategy;
}
export const AuthBtn: React.FC<AuthBtnProps> = ({
isOAuthLoading,
setIsOAuthLoading,
buttonIcon,
strategy,
}) => {
const { startOAuthFlow } = useOAuth({ strategy });
const handleOAuth = useCallback(async () => {
try {
setIsOAuthLoading(true);
const { createdSessionId, setActive } = await startOAuthFlow({
redirectUrl: Linking.createURL("/home"),
});
console.log({ createdSessionId });
if (createdSessionId) {
setActive!({ session: createdSessionId });
}
} catch (error: any) {
console.log(JSON.stringify(error, null, 2));
Toast.show({
type: "error",
text1: "Error",
text2: error.errors[0].message,
});
} finally {
setIsOAuthLoading(false);
}
}, [setIsOAuthLoading, startOAuthFlow]);
return (
<TouchableOpacity
activeOpacity={0.8}
style={[
styles.button,
isOAuthLoading && { backgroundColor: Colors.gray },
]}
disabled={isOAuthLoading}
onPress={handleOAuth}
>
<Icon name={buttonIcon} color={Colors.white} />
</TouchableOpacity>
);
};
const styles = StyleSheet.create({
button: {
flex: 1,
backgroundColor: Colors.black,
padding: 10,
borderRadius: 14,
flexDirection: "row",
justifyContent: "center",
alignItems: "center",
gap: 10,
},
});
I tried signing in with Discord and GitHub and they worked fine
import { StyleSheet, View } from "react-native";
import { useEffect, useState } from "react";
import * as WebBrowser from "expo-web-browser";
import { AuthBtn } from "./auth-btn";
export const useWarmUpBrowser = () => {
useEffect(() => {
void WebBrowser.warmUpAsync();
return () => {
void WebBrowser.coolDownAsync();
};
}, []);
};
WebBrowser.maybeCompleteAuthSession();
export const Social: React.FC = () => {
useWarmUpBrowser();
const [isOAuthLoading, setIsOAuthLoading] = useState(false);
return (
<View style={styles.container}>
<AuthBtn
strategy="oauth_google"
buttonIcon="google"
isOAuthLoading={isOAuthLoading}
setIsOAuthLoading={setIsOAuthLoading}
/>
<AuthBtn
strategy="oauth_discord"
buttonIcon="discord"
isOAuthLoading={isOAuthLoading}
setIsOAuthLoading={setIsOAuthLoading}
/>
<AuthBtn
strategy="oauth_github"
buttonIcon="github"
isOAuthLoading={isOAuthLoading}
setIsOAuthLoading={setIsOAuthLoading}
/>
</View>
);
};
const styles = StyleSheet.create({
container: {
flexDirection: "row",
gap: 10,
},
});