Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e57c2a75a2 | ||
|
|
92776140fe |
No files matched your search
@@ -30,17 +30,18 @@ body:
|
|||||||
label: Config Plugin
|
label: Config Plugin
|
||||||
options:
|
options:
|
||||||
- '@config-plugins/android-jsc-intl'
|
- '@config-plugins/android-jsc-intl'
|
||||||
- '@config-plugins/apple-settings'
|
|
||||||
- '@config-plugins/detox'
|
- '@config-plugins/detox'
|
||||||
- '@config-plugins/ffmpeg-kit-react-native'
|
- '@config-plugins/ffmpeg-kit-react-native'
|
||||||
- '@config-plugins/ios-stickers'
|
- '@config-plugins/ios-stickers'
|
||||||
- '@config-plugins/react-native-adjust'
|
- '@config-plugins/react-native-adjust'
|
||||||
|
- '@config-plugins/react-native-ble-plx'
|
||||||
- '@config-plugins/react-native-blob-util'
|
- '@config-plugins/react-native-blob-util'
|
||||||
- '@config-plugins/react-native-branch'
|
- '@config-plugins/react-native-branch'
|
||||||
- '@config-plugins/react-native-callkeep'
|
- '@config-plugins/react-native-callkeep'
|
||||||
- '@config-plugins/react-native-dynamic-app-icon'
|
- '@config-plugins/react-native-dynamic-app-icon'
|
||||||
|
- '@config-plugins/react-native-google-cast'
|
||||||
- '@config-plugins/react-native-pdf'
|
- '@config-plugins/react-native-pdf'
|
||||||
- '@config-plugins/react-native-siri-shortcut'
|
- '@config-plugins/react-native-quick-actions'
|
||||||
- '@config-plugins/react-native-webrtc'
|
- '@config-plugins/react-native-webrtc'
|
||||||
validations:
|
validations:
|
||||||
required: true
|
required: true
|
||||||
|
|||||||
@@ -11,10 +11,13 @@ contact_links:
|
|||||||
url: https://github.com/wix/Detox/issues
|
url: https://github.com/wix/Detox/issues
|
||||||
- about: FFmpeg Kit for React Native
|
- about: FFmpeg Kit for React Native
|
||||||
name: 📦 ffmpeg-kit-react-native issues
|
name: 📦 ffmpeg-kit-react-native issues
|
||||||
url: https://github.com/arthenica/ffmpeg-kit/issues
|
url: https://github.com/tanersener/ffmpeg-kit/issues
|
||||||
- about: Adjust React Native SDK
|
- about: Adjust React Native SDK
|
||||||
name: 📦 react-native-adjust issues
|
name: 📦 react-native-adjust issues
|
||||||
url: https://github.com/adjust/react_native_sdk/issues
|
url: https://github.com/adjust/react_native_sdk/issues
|
||||||
|
- about: React Native Bluetooth Low Energy library
|
||||||
|
name: 📦 react-native-ble-plx issues
|
||||||
|
url: https://github.com/Polidea/react-native-ble-plx/issues
|
||||||
- about: >-
|
- about: >-
|
||||||
A module provides upload, download, and files access API. Supports file
|
A module provides upload, download, and files access API. Supports file
|
||||||
stream read/write for process large files.
|
stream read/write for process large files.
|
||||||
@@ -26,12 +29,16 @@ contact_links:
|
|||||||
- about: Programmatically change the app icon in React Native.
|
- about: Programmatically change the app icon in React Native.
|
||||||
name: 📦 react-native-dynamic-app-icon issues
|
name: 📦 react-native-dynamic-app-icon issues
|
||||||
url: https://github.com/idearockers/react-native-dynamic-app-icon/issues
|
url: https://github.com/idearockers/react-native-dynamic-app-icon/issues
|
||||||
|
- about: React Native wrapper for the Google Cast SDK for iOS and Android
|
||||||
|
name: 📦 react-native-google-cast issues
|
||||||
|
url: >-
|
||||||
|
https://github.com/react-native-google-cast/react-native-google-cast/issues
|
||||||
- about: A react native PDF view component, support ios and android platform
|
- about: A react native PDF view component, support ios and android platform
|
||||||
name: 📦 react-native-pdf issues
|
name: 📦 react-native-pdf issues
|
||||||
url: https://github.com/wonday/react-native-pdf/issues
|
url: https://github.com/wonday/react-native-pdf/issues
|
||||||
- about: A React Native library that enables you to use iOS 12+ Siri Shortcuts.
|
- about: A react-native interface for Touch 3D home screen quick actions
|
||||||
name: 📦 react-native-siri-shortcut issues
|
name: 📦 react-native-quick-actions issues
|
||||||
url: https://github.com/Gustash/react-native-siri-shortcut/issues
|
url: https://github.com/jordanbyron/react-native-quick-actions/issues
|
||||||
- about: WebRTC for React Native
|
- about: WebRTC for React Native
|
||||||
name: 📦 react-native-webrtc issues
|
name: 📦 react-native-webrtc issues
|
||||||
url: https://github.com/react-native-webrtc/react-native-webrtc/issues
|
url: https://github.com/react-native-webrtc/react-native-webrtc/issues
|
||||||
@@ -0,0 +1,91 @@
|
|||||||
|
# AUTO GENERATED:
|
||||||
|
# This file was generated by running the following in the root directory:
|
||||||
|
#
|
||||||
|
# yarn update-dependabot-config
|
||||||
|
|
||||||
|
version: 2
|
||||||
|
updates:
|
||||||
|
- package-ecosystem: npm
|
||||||
|
directory: packages/android-jsc-intl
|
||||||
|
schedule:
|
||||||
|
interval: daily
|
||||||
|
time: '09:00'
|
||||||
|
timezone: America/Los_Angeles
|
||||||
|
- package-ecosystem: npm
|
||||||
|
directory: packages/detox
|
||||||
|
schedule:
|
||||||
|
interval: daily
|
||||||
|
time: '09:00'
|
||||||
|
timezone: America/Los_Angeles
|
||||||
|
- package-ecosystem: npm
|
||||||
|
directory: packages/ffmpeg-kit-react-native
|
||||||
|
schedule:
|
||||||
|
interval: daily
|
||||||
|
time: '09:00'
|
||||||
|
timezone: America/Los_Angeles
|
||||||
|
- package-ecosystem: npm
|
||||||
|
directory: packages/ios-stickers
|
||||||
|
schedule:
|
||||||
|
interval: daily
|
||||||
|
time: '09:00'
|
||||||
|
timezone: America/Los_Angeles
|
||||||
|
- package-ecosystem: npm
|
||||||
|
directory: packages/react-native-adjust
|
||||||
|
schedule:
|
||||||
|
interval: daily
|
||||||
|
time: '09:00'
|
||||||
|
timezone: America/Los_Angeles
|
||||||
|
- package-ecosystem: npm
|
||||||
|
directory: packages/react-native-ble-plx
|
||||||
|
schedule:
|
||||||
|
interval: daily
|
||||||
|
time: '09:00'
|
||||||
|
timezone: America/Los_Angeles
|
||||||
|
- package-ecosystem: npm
|
||||||
|
directory: packages/react-native-blob-util
|
||||||
|
schedule:
|
||||||
|
interval: daily
|
||||||
|
time: '09:00'
|
||||||
|
timezone: America/Los_Angeles
|
||||||
|
- package-ecosystem: npm
|
||||||
|
directory: packages/react-native-branch
|
||||||
|
schedule:
|
||||||
|
interval: daily
|
||||||
|
time: '09:00'
|
||||||
|
timezone: America/Los_Angeles
|
||||||
|
- package-ecosystem: npm
|
||||||
|
directory: packages/react-native-callkeep
|
||||||
|
schedule:
|
||||||
|
interval: daily
|
||||||
|
time: '09:00'
|
||||||
|
timezone: America/Los_Angeles
|
||||||
|
- package-ecosystem: npm
|
||||||
|
directory: packages/react-native-dynamic-app-icon
|
||||||
|
schedule:
|
||||||
|
interval: daily
|
||||||
|
time: '09:00'
|
||||||
|
timezone: America/Los_Angeles
|
||||||
|
- package-ecosystem: npm
|
||||||
|
directory: packages/react-native-google-cast
|
||||||
|
schedule:
|
||||||
|
interval: daily
|
||||||
|
time: '09:00'
|
||||||
|
timezone: America/Los_Angeles
|
||||||
|
- package-ecosystem: npm
|
||||||
|
directory: packages/react-native-pdf
|
||||||
|
schedule:
|
||||||
|
interval: daily
|
||||||
|
time: '09:00'
|
||||||
|
timezone: America/Los_Angeles
|
||||||
|
- package-ecosystem: npm
|
||||||
|
directory: packages/react-native-quick-actions
|
||||||
|
schedule:
|
||||||
|
interval: daily
|
||||||
|
time: '09:00'
|
||||||
|
timezone: America/Los_Angeles
|
||||||
|
- package-ecosystem: npm
|
||||||
|
directory: packages/react-native-webrtc
|
||||||
|
schedule:
|
||||||
|
interval: daily
|
||||||
|
time: '09:00'
|
||||||
|
timezone: America/Los_Angeles
|
||||||
@@ -16,5 +16,5 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v2
|
||||||
- run: yarn install --frozen-lockfile --check-files
|
- run: npm install
|
||||||
- run: npx remark --use validate-links . .github
|
- run: npx remark --use validate-links . .github
|
||||||
@@ -0,0 +1,37 @@
|
|||||||
|
name: Release
|
||||||
|
# https://github.com/bent10/monorepo-starter/blob/main/docs/recipes/release-automation.md
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
release:
|
||||||
|
name: Releasing
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
- uses: actions/setup-node@v2
|
||||||
|
|
||||||
|
- uses: actions/cache@v2
|
||||||
|
with:
|
||||||
|
path: "**/node_modules"
|
||||||
|
key: ${{ runner.os }}-modules-${{ hashFiles('**/yarn.lock') }}
|
||||||
|
|
||||||
|
- run: yarn install --frozen-lockfile --check-files
|
||||||
|
- run: yarn lerna run prepare --stream
|
||||||
|
|
||||||
|
# If the dry run fails then it will prevent us from automatically breaking the repo.
|
||||||
|
- name: Semantic release (dry run)
|
||||||
|
run: npx multi-semantic-release --dry-run --ignore-private-packages
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ github.token }}
|
||||||
|
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
|
||||||
|
- name: Semantic release
|
||||||
|
# use `--ignore-packages` to ignore packages on bumping process
|
||||||
|
# npx multi-semantic-release --ignore-packages=packages/a/**,packages/b/**
|
||||||
|
run: npx multi-semantic-release --ignore-private-packages
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ github.token }}
|
||||||
|
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
|
||||||
@@ -10,7 +10,7 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
node: ["18"]
|
node: ["16", "17"]
|
||||||
name: Build with Node ${{ matrix.node }}
|
name: Build with Node ${{ matrix.node }}
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v2
|
||||||
@@ -22,7 +22,7 @@ jobs:
|
|||||||
node-version: ${{ matrix.node }}
|
node-version: ${{ matrix.node }}
|
||||||
- run: yarn install --frozen-lockfile --check-files
|
- run: yarn install --frozen-lockfile --check-files
|
||||||
- run: yarn lerna run prepare --stream
|
- run: yarn lerna run prepare --stream
|
||||||
- uses: actions/cache@v4
|
- uses: actions/cache@v2
|
||||||
with:
|
with:
|
||||||
path: "*"
|
path: "*"
|
||||||
key: v2-${{ github.sha }}-${{ matrix.node }}
|
key: v2-${{ github.sha }}-${{ matrix.node }}
|
||||||
@@ -32,20 +32,22 @@ jobs:
|
|||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
node: ["18"]
|
node: ["16", "17"]
|
||||||
package: [
|
package: [
|
||||||
# Manually add packages here
|
# Manually add packages here
|
||||||
detox,
|
detox,
|
||||||
ffmpeg-kit-react-native,
|
ffmpeg-kit-react-native,
|
||||||
ios-stickers,
|
ios-stickers,
|
||||||
|
react-native-ble-plx,
|
||||||
react-native-blob-util,
|
react-native-blob-util,
|
||||||
react-native-branch,
|
react-native-branch,
|
||||||
react-native-siri-shortcut,
|
react-native-google-cast,
|
||||||
react-native-pdf,
|
react-native-pdf,
|
||||||
|
# react-native-quick-actions,
|
||||||
]
|
]
|
||||||
name: Test ${{ matrix.package }} on Node ${{ matrix.node }}
|
name: Test ${{ matrix.package }} on Node ${{ matrix.node }}
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/cache@v4
|
- uses: actions/cache@v2
|
||||||
with:
|
with:
|
||||||
path: "*"
|
path: "*"
|
||||||
key: v2-${{ github.sha }}-${{ matrix.node }}
|
key: v2-${{ github.sha }}-${{ matrix.node }}
|
||||||
|
|||||||
@@ -62,5 +62,4 @@ packages/@*/*/build/**
|
|||||||
|
|
||||||
apps/*/ios/*
|
apps/*/ios/*
|
||||||
apps/*/android/*
|
apps/*/android/*
|
||||||
apps/*/web-build/*
|
apps/*/web-build/*
|
||||||
apps/*/dist/*
|
|
||||||
@@ -0,0 +1,62 @@
|
|||||||
|
// From @byCedric https://github.com/expo/expo-github-action/blob/main/.releaserc.js
|
||||||
|
|
||||||
|
const rules = [
|
||||||
|
{ type: "feat", release: "minor", title: "Features" },
|
||||||
|
{ type: "fix", release: "patch", title: "Bug Fixes" },
|
||||||
|
{ type: "test", release: "patch", title: "Tests" },
|
||||||
|
{ type: "ci", release: "patch", title: "Continuous Integration" },
|
||||||
|
{ type: "refactor", release: "patch", title: "Code Refactoring" },
|
||||||
|
{ type: "chore", release: "patch", title: "Other chores" },
|
||||||
|
{ type: "docs", release: "patch", title: "Documentation changes" },
|
||||||
|
];
|
||||||
|
|
||||||
|
// Simple mapping to order the commit groups
|
||||||
|
const sortMap = Object.fromEntries(
|
||||||
|
rules.map((rule, index) => [rule.title, index])
|
||||||
|
);
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
branches: ["main"],
|
||||||
|
tagFormat: "${version}",
|
||||||
|
repositoryUrl: "https://github.com/expo/config-plugins.git",
|
||||||
|
plugins: [
|
||||||
|
[
|
||||||
|
"@semantic-release/commit-analyzer",
|
||||||
|
{
|
||||||
|
preset: "conventionalcommits",
|
||||||
|
releaseRules: [
|
||||||
|
{ breaking: true, release: "major" },
|
||||||
|
{ revert: true, release: "patch" },
|
||||||
|
].concat(
|
||||||
|
rules.map(({ type, release, breaking }) => ({
|
||||||
|
type,
|
||||||
|
release,
|
||||||
|
breaking,
|
||||||
|
}))
|
||||||
|
),
|
||||||
|
},
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"@semantic-release/release-notes-generator",
|
||||||
|
{
|
||||||
|
preset: "conventionalcommits",
|
||||||
|
presetConfig: {
|
||||||
|
types: rules.map(({ type, title }) => ({ type, section: title })),
|
||||||
|
},
|
||||||
|
writerOpts: {
|
||||||
|
commitGroupsSort: (a, z) => sortMap[a.title] - sortMap[z.title],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
"@semantic-release/changelog",
|
||||||
|
"@semantic-release/npm",
|
||||||
|
[
|
||||||
|
"@semantic-release/git",
|
||||||
|
{
|
||||||
|
message: "chore: ${nextRelease.version}\n\n${nextRelease.notes}",
|
||||||
|
assets: ["package.json", "CHANGELOG.md", "build/*"],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
"@semantic-release/github",
|
||||||
|
],
|
||||||
|
};
|
||||||
@@ -6,7 +6,7 @@ To submit a pull request:
|
|||||||
|
|
||||||
1. Fork the [repository](https://github.com/expo/config-plugins) and create a feature branch. (Existing contributors can create feature branches without forking. Prefix the branch name with `@your-github-username/`.)
|
1. Fork the [repository](https://github.com/expo/config-plugins) and create a feature branch. (Existing contributors can create feature branches without forking. Prefix the branch name with `@your-github-username/`.)
|
||||||
2. Run `yarn` in the root directory to generate the build files.
|
2. Run `yarn` in the root directory to generate the build files.
|
||||||
3. Use [conventional commits](https://www.conventionalcommits.org/en/v1.0.0/) including in the PR title.
|
3. Use [conventional commits](https://www.conventionalcommits.org/en/v1.0.0/) including in the PR tile.
|
||||||
4. Fill out the entire PR template. Ensure your code is tested locally and has continuous tests in CI.
|
4. Fill out the entire PR template. Ensure your code is tested locally and has continuous tests in CI.
|
||||||
5. Make sure all tests pass on GitHub Actions.
|
5. Make sure all tests pass on GitHub Actions.
|
||||||
6. Wait for a review and adjust the code if necessary.
|
6. Wait for a review and adjust the code if necessary.
|
||||||
|
|||||||
@@ -1,69 +1,11 @@
|
|||||||
# Expo Config Plugins
|
# Expo Config Plugins
|
||||||
|
|
||||||
- A collection of [Expo config plugins](https://docs.expo.dev/guides/config-plugins/) for configuring the `npx expo prebuild` command.
|
- A collection of [Expo config plugins](https://docs.expo.dev/guides/config-plugins/) for configuring the `expo prebuild` command.
|
||||||
- This repo is to Expo config plugins as [DefinitelyTyped](https://github.com/DefinitelyTyped/DefinitelyTyped) is to TypeScript.
|
- This repo is to Expo config plugins as [DefinitelyTyped](https://github.com/DefinitelyTyped/DefinitelyTyped) is to TypeScript.
|
||||||
- We prefer packages ship their own Expo config plugin (to ensure versioning is aligned), but if they haven't adopted the system yet, the community can add a package here.
|
- We prefer packages ship their own Expo config plugin (to ensure versioning is aligned), but if they haven't adopted the system yet, the community can add a package here.
|
||||||
- All packages here are community maintained. Feel free to improve docs, packages, tests, etc.
|
- All packages here are community maintained. Feel free to improve docs, packages, tests, etc.
|
||||||
- We maintain a 1-1 mapping of **native packages** ⇔ `@config-plugins/*`. This means there should be no general utility packages here -- those are better suited for a different repo / NPM namespace.
|
- We maintain a 1-1 mapping of **native packages** ⇔ `@config-plugins/*`. This means there should be no general utility packages here -- those are better suited for a different repo / NPM namespace.
|
||||||
|
|
||||||
## First-party plugins
|
|
||||||
|
|
||||||
Here is a list of known packages that have a built-in Config Plugin.
|
|
||||||
|
|
||||||
> Not all packages need a config plugin, packages that don't appear here might still work with managed EAS.
|
|
||||||
|
|
||||||
- [React Native Firebase](https://rnfirebase.io/) (`@react-native-firebase/perf`, `@react-native-firebase/app`, `@react-native-firebase/crashlytics`)
|
|
||||||
- [react-native-google-cast](https://github.com/react-native-google-cast/react-native-google-cast)
|
|
||||||
- [react-native-nfc-manager](https://github.com/revtel/react-native-nfc-manager)
|
|
||||||
- [react-native-health](https://github.com/agencyenterprise/react-native-health)
|
|
||||||
- [@react-native-mapbox-gl/maps](https://github.com/rnmapbox/maps)
|
|
||||||
- [@logrocket/react-native](https://www.npmjs.com/package/@logrocket/react-native)
|
|
||||||
- [sentry-expo](https://www.npmjs.com/package/sentry-expo)
|
|
||||||
- [@leanplum/react-native-sdk](https://github.com/Leanplum/Leanplum-ReactNative-SDK#readme)
|
|
||||||
- [react-native-fbsdk-next](https://www.npmjs.com/package/react-native-fbsdk-next)
|
|
||||||
- [@stripe/stripe-react-native](https://www.npmjs.com/package/@stripe/stripe-react-native)
|
|
||||||
- [@react-native-voice/voice](https://www.npmjs.com/package/@react-native-voice/voice)
|
|
||||||
- [react-native-imglysdk](https://www.npmjs.com/package/react-native-imglysdk)
|
|
||||||
- [@viro-community/react-viro](https://github.com/virocommunity/viro) -- [Guide](https://viro-community.readme.io/docs/integrating-with-expo)
|
|
||||||
- [react-native-msal](https://www.npmjs.com/package/react-native-msal)
|
|
||||||
- [react-native-spotlight-search](https://www.npmjs.com/package/react-native-spotlight-search)
|
|
||||||
- [newrelic-react-native-agent](https://www.npmjs.com/package/newrelic-react-native-agent)
|
|
||||||
- [react-native-videoeditorsdk](https://www.npmjs.com/package/react-native-videoeditorsdk)
|
|
||||||
- [notifee](https://notifee.app/)
|
|
||||||
- [App Clips](https://github.com/bndkt/react-native-app-clip/)
|
|
||||||
- [iOS Safari Extensions](https://github.com/andrew-levy/react-native-safari-extension/)
|
|
||||||
- [react-native-ble-plx](https://github.com/dotintent/react-native-ble-plx)
|
|
||||||
|
|
||||||
### Complementary
|
|
||||||
|
|
||||||
More out-of-tree plugins which can be used to configure more packages.
|
|
||||||
|
|
||||||
- [onesignal-expo-plugin](https://github.com/OneSignal/onesignal-expo-plugin) (for use with `react-native-onesignal`)
|
|
||||||
- Configures **iOS Notification Service Extensions** for rich push notification and custom notification actions.
|
|
||||||
- [@lyrahealth-inc/react-native-orientation-plugin](https://www.npmjs.com/package/@lyrahealth-inc/react-native-orientation-plugin) (for use with `react-native-orientation-plugin`)
|
|
||||||
- [airship-expo-plugin](https://www.npmjs.com/package/airship-expo-plugin) (for use with `urbanairship-react-native`)
|
|
||||||
- [config-plugin-react-native-intercom](https://www.npmjs.com/package/config-plugin-react-native-intercom) (for use with `intercom-react-native`)
|
|
||||||
- [@allboatsrise/expo-marketingcloudsdk](https://www.npmjs.com/package/@allboatsrise/expo-marketingcloudsdk) (for use with `react-native-marketingcloudsdk`)
|
|
||||||
- [@ouvio/react-native-background-location-plugin](https://www.npmjs.com/package/@ouvio/react-native-background-location-plugin) (for use with `react-native-background-location-plugin`)
|
|
||||||
- [expo-community-flipper](https://www.npmjs.com/package/expo-community-flipper) (for use with Flipper)
|
|
||||||
- [expo-appcenter](https://www.npmjs.com/package/expo-appcenter) (for use with `appcenter`)
|
|
||||||
- [expo-react-native-freshchat](https://www.npmjs.com/package/expo-react-native-freshchat) (for use with `react-native-freshchat-sdk`)
|
|
||||||
- [react-native-keyevent-expo-config-plugin](https://github.com/chronsyn/react-native-keyevent-expo-config-plugin) (for use with `react-native-keyevent`)
|
|
||||||
- [watermelondb-expo-plugin](https://github.com/morrowdigital/watermelondb-expo-plugin) (for use with `@nozbe/watermelondb`)
|
|
||||||
|
|
||||||
### No Plugin Required
|
|
||||||
|
|
||||||
Just install and rebuild! If a package doesn't require any futher setup then it most likely doesn't need an Expo config plugin. Most packages work without a config plugin (including packages not listed below):
|
|
||||||
|
|
||||||
- [react-native-share](https://github.com/react-native-share/react-native-share)
|
|
||||||
- [@react-native-menu/menu](https://github.com/react-native-menu/menu)
|
|
||||||
- [react-native-blurhash](https://github.com/mrousavy/react-native-blurhash)
|
|
||||||
- [react-native-app-shortcuts](https://github.com/lokyoung/react-native-app-shortcuts)
|
|
||||||
- [react-native-multiple-image-picker](https://github.com/baronha/react-native-multiple-image-picker)
|
|
||||||
- [`@shopify/flash-list`](https://github.com/Shopify/flash-list)
|
|
||||||
|
|
||||||
> Feel free to [open a PR](https://github.com/expo/config-plugins/edit/main/README.md) with missing packages.
|
|
||||||
|
|
||||||
## Contributing!
|
## Contributing!
|
||||||
|
|
||||||
See the [contributing guide](/CONTRIBUTING.md).
|
See the [contributing guide](/CONTRIBUTING.md).
|
||||||
@@ -0,0 +1,80 @@
|
|||||||
|
node_modules/**/*
|
||||||
|
.expo/*
|
||||||
|
npm-debug.*
|
||||||
|
*.jks
|
||||||
|
*.p8
|
||||||
|
*.p12
|
||||||
|
*.key
|
||||||
|
*.mobileprovision
|
||||||
|
*.orig.*
|
||||||
|
web-build/
|
||||||
|
|
||||||
|
# macOS
|
||||||
|
.DS_Store
|
||||||
|
|
||||||
|
|
||||||
|
/artifacts
|
||||||
|
|
||||||
|
/scripts/start.command
|
||||||
|
/ios
|
||||||
|
/android
|
||||||
|
# @generated expo-cli sync-e7dcf75f4e856f7b6f3239b3f3a7dd614ee755a8
|
||||||
|
# The following patterns were generated by expo-cli
|
||||||
|
|
||||||
|
# OSX
|
||||||
|
#
|
||||||
|
.DS_Store
|
||||||
|
|
||||||
|
# Xcode
|
||||||
|
#
|
||||||
|
build/
|
||||||
|
*.pbxuser
|
||||||
|
!default.pbxuser
|
||||||
|
*.mode1v3
|
||||||
|
!default.mode1v3
|
||||||
|
*.mode2v3
|
||||||
|
!default.mode2v3
|
||||||
|
*.perspectivev3
|
||||||
|
!default.perspectivev3
|
||||||
|
xcuserdata
|
||||||
|
*.xccheckout
|
||||||
|
*.moved-aside
|
||||||
|
DerivedData
|
||||||
|
*.hmap
|
||||||
|
*.ipa
|
||||||
|
*.xcuserstate
|
||||||
|
project.xcworkspace
|
||||||
|
|
||||||
|
# Android/IntelliJ
|
||||||
|
#
|
||||||
|
build/
|
||||||
|
.idea
|
||||||
|
.gradle
|
||||||
|
local.properties
|
||||||
|
*.iml
|
||||||
|
*.hprof
|
||||||
|
|
||||||
|
# node.js
|
||||||
|
#
|
||||||
|
node_modules/
|
||||||
|
npm-debug.log
|
||||||
|
yarn-error.log
|
||||||
|
|
||||||
|
# BUCK
|
||||||
|
buck-out/
|
||||||
|
\.buckd/
|
||||||
|
*.keystore
|
||||||
|
!debug.keystore
|
||||||
|
|
||||||
|
# Bundle artifacts
|
||||||
|
*.jsbundle
|
||||||
|
|
||||||
|
# CocoaPods
|
||||||
|
/ios/Pods/
|
||||||
|
|
||||||
|
# Expo
|
||||||
|
.expo/
|
||||||
|
web-build/
|
||||||
|
dist/
|
||||||
|
|
||||||
|
# @end expo-cli
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"expo": {
|
||||||
|
"icon": "https://icogen.vercel.app/api/icon?icon=1f334",
|
||||||
|
"plugins": [
|
||||||
|
"@config-plugins/airbridge-react-native-sdk"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
module.exports = function(api) {
|
||||||
|
api.cache(true);
|
||||||
|
return {
|
||||||
|
presets: ['babel-preset-expo'],
|
||||||
|
};
|
||||||
|
};
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
// Learn more https://docs.expo.io/guides/customizing-metro
|
||||||
|
const { getDefaultConfig } = require("@expo/metro-config");
|
||||||
|
|
||||||
|
const config = getDefaultConfig(__dirname);
|
||||||
|
|
||||||
|
module.exports = config;
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
{
|
||||||
|
"name": "@config-plugins-app/airbridge-react-native-sdk",
|
||||||
|
"main": "./index.js",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"scripts": {
|
||||||
|
"start": "expo start --dev-client",
|
||||||
|
"ios": "expo run:ios",
|
||||||
|
"android": "expo run:android"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"@config-plugins/airbridge-react-native-sdk": "*",
|
||||||
|
"expo": "^45.0.0",
|
||||||
|
"expo-splash-screen": "~0.15.1",
|
||||||
|
"react": "17.0.2",
|
||||||
|
"react-native": "0.68.2",
|
||||||
|
"airbridge-react-native-sdk": "^1.4.5",
|
||||||
|
"expo-status-bar": "~1.3.0",
|
||||||
|
"react-dom": "17.0.2",
|
||||||
|
"react-native-web": "0.17.7"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@babel/core": "^7.12.9"
|
||||||
|
},
|
||||||
|
"private": true
|
||||||
|
}
|
||||||
@@ -1,9 +1,10 @@
|
|||||||
import { View, Text } from "react-native";
|
import React from "react";
|
||||||
|
import { Text, View } from "react-native";
|
||||||
|
|
||||||
export default function App() {
|
export default function App() {
|
||||||
return (
|
return (
|
||||||
<View style={{ flex: 1, justifyContent: "center", alignItems: "center" }}>
|
<View style={{ flex: 1, justifyContent: "center", alignItems: "center" }}>
|
||||||
<Text>No-op on this platform</Text>
|
<Text>airbridge-react-native-sdk</Text>
|
||||||
</View>
|
</View>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
{
|
||||||
|
"12bb71342c6255bbf50437ec8f4441c083f47cdb74bd89160c15e4f43e52a1cb": true,
|
||||||
|
"40b842e832070c58deac6aa9e08fa459302ee3f9da492c7e77d93d2fbf4a56fd": true
|
||||||
|
}
|
||||||
@@ -1,2 +1,80 @@
|
|||||||
|
node_modules/**/*
|
||||||
|
.expo/*
|
||||||
|
npm-debug.*
|
||||||
|
*.jks
|
||||||
|
*.p8
|
||||||
|
*.p12
|
||||||
|
*.key
|
||||||
|
*.mobileprovision
|
||||||
|
*.orig.*
|
||||||
|
web-build/
|
||||||
|
|
||||||
|
# macOS
|
||||||
|
.DS_Store
|
||||||
|
|
||||||
|
|
||||||
|
/artifacts
|
||||||
|
|
||||||
/scripts/start.command
|
/scripts/start.command
|
||||||
/artifacts
|
/ios
|
||||||
|
/android
|
||||||
|
# @generated expo-cli sync-e7dcf75f4e856f7b6f3239b3f3a7dd614ee755a8
|
||||||
|
# The following patterns were generated by expo-cli
|
||||||
|
|
||||||
|
# OSX
|
||||||
|
#
|
||||||
|
.DS_Store
|
||||||
|
|
||||||
|
# Xcode
|
||||||
|
#
|
||||||
|
build/
|
||||||
|
*.pbxuser
|
||||||
|
!default.pbxuser
|
||||||
|
*.mode1v3
|
||||||
|
!default.mode1v3
|
||||||
|
*.mode2v3
|
||||||
|
!default.mode2v3
|
||||||
|
*.perspectivev3
|
||||||
|
!default.perspectivev3
|
||||||
|
xcuserdata
|
||||||
|
*.xccheckout
|
||||||
|
*.moved-aside
|
||||||
|
DerivedData
|
||||||
|
*.hmap
|
||||||
|
*.ipa
|
||||||
|
*.xcuserstate
|
||||||
|
project.xcworkspace
|
||||||
|
|
||||||
|
# Android/IntelliJ
|
||||||
|
#
|
||||||
|
build/
|
||||||
|
.idea
|
||||||
|
.gradle
|
||||||
|
local.properties
|
||||||
|
*.iml
|
||||||
|
*.hprof
|
||||||
|
|
||||||
|
# node.js
|
||||||
|
#
|
||||||
|
node_modules/
|
||||||
|
npm-debug.log
|
||||||
|
yarn-error.log
|
||||||
|
|
||||||
|
# BUCK
|
||||||
|
buck-out/
|
||||||
|
\.buckd/
|
||||||
|
*.keystore
|
||||||
|
!debug.keystore
|
||||||
|
|
||||||
|
# Bundle artifacts
|
||||||
|
*.jsbundle
|
||||||
|
|
||||||
|
# CocoaPods
|
||||||
|
/ios/Pods/
|
||||||
|
|
||||||
|
# Expo
|
||||||
|
.expo/
|
||||||
|
web-build/
|
||||||
|
dist/
|
||||||
|
|
||||||
|
# @end expo-cli
|
||||||
@@ -1,3 +1,3 @@
|
|||||||
export { default } from "./src/detox/App";
|
export { default } from './src/detox/App';
|
||||||
// export { default } from "./src/android-jsc-intl/App";
|
// export { default } from './src/android-jsc-intl/App';
|
||||||
// export { default } from "./src/react-native-adjust/App";
|
// export { default } from './src/android-jsc-adjust/App';
|
||||||
@@ -0,0 +1,66 @@
|
|||||||
|
### @expo/app [1.0.1](https://github.com/expo/config-plugins/compare/@expo/[email protected]...@expo/[email protected]) (2022-03-15)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **ci:** use correct internal versions ([ab8076a](https://github.com/expo/config-plugins/commit/ab8076adf51e9ba0439eba60b153d729a0996b8d))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
### Dependencies
|
||||||
|
|
||||||
|
* **@config-plugins/android-jsc-intl:** upgraded to 1.0.1
|
||||||
|
* **@config-plugins/detox:** upgraded to 1.0.1
|
||||||
|
* **@config-plugins/react-native-adjust:** upgraded to 1.0.0
|
||||||
|
* **@config-plugins/react-native-ble-plx:** upgraded to 1.0.0
|
||||||
|
* **@config-plugins/react-native-blob-util:** upgraded to 1.0.1
|
||||||
|
* **@config-plugins/react-native-branch:** upgraded to 1.0.0
|
||||||
|
* **@config-plugins/react-native-callkeep:** upgraded to 1.0.0
|
||||||
|
* **@config-plugins/react-native-dynamic-app-icon:** upgraded to 1.0.0
|
||||||
|
* **@config-plugins/react-native-google-cast:** upgraded to 1.0.0
|
||||||
|
* **@config-plugins/react-native-pdf:** upgraded to 1.0.0
|
||||||
|
* **@config-plugins/react-native-quick-actions:** upgraded to 1.0.0
|
||||||
|
* **@config-plugins/react-native-webrtc:** upgraded to 1.0.0
|
||||||
|
|
||||||
|
## @expo/app 1.0.0 (2022-03-15)
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* create react-native-branch plugin ([0b06baa](https://github.com/expo/config-plugins/commit/0b06baa2b486c5e02d433a4ac785960934f403b9))
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* respect old config from expo-branch ([d0e0186](https://github.com/expo/config-plugins/commit/d0e018601c09c0e92191a4eb2998ab0e6fa1c6ec))
|
||||||
|
|
||||||
|
|
||||||
|
### Other chores
|
||||||
|
|
||||||
|
* added start-metro script ([4a7d707](https://github.com/expo/config-plugins/commit/4a7d707b200a3e499d9d71caf49ad4fc1d0a89e0))
|
||||||
|
* update script ([dcf61a9](https://github.com/expo/config-plugins/commit/dcf61a9b9542851095954d84c9054c97c5400dc9))
|
||||||
|
* upgrade to latest react-native-branch ([df98474](https://github.com/expo/config-plugins/commit/df98474d79ed139b42ddd698d13100160c656c26))
|
||||||
|
|
||||||
|
|
||||||
|
### Documentation changes
|
||||||
|
|
||||||
|
* add android-jsc-intl example ([d96c0b2](https://github.com/expo/config-plugins/commit/d96c0b2888da3808d7c4e2dd7993129711ba717d))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
### Dependencies
|
||||||
|
|
||||||
|
* **@config-plugins/android-jsc-intl:** upgraded to 1.0.0
|
||||||
|
* **@config-plugins/detox:** upgraded to 1.0.0
|
||||||
|
* **@config-plugins/ffmpeg-kit-react-native:** upgraded to 1.0.0
|
||||||
|
* **@config-plugins/ios-stickers:** upgraded to 1.0.0
|
||||||
|
* **@config-plugins/react-native-adjust:** upgraded to 1.0.0
|
||||||
|
* **@config-plugins/react-native-ble-plx:** upgraded to 1.0.0
|
||||||
|
* **@config-plugins/react-native-blob-util:** upgraded to 1.0.0
|
||||||
|
* **@config-plugins/react-native-branch:** upgraded to 1.0.0
|
||||||
|
* **@config-plugins/react-native-callkeep:** upgraded to 1.0.0
|
||||||
|
* **@config-plugins/react-native-dynamic-app-icon:** upgraded to 1.0.0
|
||||||
|
* **@config-plugins/react-native-google-cast:** upgraded to 1.0.0
|
||||||
|
* **@config-plugins/react-native-pdf:** upgraded to 1.0.0
|
||||||
|
* **@config-plugins/react-native-quick-actions:** upgraded to 1.0.0
|
||||||
|
* **@config-plugins/react-native-webrtc:** upgraded to 1.0.0
|
||||||
@@ -1,10 +1,10 @@
|
|||||||
{
|
{
|
||||||
"expo": {
|
"expo": {
|
||||||
"name": "detoxapp",
|
"name": "app",
|
||||||
"slug": "app",
|
"slug": "app",
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"orientation": "portrait",
|
"orientation": "portrait",
|
||||||
"icon": "https://github.com/expo.png",
|
"icon": "https://icogen.vercel.app/api/icon",
|
||||||
"splash": {
|
"splash": {
|
||||||
"image": "./assets/splash.png",
|
"image": "./assets/splash.png",
|
||||||
"resizeMode": "contain",
|
"resizeMode": "contain",
|
||||||
@@ -29,11 +29,12 @@
|
|||||||
"favicon": "./assets/favicon.png"
|
"favicon": "./assets/favicon.png"
|
||||||
},
|
},
|
||||||
"plugins": [
|
"plugins": [
|
||||||
"@config-plugins/detox",
|
|
||||||
"@config-plugins/react-native-adjust",
|
"@config-plugins/react-native-adjust",
|
||||||
"@config-plugins/react-native-callkeep",
|
"@config-plugins/react-native-callkeep",
|
||||||
"@config-plugins/android-jsc-intl",
|
"@config-plugins/react-native-blob-util",
|
||||||
"expo-localization"
|
"@config-plugins/react-native-pdf",
|
||||||
|
"@config-plugins/android-jsc-intl"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
module.exports = function(api) {
|
||||||
|
api.cache(true);
|
||||||
|
return {
|
||||||
|
presets: ['babel-preset-expo'],
|
||||||
|
};
|
||||||
|
};
|
||||||
@@ -1,21 +1,13 @@
|
|||||||
const iosName = "detoxapp";
|
const iosName = "app";
|
||||||
const simulator = "iPhone 16";
|
const emulator = "Pixel_3a_API_30";
|
||||||
|
const simulator = "iPhone 13 Pro";
|
||||||
const derivedDataPath = "ios/build";
|
const derivedDataPath = "ios/build";
|
||||||
const sdk = "iphonesimulator";
|
const sdk = "iphonesimulator";
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
testRunner: {
|
testRunner: "jest",
|
||||||
$0: "jest",
|
runnerConfig: require.resolve("./e2e/jest.config.js"),
|
||||||
args: {
|
specs: "e2e",
|
||||||
config: require.resolve("./e2e/jest.config.js"),
|
|
||||||
_: ["e2e"],
|
|
||||||
},
|
|
||||||
jest: {
|
|
||||||
setupTimeout: 300000,
|
|
||||||
reportSpecs: true,
|
|
||||||
reportWorkerAssign: true,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
behavior: {
|
behavior: {
|
||||||
init: {
|
init: {
|
||||||
exposeGlobals: false,
|
exposeGlobals: false,
|
||||||
@@ -55,7 +47,7 @@ module.exports = {
|
|||||||
emulator: {
|
emulator: {
|
||||||
type: "android.emulator",
|
type: "android.emulator",
|
||||||
device: {
|
device: {
|
||||||
avdName: "Pixel_6_Pro_API_33",
|
avdName: emulator,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -0,0 +1,23 @@
|
|||||||
|
const {
|
||||||
|
DetoxCircusEnvironment,
|
||||||
|
SpecReporter,
|
||||||
|
WorkerAssignReporter,
|
||||||
|
} = require("detox/runners/jest-circus");
|
||||||
|
|
||||||
|
class CustomDetoxEnvironment extends DetoxCircusEnvironment {
|
||||||
|
constructor(config, context) {
|
||||||
|
super(config, context);
|
||||||
|
|
||||||
|
// Can be safely removed, if you are content with the default value (=300000ms)
|
||||||
|
this.initTimeout = 300000;
|
||||||
|
|
||||||
|
// This takes care of generating status logs on a per-spec basis. By default, Jest only reports at file-level.
|
||||||
|
// This is strictly optional.
|
||||||
|
this.registerListeners({
|
||||||
|
SpecReporter,
|
||||||
|
WorkerAssignReporter,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = CustomDetoxEnvironment;
|
||||||
@@ -1,14 +1,11 @@
|
|||||||
module.exports = {
|
module.exports = {
|
||||||
|
testEnvironment: require.resolve("./environment.js"),
|
||||||
testRunner: require.resolve("jest-circus/runner"),
|
testRunner: require.resolve("jest-circus/runner"),
|
||||||
testTimeout: 120000,
|
testTimeout: 120000,
|
||||||
rootDir: "..",
|
testRegex: "/__tests__/.*(e2e)\\.[jt]sx?$",
|
||||||
testMatch: ["<rootDir>/**/__tests__/*"],
|
|
||||||
transform: {
|
transform: {
|
||||||
"^.+\\.[jt]sx?$": "ts-jest",
|
"^.+\\.[jt]sx?$": "ts-jest",
|
||||||
},
|
},
|
||||||
reporters: [require.resolve("detox/runners/jest/reporter")],
|
reporters: [require.resolve("detox/runners/jest/streamlineReporter")],
|
||||||
globalSetup: "detox/runners/jest/globalSetup",
|
|
||||||
globalTeardown: "detox/runners/jest/globalTeardown",
|
|
||||||
testEnvironment: "detox/runners/jest/testEnvironment",
|
|
||||||
verbose: true,
|
verbose: true,
|
||||||
};
|
};
|
||||||
|
After Width: | Height: | Size: 39 KiB |
|
Before Width: | Height: | Size: 68 KiB |
|
After Width: | Height: | Size: 39 KiB |
|
Before Width: | Height: | Size: 68 KiB |
|
After Width: | Height: | Size: 39 KiB |
|
Before Width: | Height: | Size: 68 KiB |
|
After Width: | Height: | Size: 86 KiB |
|
After Width: | Height: | Size: 84 KiB |
|
After Width: | Height: | Size: 86 KiB |
@@ -0,0 +1,6 @@
|
|||||||
|
// Learn more https://docs.expo.io/guides/customizing-metro
|
||||||
|
const { getDefaultConfig } = require("@expo/metro-config");
|
||||||
|
|
||||||
|
const config = getDefaultConfig(__dirname);
|
||||||
|
|
||||||
|
module.exports = config;
|
||||||
@@ -25,28 +25,37 @@
|
|||||||
"@config-plugins/detox": "*",
|
"@config-plugins/detox": "*",
|
||||||
"@config-plugins/react-native-adjust": "*",
|
"@config-plugins/react-native-adjust": "*",
|
||||||
"@config-plugins/react-native-callkeep": "*",
|
"@config-plugins/react-native-callkeep": "*",
|
||||||
"detox": "^20.37.0",
|
"expo": "^45.0.0",
|
||||||
"expo": "~53",
|
"detox": "^19.6.9",
|
||||||
"expo-localization": "~16.1.5",
|
"expo-localization": "~13.0.0",
|
||||||
"expo-splash-screen": "~0.30.7",
|
"expo-splash-screen": "~0.15.1",
|
||||||
|
"expo-status-bar": "~1.3.0",
|
||||||
|
"expo-updates": "~0.13.1",
|
||||||
"fbjs": "^0.8.18",
|
"fbjs": "^0.8.18",
|
||||||
"i18n-js": "^3.8.0",
|
"i18n-js": "^3.8.0",
|
||||||
"luxon": "^1.27.0",
|
"luxon": "^1.27.0",
|
||||||
"react": "19.0.0",
|
"react": "17.0.2",
|
||||||
"react-native": "0.79.2",
|
"react-dom": "17.0.2",
|
||||||
"react-native-adjust": "^5.1.0",
|
"react-native": "0.68.2",
|
||||||
"react-native-callkeep": "^4.3.16",
|
"react-native-adjust": "^4.29.6",
|
||||||
"react-native-safe-area-context": "5.3.0"
|
"react-native-callkeep": "^4.3.3",
|
||||||
|
"react-native-safe-area-context": "4.2.4",
|
||||||
|
"react-native-web": "0.17.7"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
"@babel/core": "^7.12.9",
|
||||||
"@babel/plugin-syntax-jsx": "^7.16.0",
|
"@babel/plugin-syntax-jsx": "^7.16.0",
|
||||||
"@types/jest": "^29.4.0",
|
"@expo/metro-config": "~0.3.7",
|
||||||
|
"@expo/xcpretty": "^4.1.2",
|
||||||
|
"@types/jest": "^26.0.19",
|
||||||
"@types/luxon": "^1.27.1",
|
"@types/luxon": "^1.27.1",
|
||||||
"babel-jest": "^29.5.0",
|
"@types/react": "~17.0.21",
|
||||||
"jest": "~29.7.0",
|
"@types/react-native": "~0.64.12",
|
||||||
"jest-circus": "^29.5.0",
|
"babel-jest": "~25.2.6",
|
||||||
"ts-jest": "^29.0.5",
|
"jest": "^26.6.3",
|
||||||
"typescript": "~5.8.3"
|
"jest-circus": "^26.5.2",
|
||||||
|
"ts-jest": "^26.4.4",
|
||||||
|
"typescript": "~4.3.5"
|
||||||
},
|
},
|
||||||
"private": true
|
"private": true
|
||||||
}
|
}
|
||||||
@@ -9,7 +9,7 @@ set -eu
|
|||||||
|
|
||||||
iosName=$1
|
iosName=$1
|
||||||
# Debug or Release
|
# Debug or Release
|
||||||
configuration=${3:-"Debug"}
|
configuration=$2
|
||||||
# YES or NO
|
# YES or NO
|
||||||
UseModernBuildSystem=${3:-"NO"}
|
UseModernBuildSystem=${3:-"NO"}
|
||||||
|
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ else
|
|||||||
commandFile=$(dirname "$0")/start.command
|
commandFile=$(dirname "$0")/start.command
|
||||||
cat > ${commandFile} << EOF
|
cat > ${commandFile} << EOF
|
||||||
cd "\$(dirname "\$0")/.."
|
cd "\$(dirname "\$0")/.."
|
||||||
# Run 'npx expo start --help' to get more parameters
|
# Run 'react-native start --help' to get more parameters
|
||||||
yarn start --port ${port}
|
yarn start --port ${port}
|
||||||
EOF
|
EOF
|
||||||
# execute the file in a new command line window
|
# execute the file in a new command line window
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ export default function App() {
|
|||||||
"APP_TOKEN",
|
"APP_TOKEN",
|
||||||
AdjustConfig.EnvironmentSandbox
|
AdjustConfig.EnvironmentSandbox
|
||||||
);
|
);
|
||||||
Adjust.enable();
|
Adjust.create(adjustConfig);
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
|||||||
@@ -0,0 +1,3 @@
|
|||||||
|
const { createWebpackConfigAsync } = require("expo-yarn-workspaces/webpack");
|
||||||
|
|
||||||
|
module.exports = createWebpackConfigAsync;
|
||||||
@@ -1,123 +0,0 @@
|
|||||||
import withAppleSettings, {
|
|
||||||
ChildPane,
|
|
||||||
Group,
|
|
||||||
RadioGroup,
|
|
||||||
Slider,
|
|
||||||
Switch,
|
|
||||||
TextField,
|
|
||||||
Title,
|
|
||||||
} from "@config-plugins/apple-settings";
|
|
||||||
import { MultiValue } from "@config-plugins/apple-settings/build/models";
|
|
||||||
import { ConfigContext, ExpoConfig } from "expo/config";
|
|
||||||
import path from "node:path";
|
|
||||||
|
|
||||||
const folderName = path.basename(__dirname);
|
|
||||||
const cleanName = folderName.replace(/[_\s-]/g, "");
|
|
||||||
const appId = "dev.bacon." + cleanName;
|
|
||||||
|
|
||||||
function withWhiteLabel(config: Partial<ExpoConfig>) {
|
|
||||||
if (!config.extra) config.extra = {};
|
|
||||||
// Expose CI env variables to the app
|
|
||||||
config.extra.CI = process.env.CI;
|
|
||||||
|
|
||||||
if (!config.ios) config.ios = {};
|
|
||||||
config.ios.bundleIdentifier = appId;
|
|
||||||
if (!config.android) config.android = {};
|
|
||||||
config.android.package = appId;
|
|
||||||
|
|
||||||
return config;
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = ({ config }: ConfigContext): Partial<ExpoConfig> => {
|
|
||||||
config = withWhiteLabel(config);
|
|
||||||
|
|
||||||
config = withAppleSettings(config as ExpoConfig, {
|
|
||||||
// The name of the .plist file to generate. Root is the default and must be provided.
|
|
||||||
Root: {
|
|
||||||
// The locales object is optional. If provided, it will be used to generate the localized .strings files.
|
|
||||||
locales: {
|
|
||||||
// The Apple locale code. This will be used to generate the .strings file.
|
|
||||||
en: {
|
|
||||||
// Name of the localized key.
|
|
||||||
Name: "Text Field",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
// The page object is required. It will be used to generate the .plist file.
|
|
||||||
// The contents will be converted directly to plist.
|
|
||||||
page: {
|
|
||||||
// The `PreferenceSpecifiers` defines the UI elements to generate.
|
|
||||||
PreferenceSpecifiers: [
|
|
||||||
Title({
|
|
||||||
title: "Title",
|
|
||||||
value: "Default Title",
|
|
||||||
key: "title_preference",
|
|
||||||
}),
|
|
||||||
// Helper models can be used to generate the UI elements using
|
|
||||||
// an API that's similar to React Native.
|
|
||||||
TextField({
|
|
||||||
title: "Name",
|
|
||||||
key: "name_preference",
|
|
||||||
value: "",
|
|
||||||
keyboardType: "Alphabet",
|
|
||||||
autoCapitalize: "None",
|
|
||||||
autoCorrect: "No",
|
|
||||||
}),
|
|
||||||
Switch({
|
|
||||||
title: "Enabled",
|
|
||||||
key: "enabled_preference",
|
|
||||||
value: true,
|
|
||||||
}),
|
|
||||||
Slider({
|
|
||||||
key: "slider_preference",
|
|
||||||
value: 0.5,
|
|
||||||
}),
|
|
||||||
// Broken https://forums.developer.apple.com/forums/thread/764519
|
|
||||||
// RadioGroup({
|
|
||||||
// value: "option1",
|
|
||||||
// key: "radio_preference",
|
|
||||||
// items: [
|
|
||||||
// {
|
|
||||||
// title: "Option 1",
|
|
||||||
// value: "option1",
|
|
||||||
// },
|
|
||||||
|
|
||||||
// {
|
|
||||||
// title: "Option 2",
|
|
||||||
// value: "option2",
|
|
||||||
// },
|
|
||||||
// ],
|
|
||||||
// }),
|
|
||||||
// MultiValue({
|
|
||||||
// title: "Multi Value",
|
|
||||||
// key: "multi_value_preference",
|
|
||||||
// value: "alpha",
|
|
||||||
// items: [
|
|
||||||
// {
|
|
||||||
// title: "Alpha",
|
|
||||||
// value: "alpha",
|
|
||||||
// short: "α",
|
|
||||||
// },
|
|
||||||
// {
|
|
||||||
// title: "Beta",
|
|
||||||
// value: "beta",
|
|
||||||
// short: "β",
|
|
||||||
// },
|
|
||||||
// {
|
|
||||||
// title: "Delta",
|
|
||||||
// value: "delta",
|
|
||||||
// short: "Δ",
|
|
||||||
// },
|
|
||||||
// {
|
|
||||||
// title: "Omega",
|
|
||||||
// value: "omega",
|
|
||||||
// short: "Ω",
|
|
||||||
// },
|
|
||||||
// ],
|
|
||||||
// }),
|
|
||||||
],
|
|
||||||
},
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
return config;
|
|
||||||
};
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
{
|
|
||||||
"expo": {
|
|
||||||
"name": "apple-settings",
|
|
||||||
"icon": "https://github.com/expo.png",
|
|
||||||
"platforms": ["ios"],
|
|
||||||
"plugins": [["expo-build-properties", { "ios": { "ccacheEnabled": true } }]]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "@config-plugins-app/apple-settings",
|
|
||||||
"main": "./index.js",
|
|
||||||
"version": "1.0.0",
|
|
||||||
"scripts": {
|
|
||||||
"start": "expo start --dev-client",
|
|
||||||
"ios": "expo run:ios",
|
|
||||||
"android": "expo run:android"
|
|
||||||
},
|
|
||||||
"dependencies": {
|
|
||||||
"@config-plugins/apple-settings": "*",
|
|
||||||
"@react-native-community/slider": "4.5.6",
|
|
||||||
"@react-native-picker/picker": "2.11.0",
|
|
||||||
"expo": "~53",
|
|
||||||
"expo-splash-screen": "~0.30.7",
|
|
||||||
"react": "19.0.0",
|
|
||||||
"react-native": "0.79.2"
|
|
||||||
},
|
|
||||||
"private": true
|
|
||||||
}
|
|
||||||
@@ -1,57 +0,0 @@
|
|||||||
import React from "react";
|
|
||||||
import { Button, Linking, StyleSheet, View } from "react-native";
|
|
||||||
|
|
||||||
import {
|
|
||||||
SettingsRadioGroup,
|
|
||||||
SettingsSlider,
|
|
||||||
SettingsSwitch,
|
|
||||||
SettingsTextInput,
|
|
||||||
SettingsTitle,
|
|
||||||
} from "./SettingsViews";
|
|
||||||
|
|
||||||
const App = () => {
|
|
||||||
return (
|
|
||||||
<View style={styles.container}>
|
|
||||||
{/* <SettingsTitle settingsKey="title_preference" /> */}
|
|
||||||
<SettingsTextInput
|
|
||||||
style={{
|
|
||||||
height: 40,
|
|
||||||
borderColor: "gray",
|
|
||||||
borderWidth: 1,
|
|
||||||
padding: 8,
|
|
||||||
}}
|
|
||||||
settingsKey="name_preference"
|
|
||||||
/>
|
|
||||||
<SettingsSwitch settingsKey="enabled_preference" />
|
|
||||||
<SettingsSlider settingsKey="slider_preference" />
|
|
||||||
<View />
|
|
||||||
<SettingsRadioGroup settingsKey="radio_preference">
|
|
||||||
<SettingsRadioGroup.Item label="Option 1" value="option1" />
|
|
||||||
<SettingsRadioGroup.Item label="Option 2" value="option2" />
|
|
||||||
</SettingsRadioGroup>
|
|
||||||
<View />
|
|
||||||
<Button
|
|
||||||
title="Launch Settings"
|
|
||||||
onPress={() => {
|
|
||||||
Linking.openSettings();
|
|
||||||
}}
|
|
||||||
/>
|
|
||||||
</View>
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
const styles = StyleSheet.create({
|
|
||||||
container: {
|
|
||||||
flex: 1,
|
|
||||||
justifyContent: "center",
|
|
||||||
alignItems: "stretch",
|
|
||||||
paddingHorizontal: 56,
|
|
||||||
gap: 12,
|
|
||||||
},
|
|
||||||
value: {
|
|
||||||
fontSize: 24,
|
|
||||||
marginVertical: 12,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
export default App;
|
|
||||||
@@ -1,91 +0,0 @@
|
|||||||
import Slider from "@react-native-community/slider";
|
|
||||||
import { Picker } from "@react-native-picker/picker";
|
|
||||||
import React from "react";
|
|
||||||
import { Settings, Switch, Text, TextInput } from "react-native";
|
|
||||||
|
|
||||||
export function useSetting<T = string>(key: string): [T, (value: T) => void] {
|
|
||||||
const [value, setValue] = React.useState<T>(() => Settings.get(key));
|
|
||||||
React.useEffect(() => {
|
|
||||||
let isMounted = true;
|
|
||||||
const callback = Settings.watchKeys(key, () => {
|
|
||||||
if (isMounted) {
|
|
||||||
setValue(Settings.get(key));
|
|
||||||
}
|
|
||||||
});
|
|
||||||
return () => {
|
|
||||||
Settings.clearWatch(callback);
|
|
||||||
isMounted = false;
|
|
||||||
};
|
|
||||||
}, [key]);
|
|
||||||
|
|
||||||
return [
|
|
||||||
value,
|
|
||||||
(value) => {
|
|
||||||
Settings.set({ [key]: value });
|
|
||||||
setValue(value);
|
|
||||||
},
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
export function SettingsSlider({
|
|
||||||
settingsKey,
|
|
||||||
...props
|
|
||||||
}: { settingsKey: string } & Omit<
|
|
||||||
React.ComponentProps<typeof Slider>,
|
|
||||||
"selectedValue" | "onValueChange"
|
|
||||||
>) {
|
|
||||||
const [value, setValue] = useSetting<number>(settingsKey);
|
|
||||||
return <Slider {...props} value={value ?? 0} onValueChange={setValue} />;
|
|
||||||
}
|
|
||||||
|
|
||||||
export function SettingsRadioGroup({
|
|
||||||
settingsKey,
|
|
||||||
...props
|
|
||||||
}: { settingsKey: string } & Omit<
|
|
||||||
React.ComponentProps<typeof Picker>,
|
|
||||||
"selectedValue" | "onValueChange"
|
|
||||||
>) {
|
|
||||||
const [value, setValue] = useSetting<string>(settingsKey);
|
|
||||||
return (
|
|
||||||
<Picker
|
|
||||||
{...props}
|
|
||||||
selectedValue={value ?? "option1"}
|
|
||||||
onValueChange={setValue}
|
|
||||||
/>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
SettingsRadioGroup.Item = Picker.Item;
|
|
||||||
|
|
||||||
export function SettingsSwitch({
|
|
||||||
settingsKey,
|
|
||||||
...props
|
|
||||||
}: { settingsKey: string } & Omit<
|
|
||||||
React.ComponentProps<typeof Switch>,
|
|
||||||
"value" | "onValueChange"
|
|
||||||
>) {
|
|
||||||
const [value, setValue] = useSetting<boolean>(settingsKey);
|
|
||||||
return <Switch {...props} value={!!value} onValueChange={setValue} />;
|
|
||||||
}
|
|
||||||
|
|
||||||
export function SettingsTitle({
|
|
||||||
settingsKey,
|
|
||||||
...props
|
|
||||||
}: { settingsKey: string } & Omit<
|
|
||||||
React.ComponentProps<typeof Text>,
|
|
||||||
"children"
|
|
||||||
>) {
|
|
||||||
const [value] = useSetting<string>(settingsKey);
|
|
||||||
return <Text {...props} children={value} />;
|
|
||||||
}
|
|
||||||
|
|
||||||
export function SettingsTextInput({
|
|
||||||
settingsKey,
|
|
||||||
...props
|
|
||||||
}: { settingsKey: string } & Omit<
|
|
||||||
React.ComponentProps<typeof TextInput>,
|
|
||||||
"value" | "onChangeText"
|
|
||||||
>) {
|
|
||||||
const [value, setValue] = useSetting<string>(settingsKey);
|
|
||||||
return <TextInput {...props} value={value} onChangeText={setValue} />;
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,80 @@
|
|||||||
|
node_modules/**/*
|
||||||
|
.expo/*
|
||||||
|
npm-debug.*
|
||||||
|
*.jks
|
||||||
|
*.p8
|
||||||
|
*.p12
|
||||||
|
*.key
|
||||||
|
*.mobileprovision
|
||||||
|
*.orig.*
|
||||||
|
web-build/
|
||||||
|
|
||||||
|
# macOS
|
||||||
|
.DS_Store
|
||||||
|
|
||||||
|
|
||||||
|
/artifacts
|
||||||
|
|
||||||
|
/scripts/start.command
|
||||||
|
/ios
|
||||||
|
/android
|
||||||
|
# @generated expo-cli sync-e7dcf75f4e856f7b6f3239b3f3a7dd614ee755a8
|
||||||
|
# The following patterns were generated by expo-cli
|
||||||
|
|
||||||
|
# OSX
|
||||||
|
#
|
||||||
|
.DS_Store
|
||||||
|
|
||||||
|
# Xcode
|
||||||
|
#
|
||||||
|
build/
|
||||||
|
*.pbxuser
|
||||||
|
!default.pbxuser
|
||||||
|
*.mode1v3
|
||||||
|
!default.mode1v3
|
||||||
|
*.mode2v3
|
||||||
|
!default.mode2v3
|
||||||
|
*.perspectivev3
|
||||||
|
!default.perspectivev3
|
||||||
|
xcuserdata
|
||||||
|
*.xccheckout
|
||||||
|
*.moved-aside
|
||||||
|
DerivedData
|
||||||
|
*.hmap
|
||||||
|
*.ipa
|
||||||
|
*.xcuserstate
|
||||||
|
project.xcworkspace
|
||||||
|
|
||||||
|
# Android/IntelliJ
|
||||||
|
#
|
||||||
|
build/
|
||||||
|
.idea
|
||||||
|
.gradle
|
||||||
|
local.properties
|
||||||
|
*.iml
|
||||||
|
*.hprof
|
||||||
|
|
||||||
|
# node.js
|
||||||
|
#
|
||||||
|
node_modules/
|
||||||
|
npm-debug.log
|
||||||
|
yarn-error.log
|
||||||
|
|
||||||
|
# BUCK
|
||||||
|
buck-out/
|
||||||
|
\.buckd/
|
||||||
|
*.keystore
|
||||||
|
!debug.keystore
|
||||||
|
|
||||||
|
# Bundle artifacts
|
||||||
|
*.jsbundle
|
||||||
|
|
||||||
|
# CocoaPods
|
||||||
|
/ios/Pods/
|
||||||
|
|
||||||
|
# Expo
|
||||||
|
.expo/
|
||||||
|
web-build/
|
||||||
|
dist/
|
||||||
|
|
||||||
|
# @end expo-cli
|
||||||
@@ -1,10 +1,6 @@
|
|||||||
{
|
{
|
||||||
"expo": {
|
"expo": {
|
||||||
"name": "ffmpeg",
|
"icon": "https://icogen.vercel.app/api/icon",
|
||||||
"icon": "https://github.com/expo.png",
|
|
||||||
"splash": {
|
|
||||||
"image": "https://github.com/expo.png"
|
|
||||||
},
|
|
||||||
"plugins": [
|
"plugins": [
|
||||||
[
|
[
|
||||||
"@config-plugins/ffmpeg-kit-react-native",
|
"@config-plugins/ffmpeg-kit-react-native",
|
||||||
|
|||||||
@@ -0,0 +1,6 @@
|
|||||||
|
module.exports = function(api) {
|
||||||
|
api.cache(true);
|
||||||
|
return {
|
||||||
|
presets: ['babel-preset-expo'],
|
||||||
|
};
|
||||||
|
};
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
// Learn more https://docs.expo.io/guides/customizing-metro
|
||||||
|
const { getDefaultConfig } = require("@expo/metro-config");
|
||||||
|
|
||||||
|
const config = getDefaultConfig(__dirname);
|
||||||
|
|
||||||
|
module.exports = config;
|
||||||
@@ -9,11 +9,17 @@
|
|||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@config-plugins/ffmpeg-kit-react-native": "*",
|
"@config-plugins/ffmpeg-kit-react-native": "*",
|
||||||
"expo": "~53",
|
"expo": "^45.0.0",
|
||||||
"expo-splash-screen": "~0.30.7",
|
"expo-splash-screen": "~0.15.1",
|
||||||
"ffmpeg-kit-react-native": "^6.0.2",
|
"react": "17.0.2",
|
||||||
"react": "19.0.0",
|
"react-native": "0.68.2",
|
||||||
"react-native": "0.79.2"
|
"ffmpeg-kit-react-native": "^4.5.1",
|
||||||
|
"expo-status-bar": "~1.3.0",
|
||||||
|
"react-dom": "17.0.2",
|
||||||
|
"react-native-web": "0.17.7"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@babel/core": "^7.12.9"
|
||||||
},
|
},
|
||||||
"private": true
|
"private": true
|
||||||
}
|
}
|
||||||
@@ -1,54 +1,41 @@
|
|||||||
import { Session } from "ffmpeg-kit-react-native";
|
import { Session } from 'ffmpeg-kit-react-native';
|
||||||
import React from "react";
|
import React from 'react';
|
||||||
import {
|
import { ActivityIndicator, SafeAreaView, ScrollView, Text, View } from 'react-native';
|
||||||
ActivityIndicator,
|
|
||||||
SafeAreaView,
|
|
||||||
ScrollView,
|
|
||||||
Text,
|
|
||||||
View,
|
|
||||||
} from "react-native";
|
|
||||||
|
|
||||||
import { useMediaInfo, useResolvedValue } from "./useMediaInfo";
|
import { useMediaInfo, useResolvedValue } from './useMediaInfo';
|
||||||
|
|
||||||
export default function App() {
|
export default function App() {
|
||||||
const session = useMediaInfo(
|
const session = useMediaInfo('http://techslides.com/demos/sample-videos/small.mp4');
|
||||||
"http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ForBiggerBlazes.mp4"
|
|
||||||
);
|
|
||||||
|
|
||||||
if (!session) {
|
if (!session) {
|
||||||
return (
|
return <View style={{
|
||||||
<View
|
flex: 1,
|
||||||
style={{
|
justifyContent: "center",
|
||||||
flex: 1,
|
alignItems: "center",
|
||||||
justifyContent: "center",
|
}}><ActivityIndicator /><Text>Loading...</Text></View>
|
||||||
alignItems: "center",
|
}
|
||||||
}}
|
|
||||||
>
|
return <SessionInfo session={session} />
|
||||||
<ActivityIndicator />
|
|
||||||
<Text>Loading...</Text>
|
|
||||||
</View>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
return <SessionInfo session={session} />;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function SessionInfo(props: { session: Session }) {
|
function SessionInfo(props: { session: Session }) {
|
||||||
const { session } = props;
|
const { session } = props;
|
||||||
const duration = useResolvedValue(session.getDuration.bind(session));
|
const duration = useResolvedValue(session.getDuration.bind(session));
|
||||||
const output = useResolvedValue(session.getOutput.bind(session));
|
const output = useResolvedValue(session.getOutput.bind(session));
|
||||||
return (
|
return (
|
||||||
<SafeAreaView
|
<SafeAreaView
|
||||||
style={{
|
style={{
|
||||||
flex: 1,
|
flex: 1,
|
||||||
justifyContent: "center",
|
justifyContent: "center",
|
||||||
alignItems: "center",
|
alignItems: "center",
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<ScrollView>
|
<ScrollView>
|
||||||
<Text>Duration: {duration}</Text>
|
<Text>Duration: {duration}</Text>
|
||||||
<Text>Output: {output}</Text>
|
<Text>Output: {output}</Text>
|
||||||
</ScrollView>
|
</ScrollView>
|
||||||
</SafeAreaView>
|
|
||||||
);
|
</SafeAreaView>
|
||||||
}
|
);
|
||||||
|
}
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
{
|
|
||||||
"compilerOptions": {},
|
|
||||||
"extends": "expo/tsconfig.base"
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,80 @@
|
|||||||
|
node_modules/**/*
|
||||||
|
.expo/*
|
||||||
|
npm-debug.*
|
||||||
|
*.jks
|
||||||
|
*.p8
|
||||||
|
*.p12
|
||||||
|
*.key
|
||||||
|
*.mobileprovision
|
||||||
|
*.orig.*
|
||||||
|
web-build/
|
||||||
|
|
||||||
|
# macOS
|
||||||
|
.DS_Store
|
||||||
|
|
||||||
|
|
||||||
|
/artifacts
|
||||||
|
|
||||||
|
/scripts/start.command
|
||||||
|
/ios
|
||||||
|
/android
|
||||||
|
# @generated expo-cli sync-e7dcf75f4e856f7b6f3239b3f3a7dd614ee755a8
|
||||||
|
# The following patterns were generated by expo-cli
|
||||||
|
|
||||||
|
# OSX
|
||||||
|
#
|
||||||
|
.DS_Store
|
||||||
|
|
||||||
|
# Xcode
|
||||||
|
#
|
||||||
|
build/
|
||||||
|
*.pbxuser
|
||||||
|
!default.pbxuser
|
||||||
|
*.mode1v3
|
||||||
|
!default.mode1v3
|
||||||
|
*.mode2v3
|
||||||
|
!default.mode2v3
|
||||||
|
*.perspectivev3
|
||||||
|
!default.perspectivev3
|
||||||
|
xcuserdata
|
||||||
|
*.xccheckout
|
||||||
|
*.moved-aside
|
||||||
|
DerivedData
|
||||||
|
*.hmap
|
||||||
|
*.ipa
|
||||||
|
*.xcuserstate
|
||||||
|
project.xcworkspace
|
||||||
|
|
||||||
|
# Android/IntelliJ
|
||||||
|
#
|
||||||
|
build/
|
||||||
|
.idea
|
||||||
|
.gradle
|
||||||
|
local.properties
|
||||||
|
*.iml
|
||||||
|
*.hprof
|
||||||
|
|
||||||
|
# node.js
|
||||||
|
#
|
||||||
|
node_modules/
|
||||||
|
npm-debug.log
|
||||||
|
yarn-error.log
|
||||||
|
|
||||||
|
# BUCK
|
||||||
|
buck-out/
|
||||||
|
\.buckd/
|
||||||
|
*.keystore
|
||||||
|
!debug.keystore
|
||||||
|
|
||||||
|
# Bundle artifacts
|
||||||
|
*.jsbundle
|
||||||
|
|
||||||
|
# CocoaPods
|
||||||
|
/ios/Pods/
|
||||||
|
|
||||||
|
# Expo
|
||||||
|
.expo/
|
||||||
|
web-build/
|
||||||
|
dist/
|
||||||
|
|
||||||
|
# @end expo-cli
|
||||||
@@ -1,14 +1,11 @@
|
|||||||
{
|
{
|
||||||
"expo": {
|
"expo": {
|
||||||
"name": "stickers",
|
"icon": "https://icogen.vercel.app/api/icon",
|
||||||
"icon": "https://github.com/expo.png",
|
|
||||||
"platforms": ["ios"],
|
|
||||||
"plugins": [
|
"plugins": [
|
||||||
[
|
[
|
||||||
"@config-plugins/ios-stickers",
|
"@config-plugins/ios-stickers",
|
||||||
{
|
{
|
||||||
"name": "Stickers",
|
"name": "Stickers",
|
||||||
"stickerBundleId": "dev.bacon.iosstickers.stickers",
|
|
||||||
"icon": "./assets/imessage-icon.png",
|
"icon": "./assets/imessage-icon.png",
|
||||||
"columns": 4,
|
"columns": 4,
|
||||||
"stickers": [
|
"stickers": [
|
||||||
@@ -25,8 +22,7 @@
|
|||||||
"./assets/stickers/teapot.png"
|
"./assets/stickers/teapot.png"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
],
|
]
|
||||||
["expo-build-properties", { "ios": { "ccacheEnabled": true } }]
|
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
module.exports = function(api) {
|
||||||
|
api.cache(true);
|
||||||
|
return {
|
||||||
|
presets: ['babel-preset-expo'],
|
||||||
|
};
|
||||||
|
};
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
// Learn more https://docs.expo.io/guides/customizing-metro
|
||||||
|
const { getDefaultConfig } = require("@expo/metro-config");
|
||||||
|
|
||||||
|
const config = getDefaultConfig(__dirname);
|
||||||
|
|
||||||
|
module.exports = config;
|
||||||
@@ -4,16 +4,21 @@
|
|||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"start": "expo start --dev-client",
|
"start": "expo start --dev-client",
|
||||||
"prebuild": "expo prebuild -p ios --template ./expo-template-bare-minimum-50.0.17.tgz",
|
|
||||||
"ios": "expo run:ios",
|
"ios": "expo run:ios",
|
||||||
"android": "expo run:android"
|
"android": "expo run:android"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@config-plugins/ios-stickers": "*",
|
"@config-plugins/ios-stickers": "*",
|
||||||
"expo": "~53",
|
"expo": "^45.0.0",
|
||||||
"expo-splash-screen": "~0.30.7",
|
"expo-splash-screen": "~0.15.1",
|
||||||
"react": "19.0.0",
|
"react": "17.0.2",
|
||||||
"react-native": "0.79.2"
|
"react-native": "0.68.2",
|
||||||
|
"expo-status-bar": "~1.3.0",
|
||||||
|
"react-dom": "17.0.2",
|
||||||
|
"react-native-web": "0.17.7"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@babel/core": "^7.12.9"
|
||||||
},
|
},
|
||||||
"private": true
|
"private": true
|
||||||
}
|
}
|
||||||
@@ -1,3 +1,4 @@
|
|||||||
|
import React from "react";
|
||||||
import { Text, View } from "react-native";
|
import { Text, View } from "react-native";
|
||||||
|
|
||||||
export default function App() {
|
export default function App() {
|
||||||
|
|||||||
@@ -0,0 +1,80 @@
|
|||||||
|
node_modules/**/*
|
||||||
|
.expo/*
|
||||||
|
npm-debug.*
|
||||||
|
*.jks
|
||||||
|
*.p8
|
||||||
|
*.p12
|
||||||
|
*.key
|
||||||
|
*.mobileprovision
|
||||||
|
*.orig.*
|
||||||
|
web-build/
|
||||||
|
|
||||||
|
# macOS
|
||||||
|
.DS_Store
|
||||||
|
|
||||||
|
|
||||||
|
/artifacts
|
||||||
|
|
||||||
|
/scripts/start.command
|
||||||
|
/ios
|
||||||
|
/android
|
||||||
|
# @generated expo-cli sync-e7dcf75f4e856f7b6f3239b3f3a7dd614ee755a8
|
||||||
|
# The following patterns were generated by expo-cli
|
||||||
|
|
||||||
|
# OSX
|
||||||
|
#
|
||||||
|
.DS_Store
|
||||||
|
|
||||||
|
# Xcode
|
||||||
|
#
|
||||||
|
build/
|
||||||
|
*.pbxuser
|
||||||
|
!default.pbxuser
|
||||||
|
*.mode1v3
|
||||||
|
!default.mode1v3
|
||||||
|
*.mode2v3
|
||||||
|
!default.mode2v3
|
||||||
|
*.perspectivev3
|
||||||
|
!default.perspectivev3
|
||||||
|
xcuserdata
|
||||||
|
*.xccheckout
|
||||||
|
*.moved-aside
|
||||||
|
DerivedData
|
||||||
|
*.hmap
|
||||||
|
*.ipa
|
||||||
|
*.xcuserstate
|
||||||
|
project.xcworkspace
|
||||||
|
|
||||||
|
# Android/IntelliJ
|
||||||
|
#
|
||||||
|
build/
|
||||||
|
.idea
|
||||||
|
.gradle
|
||||||
|
local.properties
|
||||||
|
*.iml
|
||||||
|
*.hprof
|
||||||
|
|
||||||
|
# node.js
|
||||||
|
#
|
||||||
|
node_modules/
|
||||||
|
npm-debug.log
|
||||||
|
yarn-error.log
|
||||||
|
|
||||||
|
# BUCK
|
||||||
|
buck-out/
|
||||||
|
\.buckd/
|
||||||
|
*.keystore
|
||||||
|
!debug.keystore
|
||||||
|
|
||||||
|
# Bundle artifacts
|
||||||
|
*.jsbundle
|
||||||
|
|
||||||
|
# CocoaPods
|
||||||
|
/ios/Pods/
|
||||||
|
|
||||||
|
# Expo
|
||||||
|
.expo/
|
||||||
|
web-build/
|
||||||
|
dist/
|
||||||
|
|
||||||
|
# @end expo-cli
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
const path = require("path");
|
||||||
|
const folderName = path.basename(__dirname);
|
||||||
|
const cleanName = folderName.replace(/[_\s-]/g, "");
|
||||||
|
const appId = "dev.bacon." + cleanName;
|
||||||
|
|
||||||
|
module.exports = ({ config }) => {
|
||||||
|
if (!config.extra) config.extra = {};
|
||||||
|
// Expose CI env variables to the app
|
||||||
|
config.extra.CI = process.env.CI;
|
||||||
|
|
||||||
|
if (!config.ios) config.ios = {};
|
||||||
|
config.ios.bundleIdentifier = appId;
|
||||||
|
if (!config.android) config.android = {};
|
||||||
|
config.android.package = appId;
|
||||||
|
return config;
|
||||||
|
};
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"expo": {
|
||||||
|
"icon": "https://icogen.vercel.app/api/icon?icon=1f9b7&color_hex=0000ff",
|
||||||
|
"plugins": [
|
||||||
|
"@config-plugins/react-native-ble-plx"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
module.exports = function(api) {
|
||||||
|
api.cache(true);
|
||||||
|
return {
|
||||||
|
presets: ['babel-preset-expo'],
|
||||||
|
};
|
||||||
|
};
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
// Learn more https://docs.expo.io/guides/customizing-metro
|
||||||
|
const { getDefaultConfig } = require("@expo/metro-config");
|
||||||
|
|
||||||
|
const config = getDefaultConfig(__dirname);
|
||||||
|
|
||||||
|
module.exports = config;
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
{
|
||||||
|
"name": "@config-plugins-app/react-native-ble-plx",
|
||||||
|
"main": "./index.js",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"scripts": {
|
||||||
|
"start": "expo start --dev-client",
|
||||||
|
"ios": "expo run:ios",
|
||||||
|
"android": "expo run:android"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"@config-plugins/react-native-ble-plx": "*",
|
||||||
|
"expo": "^45.0.0",
|
||||||
|
"expo-splash-screen": "~0.15.1",
|
||||||
|
"react": "17.0.2",
|
||||||
|
"react-native": "0.68.2",
|
||||||
|
"react-native-ble-plx": "^2.0.3",
|
||||||
|
"expo-status-bar": "~1.3.0",
|
||||||
|
"react-dom": "17.0.2",
|
||||||
|
"react-native-web": "0.17.7"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@babel/core": "^7.12.9",
|
||||||
|
"@types/react": "~17.0.21",
|
||||||
|
"@types/react-native": "~0.64.12",
|
||||||
|
"typescript": "~4.3.5"
|
||||||
|
},
|
||||||
|
"private": true
|
||||||
|
}
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import { Text, View } from 'react-native';
|
||||||
|
|
||||||
|
import useBluetoothDevices, { useManager, useManagerState } from './useBluetoothDevices';
|
||||||
|
|
||||||
|
export default function App() {
|
||||||
|
const bleManager = useManager();
|
||||||
|
const state = useManagerState(bleManager);
|
||||||
|
|
||||||
|
console.log('Info:', state);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<View style={{flex: 1, justifyContent: 'center', alignItems: 'center', backgroundColor: 'blue'}}>
|
||||||
|
<Text style={{fontSize: 18, color: 'white'}}>State: {state}</Text>
|
||||||
|
{state === 'PoweredOn' && <DeviceScanner bleManager={bleManager} />}
|
||||||
|
</View>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
function DeviceScanner({ bleManager }) {
|
||||||
|
const [devices] = useBluetoothDevices(bleManager);
|
||||||
|
|
||||||
|
React.useEffect(() => {
|
||||||
|
console.log(devices);
|
||||||
|
}, [devices]);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<View>
|
||||||
|
{devices.filter(({name}) => name).map((device, index) => (<Text key={`-${index}`} style={{fontSize: 14, color: 'white'}}>{device.name}</Text>))}
|
||||||
|
</View>
|
||||||
|
)
|
||||||
|
}
|
||||||
@@ -0,0 +1,70 @@
|
|||||||
|
import { useEffect, useMemo, useRef, useState } from "react";
|
||||||
|
import { BleManager, State, Device } from "react-native-ble-plx";
|
||||||
|
import { uniqBy } from "lodash";
|
||||||
|
|
||||||
|
export function useManager() {
|
||||||
|
return useMemo(() => new BleManager(), []);
|
||||||
|
}
|
||||||
|
|
||||||
|
export function useManagerState(bleManager: BleManager): State | null {
|
||||||
|
const [state, setState] = useState<State | null>(null);
|
||||||
|
const isMounted = useMounted();
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (!bleManager) return;
|
||||||
|
|
||||||
|
bleManager.onStateChange((state) => {
|
||||||
|
if (isMounted.current) {
|
||||||
|
setState(state);
|
||||||
|
}
|
||||||
|
}, true);
|
||||||
|
}, [bleManager]);
|
||||||
|
|
||||||
|
return state;
|
||||||
|
}
|
||||||
|
|
||||||
|
function useMounted() {
|
||||||
|
const isMounted = useRef(true);
|
||||||
|
useEffect(() => {
|
||||||
|
isMounted.current = true;
|
||||||
|
return () => {
|
||||||
|
isMounted.current = false;
|
||||||
|
};
|
||||||
|
}, []);
|
||||||
|
return isMounted;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function useBluetoothDevices(
|
||||||
|
bleManager: BleManager
|
||||||
|
): [Device[], null | string] {
|
||||||
|
const isMoutned = useMounted();
|
||||||
|
const [error, setError] = useState<string | null>(null);
|
||||||
|
const [devices, setDevices] = useState<Device[]>([]);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
bleManager.startDeviceScan(
|
||||||
|
[],
|
||||||
|
{ allowDuplicates: false },
|
||||||
|
(e, scannedDevice) => {
|
||||||
|
if (!isMoutned.current) return;
|
||||||
|
if (e) {
|
||||||
|
setError(e.message);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!scannedDevice) return;
|
||||||
|
|
||||||
|
setDevices((oldDevices) =>
|
||||||
|
uniqBy([...oldDevices, scannedDevice], "id")
|
||||||
|
);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
return () => {
|
||||||
|
bleManager.stopDeviceScan();
|
||||||
|
};
|
||||||
|
}, [bleManager]);
|
||||||
|
|
||||||
|
return [devices, error];
|
||||||
|
}
|
||||||
|
|
||||||
|
export default useBluetoothDevices;
|
||||||
@@ -0,0 +1,80 @@
|
|||||||
|
node_modules/**/*
|
||||||
|
.expo/*
|
||||||
|
npm-debug.*
|
||||||
|
*.jks
|
||||||
|
*.p8
|
||||||
|
*.p12
|
||||||
|
*.key
|
||||||
|
*.mobileprovision
|
||||||
|
*.orig.*
|
||||||
|
web-build/
|
||||||
|
|
||||||
|
# macOS
|
||||||
|
.DS_Store
|
||||||
|
|
||||||
|
|
||||||
|
/artifacts
|
||||||
|
|
||||||
|
/scripts/start.command
|
||||||
|
/ios
|
||||||
|
/android
|
||||||
|
# @generated expo-cli sync-e7dcf75f4e856f7b6f3239b3f3a7dd614ee755a8
|
||||||
|
# The following patterns were generated by expo-cli
|
||||||
|
|
||||||
|
# OSX
|
||||||
|
#
|
||||||
|
.DS_Store
|
||||||
|
|
||||||
|
# Xcode
|
||||||
|
#
|
||||||
|
build/
|
||||||
|
*.pbxuser
|
||||||
|
!default.pbxuser
|
||||||
|
*.mode1v3
|
||||||
|
!default.mode1v3
|
||||||
|
*.mode2v3
|
||||||
|
!default.mode2v3
|
||||||
|
*.perspectivev3
|
||||||
|
!default.perspectivev3
|
||||||
|
xcuserdata
|
||||||
|
*.xccheckout
|
||||||
|
*.moved-aside
|
||||||
|
DerivedData
|
||||||
|
*.hmap
|
||||||
|
*.ipa
|
||||||
|
*.xcuserstate
|
||||||
|
project.xcworkspace
|
||||||
|
|
||||||
|
# Android/IntelliJ
|
||||||
|
#
|
||||||
|
build/
|
||||||
|
.idea
|
||||||
|
.gradle
|
||||||
|
local.properties
|
||||||
|
*.iml
|
||||||
|
*.hprof
|
||||||
|
|
||||||
|
# node.js
|
||||||
|
#
|
||||||
|
node_modules/
|
||||||
|
npm-debug.log
|
||||||
|
yarn-error.log
|
||||||
|
|
||||||
|
# BUCK
|
||||||
|
buck-out/
|
||||||
|
\.buckd/
|
||||||
|
*.keystore
|
||||||
|
!debug.keystore
|
||||||
|
|
||||||
|
# Bundle artifacts
|
||||||
|
*.jsbundle
|
||||||
|
|
||||||
|
# CocoaPods
|
||||||
|
/ios/Pods/
|
||||||
|
|
||||||
|
# Expo
|
||||||
|
.expo/
|
||||||
|
web-build/
|
||||||
|
dist/
|
||||||
|
|
||||||
|
# @end expo-cli
|
||||||
@@ -1,10 +1,6 @@
|
|||||||
{
|
{
|
||||||
"expo": {
|
"expo": {
|
||||||
"name": "branch",
|
"icon": "https://icogen.vercel.app/api/icon?icon=1f334",
|
||||||
"icon": "https://github.com/expo.png",
|
|
||||||
"splash": {
|
|
||||||
"image": "https://github.com/expo.png"
|
|
||||||
},
|
|
||||||
"ios": {
|
"ios": {
|
||||||
"config": {
|
"config": {
|
||||||
"branch": {
|
"branch": {
|
||||||
@@ -20,8 +16,7 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"plugins": [
|
"plugins": [
|
||||||
"@config-plugins/react-native-branch",
|
"@config-plugins/react-native-branch"
|
||||||
["expo-build-properties", { "ios": { "ccacheEnabled": true } }]
|
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
module.exports = function(api) {
|
||||||
|
api.cache(true);
|
||||||
|
return {
|
||||||
|
presets: ['babel-preset-expo'],
|
||||||
|
};
|
||||||
|
};
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
// Learn more https://docs.expo.io/guides/customizing-metro
|
||||||
|
const { getDefaultConfig } = require("@expo/metro-config");
|
||||||
|
|
||||||
|
const config = getDefaultConfig(__dirname);
|
||||||
|
|
||||||
|
module.exports = config;
|
||||||
@@ -9,11 +9,17 @@
|
|||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@config-plugins/react-native-branch": "*",
|
"@config-plugins/react-native-branch": "*",
|
||||||
"expo": "~53",
|
"expo": "^45.0.0",
|
||||||
"expo-splash-screen": "~0.30.7",
|
"expo-splash-screen": "~0.15.1",
|
||||||
"react": "19.0.0",
|
"react": "17.0.2",
|
||||||
"react-native": "0.79.2",
|
"react-native": "0.68.2",
|
||||||
"react-native-branch": "^6.6.0"
|
"react-native-branch": "^5.4.0",
|
||||||
|
"expo-status-bar": "~1.3.0",
|
||||||
|
"react-dom": "17.0.2",
|
||||||
|
"react-native-web": "0.17.7"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@babel/core": "^7.12.9"
|
||||||
},
|
},
|
||||||
"private": true
|
"private": true
|
||||||
}
|
}
|
||||||
@@ -1,3 +1,4 @@
|
|||||||
|
import React from "react";
|
||||||
import { Text, View } from "react-native";
|
import { Text, View } from "react-native";
|
||||||
|
|
||||||
export default function App() {
|
export default function App() {
|
||||||
|
|||||||
@@ -0,0 +1,80 @@
|
|||||||
|
node_modules/**/*
|
||||||
|
.expo/*
|
||||||
|
npm-debug.*
|
||||||
|
*.jks
|
||||||
|
*.p8
|
||||||
|
*.p12
|
||||||
|
*.key
|
||||||
|
*.mobileprovision
|
||||||
|
*.orig.*
|
||||||
|
web-build/
|
||||||
|
|
||||||
|
# macOS
|
||||||
|
.DS_Store
|
||||||
|
|
||||||
|
|
||||||
|
/artifacts
|
||||||
|
|
||||||
|
/scripts/start.command
|
||||||
|
/ios
|
||||||
|
/android
|
||||||
|
# @generated expo-cli sync-e7dcf75f4e856f7b6f3239b3f3a7dd614ee755a8
|
||||||
|
# The following patterns were generated by expo-cli
|
||||||
|
|
||||||
|
# OSX
|
||||||
|
#
|
||||||
|
.DS_Store
|
||||||
|
|
||||||
|
# Xcode
|
||||||
|
#
|
||||||
|
build/
|
||||||
|
*.pbxuser
|
||||||
|
!default.pbxuser
|
||||||
|
*.mode1v3
|
||||||
|
!default.mode1v3
|
||||||
|
*.mode2v3
|
||||||
|
!default.mode2v3
|
||||||
|
*.perspectivev3
|
||||||
|
!default.perspectivev3
|
||||||
|
xcuserdata
|
||||||
|
*.xccheckout
|
||||||
|
*.moved-aside
|
||||||
|
DerivedData
|
||||||
|
*.hmap
|
||||||
|
*.ipa
|
||||||
|
*.xcuserstate
|
||||||
|
project.xcworkspace
|
||||||
|
|
||||||
|
# Android/IntelliJ
|
||||||
|
#
|
||||||
|
build/
|
||||||
|
.idea
|
||||||
|
.gradle
|
||||||
|
local.properties
|
||||||
|
*.iml
|
||||||
|
*.hprof
|
||||||
|
|
||||||
|
# node.js
|
||||||
|
#
|
||||||
|
node_modules/
|
||||||
|
npm-debug.log
|
||||||
|
yarn-error.log
|
||||||
|
|
||||||
|
# BUCK
|
||||||
|
buck-out/
|
||||||
|
\.buckd/
|
||||||
|
*.keystore
|
||||||
|
!debug.keystore
|
||||||
|
|
||||||
|
# Bundle artifacts
|
||||||
|
*.jsbundle
|
||||||
|
|
||||||
|
# CocoaPods
|
||||||
|
/ios/Pods/
|
||||||
|
|
||||||
|
# Expo
|
||||||
|
.expo/
|
||||||
|
web-build/
|
||||||
|
dist/
|
||||||
|
|
||||||
|
# @end expo-cli
|
||||||
@@ -1,11 +1,6 @@
|
|||||||
{
|
{
|
||||||
"expo": {
|
"expo": {
|
||||||
"name": "app-icon",
|
|
||||||
"icon": "./assets/icons/winter.png",
|
"icon": "./assets/icons/winter.png",
|
||||||
"platforms": ["ios"],
|
|
||||||
"ios": {
|
|
||||||
"supportsTablet": true
|
|
||||||
},
|
|
||||||
"plugins": [
|
"plugins": [
|
||||||
[
|
[
|
||||||
"@config-plugins/react-native-dynamic-app-icon",
|
"@config-plugins/react-native-dynamic-app-icon",
|
||||||
@@ -16,8 +11,7 @@
|
|||||||
"./assets/icons/fall.png",
|
"./assets/icons/fall.png",
|
||||||
"./assets/icons/solstice.png"
|
"./assets/icons/solstice.png"
|
||||||
]
|
]
|
||||||
],
|
]
|
||||||
["expo-build-properties", { "ios": { "ccacheEnabled": true } }]
|
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
module.exports = function(api) {
|
||||||
|
api.cache(true);
|
||||||
|
return {
|
||||||
|
presets: ['babel-preset-expo'],
|
||||||
|
};
|
||||||
|
};
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
// Learn more https://docs.expo.io/guides/customizing-metro
|
||||||
|
const { getDefaultConfig } = require("@expo/metro-config");
|
||||||
|
|
||||||
|
const config = getDefaultConfig(__dirname);
|
||||||
|
|
||||||
|
module.exports = config;
|
||||||
@@ -9,11 +9,17 @@
|
|||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@config-plugins/react-native-dynamic-app-icon": "*",
|
"@config-plugins/react-native-dynamic-app-icon": "*",
|
||||||
"expo": "~53",
|
"expo": "^45.0.0",
|
||||||
"expo-splash-screen": "~0.30.7",
|
"expo-splash-screen": "~0.15.1",
|
||||||
"react": "19.0.0",
|
"react": "17.0.2",
|
||||||
"react-native": "0.79.2",
|
"react-native": "0.68.2",
|
||||||
"react-native-dynamic-app-icon": "^1.1.0"
|
"react-native-dynamic-app-icon": "^1.1.0",
|
||||||
|
"expo-status-bar": "~1.3.0",
|
||||||
|
"react-dom": "17.0.2",
|
||||||
|
"react-native-web": "0.17.7"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@babel/core": "^7.12.9"
|
||||||
},
|
},
|
||||||
"private": true
|
"private": true
|
||||||
}
|
}
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
{
|
|
||||||
"compilerOptions": {},
|
|
||||||
"extends": "expo/tsconfig.base"
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,80 @@
|
|||||||
|
node_modules/**/*
|
||||||
|
.expo/*
|
||||||
|
npm-debug.*
|
||||||
|
*.jks
|
||||||
|
*.p8
|
||||||
|
*.p12
|
||||||
|
*.key
|
||||||
|
*.mobileprovision
|
||||||
|
*.orig.*
|
||||||
|
web-build/
|
||||||
|
|
||||||
|
# macOS
|
||||||
|
.DS_Store
|
||||||
|
|
||||||
|
|
||||||
|
/artifacts
|
||||||
|
|
||||||
|
/scripts/start.command
|
||||||
|
/ios
|
||||||
|
/android
|
||||||
|
# @generated expo-cli sync-e7dcf75f4e856f7b6f3239b3f3a7dd614ee755a8
|
||||||
|
# The following patterns were generated by expo-cli
|
||||||
|
|
||||||
|
# OSX
|
||||||
|
#
|
||||||
|
.DS_Store
|
||||||
|
|
||||||
|
# Xcode
|
||||||
|
#
|
||||||
|
build/
|
||||||
|
*.pbxuser
|
||||||
|
!default.pbxuser
|
||||||
|
*.mode1v3
|
||||||
|
!default.mode1v3
|
||||||
|
*.mode2v3
|
||||||
|
!default.mode2v3
|
||||||
|
*.perspectivev3
|
||||||
|
!default.perspectivev3
|
||||||
|
xcuserdata
|
||||||
|
*.xccheckout
|
||||||
|
*.moved-aside
|
||||||
|
DerivedData
|
||||||
|
*.hmap
|
||||||
|
*.ipa
|
||||||
|
*.xcuserstate
|
||||||
|
project.xcworkspace
|
||||||
|
|
||||||
|
# Android/IntelliJ
|
||||||
|
#
|
||||||
|
build/
|
||||||
|
.idea
|
||||||
|
.gradle
|
||||||
|
local.properties
|
||||||
|
*.iml
|
||||||
|
*.hprof
|
||||||
|
|
||||||
|
# node.js
|
||||||
|
#
|
||||||
|
node_modules/
|
||||||
|
npm-debug.log
|
||||||
|
yarn-error.log
|
||||||
|
|
||||||
|
# BUCK
|
||||||
|
buck-out/
|
||||||
|
\.buckd/
|
||||||
|
*.keystore
|
||||||
|
!debug.keystore
|
||||||
|
|
||||||
|
# Bundle artifacts
|
||||||
|
*.jsbundle
|
||||||
|
|
||||||
|
# CocoaPods
|
||||||
|
/ios/Pods/
|
||||||
|
|
||||||
|
# Expo
|
||||||
|
.expo/
|
||||||
|
web-build/
|
||||||
|
dist/
|
||||||
|
|
||||||
|
# @end expo-cli
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
const path = require("path");
|
||||||
|
const folderName = path.basename(__dirname);
|
||||||
|
const cleanName = folderName.replace(/[_\s-]/g, "");
|
||||||
|
const appId = "dev.bacon." + cleanName;
|
||||||
|
|
||||||
|
module.exports = ({ config }) => {
|
||||||
|
if (!config.extra) config.extra = {};
|
||||||
|
// Expose CI env variables to the app
|
||||||
|
config.extra.CI = process.env.CI;
|
||||||
|
|
||||||
|
if (!config.ios) config.ios = {};
|
||||||
|
config.ios.bundleIdentifier = appId;
|
||||||
|
if (!config.android) config.android = {};
|
||||||
|
config.android.package = appId;
|
||||||
|
return config;
|
||||||
|
};
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"expo": {
|
||||||
|
"icon": "https://icogen.vercel.app/api/icon",
|
||||||
|
"plugins": [
|
||||||
|
"@config-plugins/react-native-google-cast"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
module.exports = function(api) {
|
||||||
|
api.cache(true);
|
||||||
|
return {
|
||||||
|
presets: ['babel-preset-expo'],
|
||||||
|
};
|
||||||
|
};
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
import { registerRootComponent } from "expo";
|
||||||
|
|
||||||
|
import App from "./src/App";
|
||||||
|
|
||||||
|
registerRootComponent(App);
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
// Learn more https://docs.expo.io/guides/customizing-metro
|
||||||
|
const { getDefaultConfig } = require("@expo/metro-config");
|
||||||
|
|
||||||
|
const config = getDefaultConfig(__dirname);
|
||||||
|
|
||||||
|
module.exports = config;
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
{
|
||||||
|
"name": "@config-plugins-app/react-native-google-cast",
|
||||||
|
"main": "./index.js",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"scripts": {
|
||||||
|
"start": "expo start --dev-client",
|
||||||
|
"ios": "expo run:ios",
|
||||||
|
"android": "expo run:android"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"@config-plugins/react-native-google-cast": "*",
|
||||||
|
"expo": "^45.0.0",
|
||||||
|
"expo-splash-screen": "~0.15.1",
|
||||||
|
"react": "17.0.2",
|
||||||
|
"react-native": "0.68.2",
|
||||||
|
"react-native-google-cast": "^4.1.2",
|
||||||
|
"expo-status-bar": "~1.3.0",
|
||||||
|
"react-dom": "17.0.2",
|
||||||
|
"react-native-web": "0.17.7"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@babel/core": "^7.12.9"
|
||||||
|
},
|
||||||
|
"private": true
|
||||||
|
}
|
||||||
@@ -0,0 +1,86 @@
|
|||||||
|
import React from "react";
|
||||||
|
import { View, Text, Button } from "react-native";
|
||||||
|
import GoogleCast, {
|
||||||
|
CastState,
|
||||||
|
CastButton,
|
||||||
|
useCastState,
|
||||||
|
useRemoteMediaClient,
|
||||||
|
} from "react-native-google-cast";
|
||||||
|
|
||||||
|
export default function HomeScreen() {
|
||||||
|
const castState = useCastState();
|
||||||
|
const client = useRemoteMediaClient();
|
||||||
|
|
||||||
|
GoogleCast.showIntroductoryOverlay();
|
||||||
|
|
||||||
|
const isConnected = castState === CastState.CONNECTED;
|
||||||
|
|
||||||
|
function cast() {
|
||||||
|
client
|
||||||
|
.loadMedia({
|
||||||
|
mediaInfo: {
|
||||||
|
contentUrl:
|
||||||
|
"https://commondatastorage.googleapis.com/gtv-videos-bucket/CastVideos/mp4/BigBuckBunny.mp4",
|
||||||
|
contentType: "video/mp4",
|
||||||
|
metadata: {
|
||||||
|
images: [
|
||||||
|
{
|
||||||
|
url: "https://commondatastorage.googleapis.com/gtv-videos-bucket/CastVideos/images/480x270/BigBuckBunny.jpg",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
title: "Big Buck Bunny",
|
||||||
|
subtitle:
|
||||||
|
"A large and lovable rabbit deals with three tiny bullies, led by a flying squirrel, who are determined to squelch his happiness.",
|
||||||
|
studio: "Blender Foundation",
|
||||||
|
type: "movie",
|
||||||
|
},
|
||||||
|
streamDuration: 596, // seconds
|
||||||
|
},
|
||||||
|
startTime: 10, // seconds
|
||||||
|
})
|
||||||
|
.then(console.log)
|
||||||
|
.catch(console.warn);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<View style={{ flex: 1, justifyContent: "center", alignItems: "center" }}>
|
||||||
|
<Text>State: {castState}</Text>
|
||||||
|
<CastButton style={{ width: 24, height: 24 }} />
|
||||||
|
<Button
|
||||||
|
title="Overlay"
|
||||||
|
onPress={() => {
|
||||||
|
GoogleCast.showIntroductoryOverlay();
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
<Button
|
||||||
|
title="Expanded Controls"
|
||||||
|
onPress={() => {
|
||||||
|
GoogleCast.showExpandedControls();
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
|
||||||
|
<Button
|
||||||
|
title="Cast"
|
||||||
|
disabled={!isConnected}
|
||||||
|
onPress={() => {
|
||||||
|
cast();
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
<Button
|
||||||
|
title="Pause"
|
||||||
|
disabled={!isConnected}
|
||||||
|
onPress={() => {
|
||||||
|
// cast()
|
||||||
|
client.pause();
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
<Button
|
||||||
|
title="Disconnect"
|
||||||
|
disabled={!isConnected}
|
||||||
|
onPress={() => {
|
||||||
|
GoogleCast.sessionManager.endCurrentSession(true);
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</View>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -0,0 +1,80 @@
|
|||||||
|
node_modules/**/*
|
||||||
|
.expo/*
|
||||||
|
npm-debug.*
|
||||||
|
*.jks
|
||||||
|
*.p8
|
||||||
|
*.p12
|
||||||
|
*.key
|
||||||
|
*.mobileprovision
|
||||||
|
*.orig.*
|
||||||
|
web-build/
|
||||||
|
|
||||||
|
# macOS
|
||||||
|
.DS_Store
|
||||||
|
|
||||||
|
|
||||||
|
/artifacts
|
||||||
|
|
||||||
|
/scripts/start.command
|
||||||
|
/ios
|
||||||
|
/android
|
||||||
|
# @generated expo-cli sync-e7dcf75f4e856f7b6f3239b3f3a7dd614ee755a8
|
||||||
|
# The following patterns were generated by expo-cli
|
||||||
|
|
||||||
|
# OSX
|
||||||
|
#
|
||||||
|
.DS_Store
|
||||||
|
|
||||||
|
# Xcode
|
||||||
|
#
|
||||||
|
build/
|
||||||
|
*.pbxuser
|
||||||
|
!default.pbxuser
|
||||||
|
*.mode1v3
|
||||||
|
!default.mode1v3
|
||||||
|
*.mode2v3
|
||||||
|
!default.mode2v3
|
||||||
|
*.perspectivev3
|
||||||
|
!default.perspectivev3
|
||||||
|
xcuserdata
|
||||||
|
*.xccheckout
|
||||||
|
*.moved-aside
|
||||||
|
DerivedData
|
||||||
|
*.hmap
|
||||||
|
*.ipa
|
||||||
|
*.xcuserstate
|
||||||
|
project.xcworkspace
|
||||||
|
|
||||||
|
# Android/IntelliJ
|
||||||
|
#
|
||||||
|
build/
|
||||||
|
.idea
|
||||||
|
.gradle
|
||||||
|
local.properties
|
||||||
|
*.iml
|
||||||
|
*.hprof
|
||||||
|
|
||||||
|
# node.js
|
||||||
|
#
|
||||||
|
node_modules/
|
||||||
|
npm-debug.log
|
||||||
|
yarn-error.log
|
||||||
|
|
||||||
|
# BUCK
|
||||||
|
buck-out/
|
||||||
|
\.buckd/
|
||||||
|
*.keystore
|
||||||
|
!debug.keystore
|
||||||
|
|
||||||
|
# Bundle artifacts
|
||||||
|
*.jsbundle
|
||||||
|
|
||||||
|
# CocoaPods
|
||||||
|
/ios/Pods/
|
||||||
|
|
||||||
|
# Expo
|
||||||
|
.expo/
|
||||||
|
web-build/
|
||||||
|
dist/
|
||||||
|
|
||||||
|
# @end expo-cli
|
||||||