signInWithApple method

Future<CuReSupabaseAuthResponse> signInWithApple([
  1. Map<String, dynamic>? userMetadata
])

Implementation

Future<CuReSupabaseAuthResponse> signInWithApple(
    [Map<String, dynamic>? userMetadata]) async {
  try {
    final supabase = Supabase.instance.client;
    final rawNonce = supabase.auth.generateRawNonce();
    final hashedNonce = sha256.convert(utf8.encode(rawNonce)).toString();

    final credential = await SignInWithApple.getAppleIDCredential(
      scopes: [
        AppleIDAuthorizationScopes.email,
        AppleIDAuthorizationScopes.fullName,
      ],
      nonce: hashedNonce,
    );

    final idToken = credential.identityToken;
    if (idToken == null) {
      // ignore: avoid_print
      print(
          '[Supabase CuRe Auth] Could not find ID Token from generated credential.');
      return CuReSupabaseAuthResponse(
        user: null,
        session: null,
        error: 'Could not find ID Token from generated credential.',
      );
    }

    final result = await supabase.auth.signInWithIdToken(
      provider: OAuthProvider.apple,
      idToken: idToken,
      nonce: rawNonce,
    );

    // Update user metadata if provided
    if (result.user != null && userMetadata != null) {
      await supabase.auth.updateUser(
        UserAttributes(
          data: userMetadata,
        ),
      );
    }

    return CuReSupabaseAuthResponse(
      user: result.user,
      session: result.session,
      error: null,
    );
  } catch (e) {
    // ignore: avoid_print
    print('[Supabase CuRe Auth] Exception during Apple sign in: $e');
    return CuReSupabaseAuthResponse(
      user: null,
      session: null,
      error: _getErrorMessage(e),
    );
  }
}