// Dynamic config layered over app.json. // // react-native-maps reads the Google Maps key from the *native* manifest // (AndroidManifest `com.google.android.geo.API_KEY`), not from the JS bundle, // so EXPO_PUBLIC_GOOGLE_API_KEY has to be injected here at build time. Without // it Android renders an empty grey tile area instead of a map. const googleMapsApiKey = process.env.EXPO_PUBLIC_GOOGLE_API_KEY; const LOCATION_PERMISSION = "Waseel uses your location to show nearby drivers and set your pickup point."; module.exports = ({ config }) => { if (!googleMapsApiKey) { const message = "EXPO_PUBLIC_GOOGLE_API_KEY is not set — the Android manifest will have no " + "Maps key and the map will render blank."; // `.env` is gitignored, so it is never uploaded to EAS. Unless the key is // also registered as an EAS environment variable the build silently // produces a keyless APK, and the blank map only shows up on the device. // Fail the build here rather than shipping that. if (process.env.EAS_BUILD) { throw new Error( `[app.config] ${message} Register it with \`eas env:create\` (or in the ` + "EAS dashboard) for this build profile.", ); } console.warn(`[app.config] ${message}`); } return { ...config, ios: { ...config.ios, // iOS uses Apple Maps via PROVIDER_DEFAULT, so this only matters if the // Map component is switched to PROVIDER_GOOGLE. config: { ...config.ios?.config, googleMapsApiKey }, infoPlist: { ...config.ios?.infoPlist, NSLocationWhenInUseUsageDescription: LOCATION_PERMISSION, }, }, android: { ...config.android, config: { ...config.android?.config, googleMaps: { apiKey: googleMapsApiKey }, }, // Location permissions come from the expo-location plugin below. }, plugins: [ ...(config.plugins ?? []), [ "expo-location", { locationAlwaysAndWhenInUsePermission: LOCATION_PERMISSION, locationWhenInUsePermission: LOCATION_PERMISSION, }, ], ], }; };