feat: add OAuth redirect handling and update Google OAuth integration

This commit is contained in:
2026-03-19 21:19:49 -03:00
parent 34cbd4a861
commit 39f024f98d
5 changed files with 31 additions and 23 deletions
+16 -17
View File
@@ -2,16 +2,15 @@
* Plugin local: injeta o intent filter do Google OAuth no AndroidManifest.xml
* durante o `expo prebuild`.
*
* Sem esse intent filter, o Android não sabe que o MeowSpool deve interceptar
* o redirect do Google OAuth (scheme com.googleusercontent.apps.*), fazendo o
* Chrome tratar a URL como pesquisa.
*
* O scheme é o reverse do Android OAuth 2.0 client ID registrado no Google Cloud Console.
* expo-auth-session v5+ usa ${Application.applicationId}:/oauthredirect como
* redirect URI nativo (ex: com.meowspool.app:/oauthredirect).
* Sem esse intent filter, o Android não intercepta o redirect e o Chrome
* trata a URL como pesquisa, redirecionando para o google.com.
*/
const { withAndroidManifest } = require('@expo/config-plugins');
const { withAndroidManifest } = require("@expo/config-plugins");
const GOOGLE_REVERSE_CLIENT_ID =
'com.googleusercontent.apps.724520558909-bg5a7e4u24jmis8lgg41ucs0kv0nfp1v';
// Scheme gerado por expo-auth-session v7: applicationId do app
const APP_SCHEME = "com.meowspool.app";
module.exports = function withGoogleOAuth(config) {
return withAndroidManifest(config, (config) => {
@@ -19,29 +18,29 @@ module.exports = function withGoogleOAuth(config) {
const activities = manifest.manifest.application?.[0]?.activity ?? [];
const mainActivity = activities.find(
(a) => a.$?.['android:name'] === '.MainActivity',
(a) => a.$?.["android:name"] === ".MainActivity",
);
if (!mainActivity) return config;
// Evita duplicar o intent filter em rebuilds consecutivos
const alreadyAdded = (mainActivity['intent-filter'] ?? []).some((filter) =>
const alreadyAdded = (mainActivity["intent-filter"] ?? []).some((filter) =>
(filter.data ?? []).some(
(d) => d.$?.['android:scheme'] === GOOGLE_REVERSE_CLIENT_ID,
(d) => d.$?.["android:scheme"] === APP_SCHEME,
),
);
if (alreadyAdded) return config;
mainActivity['intent-filter'] = [
...(mainActivity['intent-filter'] ?? []),
mainActivity["intent-filter"] = [
...(mainActivity["intent-filter"] ?? []),
{
action: [{ $: { 'android:name': 'android.intent.action.VIEW' } }],
action: [{ $: { "android:name": "android.intent.action.VIEW" } }],
category: [
{ $: { 'android:name': 'android.intent.category.DEFAULT' } },
{ $: { 'android:name': 'android.intent.category.BROWSABLE' } },
{ $: { "android:name": "android.intent.category.DEFAULT" } },
{ $: { "android:name": "android.intent.category.BROWSABLE" } },
],
data: [{ $: { 'android:scheme': GOOGLE_REVERSE_CLIENT_ID } }],
data: [{ $: { "android:scheme": APP_SCHEME } }],
},
];