Closed fobos531 closed 10 months ago
Hey! A few things:
@expo/config-plugins
and expo-module-scripts
is enough:"devDependencies": {
"@babel/core": "^7.20.0",
"@babel/preset-env": "^7.20.0",
+ "@expo/config-plugins": "^7.2.5",
"@types/react": "^18.2.45",
"@typescript-eslint/eslint-plugin": "^6.14.0",
"@typescript-eslint/parser": "^6.14.0",
"eslint": "^8.55.0",
"eslint-plugin-react": "^7.33.2",
"eslint-plugin-react-hooks": "^4.6.0",
- "expo": "^49.0.21",
"expo-module-scripts": "^3.1.0",
"lint-staged": "^15.2.0",
"prettier": "^3.1.1",
"prettier-plugin-organize-imports": "^3.2.4",
"react": "^18.2.0",
"react-native": "^0.73.0",
"react-native-builder-bob": "^0.23.2",
"typescript": "^5.3.3"
}
import {ConfigPlugin, withDangerousMod} from '@expo/config-plugins';
import {mergeContents} from '@expo/config-plugins/build/utils/generateCode';
import fs from 'fs';
import path from 'path';
type Props = {
iosPermissions?: Array<
| 'AppTrackingTransparency'
| 'Bluetooth'
| 'Calendars'
| 'CalendarsWriteOnly'
| 'Camera'
| 'Contacts'
| 'FaceID'
| 'LocationAccuracy'
| 'LocationAlways'
| 'LocationWhileInUse'
| 'MediaLibrary'
| 'Microphone'
| 'Motion'
| 'Notifications'
| 'PhotoLibrary'
| 'PhotoLibraryAddOnly'
| 'Reminders'
| 'Siri'
| 'SpeechRecognition'
| 'StoreKit'
>;
};
const plugin: ConfigPlugin<Props> = (config, {iosPermissions}) => {
if (iosPermissions == null || iosPermissions.length === 0) {
return config;
}
return withDangerousMod(config, [
'ios',
async (config) => {
const file = path.join(config.modRequest.platformProjectRoot, 'Podfile');
let contents = await fs.promises.readFile(file, 'utf8');
contents = mergeContents({
tag: 'node-require-function',
src: contents,
newSrc: `def node_require(script)\n\t# Resolve script with node to allow for hoisting\n\trequire Pod::Executable.execute_command('node', ['-p',\n\t\t"require.resolve(\n\t\t\t'#{script}',\n\t\t\t {paths: [process.argv[1]]},\n\t\t)", __dir__]).strip\nend\n\nnode_require('react-native-permissions/scripts/setup.rb')`,
anchor: /scripts\/react_native_pods/,
offset: 1,
comment: '#',
}).contents;
contents = mergeContents({
tag: 'permissions-array',
src: contents,
newSrc: `setup_permissions([${iosPermissions
.map((permission) => `'${permission}'`)
.join(',')}])`,
anchor: /prepare_react_native_project!/,
offset: 1,
comment: '#',
}).contents;
await fs.promises.writeFile(file, contents, 'utf-8');
return config;
},
]);
};
export default plugin;
app.plugin.js
in the .eslintignore
file.master
yarn format
The yarn prepack
error does not occurs for me on master
, only on your branch, so if you do a proper rebase it should be good.
expo-module-scripts
is also really bloated. Please remove it and replace the plugin tsconfig with this (that's all what it imports when using expo-module-scripts/tsconfig.plugin
):
{
"compilerOptions": {
"target": "ES2020",
"lib": ["ES2020"],
"moduleResolution": "Node16",
"module": "Node16",
"strict": true,
"esModuleInterop": true,
"declaration": true,
"skipLibCheck": true,
"forceConsistentCasingInFileNames": true,
"rootDir": "src",
"outDir": "build"
},
"include": ["./src"],
"exclude": ["**/__mocks__/*", "**/__tests__/*"]
}
@zoontek @fobos531
I used to use version 3 of the lib with expo and it works as expected. all that was needed was adding this package.json hook
"eas-build-post-install": "react-native setup-ios-permissions && pod-install",
@a-eid The CLI command has been removed in v4
@zoontek yeah, can't wait for this PR to get merged so we're able to upgrade to version 4.
@a-eid I'm waiting for @fobos531 to rebase and perform the requested changes.
Hello @zoontek,
apologies, it took me a while to get to it - I also didn't perform the changes exactly how you requested (by rebasing) since I've had some difficulties with getting it to work (still a little unexperienced), but I'm pretty confident the end result is now the same. I was also able to clean-up the plugin a little further. Here: https://www.diffchecker.com/KtEzHQEf/ You can see the diff between the Podfile where the expo config plugin was not applied, and on the right it was applied using the following syntax:
[
'react-native-permissions',
{
iosPermissions: ['Bluetooth'],
},
],
One thing to note is that this is plugin supported on RN 0.72+ only (I didn't account for the require_relative
syntax for < 0.72)
Let me know in case you require any other changes from my end.
Perfect, I merge this is a 4.1.0
for more testing before a release, thanks a lot!
Summary
Hello @zoontek !
Thank you for this amazing library, to my knowledge this is the sole library which provides a built-in way to check for Bluetooth permissions on iOS and I use that a lot, so this is very useful to me!
I would like to contribute back to this library by providing an Expo config plugin which simplifies the iOS permission setup configuration. The way it is set up is that Expo users would use your library like this:
Essentially, what it does it automates the steps 1 & 2 of the iOS setup (which are the most "tedious") from your README. The rest of the setup is supported out-of-the-box by Expo anyways.
Test Plan
I would wholeheartedly like to test but I'm running into a few issues that I believe are NOT caused by me adding this integration. I'll list them here, so I hope you could provide insight into why they're happening since I'm not fully familiar with this repo.
yarn prepack
(i.e.bob build
) runs, I'm met with this error:It looks like this is caused by one of the dependencies (builder bob?) - any idea how exactly to resolve this? This is blocking me from testing it by either installing it in the example project or by publishing to NPM and using it then. If we can figure out how to fix this, I'm hoping I can get it running and verify that the changes specified in the config plugin are actually properly applied.
Also, I'm getting this ESLint issue which I'm not sure how to fix:
I see that you have a fairly involved ESLint config file, so I'm not sure what is necessary to do to ensure that ESLint is happy with the
app.plugin.js
being present in the root directory of this project.When this is resolved, I can add docs to the README to inform users that this feature is available for them to use.
I hope you can take this pull request into consideration.
Thank you!
What's required for testing (prerequisites)?
Expo project.
What are the steps to test it (after prerequisites)?
Add this package in an Expo project, use the Expo config plugin like so:
Observe that the resulting Podfile contains the same changes that it would contain if the setup was done manually.
Compatibility
Checklist
README.md
example/App.tsx
)