main defc08c12fe7 cached
239 files
528.8 KB
137.6k tokens
617 symbols
1 requests
Download .txt
Showing preview only (592K chars total). Download the full file or copy to clipboard to get everything.
Repository: baronha/react-native-multiple-image-picker
Branch: main
Commit: defc08c12fe7
Files: 239
Total size: 528.8 KB

Directory structure:
gitextract_k5e7rspq/

├── .circleci/
│   └── config.yml
├── .github/
│   ├── FUNDING.yml
│   └── workflows/
│       └── docs.yml
├── .gitignore
├── .npmignore
├── CONTRIBUTING.md
├── LICENSE
├── MultipleImagePicker.podspec
├── README.md
├── android/
│   ├── CMakeLists.txt
│   ├── build.gradle
│   ├── gradle.properties
│   └── src/
│       └── main/
│           ├── AndroidManifest.xml
│           ├── cpp/
│           │   └── cpp-adapter.cpp
│           ├── java/
│           │   └── com/
│           │       └── margelo/
│           │           └── nitro/
│           │               └── multipleimagepicker/
│           │                   ├── CameraEngine.kt
│           │                   ├── Constant.kt
│           │                   ├── CropEngine.kt
│           │                   ├── ExoPlayerEngine.kt
│           │                   ├── GlideEngine.kt
│           │                   ├── ImageLoaderUtils.kt
│           │                   ├── LoadingDialog.kt
│           │                   ├── MultipleImagePicker.kt
│           │                   ├── MultipleImagePickerImp.kt
│           │                   ├── MultipleImagePickerPackage.java
│           │                   ├── PictureSelectorEngineImp.kt
│           │                   └── VideoThumbnailEngine.kt
│           └── res/
│               ├── anim/
│               │   └── anim_modal_in.xml
│               ├── drawable/
│               │   ├── checkbox_selector.xml
│               │   ├── complete_button.xml
│               │   ├── ic_checkmark.xml
│               │   ├── ic_down.xml
│               │   ├── num_oval.xml
│               │   ├── picture_not_selected.xml
│               │   ├── picture_selector.xml
│               │   ├── preview_gallery_item.xml
│               │   └── preview_gallery_white_bg.xml
│               ├── layout/
│               │   └── loading_dialog.xml
│               └── values/
│                   ├── colors.xml
│                   └── styles.xml
├── babel.config.js
├── docs/
│   ├── .gitignore
│   ├── docs/
│   │   ├── CAMERA.mdx
│   │   ├── CONFIG.mdx
│   │   ├── CROP.mdx
│   │   ├── GETTING_STARTED.mdx
│   │   ├── PREVIEW.mdx
│   │   ├── RESULT.mdx
│   │   ├── SHOWCASE/
│   │   │   ├── index.mdx
│   │   │   ├── showcase.css
│   │   │   └── showcase.json
│   │   ├── USAGE.mdx
│   │   └── index.md
│   ├── docusaurus.config.ts
│   ├── package.json
│   ├── patches/
│   │   └── @gorhom+docusaurus-preset+1.0.2.patch
│   ├── sidebars.ts
│   ├── src/
│   │   └── css/
│   │       └── custom.css
│   ├── static/
│   │   └── .nojekyll
│   └── tsconfig.json
├── example/
│   ├── .gitignore
│   ├── App.tsx
│   ├── Gemfile
│   ├── README.md
│   ├── app.json
│   ├── babel.config.js
│   ├── metro.config.js
│   ├── package.json
│   ├── react-native.config.js
│   ├── src/
│   │   ├── assets/
│   │   │   └── index.ts
│   │   ├── common/
│   │   │   └── const.ts
│   │   ├── components/
│   │   │   ├── BottomSheet.tsx
│   │   │   ├── Button.tsx
│   │   │   ├── CheckBox.tsx
│   │   │   ├── CodeTag.tsx
│   │   │   ├── Container.tsx
│   │   │   ├── CounterView.tsx
│   │   │   ├── Divider.tsx
│   │   │   ├── Input.tsx
│   │   │   ├── Row.tsx
│   │   │   ├── SectionView.tsx
│   │   │   ├── SegmentControl.tsx
│   │   │   ├── Text.tsx
│   │   │   ├── View.tsx
│   │   │   └── index.tsx
│   │   ├── hook/
│   │   │   ├── context.ts
│   │   │   ├── index.ts
│   │   │   └── useTheme.ts
│   │   ├── index.tsx
│   │   └── theme/
│   │       ├── color.ts
│   │       └── size.ts
│   └── tsconfig.json
├── ios/
│   ├── Assets.swift
│   ├── Assets.xcassets/
│   │   ├── Contents.json
│   │   └── close.imageset/
│   │       └── Contents.json
│   ├── ErrorCode.swift
│   ├── HybridMultipleImagePicker+Camera.swift
│   ├── HybridMultipleImagePicker+Config.swift
│   ├── HybridMultipleImagePicker+Crop.swift
│   ├── HybridMultipleImagePicker+Preview.swift
│   ├── HybridMultipleImagePicker+Result.swift
│   ├── HybridMultipleImagePicker.swift
│   ├── MultipleImagePickerOnLoad.mm
│   ├── PHAsset+Thumbnail.swift
│   ├── PhotoCancelItem.swift
│   ├── TopViewController.swift
│   ├── UIColor+Hex.swift
│   ├── UIColor+React.swift
│   ├── UIImage.swift
│   ├── URL+Mime.swift
│   └── Utils.swift
├── nitro.json
├── nitrogen/
│   └── generated/
│       ├── .gitattributes
│       ├── android/
│       │   ├── MultipleImagePicker+autolinking.cmake
│       │   ├── MultipleImagePicker+autolinking.gradle
│       │   ├── MultipleImagePickerOnLoad.cpp
│       │   ├── MultipleImagePickerOnLoad.hpp
│       │   ├── c++/
│       │   │   ├── JCameraDevice.hpp
│       │   │   ├── JCameraResult.hpp
│       │   │   ├── JCropRatio.hpp
│       │   │   ├── JCropResult.hpp
│       │   │   ├── JFunc_void_CameraResult.hpp
│       │   │   ├── JFunc_void_CropResult.hpp
│       │   │   ├── JFunc_void_double.hpp
│       │   │   ├── JFunc_void_std__vector_PickerResult_.hpp
│       │   │   ├── JHybridMultipleImagePickerSpec.cpp
│       │   │   ├── JHybridMultipleImagePickerSpec.hpp
│       │   │   ├── JLanguage.hpp
│       │   │   ├── JMediaPreview.hpp
│       │   │   ├── JMediaType.hpp
│       │   │   ├── JNitroCameraConfig.hpp
│       │   │   ├── JNitroConfig.hpp
│       │   │   ├── JNitroCropConfig.hpp
│       │   │   ├── JNitroPreviewConfig.hpp
│       │   │   ├── JPickerCameraConfig.hpp
│       │   │   ├── JPickerCropConfig.hpp
│       │   │   ├── JPickerResult.hpp
│       │   │   ├── JPresentation.hpp
│       │   │   ├── JResultType.hpp
│       │   │   ├── JSelectBoxStyle.hpp
│       │   │   ├── JSelectMode.hpp
│       │   │   ├── JText.hpp
│       │   │   └── JTheme.hpp
│       │   └── kotlin/
│       │       └── com/
│       │           └── margelo/
│       │               └── nitro/
│       │                   └── multipleimagepicker/
│       │                       ├── CameraDevice.kt
│       │                       ├── CameraResult.kt
│       │                       ├── CropRatio.kt
│       │                       ├── CropResult.kt
│       │                       ├── Func_void_CameraResult.kt
│       │                       ├── Func_void_CropResult.kt
│       │                       ├── Func_void_double.kt
│       │                       ├── Func_void_std__vector_PickerResult_.kt
│       │                       ├── HybridMultipleImagePickerSpec.kt
│       │                       ├── Language.kt
│       │                       ├── MediaPreview.kt
│       │                       ├── MediaType.kt
│       │                       ├── MultipleImagePickerOnLoad.kt
│       │                       ├── NitroCameraConfig.kt
│       │                       ├── NitroConfig.kt
│       │                       ├── NitroCropConfig.kt
│       │                       ├── NitroPreviewConfig.kt
│       │                       ├── PickerCameraConfig.kt
│       │                       ├── PickerCropConfig.kt
│       │                       ├── PickerResult.kt
│       │                       ├── Presentation.kt
│       │                       ├── ResultType.kt
│       │                       ├── SelectBoxStyle.kt
│       │                       ├── SelectMode.kt
│       │                       ├── Text.kt
│       │                       └── Theme.kt
│       ├── ios/
│       │   ├── MultipleImagePicker+autolinking.rb
│       │   ├── MultipleImagePicker-Swift-Cxx-Bridge.cpp
│       │   ├── MultipleImagePicker-Swift-Cxx-Bridge.hpp
│       │   ├── MultipleImagePicker-Swift-Cxx-Umbrella.hpp
│       │   ├── MultipleImagePickerAutolinking.mm
│       │   ├── MultipleImagePickerAutolinking.swift
│       │   ├── c++/
│       │   │   ├── HybridMultipleImagePickerSpecSwift.cpp
│       │   │   └── HybridMultipleImagePickerSpecSwift.hpp
│       │   └── swift/
│       │       ├── CameraDevice.swift
│       │       ├── CameraResult.swift
│       │       ├── CropRatio.swift
│       │       ├── CropResult.swift
│       │       ├── Func_void_CameraResult.swift
│       │       ├── Func_void_CropResult.swift
│       │       ├── Func_void_double.swift
│       │       ├── Func_void_std__vector_PickerResult_.swift
│       │       ├── HybridMultipleImagePickerSpec.swift
│       │       ├── HybridMultipleImagePickerSpec_cxx.swift
│       │       ├── Language.swift
│       │       ├── MediaPreview.swift
│       │       ├── MediaType.swift
│       │       ├── NitroCameraConfig.swift
│       │       ├── NitroConfig.swift
│       │       ├── NitroCropConfig.swift
│       │       ├── NitroPreviewConfig.swift
│       │       ├── PickerCameraConfig.swift
│       │       ├── PickerCropConfig.swift
│       │       ├── PickerResult.swift
│       │       ├── Presentation.swift
│       │       ├── ResultType.swift
│       │       ├── SelectBoxStyle.swift
│       │       ├── SelectMode.swift
│       │       ├── Text.swift
│       │       └── Theme.swift
│       └── shared/
│           └── c++/
│               ├── CameraDevice.hpp
│               ├── CameraResult.hpp
│               ├── CropRatio.hpp
│               ├── CropResult.hpp
│               ├── HybridMultipleImagePickerSpec.cpp
│               ├── HybridMultipleImagePickerSpec.hpp
│               ├── Language.hpp
│               ├── MediaPreview.hpp
│               ├── MediaType.hpp
│               ├── NitroCameraConfig.hpp
│               ├── NitroConfig.hpp
│               ├── NitroCropConfig.hpp
│               ├── NitroPreviewConfig.hpp
│               ├── PickerCameraConfig.hpp
│               ├── PickerCropConfig.hpp
│               ├── PickerResult.hpp
│               ├── Presentation.hpp
│               ├── ResultType.hpp
│               ├── SelectBoxStyle.hpp
│               ├── SelectMode.hpp
│               ├── Text.hpp
│               └── Theme.hpp
├── package.json
├── react-native.config.js
├── scripts/
│   └── bootstrap.js
├── src/
│   ├── index.ts
│   ├── specs/
│   │   └── MultipleImagePicker.nitro.ts
│   └── types/
│       ├── camera.ts
│       ├── config.ts
│       ├── crop.ts
│       ├── error.ts
│       ├── index.ts
│       ├── picker.ts
│       ├── preview.ts
│       └── result.ts
├── tsconfig.build.json
└── tsconfig.json

================================================
FILE CONTENTS
================================================

================================================
FILE: .circleci/config.yml
================================================
version: 2.1

executors:
  default:
    docker:
      - image: circleci/node:10
    working_directory: ~/project

commands:
  attach_project:
    steps:
      - attach_workspace:
          at: ~/project

jobs:
  install-dependencies:
    executor: default
    steps:
      - checkout
      - attach_project
      - restore_cache:
          keys:
            - dependencies-{{ checksum "package.json" }}
            - dependencies-
      - restore_cache:
          keys:
            - dependencies-example-{{ checksum "example/package.json" }}
            - dependencies-example-
      - run:
          name: Install dependencies
          command: |
            yarn install --cwd example --frozen-lockfile
            yarn install --frozen-lockfile
      - save_cache:
          key: dependencies-{{ checksum "package.json" }}
          paths: node_modules
      - save_cache:
          key: dependencies-example-{{ checksum "example/package.json" }}
          paths: example/node_modules
      - persist_to_workspace:
          root: .
          paths: .

  lint:
    executor: default
    steps:
      - attach_project
      - run:
          name: Lint files
          command: |
            yarn lint

  typescript:
    executor: default
    steps:
      - attach_project
      - run:
          name: Typecheck files
          command: |
            yarn typescript

  unit-tests:
    executor: default
    steps:
      - attach_project
      - run:
          name: Run unit tests
          command: |
            yarn test --coverage
      - store_artifacts:
          path: coverage
          destination: coverage

  build-package:
    executor: default
    steps:
      - attach_project
      - run:
          name: Build package
          command: |
            yarn prepare

workflows:
  build-and-test:
    jobs:
      - install-dependencies
      - lint:
          requires:
            - install-dependencies
      - typescript:
          requires:
            - install-dependencies
      - unit-tests:
          requires:
            - install-dependencies
      - build-package:
          requires:
            - install-dependencies


================================================
FILE: .github/FUNDING.yml
================================================
# These are supported funding model platforms

github: baronha
patreon: baronha
open_collective: # Replace with a single Open Collective username
ko_fi: baoha
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: # Replace with a single Liberapay username
issuehunt: # Replace with a single IssueHunt username
otechie: # Replace with a single Otechie username
lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry
custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']


================================================
FILE: .github/workflows/docs.yml
================================================
name: Deploy to GitHub Pages

on:
  push:
    branches:
      - main
    paths:
      - 'docs/**'
      
jobs:
  build:
    name: Build Docusaurus
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0
      - uses: actions/setup-node@v4
        with:
          node-version: 18
          cache: yarn

      - name: Install dependencies
        working-directory: docs
        run: yarn install --frozen-lockfile
      - name: Build docs
        working-directory: docs
        run: yarn build

      - name: Upload Build Artifact
        uses: actions/upload-pages-artifact@v3
        with:
          path: docs/build

  deploy:
    name: Deploy to GitHub Pages
    needs: build

    # Grant GITHUB_TOKEN the permissions required to make a Pages deployment
    permissions:
      pages: write # to deploy to Pages
      id-token: write # to verify the deployment originates from an appropriate source

    # Deploy to the github-pages environment
    environment:
      name: github-pages
      url: ${{ steps.deployment.outputs.page_url }}

    runs-on: ubuntu-latest
    steps:
      - name: Deploy to GitHub Pages
        id: deployment
        uses: actions/deploy-pages@v4


================================================
FILE: .gitignore
================================================
# OSX
#
.DS_Store

# XDE
.expo/

# VSCode
.vscode/
jsconfig.json

# 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/IJ
#
.classpath
.cxx
.gradle
.idea
.project
.settings
local.properties
android.iml

# Cocoapods
#
example/ios/Pods

# Ruby
example/vendor/

# node.js
#
node_modules/
npm-debug.log
yarn-debug.log
yarn-error.log

# BUCK
buck-out/
\.buckd/
android/app/libs
android/keystores/debug.keystore

# Yarn
.yarn/*
!.yarn/patches
!.yarn/plugins
!.yarn/releases
!.yarn/sdks
!.yarn/versions

# Expo
.expo/

# Turborepo
.turbo/

# generated by bob
lib/


================================================
FILE: .npmignore
================================================
example/
files/
node_modules/
npm-debug.log
package-lock.json


================================================
FILE: CONTRIBUTING.md
================================================
# Contributing

We want this community to be friendly and respectful to each other. Please follow it in all your interactions with the project.

## Development workflow

To get started with the project, run `yarn` in the root directory to install the required dependencies for each package:

```sh
yarn
```

While developing, you can run the [example app](/example/) to test your changes.

To start the packager:

```sh
yarn example start
```

To run the example app on Android:

```sh
yarn example android
```

To run the example app on iOS:

```sh
yarn example ios
```

Make sure your code passes TypeScript and ESLint. Run the following to verify:

```sh
yarn typescript
yarn lint
```

To fix formatting errors, run the following:

```sh
yarn lint --fix
```

Remember to add tests for your change if possible. Run the unit tests by:

```sh
yarn test
```

To edit the Objective-C files, open `example/ios/MultipleImagePickerExample.xcworkspace` in XCode and find the source files at `Pods > Development Pods > react-native-multiple-image-picker`.

To edit the Kotlin files, open `example/android` in Android studio and find the source files at `reactnativemultipleimagepicker` under `Android`.

### Commit message convention

We follow the [conventional commits specification](https://www.conventionalcommits.org/en) for our commit messages:

- `fix`: bug fixes, e.g. fix crash due to deprecated method.
- `feat`: new features, e.g. add new method to the module.
- `refactor`: code refactor, e.g. migrate from class components to hooks.
- `docs`: changes into documentation, e.g. add usage example for the module..
- `test`: adding or updating tests, e.g. add integration tests using detox.
- `chore`: tooling changes, e.g. change CI config.

Our pre-commit hooks verify that your commit message matches this format when committing.

### Linting and tests

[ESLint](https://eslint.org/), [Prettier](https://prettier.io/), [TypeScript](https://www.typescriptlang.org/)

We use [TypeScript](https://www.typescriptlang.org/) for type checking, [ESLint](https://eslint.org/) with [Prettier](https://prettier.io/) for linting and formatting the code, and [Jest](https://jestjs.io/) for testing.

Our pre-commit hooks verify that the linter and tests pass when committing.

### Scripts

The `package.json` file contains various scripts for common tasks:

- `yarn bootstrap`: setup project by installing all dependencies and pods.
- `yarn typescript`: type-check files with TypeScript.
- `yarn lint`: lint files with ESLint.
- `yarn test`: run unit tests with Jest.
- `yarn example start`: start the Metro server for the example app.
- `yarn example android`: run the example app on Android.
- `yarn example ios`: run the example app on iOS.

### Sending a pull request

> **Working on your first pull request?** You can learn how from this _free_ series: [How to Contribute to an Open Source Project on GitHub](https://egghead.io/series/how-to-contribute-to-an-open-source-project-on-github).

When you're sending a pull request:

- Prefer small pull requests focused on one change.
- Verify that linters and tests are passing.
- Review the documentation to make sure it looks good.
- Follow the pull request template when opening a pull request.
- For pull requests that change the API or implementation, discuss with maintainers first by opening an issue.

## Code of Conduct

### Our Pledge

We as members, contributors, and leaders pledge to make participation in our community a harassment-free experience for everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, religion, or sexual identity and orientation.

We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community.

### Our Standards

Examples of behavior that contributes to a positive environment for our community include:

- Demonstrating empathy and kindness toward other people
- Being respectful of differing opinions, viewpoints, and experiences
- Giving and gracefully accepting constructive feedback
- Accepting responsibility and apologizing to those affected by our mistakes, and learning from the experience
- Focusing on what is best not just for us as individuals, but for the overall community

Examples of unacceptable behavior include:

- The use of sexualized language or imagery, and sexual attention or
  advances of any kind
- Trolling, insulting or derogatory comments, and personal or political attacks
- Public or private harassment
- Publishing others' private information, such as a physical or email
  address, without their explicit permission
- Other conduct which could reasonably be considered inappropriate in a
  professional setting

### Enforcement Responsibilities

Community leaders are responsible for clarifying and enforcing our standards of acceptable behavior and will take appropriate and fair corrective action in response to any behavior that they deem inappropriate, threatening, offensive, or harmful.

Community leaders have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, and will communicate reasons for moderation decisions when appropriate.

### Scope

This Code of Conduct applies within all community spaces, and also applies when an individual is officially representing the community in public spaces. Examples of representing our community include using an official e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event.

### Enforcement

Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the community leaders responsible for enforcement at [INSERT CONTACT METHOD]. All complaints will be reviewed and investigated promptly and fairly.

All community leaders are obligated to respect the privacy and security of the reporter of any incident.

### Enforcement Guidelines

Community leaders will follow these Community Impact Guidelines in determining the consequences for any action they deem in violation of this Code of Conduct:

#### 1. Correction

**Community Impact**: Use of inappropriate language or other behavior deemed unprofessional or unwelcome in the community.

**Consequence**: A private, written warning from community leaders, providing clarity around the nature of the violation and an explanation of why the behavior was inappropriate. A public apology may be requested.

#### 2. Warning

**Community Impact**: A violation through a single incident or series of actions.

**Consequence**: A warning with consequences for continued behavior. No interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, for a specified period of time. This includes avoiding interactions in community spaces as well as external channels like social media. Violating these terms may lead to a temporary or permanent ban.

#### 3. Temporary Ban

**Community Impact**: A serious violation of community standards, including sustained inappropriate behavior.

**Consequence**: A temporary ban from any sort of interaction or public communication with the community for a specified period of time. No public or private interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, is allowed during this period. Violating these terms may lead to a permanent ban.

#### 4. Permanent Ban

**Community Impact**: Demonstrating a pattern of violation of community standards, including sustained inappropriate behavior, harassment of an individual, or aggression toward or disparagement of classes of individuals.

**Consequence**: A permanent ban from any sort of public interaction within the community.

### Attribution

This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 2.0,
available at https://www.contributor-covenant.org/version/2/0/code_of_conduct.html.

Community Impact Guidelines were inspired by [Mozilla's code of conduct enforcement ladder](https://github.com/mozilla/diversity).

[homepage]: https://www.contributor-covenant.org

For answers to common questions about this code of conduct, see the FAQ at
https://www.contributor-covenant.org/faq. Translations are available at https://www.contributor-covenant.org/translations.


================================================
FILE: LICENSE
================================================
MIT License

Copyright (c) 2020 Baron Ha.

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.


================================================
FILE: MultipleImagePicker.podspec
================================================
require "json"

package = JSON.parse(File.read(File.join(__dir__, "package.json")))

Pod::Spec.new do |s|
  s.name         = "MultipleImagePicker"
  s.version      = package["version"]
  s.summary      = package["description"]
  s.homepage     = package["homepage"]
  s.license      = package["license"]
  s.authors      = package["author"]

  s.platforms    = { :ios => min_ios_version_supported }
  s.source       = { :git => "https://github.com/baronha/react-native-multiple-image-picker.git", :tag => "#{s.version}" }

  s.source_files = [
    # Implementation (Swift)
    "ios/**/*.{swift}",
    # Autolinking/Registration (Objective-C++)
    "ios/**/*.{m,mm}",
    # Implementation (C++ objects)
    "cpp/**/*.{hpp,cpp}",
  ]

  s.resource_bundles = {
    "MultipleImagePicker" => ["ios/Assets.xcassets"]
  }


  s.dependency "HXPhotoPicker/Picker", "4.2.4"
  s.dependency "HXPhotoPicker/Camera/Lite", "4.2.4"
  s.dependency "HXPhotoPicker/Editor", "4.2.4"

  s.pod_target_xcconfig = {
    # C++ compiler flags, mainly for folly.
    "CLANG_CXX_LANGUAGE_STANDARD" => "c++20",
    "GCC_PREPROCESSOR_DEFINITIONS" => "$(inherited) FOLLY_NO_CONFIG FOLLY_CFG_NO_COROUTINES FOLLY_MOBILE"
  }

  if ENV["USE_FRAMEWORKS"]
    s.dependency "React-Core"
    add_dependency(s, "React-jsinspector", :framework_name => "jsinspector_modern")
    add_dependency(s, "React-rendererconsistency", :framework_name => "React_rendererconsistency")
    add_dependency(s, "React-jsinspectortracing", :framework_name => 'jsinspector_moderntracing')
    add_dependency(s, "React-jsinspectorcdp", :framework_name => 'jsinspector_moderncdp')
  end

  load 'nitrogen/generated/ios/MultipleImagePicker+autolinking.rb'

  add_nitrogen_files(s)

  s.dependency 'React-jsi'
  s.dependency 'React-callinvoker'

  install_modules_dependencies(s)
end

================================================
FILE: README.md
================================================
![Logo][Logo]

<p align="center">
  <img src="./files/banner.png" width="100%">
</p>

[![iOS][iOS]][iOS-URL] [![Android][Android]][Android-URL] [![Swift][Swift]][Swift-URL] [![Kotlin][Kotlin]][Kotlin-URL] [![React-Native][React-Native]][React-Native-URL]

## Overview 🎇

https://github.com/user-attachments/assets/79580bc7-237c-46b7-b92e-1479cc6d9079

React Native Multiple Image Picker **(RNMIP)** enables application to pick images and videos from multiple smart album in iOS/Android. React Native Multiple Image Picker is based on two libraries available, [HXPhotoPicker](https://github.com/SilenceLove/HXPhotoPicker) and [PictureSelector](https://github.com/LuckSiege/PictureSelector)

## Documentation 📚

## Features 🔥

| 🤩  | ![Logo][Logo]                                                                         |
| --- | ------------------------------------------------------------------------------------- |
| 🍕  | [**Crop**](/docs/docs/CROP.mdx) single/multiple image.                                |
| 🎑  | [**Preview**](/docs/docs/PREVIEW.mdx) image/video.                                    |
| 📸  | [**Camera**](/docs/docs/CAMERA.mdx) module for capturing photos and recording videos. |
| 🐳  | Keep the previous selection.                                                          |
| 0️⃣  | Selected order index.                                                                 |
| 🎨  | UI Customization (numberOfColumn, spacing, primaryColor ... )                         |
| 🌚  | Dark Mode, Light Mode                                                                 |
| 🌄  | Choose multiple images/video.                                                         |
| 📦  | Support smart album `(camera roll, selfies, panoramas, favorites, videos...)`.        |
| 📺  | Display video duration.                                                               |
| ⛅️ | Support iCloud Photo Library.                                                         |
| 🌪  | Scrolling performance. ☕️                                                             |

## Requirements

Because RNMIP uses Nitro Module, it complies with Nitro Modules' requirements.
View Nitro Modules' requirements [here](https://nitro.margelo.com/docs/minimum-requirements)

- `Xcode 16+`
- `iOS 13+`
- `react-native 0.75+`
- `compileSdkVersion 34+`

## Installation

See more [**Installation**](https://nitrogenzlab.github.io/react-native-multiple-image-picker/getting-started)

## Usage

Here is a simple usage of the Multiple Image Picker. <br/>
See more [**Config**](https://nitrogenzlab.github.io/react-native-multiple-image-picker/config)

```typescript
import { openPicker, Config } from '@baronha/react-native-multiple-image-picker'

const config: Config = {
  maxSelect: 10,
  maxVideo: 10,
  primaryColor: '#FB9300',
  backgroundDark: '#2f2f2f',
  numberOfColumn: 4,
  mediaType: 'all',
  selectBoxStyle: 'number',
  selectMode: 'multiple',
  language: 'vi', // 🇻🇳 Vietnamese
  theme: 'dark',
  isHiddenOriginalButton: false,
  primaryColor: '#F6B35D',
}

const onPicker = async () => {
  try {
    const response = await openPicker(config)
    setImages(response)
  } catch (e) {
    // catch error for multiple image picker
  }
}
```

## To Do

- [x] Crop Image in iOS.
- [x] Preview Controller for `iOS`.
- [x] Handle Permission when limited on `iOS`.
- [x] Migrating Library to the New Architecture.
- [x] Multiple Crop Image.
- [x] Multiple Preview Image.
- [x] Dynamic Theme.
- [x] Dynamic Language
- [x] Open Crop Controller.
- [x] Open Preview Controller.
- [x] Open Camera Controller.

## Sponsor & Support ☕️

[![BuyMeACoffee][BuyMeACoffee]][BuyMeACoffee-URL] [![Kofi][Kofi]][Kofi-URL]

[BuyMeACoffee]: https://img.shields.io/badge/Buy_Me_A_Coffee-FFDD00?style=for-the-badge&logo=buy-me-a-coffee&logoColor=black
[BuyMeACoffee-URL]: https://buymeacoffee.com/baronha
[Kofi]: https://img.shields.io/badge/Ko--fi-F16061?style=for-the-badge&logo=ko-fi&logoColor=white
[Kofi-URL]: https://ko-fi.com/baoha
To keep this library maintained and up-to-date please consider [sponsoring it on GitHub](https://github.com/sponsors/baronha). Or if you are looking for a private support or help in customizing the experience, then reach out to me on Twitter [@\_baronha](https://twitter.com/_baronha).<br/>
Besides, I also built a product using HXPhotoPicker here, Hope you support:<br/>

<a href="https://apps.apple.com/vn/app/binsoo-photo-filters-editor/id6502683720" target="_blank">
  <img  width="64px" height="64px" src="https://github.com/user-attachments/assets/71b5ddf7-3da1-4091-aae6-9aa7e411ce75" />
</a>

## Built With ❤️

[![NitroModules](https://img.shields.io/badge/Nitro_Modules-0052CC?style=for-the-badge)](https://nitro.margelo.com/docs/nitro-modules)
<br/>
[![HXPhotoPicker](https://img.shields.io/badge/HXPhotoPicker-F05138?style=for-the-badge)](https://github.com/SilenceLove/HXPhotoPicker)
<br/>
[![PictureSelector](https://img.shields.io/badge/Picture_Selector-b07219?style=for-the-badge)](https://github.com/LuckSiege/PictureSelector)

## Star History

[![Star History Chart](https://api.star-history.com/svg?repos=baronha/react-native-multiple-image-picker&type=Date)](https://star-history.com/#bytebase/star-history&Date)

## Showcase ✨

List of used applications with `@baronha/react-native-multiple-image-picker`

Contributions are welcome! If you have an application that uses `@baronha/react-native-multiple-image-picker`, please open a [pull request](/docs/docs/SHOWCASE/showcase.json) to add it to the list.

See all [**Showcase**](https://nitrogenzlab.github.io/react-native-multiple-image-picker/showcase)

## Performance

We're trying to improve performance. If you have a better solution, please open a [issue](https://github.com/NitrogenZLab/react-native-multiple-image-picker/issues)
or [pull request](https://github.com/NitrogenZLab/react-native-multiple-image-picker/pulls). Best regards!

## License

MIT
<br>
[TLPhotoPicker](https://github.com/tilltue/TLPhotoPicker/blob/master/LICENSE)
<br>
[PictureSelector](https://github.com/LuckSiege/PictureSelector/blob/master/LICENSE)

<!-- Badge for README -->

[iOS]: https://img.shields.io/badge/iOS-000000?style=for-the-badge&logo=ios&logoColor=white
[iOS-URL]: https://www.apple.com/ios
[Android]: https://img.shields.io/badge/Android-3DDC84?style=for-the-badge&logo=android&logoColor=white
[Android-URL]: https://www.android.com/
[React-Native]: https://img.shields.io/badge/React_Native-20232A?style=for-the-badge&logo=react&logoColor=61DAFB
[React-Native-URL]: https://reactnative.dev/
[React-Native]: https://img.shields.io/badge/React_Native-20232A?style=for-the-badge&logo=react&logoColor=61DAFB
[React-Native-URL]: https://reactnative.dev/
[Swift]: https://img.shields.io/badge/Swift-FA7343?style=for-the-badge&logo=swift&logoColor=white
[Swift-URL]: https://developer.apple.com/swift/
[Kotlin]: https://img.shields.io/badge/Kotlin-0095D5?&style=for-the-badge&logo=kotlin&logoColor=white
[Kotlin-URL]: https://kotlinlang.org/
[Logo]: https://img.shields.io/badge/React_Native_Multiple_Image_Picker-DF78C3?style=for-the-badge


================================================
FILE: android/CMakeLists.txt
================================================
project(MultipleImagePicker)
cmake_minimum_required(VERSION 3.9.0)

set (PACKAGE_NAME MultipleImagePicker)
set (CMAKE_VERBOSE_MAKEFILE ON)
set (CMAKE_CXX_STANDARD 20)

# Define C++ library and add all sources
add_library(${PACKAGE_NAME} SHARED
        src/main/cpp/cpp-adapter.cpp
)

# Add Nitrogen specs :)
include(${CMAKE_SOURCE_DIR}/../nitrogen/generated/android/MultipleImagePicker+autolinking.cmake)

# Set up local includes
include_directories(
        "src/main/cpp"
        "../cpp"
)

find_library(LOG_LIB log)

# Link all libraries together
target_link_libraries(
        ${PACKAGE_NAME}
        ${LOG_LIB}
        android                                   # <-- Android core
)


================================================
FILE: android/build.gradle
================================================
buildscript {
    repositories {
        google()
        mavenCentral()
    }

    dependencies {
        classpath "com.android.tools.build:gradle:7.2.1"
    }
}

def reactNativeArchitectures() {
    def value = rootProject.getProperties().get("reactNativeArchitectures")
    return value ? value.split(",") : ["armeabi-v7a", "x86", "x86_64", "arm64-v8a"]
}

def isNewArchitectureEnabled() {
    return rootProject.hasProperty("newArchEnabled") && rootProject.getProperty("newArchEnabled") == "true"
}

apply plugin: "com.android.library"
apply plugin: 'org.jetbrains.kotlin.android'
apply from: '../nitrogen/generated/android/MultipleImagePicker+autolinking.gradle'

if (isNewArchitectureEnabled()) {
    apply plugin: "com.facebook.react"
}

def getExtOrDefault(name) {
    return rootProject.ext.has(name) ? rootProject.ext.get(name) : project.properties["MultipleImagePicker_" + name]
}

def getExtOrIntegerDefault(name) {
    return rootProject.ext.has(name) ? rootProject.ext.get(name) : (project.properties["MultipleImagePicker_" + name]).toInteger()
}

android {
    namespace "com.margelo.nitro.multipleimagepicker"

    ndkVersion getExtOrDefault("ndkVersion")
    compileSdkVersion getExtOrIntegerDefault("compileSdkVersion")

    defaultConfig {
        minSdkVersion getExtOrIntegerDefault("minSdkVersion")
        targetSdkVersion getExtOrIntegerDefault("targetSdkVersion")
        buildConfigField "boolean", "IS_NEW_ARCHITECTURE_ENABLED", isNewArchitectureEnabled().toString()

        externalNativeBuild {
            cmake {
                cppFlags "-O2 -frtti -fexceptions -Wall -fstack-protector-all"
                arguments "-DANDROID_STL=c++_shared"
                abiFilters(*reactNativeArchitectures())
            }
        }
    }

    externalNativeBuild {
        cmake {
            path "CMakeLists.txt"
        }
    }

    packagingOptions {
        excludes = ["META-INF",
                    "META-INF/**",
                    "**/libc++_shared.so",
                    "**/libfbjni.so",
                    "**/libjsi.so",
                    "**/libfolly_json.so",
                    "**/libfolly_runtime.so",
                    "**/libglog.so",
                    "**/libhermes.so",
                    "**/libhermes-executor-debug.so",
                    "**/libhermes_executor.so",
                    "**/libreactnative.so",
                    "**/libreactnativejni.so",
                    "**/libturbomodulejsijni.so",
                    "**/libreact_nativemodule_core.so",
                    "**/libjscexecutor.so"]
    }

    buildFeatures {
        buildConfig true
        prefab true
    }

    buildTypes {
        release {
            minifyEnabled false
        }
    }

    lintOptions {
        disable "GradleCompatible"
    }

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

    sourceSets {
        main {
            if (isNewArchitectureEnabled()) {
                java.srcDirs += [
                        // React Codegen files
                        "${project.buildDir}/generated/source/codegen/java"]
            }
        }
    }
}

repositories {
    mavenCentral()
    google()
}


dependencies {
    // For < 0.71, this will be from the local maven repo
    // For > 0.71, this will be replaced by `com.facebook.react:react-android:$version` by react gradle plugin
    //noinspection GradleDynamicVersion

    // Add a dependency on NitroModules
    implementation 'com.github.bumptech.glide:glide:4.16.0'
    annotationProcessor 'com.github.bumptech.glide:compiler:4.16.0'
    // PictureSelector basic (Necessary)
    implementation 'io.github.lucksiege:pictureselector:v3.11.2'

    // image compress library (Not necessary)
    implementation 'io.github.lucksiege:compress:v3.11.2'

    // uCrop library (Not necessary)
    implementation 'io.github.lucksiege:ucrop:v3.11.2'

    // simple camerax library (Not necessary)
    implementation 'io.github.lucksiege:camerax:v3.11.2'

    // exoplayer
    implementation "com.google.android.exoplayer:exoplayer:2.19.1"


    implementation "com.facebook.react:react-native:+"

    // Add a dependency on NitroModules
    implementation project(":react-native-nitro-modules")
}

if (isNewArchitectureEnabled()) {
    react {
        jsRootDir = file("../src/")
        libraryName = "MultipleImagePicker"
        codegenJavaPackageName = "com.margelo.nitro.multipleimagepicker"
    }
}



================================================
FILE: android/gradle.properties
================================================
MultipleImagePicker_kotlinVersion=1.9.24
MultipleImagePicker_minSdkVersion=23
MultipleImagePicker_targetSdkVersion=34
MultipleImagePicker_compileSdkVersion=34
MultipleImagePicker_ndkVersion=26.1.10909125


================================================
FILE: android/src/main/AndroidManifest.xml
================================================
<manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools">
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission tools:ignore="ProtectedPermissions" android:name="android.permission.WRITE_MEDIA_STORAGE" />
    <uses-permission tools:ignore="ProtectedPermissions" android:name="android.permission.WRITE_SETTINGS" />
    <uses-permission tools:ignore="ProtectedPermissions" android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
    <uses-permission tools:ignore="ProtectedPermissions" android:name="android.permission.FOREGROUND_SERVICE" />
    <uses-permission tools:ignore="ProtectedPermissions" android:name="android.permission.RECORD_AUDIO" />
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.VIBRATE" />
    <uses-permission android:name="android.permission.BLUETOOTH" />

    <!-- Android 13 -->
    <uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
    <uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />
    <uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />

    <application android:requestLegacyExternalStorage="true" />
</manifest>


================================================
FILE: android/src/main/cpp/cpp-adapter.cpp
================================================
#include <jni.h>
#include "MultipleImagePickerOnLoad.hpp"

JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void*) {
  return margelo::nitro::multipleimagepicker::initialize(vm);
}


================================================
FILE: android/src/main/java/com/margelo/nitro/multipleimagepicker/CameraEngine.kt
================================================
package com.margelo.nitro.multipleimagepicker

import android.content.Context
import android.graphics.Color
import androidx.fragment.app.Fragment
import com.bumptech.glide.Glide
import com.facebook.react.bridge.ColorPropConverter
import com.luck.lib.camerax.SimpleCameraX
import com.luck.picture.lib.interfaces.OnCameraInterceptListener
import java.io.File

class CameraEngine(
    private val appContext: Context,
    val config: NitroCameraConfig,
) :
    OnCameraInterceptListener {
    override fun openCamera(fragment: Fragment, cameraMode: Int, requestCode: Int) {
        val camera = SimpleCameraX.of()

        camera.setImageEngine { context, url, imageView ->
            Glide.with(context).load(url).into(imageView)
        }

        camera.isAutoRotation(true)
        camera.setCameraMode(cameraMode)
        camera.isDisplayRecordChangeTime(true)
        camera.isManualFocusCameraPreview(true)
        camera.isZoomCameraPreview(true)
        camera.setRecordVideoMaxSecond(config.videoMaximumDuration?.toInt() ?: 60)
        camera.setCameraAroundState(config.cameraDevice == CameraDevice.FRONT)
        camera.setOutputPathDir(getSandboxCameraOutputPath())

        config.color?.let {
            val primaryColor = ColorPropConverter.getColor(it, appContext) ?: Color.BLACK
            camera.setCaptureLoadingColor(primaryColor)
        }

        camera.start(fragment.requireActivity(), fragment, requestCode)
    }

    private fun getSandboxCameraOutputPath(): String {
        val externalFilesDir: File? = appContext.getExternalFilesDir("")
        val customFile = File(externalFilesDir?.absolutePath, "Sandbox")
        if (!customFile.exists()) {
            customFile.mkdirs()
        }
        return customFile.absolutePath + File.separator

    }
}

================================================
FILE: android/src/main/java/com/margelo/nitro/multipleimagepicker/Constant.kt
================================================
package com.margelo.nitro.multipleimagepicker

object Constant {
    const val TOOLBAR_TEXT_SIZE = 12
}

================================================
FILE: android/src/main/java/com/margelo/nitro/multipleimagepicker/CropEngine.kt
================================================
package com.margelo.nitro.multipleimagepicker


import android.content.Context
import android.graphics.Bitmap
import android.graphics.drawable.Drawable
import android.net.Uri
import android.widget.ImageView
import androidx.fragment.app.Fragment
import com.bumptech.glide.Glide
import com.bumptech.glide.request.target.CustomTarget
import com.bumptech.glide.request.transition.Transition
import com.luck.picture.lib.config.PictureMimeType
import com.luck.picture.lib.engine.CropFileEngine
import com.luck.picture.lib.entity.LocalMedia
import com.luck.picture.lib.interfaces.OnMediaEditInterceptListener
import com.luck.picture.lib.utils.DateUtils
import com.margelo.nitro.multipleimagepicker.ImageLoaderUtils.assertValidRequest
import com.yalantis.ucrop.UCrop
import com.yalantis.ucrop.UCrop.Options
import com.yalantis.ucrop.UCropImageEngine
import java.io.File

class CropImageEngine : UCropImageEngine {
    override fun loadImage(context: Context, url: String, imageView: ImageView) {
        if (!assertValidRequest(context)) {
            return
        }
        Glide.with(context).load(url).override(180, 180).into(imageView)
    }

    override fun loadImage(
        context: Context,
        url: Uri,
        maxWidth: Int,
        maxHeight: Int,
        call: UCropImageEngine.OnCallbackListener<Bitmap>
    ) {
        Glide.with(context).asBitmap().load(url).override(maxWidth, maxHeight)
            .into(object : CustomTarget<Bitmap?>() {
                override fun onResourceReady(
                    resource: Bitmap, transition: Transition<in Bitmap?>?
                ) {
                    call.onCall(resource)
                }

                override fun onLoadCleared(placeholder: Drawable?) {
                    call.onCall(null)
                }
            })
    }
}

class CropEngine(cropOption: Options) : CropFileEngine {
    private val options: Options = cropOption

    override fun onStartCrop(
        fragment: Fragment,
        srcUri: Uri?,
        destinationUri: Uri?,
        dataSource: ArrayList<String?>?,
        requestCode: Int
    ) {
        val uCrop = UCrop.of(srcUri!!, destinationUri!!, dataSource)
        uCrop.withOptions(options)
        uCrop.setImageEngine(CropImageEngine())
        uCrop.start(fragment.requireActivity(), fragment, requestCode)
    }
}

class MediaEditInterceptListener(
    private val outputCropPath: String,
    private val options: Options,
) : OnMediaEditInterceptListener {
    override fun onStartMediaEdit(
        fragment: Fragment, currentLocalMedia: LocalMedia, requestCode: Int
    ) {
        val currentEditPath = currentLocalMedia.availablePath
        val inputUri =
            if (PictureMimeType.isContent(currentEditPath)) Uri.parse(currentEditPath)
            else Uri.fromFile(File(currentEditPath))

        val destinationUri = Uri.fromFile(
            File(outputCropPath, DateUtils.getCreateFileName("CROP_") + ".jpeg")
        )

        val uCrop = UCrop.of<Any>(inputUri, destinationUri)

        uCrop.withOptions(options)

        // set engine
        uCrop.setImageEngine(CropImageEngine())

        // start edit
        uCrop.startEdit(fragment.requireActivity(), fragment, requestCode)
    }
}


fun getSandboxPath(context: Context): String {
    val externalFilesDir: File? = context.getExternalFilesDir("")
    val customFile = File(externalFilesDir?.absolutePath, "Sandbox")
    if (!customFile.exists()) {
        customFile.mkdirs()
    }
    return customFile.absolutePath + File.separator
}




================================================
FILE: android/src/main/java/com/margelo/nitro/multipleimagepicker/ExoPlayerEngine.kt
================================================
package com.margelo.nitro.multipleimagepicker

import android.content.Context
import android.net.Uri
import android.view.View
import com.google.android.exoplayer2.ExoPlayer
import com.google.android.exoplayer2.MediaItem
import com.google.android.exoplayer2.PlaybackException
import com.google.android.exoplayer2.Player
import com.google.android.exoplayer2.ui.StyledPlayerView
import com.luck.picture.lib.config.PictureMimeType
import com.luck.picture.lib.config.SelectorProviders
import com.luck.picture.lib.engine.VideoPlayerEngine
import com.luck.picture.lib.entity.LocalMedia
import com.luck.picture.lib.interfaces.OnPlayerListener
import java.io.File
import java.util.concurrent.CopyOnWriteArrayList


class ExoPlayerEngine : VideoPlayerEngine<StyledPlayerView> {
    private val listeners = CopyOnWriteArrayList<OnPlayerListener>()

    override fun onCreateVideoPlayer(context: Context): View {
        val exoPlayer = StyledPlayerView(context)
        exoPlayer.useController = true
        return exoPlayer
    }

    override fun onStarPlayer(exoPlayer: StyledPlayerView, media: LocalMedia) {
        val player = exoPlayer.player
        if (player != null) {
            val mediaItem: MediaItem
            val path = media.availablePath
            mediaItem = if (PictureMimeType.isContent(path)) {
                MediaItem.fromUri(Uri.parse(path))
            } else if (PictureMimeType.isHasHttp(path)) {
                MediaItem.fromUri(path)
            } else {
                MediaItem.fromUri(Uri.fromFile(File(path)))
            }
            val config = SelectorProviders.getInstance().selectorConfig
            player.repeatMode =
                if (config.isLoopAutoPlay) Player.REPEAT_MODE_ALL else Player.REPEAT_MODE_OFF
            player.setMediaItem(mediaItem)
            player.prepare()
            player.play()
        }
    }

    override fun onResume(exoPlayer: StyledPlayerView) {
        val player = exoPlayer.player
        player?.play()
    }

    override fun onPause(exoPlayer: StyledPlayerView) {
        val player = exoPlayer.player
        player?.pause()
    }

    override fun isPlaying(exoPlayer: StyledPlayerView): Boolean {
        val player = exoPlayer.player
        return player != null && player.isPlaying
    }


    override fun addPlayListener(playerListener: OnPlayerListener) {
        if (!listeners.contains(playerListener)) {
            listeners.add(playerListener)
        }
    }

    override fun removePlayListener(playerListener: OnPlayerListener) {
        listeners.remove(playerListener)
    }

    override fun onPlayerAttachedToWindow(exoPlayer: StyledPlayerView) {
        val player: Player = ExoPlayer.Builder(exoPlayer.context).build()
        exoPlayer.player = player
        player.addListener(mPlayerListener)
    }

    override fun onPlayerDetachedFromWindow(exoPlayer: StyledPlayerView) {
        val player = exoPlayer.player
        if (player != null) {
            player.removeListener(mPlayerListener)
            player.release()
            exoPlayer.player = null
        }
    }

    override fun destroy(exoPlayer: StyledPlayerView) {
        val player = exoPlayer.player
        if (player != null) {
            player.removeListener(mPlayerListener)
            player.release()
        }
    }

    private val mPlayerListener: Player.Listener = object : Player.Listener {
        override fun onPlayerError(error: PlaybackException) {
            for (i in listeners.indices) {
                val playerListener = listeners[i]
                playerListener.onPlayerError()
            }
        }

        override fun onPlaybackStateChanged(playbackState: Int) {
            if (playbackState == Player.STATE_READY) {
                for (i in listeners.indices) {
                    val playerListener = listeners[i]
                    playerListener.onPlayerReady()
                }
            } else if (playbackState == Player.STATE_BUFFERING) {
                for (i in listeners.indices) {
                    val playerListener = listeners[i]
                    playerListener.onPlayerLoading()
                }
            } else if (playbackState == Player.STATE_ENDED) {
                for (i in listeners.indices) {
                    val playerListener = listeners[i]
                    playerListener.onPlayerEnd()
                }
            }
        }
    }
}

================================================
FILE: android/src/main/java/com/margelo/nitro/multipleimagepicker/GlideEngine.kt
================================================
package com.margelo.nitro.multipleimagepicker

import android.content.Context
import android.widget.ImageView
import com.bumptech.glide.Glide
import com.bumptech.glide.load.resource.bitmap.CenterCrop
import com.bumptech.glide.load.resource.bitmap.RoundedCorners
import com.luck.picture.lib.engine.ImageEngine
import com.luck.picture.lib.utils.ActivityCompatHelper

class GlideEngine private constructor() : ImageEngine {
    override fun loadImage(context: Context, url: String, imageView: ImageView) {
        if (!ActivityCompatHelper.assertValidRequest(context)) {
            return
        }
        Glide.with(context)
            .load(url)
            .into(imageView)
    }

    override fun loadImage(
        context: Context,
        imageView: ImageView,
        url: String,
        maxWidth: Int,
        maxHeight: Int
    ) {
        if (!ActivityCompatHelper.assertValidRequest(context)) {
            return
        }
        Glide.with(context)
            .load(url)
            .override(maxWidth, maxHeight)
            .into(imageView)
    }

    override fun loadAlbumCover(context: Context, url: String, imageView: ImageView) {
        if (!ActivityCompatHelper.assertValidRequest(context)) {
            return
        }
        Glide.with(context)
            .asBitmap()
            .load(url)
            .override(180, 180)
            .sizeMultiplier(0.5f)
            .transform(CenterCrop(), RoundedCorners(8))
            .into(imageView)
    }

    override fun loadGridImage(context: Context, url: String, imageView: ImageView) {
        if (!ActivityCompatHelper.assertValidRequest(context)) {
            return
        }
        Glide.with(context)
            .load(url)
            .override(200, 200)
            .centerCrop()
            .placeholder(com.luck.picture.lib.R.drawable.ps_image_placeholder)
            .into(imageView)
    }

    override fun pauseRequests(context: Context) {
        if (!ActivityCompatHelper.assertValidRequest(context)) {
            return
        }
        Glide.with(context).pauseRequests()
    }

    override fun resumeRequests(context: Context) {
        if (!ActivityCompatHelper.assertValidRequest(context)) {
            return
        }
        Glide.with(context).resumeRequests()
    }

    private object InstanceHolder {
        val instance = GlideEngine()
    }

    companion object {
        fun createGlideEngine(): GlideEngine {
            return InstanceHolder.instance
        }
    }
}

================================================
FILE: android/src/main/java/com/margelo/nitro/multipleimagepicker/ImageLoaderUtils.kt
================================================
package com.margelo.nitro.multipleimagepicker

import android.app.Activity
import android.content.Context
import android.content.ContextWrapper

object ImageLoaderUtils {
    fun assertValidRequest(context: Context?): Boolean {
        if (context is Activity) {
            return !isDestroy(context)
        } else if (context is ContextWrapper) {
            if (context.baseContext is Activity) {
                val activity = context.baseContext as Activity
                return !isDestroy(activity)
            }
        }
        return true
    }

    private fun isDestroy(activity: Activity?): Boolean {
        return if (activity == null) {
            true
        } else activity.isFinishing || activity.isDestroyed
    }
}

================================================
FILE: android/src/main/java/com/margelo/nitro/multipleimagepicker/LoadingDialog.kt
================================================
package com.margelo.nitro.multipleimagepicker


import android.app.Dialog
import android.content.Context
import android.os.Bundle
import android.view.Gravity
import android.view.ViewGroup


class LoadingDialog(context: Context?) :
    Dialog(context!!, R.style.Picture_Theme_AlertDialog) {
    init {
        setCancelable(true)
        setCanceledOnTouchOutside(false)
    }

    override fun onCreate(savedInstanceState: Bundle) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.loading_dialog)
        setDialogSize()
    }

    private fun setDialogSize() {
        val params = window!!.attributes
        params.width = ViewGroup.LayoutParams.WRAP_CONTENT
        params.height = ViewGroup.LayoutParams.WRAP_CONTENT
        params.gravity = Gravity.CENTER
        window!!.setWindowAnimations(R.style.PictureThemeDialogWindowStyle)
        window!!.attributes = params
    }
}

================================================
FILE: android/src/main/java/com/margelo/nitro/multipleimagepicker/MultipleImagePicker.kt
================================================
package com.margelo.nitro.multipleimagepicker

import com.margelo.nitro.NitroModules


class MultipleImagePicker : HybridMultipleImagePickerSpec() {
    override val memorySize: Long
        get() = 5

    private val pickerModule = MultipleImagePickerImp(NitroModules.applicationContext)

    override fun openPicker(
        config: NitroConfig,
        resolved: (result: Array<PickerResult>) -> Unit,
        rejected: (reject: Double) -> Unit
    ) {
        pickerModule.openPicker(config, resolved, rejected)
    }

    override fun openCrop(
        image: String,
        config: NitroCropConfig,
        resolved: (result: CropResult) -> Unit,
        rejected: (reject: Double) -> Unit
    ) {
        pickerModule.openCrop(image, config, resolved, rejected)
    }

    override fun openPreview(
        media: Array<MediaPreview>,
        index: Double,
        config: NitroPreviewConfig,
        onLongPress: (index: Double) -> Unit
    ) {
        pickerModule.openPreview(media, index.toInt(), config, onLongPress)
    }

    override fun openCamera(
        config: NitroCameraConfig,
        resolved: (result: CameraResult) -> Unit,
        rejected: (reject: Double) -> Unit
    ) {
        pickerModule.openCamera(config, resolved, rejected)
    }

}

================================================
FILE: android/src/main/java/com/margelo/nitro/multipleimagepicker/MultipleImagePickerImp.kt
================================================
package com.margelo.nitro.multipleimagepicker

import android.app.Activity
import android.content.Context
import android.content.Intent
import android.graphics.Color
import android.net.Uri
import androidx.core.content.ContextCompat
import com.facebook.react.bridge.BaseActivityEventListener
import com.facebook.react.bridge.ColorPropConverter
import com.facebook.react.bridge.ReactApplicationContext
import com.facebook.react.bridge.ReactContextBaseJavaModule
import com.facebook.react.bridge.ReactMethod
import com.luck.picture.lib.app.IApp
import com.luck.picture.lib.app.PictureAppMaster
import com.luck.picture.lib.basic.PictureSelector
import com.luck.picture.lib.config.PictureMimeType
import com.luck.picture.lib.config.SelectMimeType
import com.luck.picture.lib.config.SelectModeConfig
import com.luck.picture.lib.engine.PictureSelectorEngine
import com.luck.picture.lib.entity.LocalMedia
import com.luck.picture.lib.interfaces.OnCustomLoadingListener
import com.luck.picture.lib.interfaces.OnExternalPreviewEventListener
import com.luck.picture.lib.interfaces.OnMediaEditInterceptListener
import com.luck.picture.lib.interfaces.OnResultCallbackListener
import com.luck.picture.lib.language.LanguageConfig
import com.luck.picture.lib.style.BottomNavBarStyle
import com.luck.picture.lib.style.PictureSelectorStyle
import com.luck.picture.lib.style.PictureWindowAnimationStyle
import com.luck.picture.lib.style.SelectMainStyle
import com.luck.picture.lib.style.TitleBarStyle
import com.luck.picture.lib.utils.DateUtils
import com.luck.picture.lib.utils.DensityUtil
import com.luck.picture.lib.utils.MediaUtils
import com.yalantis.ucrop.UCrop
import com.yalantis.ucrop.UCrop.Options
import com.yalantis.ucrop.UCrop.REQUEST_CROP
import com.yalantis.ucrop.model.AspectRatio
import java.io.File
import java.net.HttpURLConnection
import java.net.URL


class MultipleImagePickerImp(reactContext: ReactApplicationContext?) :
    ReactContextBaseJavaModule(reactContext), IApp {

    override fun getName(): String {
        return "MultipleImagePicker"
    }

    companion object {
        const val TAG = "MultipleImagePicker"
    }

    private var style = PictureSelectorStyle()
    private lateinit var config: NitroConfig
    private var cropOption = Options()
    private var dataList = mutableListOf<LocalMedia>()


    @ReactMethod
    fun openPicker(
        options: NitroConfig,
        resolved: (result: Array<PickerResult>) -> Unit,
        rejected: (reject: Double) -> Unit
    ) {
        PictureAppMaster.getInstance().app = this
        val activity = reactApplicationContext.currentActivity
            ?: throw IllegalStateException("No current Activity available")
        val imageEngine = GlideEngine.createGlideEngine()

        // set global config
        config = options

        setStyle() // set style for UI
        handleSelectedAssets(config)

        val chooseMode = getChooseMode(config.mediaType)

        val maxSelect = config.maxSelect?.toInt() ?: 20
        val maxVideo = config.maxVideo?.toInt() ?: 20
        val isPreview = config.isPreview ?: true
        val maxFileSize = config.maxFileSize?.toLong()
        val maxDuration = config.maxVideoDuration?.toInt()
        val minDuration = config.minVideoDuration?.toInt()
        val allowSwipeToSelect = config.allowSwipeToSelect ?: false
        val isMultiple = config.selectMode == SelectMode.MULTIPLE
        val selectMode = if (isMultiple) SelectModeConfig.MULTIPLE else SelectModeConfig.SINGLE

        val isCrop = config.crop != null

        PictureSelector.create(activity)
            .openGallery(chooseMode)
            .setImageEngine(imageEngine)
            .setSelectedData(dataList)
            .setSelectorUIStyle(style)
            .apply {
                if (isCrop) {
                    setCropOption(config.crop)
                    // Disabled force crop engine for multiple
                    if (!isMultiple) setCropEngine(CropEngine(cropOption))
                    else setEditMediaInterceptListener(setEditMediaEvent())
                }
                maxDuration?.let {
                    setFilterVideoMaxSecond(it)
                }

                minDuration?.let {
                    setFilterVideoMinSecond(it)
                }

                maxFileSize?.let {
                    setFilterMaxFileSize(it)
                }

                isDisplayCamera(config.camera != null)

                config.camera?.let {
                    val cameraConfig = NitroCameraConfig(
                        mediaType = MediaType.ALL,
                        presentation = Presentation.FULLSCREENMODAL,
                        language = Language.SYSTEM,
                        crop = null,
                        isSaveSystemAlbum = false,
                        color = config.primaryColor,
                        cameraDevice = it.cameraDevice,
                        videoMaximumDuration = it.videoMaximumDuration
                    )

                    setCameraInterceptListener(CameraEngine(appContext, cameraConfig))
                }
            }
            .setVideoThumbnailListener(VideoThumbnailEngine(getVideoThumbnailDir()))
            .setImageSpanCount(config.numberOfColumn?.toInt() ?: 3)
            .setMaxSelectNum(maxSelect)
            .isDirectReturnSingle(true)
            .isSelectZoomAnim(true)
            .isPageStrategy(true, 50)
            .isWithSelectVideoImage(true)
            .setMaxVideoSelectNum(if (maxVideo != 20) maxVideo else maxSelect)
            .isMaxSelectEnabledMask(true)
            .isAutoVideoPlay(true)
            .isFastSlidingSelect(allowSwipeToSelect)
            .isPageSyncAlbumCount(true)
            // isPreview
            .isPreviewImage(isPreview)
            .isPreviewVideo(isPreview)
            .isDisplayTimeAxis(true)
            .setSelectionMode(selectMode)
            .isOriginalControl(config.isHiddenOriginalButton == false)
            .setLanguage(getLanguage(config.language))
            .isPreviewFullScreenMode(true)
            .forResult(object : OnResultCallbackListener<LocalMedia?> {
                override fun onResult(localMedia: ArrayList<LocalMedia?>?) {
                    var data: Array<PickerResult> = arrayOf()
                    if (localMedia?.size == 0 || localMedia == null) {
                        resolved(arrayOf())
                        return
                    }

                    // set dataList
                    dataList = localMedia.filterNotNull().toMutableList()

                    localMedia.forEach { item ->
                        if (item != null) {
                            val media = getResult(item)
                            data += media  // Add the media to the data array
                        }
                    }
                    resolved(data)
                }

                override fun onCancel() {
                    //
                }
            })
    }

    @ReactMethod
    fun openCrop(
        image: String,
        options: NitroCropConfig,
        resolved: (result: CropResult) -> Unit,
        rejected: (reject: Double) -> Unit
    ) {
        cropOption = Options()

        setCropOption(
            PickerCropConfig(
                circle = options.circle,
                ratio = options.ratio,
                defaultRatio = options.defaultRatio,
                freeStyle = options.freeStyle
            )
        )

        try {
            val uri = when {
                // image network
                image.startsWith("http://") || image.startsWith("https://") -> {
                    // Handle remote URL
                    val url = URL(image)
                    val connection = url.openConnection() as HttpURLConnection
                    connection.doInput = true
                    connection.connect()

                    val inputStream = connection.inputStream
                    // Create a temp file to store the image
                    val file = File(appContext.cacheDir, "CROP_")
                    file.outputStream().use { output ->
                        inputStream.copyTo(output)
                    }

                    Uri.fromFile(file)
                }

                else -> Uri.parse(image)
            }

            val destinationUri = Uri.fromFile(
                File(getSandboxPath(appContext), DateUtils.getCreateFileName("CROP_") + ".jpeg")
            )
            val uCrop = UCrop.of<Any>(uri, destinationUri).withOptions(cropOption)

            // set engine
            uCrop.setImageEngine(CropImageEngine())
            // start edit

            val cropActivityEventListener = object : BaseActivityEventListener() {
                override fun onActivityResult(
                    activity: Activity,
                    requestCode: Int,
                    resultCode: Int,
                    data: Intent?
                ) {
                    if (resultCode == Activity.RESULT_OK && requestCode == REQUEST_CROP) {
                        val resultUri = UCrop.getOutput(data!!)
                        val width = UCrop.getOutputImageWidth(data).toDouble()
                        val height = UCrop.getOutputImageHeight(data).toDouble()

                        resultUri?.let {
                            val result = CropResult(
                                path = it.toString(),
                                width,
                                height,
                            )
                            resolved(result)
                        }
                    } else if (resultCode == UCrop.RESULT_ERROR) {
                        val cropError = UCrop.getError(data!!)
                        rejected(0.0)
                    }

                    // Remove listener after getting result
                    reactApplicationContext.removeActivityEventListener(this)
                }
            }

            // Add listener before starting UCrop
            reactApplicationContext.addActivityEventListener(cropActivityEventListener)

            reactApplicationContext.currentActivity?.let { uCrop.start(it, REQUEST_CROP) }
        } catch (e: Exception) {
            rejected(0.0)
        }
    }

    @ReactMethod
    fun openPreview(
        media: Array<MediaPreview>,
        index: Int,
        config: NitroPreviewConfig,
        onLongPress: (index: Double) -> Unit
    ) {
        val imageEngine = GlideEngine.createGlideEngine()

        val assets: ArrayList<LocalMedia> = arrayListOf()

        val previewStyle = PictureSelectorStyle()
        val titleBarStyle = TitleBarStyle()

        previewStyle.windowAnimationStyle.setActivityEnterAnimation(R.anim.anim_modal_in)
        previewStyle.windowAnimationStyle.setActivityExitAnimation(com.luck.picture.lib.R.anim.ps_anim_modal_out)
        previewStyle.selectMainStyle.previewBackgroundColor = Color.BLACK

        titleBarStyle.previewTitleBackgroundColor = Color.BLACK
        previewStyle.titleBarStyle = titleBarStyle

        media.withIndex().forEach { (index, mediaItem) ->

            var asset: LocalMedia? = null

            mediaItem.path?.let { path ->
                // network asset
                if (path.startsWith("https://") || path.startsWith("http://")) {
                    val localMedia = LocalMedia.create()
                    localMedia.path = path
                    localMedia.mimeType =
                        if (mediaItem.type == ResultType.VIDEO) "video/mp4" else MediaUtils.getMimeTypeFromMediaHttpUrl(
                            path
                        ) ?: "image/jpg"
                    asset = localMedia
                } else {
                    asset = LocalMedia.generateLocalMedia(appContext, path)
                }
            }

            asset?.let {
                it.setPosition(index)
                assets.add(it)
            }
        }

        val activity = reactApplicationContext.currentActivity
            ?: throw IllegalStateException("No current Activity available")
        PictureSelector
            .create(activity)
            .openPreview()
            .setImageEngine(imageEngine)
            .setLanguage(getLanguage(config.language))
            .setSelectorUIStyle(previewStyle)
            .isPreviewFullScreenMode(true)
            .isAutoVideoPlay(config.videoAutoPlay == true)
            .setVideoPlayerEngine(ExoPlayerEngine())
            .isVideoPauseResumePlay(true)
            .setCustomLoadingListener(getCustomLoadingListener())
            .setExternalPreviewEventListener(object : OnExternalPreviewEventListener {
                override fun onPreviewDelete(position: Int) {
                    //
                }

                override fun onLongPressDownload(context: Context, media: LocalMedia): Boolean {
                    onLongPress(media.position.toDouble())
                    return true
                }
            })
            .startFragmentPreview(index, false, assets)
    }


    private fun getCustomLoadingListener(): OnCustomLoadingListener {
        return OnCustomLoadingListener { context -> LoadingDialog(context) }
    }

    @ReactMethod
    fun openCamera(
        config: NitroCameraConfig,
        resolved: (result: CameraResult) -> Unit,
        rejected: (reject: Double) -> Unit
    ) {
        val activity = reactApplicationContext.currentActivity
            ?: throw IllegalStateException("No current Activity available")
        val chooseMode = getChooseMode(config.mediaType)

        PictureSelector
            .create(activity)
            .openCamera(chooseMode)
            .setLanguage(getLanguage(config.language))
            .setCameraInterceptListener(CameraEngine(appContext, config))
            .isQuickCapture(true)
            .isOriginalControl(true)
            .setVideoThumbnailListener(VideoThumbnailEngine(getVideoThumbnailDir()))
            .apply {
                if (config.crop != null) {
                    setCropEngine(CropEngine(cropOption))
                }
            }
            .forResult(object : OnResultCallbackListener<LocalMedia?> {
                override fun onResult(results: java.util.ArrayList<LocalMedia?>?) {
                    results?.first()?.let {
                        val result = getResult(it)

                        resolved(
                            CameraResult(
                                path = result.path,
                                type = result.type,
                                width = result.width,
                                height = result.height,
                                duration = result.duration,
                                thumbnail = result.thumbnail,
                                fileName = result.fileName
                            )
                        )
                    }
                }

                override fun onCancel() {
//                    rejected(0.0)
                }
            })
    }

    private fun getChooseMode(mediaType: MediaType): Int {
        return when (mediaType) {
            MediaType.VIDEO -> SelectMimeType.ofVideo()
            MediaType.IMAGE -> SelectMimeType.ofImage()
            else -> SelectMimeType.ofAll()
        }
    }

    private fun getVideoThumbnailDir(): String {
        val externalFilesDir: File? = appContext.getExternalFilesDir("")
        val customFile = File(externalFilesDir?.absolutePath, "Thumbnail")
        if (!customFile.exists()) {
            customFile.mkdirs()
        }
        return customFile.absolutePath + File.separator
    }


    private fun getLanguage(language: Language): Int {
        return when (language) {
            Language.VI -> LanguageConfig.VIETNAM  // -> 🇻🇳 My country. Yeahhh
            Language.EN -> LanguageConfig.ENGLISH
            Language.ZH_HANS -> LanguageConfig.CHINESE
            Language.ZH_HANT -> LanguageConfig.TRADITIONAL_CHINESE
            Language.DE -> LanguageConfig.GERMANY
            Language.KO -> LanguageConfig.KOREA
            Language.FR -> LanguageConfig.FRANCE
            Language.JA -> LanguageConfig.JAPAN
            Language.AR -> LanguageConfig.AR
            Language.RU -> LanguageConfig.RU
            else -> LanguageConfig.SYSTEM_LANGUAGE
        }
    }

    private fun setCropOption(config: PickerCropConfig?) {
        cropOption.setShowCropFrame(true)
        cropOption.setShowCropGrid(true)
        cropOption.setCircleDimmedLayer(config?.circle ?: false)
        cropOption.setCropOutputPathDir(getSandboxPath(appContext))
        cropOption.isCropDragSmoothToCenter(true)
        cropOption.isForbidSkipMultipleCrop(true)
        cropOption.setMaxScaleMultiplier(100f)
        cropOption.setToolbarWidgetColor(Color.BLACK)
        cropOption.setStatusBarColor(Color.WHITE)
        cropOption.isDarkStatusBarBlack(true)
        cropOption.isDragCropImages(true)
        cropOption.setFreeStyleCropEnabled(config?.freeStyle ?: true)
        cropOption.setSkipCropMimeType(*getNotSupportCrop())


        val ratioCount = config?.ratio?.size ?: 0

        if (config?.defaultRatio != null || ratioCount > 0) {

            var ratioList = arrayOf(AspectRatio("Original", 0f, 0f))

            if (ratioCount > 0) {
                config?.ratio?.take(4)?.toTypedArray()?.forEach { item ->
                    ratioList += AspectRatio(
                        item.title, item.width.toFloat(), item.height.toFloat()
                    )
                }
            }

            // Add default Aspects
            ratioList += arrayOf(
                AspectRatio(null, 1f, 1f),
                AspectRatio(null, 16f, 9f),
                AspectRatio(null, 4f, 3f),
                AspectRatio(null, 3f, 2f)
            )

            config?.defaultRatio?.let {
                val defaultRatio = AspectRatio(it.title, it.width.toFloat(), it.height.toFloat())
                ratioList = arrayOf(defaultRatio) + ratioList

            }

            cropOption.apply {

                setAspectRatioOptions(
                    0,
                    *ratioList.take(5).toTypedArray()
                )
            }
        }
    }


    private fun getNotSupportCrop(): Array<String> {
        return arrayOf(PictureMimeType.ofGIF(), PictureMimeType.ofWEBP())
    }


    private fun setEditMediaEvent(): OnMediaEditInterceptListener {
        return MediaEditInterceptListener(getSandboxPath(appContext), cropOption)
    }

    private fun setStyle() {
        val primaryColor = ColorPropConverter.getColor(config.primaryColor, appContext)
        val isNumber =
            config.selectMode == SelectMode.MULTIPLE && config.selectBoxStyle == SelectBoxStyle.NUMBER
        val selectType = if (isNumber) R.drawable.picture_selector else R.drawable.checkbox_selector
        val isDark = config.theme == Theme.DARK

        val backgroundDark = ColorPropConverter.getColor(config.backgroundDark, appContext)
            ?: ContextCompat.getColor(
                appContext, com.luck.picture.lib.R.color.ps_color_33
            )

        val foreground = if (isDark) Color.WHITE else Color.BLACK
        val background = if (isDark) backgroundDark else Color.WHITE

        val titleBar = TitleBarStyle()
        val bottomBar = BottomNavBarStyle()
        val mainStyle = SelectMainStyle()
        val iconBack =
            if (isDark) com.luck.picture.lib.R.drawable.ps_ic_back else com.luck.picture.lib.R.drawable.ps_ic_black_back

        cropOption.setLogoColor(primaryColor ?: Color.BLACK)

        // TITLE BAR
        titleBar.titleBackgroundColor = background
        titleBar.isAlbumTitleRelativeLeft = true
        titleBar.titleAlbumBackgroundResource = com.luck.picture.lib.R.drawable.ps_album_bg
        titleBar.titleDrawableRightResource = com.luck.picture.lib.R.drawable.ps_ic_grey_arrow
        titleBar.previewTitleLeftBackResource = iconBack
        titleBar.titleLeftBackResource = iconBack
        titleBar.isHideCancelButton = true

        // BOTTOM BAR
        bottomBar.bottomPreviewNormalTextColor = foreground
        bottomBar.bottomPreviewSelectTextColor = foreground
        bottomBar.bottomNarBarBackgroundColor = background
        bottomBar.bottomEditorTextColor = foreground
        bottomBar.bottomOriginalTextColor = foreground
        bottomBar.bottomPreviewNarBarBackgroundColor = background

        mainStyle.mainListBackgroundColor = foreground
        mainStyle.selectNormalTextColor = foreground
        mainStyle.isDarkStatusBarBlack = !isDark
        mainStyle.statusBarColor = background
        mainStyle.mainListBackgroundColor = background
        mainStyle.adapterPreviewGalleryItemSize = DensityUtil.dip2px(appContext, 52f);
        mainStyle.adapterPreviewGalleryBackgroundResource =
            if (isDark) com.luck.picture.lib.R.drawable.ps_preview_gallery_bg else R.drawable.preview_gallery_white_bg
        mainStyle.adapterPreviewGalleryFrameResource = R.drawable.preview_gallery_item
        mainStyle.previewBackgroundColor = background

        bottomBar.isCompleteCountTips = false
        bottomBar.bottomOriginalTextSize = Constant.TOOLBAR_TEXT_SIZE
        bottomBar.bottomSelectNumTextSize = Constant.TOOLBAR_TEXT_SIZE
//        bottomBar.bottomPreviewNormalTextSize = Constant.TOOLBAR_TEXT_SIZE
//        bottomBar.bottomEditorTextSize = Constant.TOOLBAR_TEXT_SIZE

        // MAIN STYLE
        mainStyle.isCompleteSelectRelativeTop = false
        mainStyle.isPreviewDisplaySelectGallery = true
        mainStyle.isAdapterItemIncludeEdge = true
        mainStyle.isPreviewSelectRelativeBottom = false
//        mainStyle.previewSelectTextSize = Constant.TOOLBAR_TEXT_SIZE
        mainStyle.selectTextColor = primaryColor ?: Color.BLACK
//        mainStyle.selectTextSize = Constant.TOOLBAR_TEXT_SIZE
        mainStyle.selectBackground = selectType
        mainStyle.isSelectNumberStyle = isNumber
        mainStyle.previewSelectBackground = selectType
        mainStyle.isPreviewSelectNumberStyle = isNumber

        if (config.camera != null) {
            // hide title camera
            mainStyle.adapterCameraText = " "
        }

        // custom toolbar text
        config.text.let { text ->
            text?.finish.let {
                mainStyle.selectText = it
                mainStyle.selectNormalText = it
                mainStyle.selectText = it
            }

            text?.preview.let {
                mainStyle.previewSelectText = it
            }

            text?.original.let {
                bottomBar.bottomOriginalText = it
            }

            text?.edit.let {
                bottomBar.bottomEditorText = it
            }
        }

        // SET STYLE
        style.titleBarStyle = titleBar
        style.bottomBarStyle = bottomBar
        style.selectMainStyle = mainStyle

        // ANIMATION SLIDE FROM BOTTOM
        val animationStyle = PictureWindowAnimationStyle()
        animationStyle.setActivityEnterAnimation(com.luck.picture.lib.R.anim.ps_anim_up_in)
        animationStyle.setActivityExitAnimation(com.luck.picture.lib.R.anim.ps_anim_down_out)

        style.windowAnimationStyle = animationStyle
    }

    private fun handleSelectedAssets(config: NitroConfig) {
        val assets = config.selectedAssets
        val assetIds = assets.map { it.localIdentifier }.toSet()
        dataList = dataList.filter { media ->
            assetIds.contains(media.id.toString())
        }.toMutableList()
    }

    private fun getResult(item: LocalMedia): PickerResult {

        val type: ResultType =
            if (item.mimeType.startsWith("video/")) ResultType.VIDEO else ResultType.IMAGE

        var path = item.path
        var width: Double = item.width.toDouble()
        var height: Double = item.height.toDouble()

        val thumbnail = item.videoThumbnailPath?.let {
            if (!it.startsWith("file://")) "file://$it" else it
        }

        if (item.isCut) {
            path = "file://${item.cutPath}"
            width = item.cropImageWidth.toDouble()
            height = item.cropImageHeight.toDouble()
        }

        if (!path.startsWith("file://") && !path.startsWith("content://") && type == ResultType.IMAGE)
            path = "file://$path"

        val media = PickerResult(
            localIdentifier = item.id.toString(),
            width,
            height,
            mime = item.mimeType,
            size = item.size.toDouble(),
            bucketId = item.bucketId.toDouble(),
            realPath = item.realPath,
            parentFolderName = item.parentFolderName,
            creationDate = item.dateAddedTime.toDouble(),
            crop = item.isCut,
            path,
            type,
            fileName = item.fileName,
            thumbnail = thumbnail,
            duration = item.duration.toDouble()
        )

        return media
    }

    override fun getAppContext(): Context {
        return reactApplicationContext
    }

    override fun getPictureSelectorEngine(): PictureSelectorEngine {
        return PictureSelectorEngineImp()
    }
}

================================================
FILE: android/src/main/java/com/margelo/nitro/multipleimagepicker/MultipleImagePickerPackage.java
================================================
package com.margelo.nitro.multipleimagepicker;


import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

import com.facebook.react.bridge.NativeModule;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.module.model.ReactModuleInfoProvider;
import com.facebook.react.TurboReactPackage;

import java.util.HashMap;

public class MultipleImagePickerPackage extends TurboReactPackage {
    @Nullable
    @Override
    public NativeModule getModule(@NonNull String name, @NonNull ReactApplicationContext reactContext) {
        return null;
    }

    @Override
    public ReactModuleInfoProvider getReactModuleInfoProvider() {
        return HashMap::new;
    }

    static {
        System.loadLibrary("MultipleImagePicker");
    }
}

================================================
FILE: android/src/main/java/com/margelo/nitro/multipleimagepicker/PictureSelectorEngineImp.kt
================================================
package com.margelo.nitro.multipleimagepicker

import android.util.Log
import com.luck.picture.lib.basic.IBridgeLoaderFactory
import com.luck.picture.lib.engine.*
import com.luck.picture.lib.engine.CompressEngine
import com.luck.picture.lib.entity.LocalMedia
import com.luck.picture.lib.interfaces.OnInjectLayoutResourceListener
import com.luck.picture.lib.interfaces.OnResultCallbackListener

class PictureSelectorEngineImp : PictureSelectorEngine {
    /**
     * 重新创建[ImageEngine]引擎
     *
     * @return
     */
    override fun createImageLoaderEngine(): ImageEngine {
        return GlideEngine.createGlideEngine()
    }

    /**
     * 重新创建[CompressEngine]引擎
     *
     * @return
     */
    override fun createCompressEngine(): CompressEngine? {
        // TODO 这种情况是内存极度不足的情况下,比如开启开发者选项中的不保留活动或后台进程限制,导致CompressEngine被回收
        return null
    }

    /**
     * 重新创建[CompressEngine]引擎
     *
     * @return
     */
    override fun createCompressFileEngine(): CompressFileEngine? {
        // TODO 这种情况是内存极度不足的情况下,比如开启开发者选项中的不保留活动或后台进程限制,导致CompressFileEngine被回收
        return null
    }

    /**
     * 重新创建[ExtendLoaderEngine]引擎
     *
     * @return
     */
    override fun createLoaderDataEngine(): ExtendLoaderEngine? {
        return null
    }

    override fun createVideoPlayerEngine(): VideoPlayerEngine<*>? {
        return null
    }

    override fun onCreateLoader(): IBridgeLoaderFactory? {
        return null
    }

    /**
     * 重新创建[SandboxFileEngine]引擎
     *
     * @return
     */
    override fun createSandboxFileEngine(): SandboxFileEngine? {
        return null
    }

    override fun createUriToFileTransformEngine(): UriToFileTransformEngine? {
        return null
    }

    override fun createLayoutResourceListener(): OnInjectLayoutResourceListener? {
        return null
    }

    override fun getResultCallbackListener(): OnResultCallbackListener<LocalMedia?> {
        return object : OnResultCallbackListener<LocalMedia?> {
            override fun onResult(result: ArrayList<LocalMedia?>) {

                Log.i(TAG, "onResult:" + result.size)
            }

            override fun onCancel() {
                Log.i(TAG, "PictureSelector onCancel")
            }
        }
    }

    companion object {
        private val TAG = PictureSelectorEngineImp::class.java.simpleName
    }
}

================================================
FILE: android/src/main/java/com/margelo/nitro/multipleimagepicker/VideoThumbnailEngine.kt
================================================
package com.margelo.nitro.multipleimagepicker

import android.content.Context
import android.graphics.Bitmap
import android.graphics.drawable.Drawable
import com.bumptech.glide.Glide
import com.bumptech.glide.request.target.CustomTarget
import com.bumptech.glide.request.transition.Transition
import com.luck.picture.lib.interfaces.OnKeyValueResultCallbackListener
import com.luck.picture.lib.interfaces.OnVideoThumbnailEventListener
import com.luck.picture.lib.utils.PictureFileUtils
import java.io.ByteArrayOutputStream
import java.io.File
import java.io.FileOutputStream
import java.io.IOException


class VideoThumbnailEngine(private val targetPath: String) : OnVideoThumbnailEventListener {
    override fun onVideoThumbnail(
        context: Context, videoPath: String, call: OnKeyValueResultCallbackListener
    ) {
        Glide.with(context).asBitmap().sizeMultiplier(0.6f).load(videoPath)
            .into(object : CustomTarget<Bitmap?>() {
                override fun onResourceReady(
                    resource: Bitmap, transition: Transition<in Bitmap?>?
                ) {
                    val stream = ByteArrayOutputStream()
                    resource.compress(Bitmap.CompressFormat.JPEG, 60, stream)
                    var fos: FileOutputStream? = null
                    var result: String? = null
                    try {
                        val targetFile =
                            File(targetPath, "thumbnails_" + System.currentTimeMillis() + ".jpg")
                        fos = FileOutputStream(targetFile)
                        fos.write(stream.toByteArray())
                        fos.flush()
                        result = targetFile.absolutePath
                    } catch (e: IOException) {
                        e.printStackTrace()
                    } finally {
                        PictureFileUtils.close(fos)
                        PictureFileUtils.close(stream)
                    }
                    call.onCallback(videoPath, result)
                }

                override fun onLoadCleared(placeholder: Drawable?) {
                    call.onCallback(videoPath, "")
                }
            })
    }
}

================================================
FILE: android/src/main/res/anim/anim_modal_in.xml
================================================
<?xml version="1.0" encoding="utf-8"?>

<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:anim/linear_interpolator"
    android:shareInterpolator="true">
    <alpha
        android:fromAlpha="0.2"
        android:toAlpha="1"
        android:duration="90"/>

    <scale
        android:fromXScale="0.7"
        android:toXScale="1.0"
        android:fromYScale="0.7"
        android:toYScale="1.0"
        android:pivotX="50%"
        android:pivotY="50%"
        android:duration="135"/>
</set>

================================================
FILE: android/src/main/res/drawable/checkbox_selector.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/picture_not_selected" android:state_selected="false" />
    <item android:drawable="@drawable/ic_checkmark" android:state_selected="true" />
</selector>


================================================
FILE: android/src/main/res/drawable/complete_button.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="@color/app_color_pri" />
    <corners android:radius="5dp" />
    <padding
        android:bottom="5dp"
        android:left="10dp"
        android:right="10dp"
        android:top="5dp" />
</shape>

================================================
FILE: android/src/main/res/drawable/ic_checkmark.xml
================================================
<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="24dp"
    android:height="24dp"
    android:viewportWidth="24"
    android:viewportHeight="24">
  <path
      android:pathData="M12,12m-12,0a12,12 0,1 1,24 0a12,12 0,1 1,-24 0"
      android:fillColor="@color/app_color_33"/>
  <path
      android:pathData="M15.7936,6.5936L10.1279,14.0879L7.6847,10.9253C7.4402,10.6113 7.081,10.4072 6.6861,10.358C6.2912,10.3088 5.8928,10.4185 5.5788,10.663C5.2648,10.9075 5.0607,11.2667 5.0115,11.6617C4.9623,12.0566 5.072,12.4549 5.3165,12.7689L8.9588,17.4304C9.0999,17.609 9.2799,17.7532 9.4851,17.8519C9.6902,17.9506 9.9152,18.0012 10.1429,18C10.3718,17.9994 10.5975,17.9465 10.8028,17.8451C11.008,17.7438 11.1873,17.5968 11.327,17.4154L18.1768,8.4222C18.4193,8.1042 18.5255,7.7029 18.4721,7.3065C18.4187,6.9102 18.21,6.5513 17.892,6.3088C17.574,6.0663 17.1727,5.9601 16.7763,6.0135C16.38,6.0669 16.0211,6.2756 15.7786,6.5936H15.7936Z"
      android:fillColor="#ffffff"/>
</vector>


================================================
FILE: android/src/main/res/drawable/ic_down.xml
================================================
<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="24dp"
    android:height="24dp"
    android:viewportWidth="24"
    android:viewportHeight="24">
  <path
      android:pathData="M12,16a1,1 0,0 1,-0.71 -0.29l-6,-6a1,1 0,0 1,1.42 -1.42l5.29,5.3 5.29,-5.29a1,1 0,0 1,1.41 1.41l-6,6a1,1 0,0 1,-0.7 0.29z"
      android:fillColor="@color/app_color_grey"/>
</vector>


================================================
FILE: android/src/main/res/drawable/num_oval.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="oval"
    android:useLevel="false">

    <solid android:color="@color/app_color_33" />
    <stroke
        android:width="1.5dp"
        android:color="@color/app_color_white" />
    <size
        android:width="24dp"
        android:height="24dp" />
</shape>

================================================
FILE: android/src/main/res/drawable/picture_not_selected.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="oval"
    android:useLevel="false">
   <stroke
        android:width="2dp"
        android:color="@color/app_color_9b" />
    <size
        android:width="24dp"
        android:height="24dp" />
</shape>


================================================
FILE: android/src/main/res/drawable/picture_selector.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<selector android:id="@+id/picture_selector" xmlns:android="http://schemas.android.com/apk/res/android">
  <item android:drawable="@drawable/num_oval" android:state_selected="true" />
  <item android:drawable="@drawable/picture_not_selected" android:state_selected="false" />
</selector>

================================================
FILE: android/src/main/res/drawable/preview_gallery_item.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="@color/ps_color_transparent" />
    <stroke
        android:width="2dp"
        android:color="@color/app_color_white" />
</shape>

================================================
FILE: android/src/main/res/drawable/preview_gallery_white_bg.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:left="-1dp"
        android:right="-1dp"
        android:top="-1dp">
        <shape android:shape="rectangle">
            <solid android:color="@color/app_color_white_transparent" />
            <padding
                android:left="0dp"
                android:right="0dp" />
            <corners android:radius="0dp" />
        </shape>
    </item>
</layer-list>


================================================
FILE: android/src/main/res/layout/loading_dialog.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/loading"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@drawable/ps_dialog_loading_bg"
    android:orientation="vertical"
    android:padding="10dp">

    <ProgressBar
        android:layout_width="25dp"
        android:layout_height="25dp"
        android:layout_gravity="center_horizontal"
        android:indeterminateBehavior="repeat"

        />

</LinearLayout>

================================================
FILE: android/src/main/res/values/colors.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
  <color name="app_color_grey">#393a3e</color>
  <color name="app_color_black">#000000</color>
  <color name="app_color_f6">#f6f6f6</color>
  <color name="app_color_fa">#fafafa</color>
  <color name="app_color_divider">#B6B6B6</color>
  <color name="app_color_c51">#f94c51</color>
  <color name="app_color_green">#43c117</color>
  <color name="app_color_53575e">#53575e</color>
  <color name="app_color_transparent">#00000000</color>
  <color name="app_color_white">#FFFFFF</color>
  <color name="app_color_white_transparent">#E0DBDBDB</color>
  <color name="app_color_blue">#7D7DFF</color>
  <color name="app_color_9b">#9b9b9b</color>
  <color name="app_color_e0ff6100">#E0FF6100</color>
  <color name="app_color_red">#FF0000</color>
  <color name="app_color_pri">#FB9300</color>
  <color name="app_color_33">#333333</color>
  <color name="app_color_3310">#0D333333</color>
</resources>


================================================
FILE: android/src/main/res/values/styles.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>

    <style name="Base.Theme.NoActionBar" parent="Theme.AppCompat.Light.NoActionBar"> 
        <item name="android:windowOptOutEdgeToEdgeEnforcement">true</item>
    </style>

    <style name="Picture.Theme.Translucent" parent="Base.Theme.NoActionBar">
        <item name="android:windowBackground">@color/ps_color_transparent</item>
        <item name="android:windowNoTitle">true</item>
        <item name="android:windowIsTranslucent">true</item>
    </style>

    <style name="PictureThemeWindowStyle">
        <item name="android:windowEnterAnimation">@anim/ps_anim_album_show</item>
        <item name="android:windowExitAnimation">@anim/ps_anim_album_dismiss</item>
    </style>

    <style name="PictureThemeDialogWindowStyle">
        <item name="android:windowEnterAnimation">@anim/ps_anim_modal_in</item>
        <item name="android:windowExitAnimation">@anim/ps_anim_modal_out</item>
    </style>

    <style name="Picture.Theme.Dialog.AudioStyle">
        <item name="android:windowEnterAnimation">@anim/ps_anim_enter</item>
        <item name="android:windowExitAnimation">@anim/ps_anim_exit</item>
    </style>

    <style name="Picture.Theme.AlertDialog" parent="android:Theme.Dialog">
        <item name="android:windowIsFloating">true</item>
        <item name="android:windowIsTranslucent">false</item>
        <item name="android:windowNoTitle">true</item>
        <item name="android:windowFullscreen">false</item>
        <item name="android:windowBackground">@color/ps_color_transparent</item>
        <item name="android:windowAnimationStyle">@null</item>
        <item name="android:backgroundDimEnabled">false</item>
        <item name="android:backgroundDimAmount">0.4</item>
    </style>

    <style name="PictureThemeDialogFragmentAnim" mce_bogus="1" parent="android:Animation">
        <item name="android:windowEnterAnimation">@anim/ps_anim_up_in</item>
        <item name="android:windowExitAnimation">@anim/ps_anim_down_out</item>
    </style>

    <style name="Picture.Theme.Dialog" parent="@android:style/Theme.Dialog">

        <!-- 边框 -->
        <item name="android:windowFrame">@android:color/transparent</item>
        <!-- 是否浮现在activity之上 -->
        <item name="android:windowIsFloating">true</item>
        <!-- 半透明 -->
        <item name="android:windowIsTranslucent">false</item>
        <!-- 无标题 -->
        <item name="android:windowNoTitle">true</item>
        <item name="android:windowContentOverlay">@null</item>
        <item name="android:windowAnimationStyle">@android:style/Animation.Dialog</item>
        <item name="android:windowSoftInputMode">stateUnspecified|adjustPan</item>

        <!-- 自己想要的背景 -->
        <item name="android:windowBackground">@android:color/transparent</item>
    </style>

</resources>

================================================
FILE: babel.config.js
================================================
module.exports = {
  presets: ['module:metro-react-native-babel-preset'],
};


================================================
FILE: docs/.gitignore
================================================
# Dependencies
/node_modules

# Production
/build

# Generated files
.docusaurus
.cache-loader

# Misc
.DS_Store
.env.local
.env.development.local
.env.test.local
.env.production.local

npm-debug.log*
yarn-debug.log*
yarn-error.log*


================================================
FILE: docs/docs/CAMERA.mdx
================================================
---
id: camera
title: Camera 📸
sidebar_label: Camera 📸
slug: /camera
---

import ReactPlayer from 'react-player'

The camera module provides a simple interface for capturing photos and recording videos with customizable options.

<ReactPlayer
  playing
  controls
  width="100%"
  height="100%"
  url="https://github.com/user-attachments/assets/7afbc4cd-07a7-46b0-8501-9f1b3be70699"
/>

## Usage

```typescript
import { openCamera } from '@baronha/react-native-multiple-image-picker'

const open = async () => {
  try {
    const response = await openCamera({
      mediaType: 'all',
      cameraDevice: 'back'
    })
    console.log(response)
  } catch (e) {
    console.log(e)
  }
}
```

## Configuration Options

### `mediaType`
Specifies the type of media that can be captured.

```typescript
mediaType?: 'video' | 'image' | 'all'
```

**Default:** `'all'`

### `cameraDevice`
Selects which camera to use for capture.

```typescript
cameraDevice?: 'front' | 'back'
```

**Default:** `'back'`

### `videoMaximumDuration`
Sets the maximum duration for video recording in seconds.

```typescript
videoMaximumDuration?: number
```

**Default:** No limit

### `presentation`
Controls how the camera view is presented (iOS only).

```typescript
presentation?: 'fullScreenModal' | 'formSheet'
```

**Default:** `'fullScreenModal'`

### `language`
Sets the interface language.

```typescript
language?: Language
```

**Supported values:**
- 🌐 `'system'`: System default
- 🇨🇳 `'zh-Hans'`: Simplified Chinese
- 🇹🇼 `'zh-Hant'`: Traditional Chinese
- 🇯🇵 `'ja'`: Japanese
- 🇰🇷 `'ko'`: Korean
- 🇬🇧 `'en'`: English
- 🇹🇭 `'th'`: Thai
- 🇮🇩 `'id'`: Indonesian
- 🇻🇳 `'vi'`: Vietnamese
- 🇷🇺 `'ru'`: Russian
- 🇩🇪 `'de'`: German
- 🇫🇷 `'fr'`: French
- 🇸🇦 `'ar'`: Arabic

**Default:** `'system'`

### `crop`
Enables and configures image cropping after capture.

See details in [Crop Configuration](/config/#crop-)

### `color`

- **Type**: [**ColorValue**](https://reactnative.dev/docs/colors)
- **Default**: 🟦 `#2979ff`
- **Required**: No
- **Platform**: iOS, Android

## Result Type

The camera function returns a `CameraResult` object:

```typescript
interface CameraResult {
  /**
   * Path to the captured media file
   * - iOS: Starts with 'file://'
   * - Android: Can start with 'file://' or 'content://'
   */
  path: string

  /**
   * Type of captured media
   * - 'video': For video recordings
   * - 'image': For photos
   */
  type: 'video' | 'image'

  /**
   * Width of the media in pixels
   * For cropped images, this represents the final cropped width
   */
  width: number

  /**
   * Height of the media in pixels
   * For cropped images, this represents the final cropped height
   */
  height: number

  /**
   * Duration of the video in seconds
   * Only available when type is 'video'
   * @platform ios, android
   */
  duration: number

  /**
   * Path to the video thumbnail image
   * Only available when type is 'video'
   * Format: 'file://path/to/thumbnail.jpg'
   * @platform ios, android
   */
  thumbnail?: string

  /**
   * Original filename of the captured media
   * Example: 'IMG_1234.JPG' or 'VID_5678.MP4'
   */
  fileName: string
}
```

### Example Response

#### Photo Capture
```typescript
{
  path: 'file:///var/mobile/Containers/.../IMG_0123.JPG',
  type: 'image',
  width: 3024,
  height: 4032,
  fileName: 'IMG_0123.JPG'
}
```

#### Video Recording
```typescript
{
  path: 'file:///var/mobile/Containers/.../VID_0124.MP4',
  type: 'video',
  width: 1920,
  height: 1080,
  duration: 15.6,
  thumbnail: 'file:///var/mobile/Containers/.../VID_0124_thumb.JPG',
  fileName: 'VID_0124.MP4'
}
```

### Notes

- The `path` format may vary between iOS and Android. Always use the provided path as-is.
- Video thumbnails are automatically generated and provided in the `thumbnail` property.
- For cropped images, the `width` and `height` reflect the dimensions after cropping.
- The `duration` property is only available for video recordings and is measured in seconds.
- All file paths are provided with the appropriate prefix (`file://` or `content://`).

## Examples

### Photo Capture
```typescript
const result = await openCamera({
  mediaType: 'image',
  cameraDevice: 'back'
})
```

### Video Recording
```typescript
const result = await openCamera({
  mediaType: 'video',
  videoMaximumDuration: 30,
  cameraDevice: 'front'
})
```

### With Cropping
```typescript
const result = await openCamera({
  mediaType: 'image',
  crop: {
    circle: true,
    ratio: [
      { title: "Square", width: 1, height: 1 },
      { title: "Portrait", width: 3, height: 4 }
    ]
  }
})
```

### Custom UI
```typescript
const result = await openCamera({
  color: '#FF6B6B',
  language: 'en',
  presentation: 'fullScreenModal'
})
```

## Platform Specific Notes

### iOS
- Supports `presentation` option for modal style
- Full support for all UI customization options

### Android
- Maximum 4 custom crop ratios
- Some UI elements may appear differently

## Required Permissions

### iOS
Add to `Info.plist`:
```xml
<key>NSCameraUsageDescription</key>
<string>Camera access is required to take photos and videos</string>
<key>NSMicrophoneUsageDescription</key>
<string>Microphone access is required to record videos</string>
```

### Android
Add to `AndroidManifest.xml`:
```xml
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
```


================================================
FILE: docs/docs/CONFIG.mdx
================================================
---
id: config
title: Configuration
sidebar_label: Configuration
slug: /config
---

# Configuration

### `selectMode`

Mode of selection in the picker.

- **Type**: string
- **Default**: `multiple`
- **Required**: No
- **Options**:
  - `single`: Single selection mode
  - `multiple`: Multiple selection mode

### `selectedAssets`

Keep previous selection in Multiple Image Picker <br/>
See [**Result**](/result)

- **Type**: Result[]
- **Default**: `[]`
- **Required**: No

### `allowedLimit`

Display additional select more media when permission on `iOS` is limited.

- **Type**: boolean
- **Default**: `true`
- **Required**: No
- **Platform**: iOS

### `allowSwipeToSelect`

Allow swiping to select items.

- **Type**: boolean
- **Default**: `true`
- **Required**: No
- **Platform**: iOS, Android

### `isHiddenOriginalButton`

Hide the original button.

- **Type**: boolean
- **Default**: `false`
- **Required**: No
- **Platform**: iOS, Android

### `maxSelect`

Maximum number of items that can be selected.

- **Type**: number
- **Default**: `20`
- **Required**: No
- **Platform**: iOS, Android

### `maxVideo`

Maximum number of videos allowed.

- **Type**: number
- **Default**: `20`
- **Required**: No
- **Platform**: iOS, Android

## Camera 📸

Configuration camera functionality.

- **Type**: object
- **Default**: `{}`
- **Required**: No
- **Platform**: iOS, Android

### `cameraDevice`

Camera device to be used.

- **Type**: `string`
- **Default**: `back`
- **Required**: No
- **Platform**: iOS
- **Options**:
  - `back`: Back camera
  - `front`: Front camera

### `videoMaximumDuration`

Maximum video duration in seconds.

- **Type**: number
- **Default**: 60
- **Required**: No
- **Platform**: iOS, Android

## Crop 🪚

Configuration for image cropping functionality.

- **Type**: object
- **Default**: `undefined`
- **Required**: No
- **Platform**: iOS, Android

### `circle`

Enable circular crop mask.

- **Type**: boolean
- **Default**: `false`
- **Required**: No
- **Platform**: iOS, Android

### `ratio`

Aspect ratios for cropping.
Android: Maximum: 4 items

- **Type**: `array`
- **Default**: `undefined`
- **Required**: No
- **Platform**: iOS, Android
- **Properties**:
  - `title`: string - Display title for the ratio (e.g., "Square", "16:9")
  - `width`: number - Width value for the aspect ratio
  - `height`: number - Height value for the aspect ratio

### `defaultRatio`

Default ratio to be selected when opening the crop interface.

- **Type**: `object`
- **Default**: `undefined`
- **Required**: No
- **Platform**: iOS, Android
- **Properties**:
  - `title`: string - Display title for the ratio (e.g., "Square", "16:9")
  - `width`: number - Width value for the aspect ratio
  - `height`: number - Height value for the aspect ratio

### `freeStyle`

Enable free style cropping.

- **Type**: `boolean`
- **Default**: `false`
- **Required**: No
- **Platform**: iOS, Android

---

## UI Customize 🌈

### `theme`

Theme mode for the picker.

- **Type**: string
- **Default**: `system`
- **Required**: No
- **Platform**: iOS, Android
- **Options**:
  - `light`: Light theme
  - `dark`: Dark theme
  - `system`: System default theme

### `primaryColor`

Primary color for the picker UI elements.

- **Type**: [**ColorValue**](https://reactnative.dev/docs/colors)
- **Default**: 🟦 `#2979ff`
- **Required**: No
- **Platform**: iOS, Android

### `backgroundDark`

Background color for dark mode UI elements.

- **Type**: [**ColorValue**](https://reactnative.dev/docs/colors)
- **Default**: ⚫️ `#1A1A1A`
- **Required**: No
- **Platform**: iOS, Android

### `selectBoxStyle`

Style of selection box in the picker.

- **Type**: string
- **Default**: `number`
- **Required**: No
- **Options**:
  - `number`: Show numbers in selection box
  - `tick`: Show checkmark in selection box

### `spacing`

Spacing between items in the grid.

- **Type**: number
- **Default**: `2`
- **Required**: No
- **Platform**: iOS, Android

### `numberOfColumn`

Number of columns in the grid view.

- **Type**: number
- **Default**: `4`
- **Required**: No
- **Platform**: iOS, Android

### `presentation`

Modal presentation style for the picker.

- **Type**: string
- **Default**: `fullScreenModal`
- **Required**: No
- **Platform**: iOS
- **Options**:
  - `fullScreenModal`: Full screen presentation
  - `formSheet`: Form sheet presentation

---

## Filter data 🎞️

### `mediaType`

Type of media to be displayed in the picker.

- **Type**: string
- **Default**: `all`
- **Required**: No
- **Options**:
  - `video`: Only show videos
  - `image`: Only show images
  - `all`: Show both videos and images

### `maxVideoDuration`

Maximum duration for videos in seconds.

- **Type**: number
- **Default**: `undefined`
- **Required**: No
- **Platform**: iOS, Android

### `minVideoDuration`

Minimum duration for videos in seconds.

- **Type**: number
- **Default**: `undefined`
- **Required**: No
- **Platform**: iOS, Android

### `maxFileSize`

Maximum file size in bytes.

- **Type**: number
- **Default**: `undefined`
- **Required**: No
- **Platform**: iOS, Android

---

## Preview 🌠

### `isPreview`

Enable preview functionality.

- **Type**: boolean
- **Default**: `true`
- **Required**: No
- **Platform**: iOS, Android

### `isShowPreviewList`

Show preview list.

- **Type**: boolean
- **Default**: `false`
- **Required**: No
- **Platform**: iOS

### `isHiddenPreviewButton`

Hide the preview button and button mode.

- **Type**: boolean
- **Default**: `false`
- **Required**: No
- **Platform**: iOS, Android

### `allowHapticTouchPreview`

Enable haptic feedback on preview.

- **Type**: boolean
- **Default**: `false`
- **Required**: No
- **Platform**: iOS

---

## Localization 🌐

### `text`

Custom text labels for buttons and headers.

- **Type**: object
- **Default**: `undefined`
- **Required**: No
- **Platform**: iOS, Android
- **Properties**:
  - `finish`: string - Text for finish/done button
  - `original`: string - Text for original button
  - `preview`: string - Text for preview button
  - `edit`: string - Text for edit button

### `language`

Interface language for the picker.

- **Type**: string
- **Default**: `system`
- **Required**: No
- **Options**:

  - `system`: 🌐 System default
  - `zh-Hans`: 🇨🇳 Simplified Chinese
  - `zh-Hant`: 🇹🇼 Traditional Chinese
  - `ja`: 🇯🇵 Japanese
  - `ko`: 🇰🇷 Korean
  - `en`: 🇬🇧 English
  - `vi`: 🇻🇳 Vietnamese
  - `ru`: 🇷🇺 Russian
  - `de`: 🇩🇪 German
  - `fr`: 🇫🇷 French
  - `ar`: 🇸🇦 Arabic

  **iOS Only**:

  - `id`: 🇮🇩 Indonesian
  - `th`: 🇹🇭 Thai


================================================
FILE: docs/docs/CROP.mdx
================================================
---
id: crop
title: Crop 🍕
sidebar_label: Crop 🍕
slug: /crop
---

## Usage

```typescript
import { openCropper } from '@baronha/react-native-multiple-image-picker'

const cropConfig: CropConfig = {
  // ...
}

const open = async () => {
  try {
    const response = await openCropper('file://path/to/image.jpg', cropConfig)
    setImages(response)
  } catch (e) {
    // catch error for multiple image picker
  }
}
```

## CropConfig

### `circle`

Enable circular crop mask.

- **Type**: boolean
- **Default**: `false`
- **Required**: No
- **Platform**: iOS, Android

### `ratio`

Aspect ratios for cropping.
Android: Maximum: 4 items

- **Type**: `array`
- **Default**: `undefined`
- **Required**: No
- **Platform**: iOS, Android
- **Properties**:
  - `title`: string - Display title for the ratio (e.g., "Square", "16:9")
  - `width`: number - Width value for the aspect ratio
  - `height`: number - Height value for the aspect ratio

### `defaultRatio`

Default ratio to be selected when opening the crop interface.

- **Type**: `object`
- **Default**: `undefined`
- **Required**: No
- **Platform**: iOS, Android
- **Properties**:
  - `title`: string - Display title for the ratio (e.g., "Square", "16:9")
  - `width`: number - Width value for the aspect ratio
  - `height`: number - Height value for the aspect ratio

### `freeStyle`

Enable free style cropping.

- **Type**: `boolean`
- **Default**: `false`
- **Required**: No
- **Platform**: iOS, Android

### `language`

- **Type**: `string`
- **Default**: `false`
- **Required**: No
- **Platform**: iOS

See [**Language**](/config/#language)

## Result

### `path`

- **Type**: `string`

### `width`

- **Type**: `number`

### `height`

- **Type**: `number`


================================================
FILE: docs/docs/GETTING_STARTED.mdx
================================================
---
id: getting-started
title: Getting Started
sidebar_label: Getting Started
sidebar_id: getting-started
slug: /getting-started
---

import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
import useBaseUrl from '@docusaurus/useBaseUrl'

## Requirements

Because RNMIP uses Nitro Module, it complies with Nitro Modules' requirements.<br />
View Nitro Modules' requirements [here](https://nitro.margelo.com/docs/minimum-requirements)

<Tabs groupId="platform">
  <TabItem value="ios" label="iOS" default>
    - `iOS` 13+

    - `react-native` 0.75+

    - `Xcode` 16+

  </TabItem>
  <TabItem value="android" label="Android">
    - `react-native` 0.75+

    - `compileSdkVersion` 34+

  </TabItem>
</Tabs>

## Installing

Install [@baronha/react-native-multiple-image-picker](https://www.npmjs.com/package/@baronha/react-native-multiple-image-picker) through npm:

> This package requires `react-native-nitro-modules` to be installed first.
> See [react-native-nitro-modules](https://github.com/mrousavy/nitro) for more information.

<Tabs
  groupId="environment"
  defaultValue="rn"
  values={[
    {label: 'React Native', value: 'rn'},
    {label: 'Expo', value: 'expo'}
  ]}>
<TabItem value="rn">

```bash
yarn add @baronha/react-native-multiple-image-picker
yarn add -D react-native-nitro-modules
cd ios && pod install
```

</TabItem>

<TabItem value="expo">

```bash
npx expo install @baronha/react-native-multiple-image-picker 
npx expo install react-native-nitro-modules -- --dev
npx expo prebuild
```

</TabItem>
</Tabs>

## Updating manifests

<Tabs
  groupId="environment"
  defaultValue="rn"
  values={[
    {label: 'React Native', value: 'rn'},
    {label: 'Expo', value: 'expo'}
  ]}>
<TabItem value="rn">

### Info.plist

Open your project's `Info.plist` and add the following lines inside the outermost `<dict>` tag:

```xml
<key>NSPhotoLibraryAddUsageDescription</key>
<string>$(PRODUCT_NAME) needs photo library permissions</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>$(PRODUCT_NAME) needs photo library permissions</string>
<!--  if you allow camera, you need to add this:-->
<key>NSCameraUsageDescription</key>
<string>$(PRODUCT_NAME) needs to access your Camera</string>
<key>NSMicrophoneUsageDescription</key>
<string>$(PRODUCT_NAME) needs to access your microphone so that you can record audio.</string>
```

</TabItem>
<TabItem value="expo">

### Managed Expo

Config your Expo app (`app.json`, `app.config.json` or `app.config.js`):

```json
{
  "name": "my app",
  "ios": {
    // ...
    "infoPlist": {
      "NSPhotoLibraryAddUsageDescription": "$(PRODUCT_NAME) needs photo library permissions",
      "NSPhotoLibraryUsageDescription": "$(PRODUCT_NAME) needs photo library permissions",
      // if you allow camera, you need to add this
      "NSCameraUsageDescription": "$(PRODUCT_NAME) needs to access your Camera",
      "NSMicrophoneUsageDescription": "$(PRODUCT_NAME) needs to access your microphone so that you can record audio"
    }
    // ...
  }
}
```

Finally, compile the mods:

```bash
npx expo prebuild
```

To apply the changes, build a new binary with EAS:

```bash
eas build
```

</TabItem>
</Tabs>

<br />

#### 🎉 Hooray! You're ready to learn about [Usage](/usage)!

---


================================================
FILE: docs/docs/PREVIEW.mdx
================================================
---
id: preview
title: Preview 🎑
sidebar_label: Preview 🎑
slug: /preview
---

import ReactPlayer from 'react-player'

## Overview

Preview is a simple image viewer that supports both local and remote media. It allows you to preview images and videos seamlessly.

<ReactPlayer
  playing
  controls
  width="100%"
  height="100%"
  url="https://github.com/user-attachments/assets/92a1c319-ad99-4d24-892c-7cd878787acd"
/>

## Usage

```typescript
import {
  openPreview,
  PreviewConfig,
} from '@baronha/react-native-multiple-image-picker'

const previewConfig: PreviewConfig = {
  language: 'system',
}

const media: MediaPreview[] = [
  // remote image
  {
    path: 'https://images.unsplash.com/photo-1733235015085-fc29c17c4a16?w=500',
    type: 'image',
  },
  // local video
  {
    path: 'file://Documents/video-sample/mp4',
    thumbnail:
      'https://images.unsplash.com/photo-1733889886752-f4599c954608?q=80&w=2574&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D',
    type: 'video',
  },
  // remote video
  {
    path: 'https://cdn.pixabay.com/video/2024/02/09/199958-911694865_large.mp4',
    type: 'video',
  },
]

// call to preview
openPreview(media, 2, previewConfig)
```

## `MediaPreview[]`

`MediaPreview[]` is an array of media objects that you want to preview. Each object in the array should have the following properties:<br/>

**NOTE**: You can also use [`Result[]`](/result) from openPicker's return result

- `path`: A string representing the URL or file path of the media.
- `type`: A string indicating the type of media, either `image` or `video`.
- `thumbnail` (optional): A string representing the URL of the thumbnail image for videos.
- `localIdentifier` (optional): A string representing the local identifier for media from device gallery.

## `index`

default: `0`

The `index` parameter in the `openPreview` function specifies the initial media item to display. It is a zero-based index, meaning that `0` will display the first item in the `MediaPreview` array.

## `previewConfig`

### [`language`](/config/#language)

see [`language`](/config/#language)

### `onLongPress`

`onLongPress` is a callback function that is called when a long press is detected on the media item. It is a function that takes an index as an argument and returns void.

```typescript
onLongPress: (index: number) => void
```

## Additional Information

- Ensure that the media paths are accessible and correctly formatted.
- The `openPreview` function is part of the `@baronha/react-native-multiple-image-picker` package, which should be installed and properly configured in your project.

For more detailed information, refer to the [official documentation](https://github.com/baronha/react-native-multiple-image-picker).


================================================
FILE: docs/docs/RESULT.mdx
================================================
---
id: result
title: Result
sidebar_label: Result
slug: /result
---

The result object returned for each selected media item.

### `path`

- **Type**: string
- **Description**: Local file path of the media

### `fileName`

- **Type**: string
- **Description**: Name of the media file

### `localIdentifier`

- **Type**: string
- **Description**: Unique identifier for the media asset

### `width`

- **Type**: number
- **Description**: Width of the media in pixels

### `height`

- **Type**: number
- **Description**: Height of the media in pixels

### `mime`

- **Type**: string
- **Description**: MIME type of the media file

### `size`

- **Type**: number
- **Description**: File size in bytes

### `bucketId`

- **Type**: number
- **Description**: ID of the bucket containing the media
- **Platform**: Android

### `realPath`

- **Type**: string
- **Description**: Actual file path in the device storage
- **Platform**: Android

### `parentFolderName`

- **Type**: string
- **Description**: Name of the parent folder
- **Platform**: Android

### `creationDate`

- **Type**: number
- **Description**: Creation timestamp of the media

### `type`

- **Type**: string
- **Options**: `image` | `video`
- **Description**: Type of the media file

### `duration`

- **Type**: number
- **Description**: Duration in seconds (for video files)

### `thumbnail`

- **Type**: string
- **Description**: Thumbnail path for video files

### `crop`

- **Type**: boolean
- **Description**: Indicates if the media has been cropped


================================================
FILE: docs/docs/SHOWCASE/index.mdx
================================================
---
id: showcase
title: Showcase ✨
sidebar_label: Showcase ✨
slug: /showcase
---

import style from './showcase.css'
import data from './showcase.json'

List of used applications with `@baronha/react-native-multiple-image-picker`

> Contributions are welcome! If you have an application that uses `@baronha/react-native-multiple-image-picker`<br/>
> please open a [**Pull Request**](https://github.com/baronha/react-native-multiple-image-picker/tree/master/docs/docs/SHOWCASE/showcase.json) to add it to the list.

<br />

<div className="showcaseContainer">
  {data.map((item, index) => {
    return (
      <a
        key={`showcase-${index}`}
        href={item.link}
        target="_blank"
        className="showcaseItem"
      >
        <img src={item.banner} alt={item.title} className="showcaseBanner" />
        <b>{item.title}</b>
        <p className="showcaseTagline">{item?.tagline}</p>
      </a>
    )
  })}
</div>


================================================
FILE: docs/docs/SHOWCASE/showcase.css
================================================
.showcaseContainer {
  display: flex;
  /* justify-content: space-between; */
  flex-wrap: wrap;
  gap: 20px;
}

.showcaseItem {
  flex: 1;
  color: inherit;
  text-decoration: none;
}

.showcaseItem a:hover {
  color: red;
  text-decoration: none !important;
}

.showcaseItem b {
  font-size: 1rem;
}

.showcaseItem .showcaseTagline {
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
  text-overflow: ellipsis;
  margin: 0;
}

.showcaseBanner {
  width: 100%;
  aspect-ratio: 16/9;
  object-fit: cover;
}

@media (max-width: 768px) {
  .showcaseItem {
    flex: 100%;
    margin-right: 0;
  }
}

@media (min-width: 992px) {
  /* lg */
  .showcaseItem {
    max-width: 33.333%;
  }
}

@media (min-width: 1200px) {
  /* xl */
  .showcaseItem {
    max-width: 33.333%;
  }
}

@media (min-width: 1400px) {
  /* xxl */
  .showcaseItem {
    max-width: 33.333%;
  }
}

@media (max-width: 480px) {
  .showcaseItem {
    flex: 100%;
  }
}


================================================
FILE: docs/docs/SHOWCASE/showcase.json
================================================
[
  {
    "banner": "https://github.com/user-attachments/assets/84ec6432-1557-4649-965c-6100d9c4c12d",
    "title": "✨ Binsoo - Photo Filters & Editor",
    "link": "https://apps.apple.com/vn/app/binsoo-photo-filters-editor/id6502683720",
    "tagline": "Endless aesthetics and effects"
  },
  {
    "banner": "https://github.com/user-attachments/assets/72a7787a-4a41-40e3-b6bb-a5c7b0eafc83",
    "title": "Pupi",
    "link": "https://apps.apple.com/vn/app/pupi-h%E1%BB%8Dc-vui-ti%E1%BA%BFn-b%E1%BB%99/id1638474798",
    "tagline": "Học vui & tiến b‪ộ"
  },
  {
    "banner": "https://github.com/user-attachments/assets/dd92d243-7fb0-40ff-9b78-7b4fd2a54092",
    "title": "Pety",
    "link": "https://apps.apple.com/vn/app/pety/id1506375124",
    "tagline": "New Lifestyle for Pet Lovers"
  }
]


================================================
FILE: docs/docs/USAGE.mdx
================================================
---
id: usage
title: Usage
sidebar_label: Usage
slug: /usage
---

Here is a simple usage of the Multiple Image Picker. <br/>
See more [**Config**](/config)

```typescript
import { openPicker, Config } from '@baronha/react-native-multiple-image-picker'

const config: Config = {
  maxSelect: 10,
  maxVideo: 10,
  primaryColor: '#FB9300',
  backgroundDark: '#2f2f2f',
  numberOfColumn: 4,
  mediaType: 'all',
  selectBoxStyle: 'number',
  selectMode: 'multiple',
  language: 'vi', // 🇻🇳 Vietnamese
  theme: 'dark',
  isHiddenOriginalButton: false,
  primaryColor: '#F6B35D',
}

const onPicker = async () => {
  try {
    const response = await openPicker(config)
    setImages(response)
  } catch (e) {
    // catch error for multiple image picker
  }
}
```


================================================
FILE: docs/docs/index.md
================================================
---
id: index
title: Multiple Image Picker | BAO HA
hide_title: true
sidebar_label: Multiple Image Picker
description: 🏞 react-native-multiple-image-picker enables applications to pick images and videos from multiple smart albums in iOS/Android
image: img/banner.png
slug: /
---

import ReactPlayer from 'react-player'

![Logo][Logo]

<img src="img/banner.png" width="100%" />

[![iOS][iOS]][iOS-URL] [![Android][Android]][Android-URL] [![Swift][Swift]][Swift-URL] [![Kotlin][Kotlin]][Kotlin-URL] [![React-Native][React-Native]][React-Native-URL]

## Overview 🎇

<ReactPlayer playing controls width="100%" height="100%" url='https://github.com/user-attachments/assets/79580bc7-237c-46b7-b92e-1479cc6d9079' />

React Native Multiple Image Picker **(RNMIP)** enables application to pick images and videos from multiple smart album in iOS/Android. React Native Multiple Image Picker is based on two libraries available, [HXPhotoPicker](https://github.com/SilenceLove/HXPhotoPicker) and [PictureSelector](https://github.com/LuckSiege/PictureSelector)

## Features 🔥

| 🤩  | ![Logo][Logo]                                                                  |
| --- | ------------------------------------------------------------------------------ |
| 🍕  | [**Crop**](/crop) single/multiple image.                            |
| 🎑  | [**Preview**](/preview) image/video.                                |
| 📸  | [**Camera**](/camera) module for capturing photos and recording videos. |
| 🐳  | Keep the previous selection.                                                   |
| 0️⃣  | Selected order index.                                                          |
| 🎨  | UI Customization (numberOfColumn, spacing, primaryColor ... )                  |
| 🌚  | Dark Mode, Light Mode                                                          |
| 🌄  | Choose multiple images/video.                                                  |
| 📦  | Support smart album `(camera roll, selfies, panoramas, favorites, videos...)`. |
| 📺  | Display video duration.                                                        |
| ⛅️ | Support iCloud Photo Library.                                                  |
| 🌪  | Scrolling performance. ☕️                                                      |

## Sponsor & Support ☕️

To keep this library maintained and up-to-date please consider [sponsoring it on GitHub](https://github.com/sponsors/baronha). Or if you are looking for a private support or help in customizing the experience, then reach out to me on Twitter [@\_baronha](https://twitter.com/_baronha).

## Built With ❤️

[![NitroModules](https://img.shields.io/badge/Nitro_Modules-0052CC?style=for-the-badge)](https://nitro.margelo.com/docs/nitro-modules)

[![HXPhotoPicker](https://img.shields.io/badge/HXPhotoPicker-F05138?style=for-the-badge)](https://github.com/SilenceLove/HXPhotoPicker)

[![PictureSelector](https://img.shields.io/badge/Picture_Selector-b07219?style=for-the-badge)](https://github.com/LuckSiege/PictureSelector)

<!-- Badge for README -->

[iOS]: https://img.shields.io/badge/iOS-000000?style=for-the-badge&logo=ios&logoColor=white
[iOS-URL]: https://www.apple.com/ios
[Android]: https://img.shields.io/badge/Android-3DDC84?style=for-the-badge&logo=android&logoColor=white
[Android-URL]: https://www.android.com/
[React-Native]: https://img.shields.io/badge/React_Native-20232A?style=for-the-badge&logo=react&logoColor=61DAFB
[React-Native-URL]: https://reactnative.dev/
[React-Native]: https://img.shields.io/badge/React_Native-20232A?style=for-the-badge&logo=react&logoColor=61DAFB
[React-Native-URL]: https://reactnative.dev/
[Swift]: https://img.shields.io/badge/Swift-FA7343?style=for-the-badge&logo=swift&logoColor=white
[Swift-URL]: https://developer.apple.com/swift/
[Kotlin]: https://img.shields.io/badge/Kotlin-0095D5?&style=for-the-badge&logo=kotlin&logoColor=white
[Kotlin-URL]: https://kotlinlang.org/
[Logo]: https://img.shields.io/badge/React_Native_Multiple_Image_Picker-DF78C3?style=for-the-badge


================================================
FILE: docs/docusaurus.config.ts
================================================
import { themes as prismThemes } from 'prism-react-renderer'
import type { Config } from '@docusaurus/types'
import type * as Preset from '@docusaurus/preset-classic'

// This runs in Node.js - Don't use client-side code here (browser APIs, JSX...)

const config: Config = {
  title: 'React Native Multiple Image Picker',
  tagline: 'High-performance React Native Multiple Image Picker library.',
  favicon: 'img/favicon.ico',

  // Set the production url of your site here
  url: 'https://nitrogenzlab.github.io',

  // Set the /<baseUrl>/ pathname under which your site is served
  // For GitHub pages deployment, it is often '/<projectName>/'
  baseUrl: '/react-native-multiple-image-picker',

  // GitHub pages deployment config.
  // If you aren't using GitHub pages, you don't need these.
  organizationName: 'baronha', // Usually your GitHub org/user name.
  projectName: 'react-native-multiple-image-picker', // Usually your repo name.
  trailingSlash: false,

  onBrokenLinks: 'throw',
  onBrokenMarkdownLinks: 'warn',

  // Even if you don't use internationalization, you can use this field to set
  // useful metadata like html lang. For example, if your site is Chinese, you
  // may want to replace "en" with "zh-Hans".
  i18n: {
    defaultLocale: 'en',
    locales: ['en', 'vi'],
    path: 'i18n',
    localeConfigs: {
      en: {
        label: 'English',
        direction: 'ltr',
        htmlLang: 'en-US',
        calendar: 'gregory',
        path: 'en',
      },
    },
  },

  presets: [
    [
      '@gorhom/docusaurus-preset',
      {
        docs: {
          sidebarPath: './sidebars.ts',
          routeBasePath: '/',
          editUrl:
            'https://github.com/NitrogenZLab/react-native-multiple-image-picker/tree/main/docs/docs',
          lastVersion: 'current',
          versions: {
            current: {
              label: 'v2.0',
            },
          },
        },
        theme: {
          customCss: './src/css/custom.css',
        },
      } satisfies Preset.Options,
    ],
  ],

  themeConfig: {
    // Replace with your project's social card
    image: 'img/banner.png',

    colorMode: {
      defaultMode: 'dark',
      disableSwitch: false,
      respectPrefersColorScheme: true,
    },

    navbar: {
      title: 'RNMIP',
      logo: {
        alt: 'RNMIP Logo',
        src: 'img/RNMIP.png',
      },
      items: [
        {
          type: 'docSidebar',
          sidebarId: 'multiple-image-picker',
          position: 'left',
          label: 'Guides',
        },
        {
          href: 'https://github.com/NitrogenZLab/react-native-multiple-image-picker/tree/main/example',
          label: 'Example',
          position: 'left',
        },
        {
          href: '/showcase',
          label: 'Showcase',
          position: 'left',
        },
        {
          href: 'https://github.com/NitrogenZLab/react-native-multiple-image-picker',
          label: 'GitHub',
          position: 'right',
        },

        {
          href: 'https://apps.apple.com/vn/app/binsoo-photo-filters-editor/id6502683720',
          label: '✨ Binsoo - Photo Editor',
          position: 'right',
        },
      ],
    },

    footer: {
      style: 'dark',
      links: [
        {
          title: 'Guides',
          items: [
            {
              label: 'Getting Started',
              to: '/getting-started',
            },
            {
              label: 'Config',
              to: '/config',
            },
            {
              label: 'Result',
              to: '/result',
            },
            {
              label: '☕️ Buy me a coffee',
              href: 'https://github.com/sponsors/baronha',
            },
          ],
        },
        {
          title: 'Community',
          items: [
            {
              label: 'X',
              href: 'https://x.com/_baronha',
            },
            {
              label: 'Threads',
              href: 'https://www.threads.net/@___donquijote',
            },
          ],
        },
        {
          title: 'More',
          items: [
            {
              label: 'Github',
              href: 'https://github.com/baronha',
            },
            {
              label: 'Binsoo - Photo Editor',
              href: 'https://apps.apple.com/vn/app/binsoo-photo-filters-editor/id6502683720',
            },
          ],
        },
      ],
      copyright: `Copyright © ${new Date().getFullYear()} Bảo Hà (baronha)`,
    },

    prism: {
      theme: prismThemes.github,
      darkTheme: prismThemes.dracula,
    },
  } satisfies Preset.ThemeConfig,
}

export default config


================================================
FILE: docs/package.json
================================================
{
  "name": "docs",
  "version": "2.2.6",
  "private": true,
  "scripts": {
    "docusaurus": "docusaurus",
    "start": "docusaurus start",
    "build": "docusaurus build",
    "swizzle": "docusaurus swizzle",
    "deploy": "docusaurus deploy",
    "clear": "docusaurus clear",
    "serve": "docusaurus serve",
    "write-translations": "docusaurus write-translations",
    "write-heading-ids": "docusaurus write-heading-ids",
    "typecheck": "tsc",
    "postinstall": "patch-package"
  },
  "dependencies": {
    "@docusaurus/core": "3.5.2",
    "@docusaurus/plugin-google-gtag": "^3.5.2",
    "@docusaurus/preset-classic": "3.5.2",
    "@gorhom/docusaurus-preset": "*",
    "@gorhom/docusaurus-theme": "*",
    "@mdx-js/react": "^3.0.0",
    "clsx": "^2.0.0",
    "prism-react-renderer": "^2.3.0",
    "react": "^18.0.0",
    "react-dom": "^18.0.0",
    "react-player": "^2.16.0"
  },
  "devDependencies": {
    "@docusaurus/module-type-aliases": "3.5.2",
    "@docusaurus/tsconfig": "3.5.2",
    "@docusaurus/types": "3.5.2",
    "patch-package": "^8.0.0",
    "typescript": "~5.6.2"
  },
  "browserslist": {
    "production": [
      ">0.5%",
      "not dead",
      "not op_mini all"
    ],
    "development": [
      "last 3 chrome version",
      "last 3 firefox version",
      "last 5 safari version"
    ]
  },
  "engines": {
    "node": ">=18.0"
  }
}


================================================
FILE: docs/patches/@gorhom+docusaurus-preset+1.0.2.patch
================================================
diff --git a/node_modules/@gorhom/docusaurus-preset/lib/index.js b/node_modules/@gorhom/docusaurus-preset/lib/index.js
index 66e815e..7ab6b15 100644
--- a/node_modules/@gorhom/docusaurus-preset/lib/index.js
+++ b/node_modules/@gorhom/docusaurus-preset/lib/index.js
@@ -23,21 +23,21 @@ export default function preset(context, opts = {}) {
         theme: prismThemes.github,
         darkTheme: prismThemes.dracula,
     };
-    // overrides footer
-    themeConfig.footer = {
-        ...(themeConfig.footer ?? {}),
-        copyright: `Open Source by <a rel="noreferrer" href="https://gorhom.dev/" target="_blank">Mo Gorhom</a>.`,
-        links: [
-            {
-                label: "Github",
-                href: "https://github.com/gorhom",
-            },
-            {
-                label: "X (Twitter)",
-                href: "https://twitter.com/gorhom",
-            },
-        ]
-    };
+    	// overrides footer
+	themeConfig.footer = {
+		
+		copyright: `Open Source by <a rel="noreferrer" href="https://baoha.vercel.app/" target="_blank">Bao Ha</a>.`,
+		links: [
+			{
+				label: "Github",
+				href: "https://github.com/baronha",
+			},
+			{
+				label: "X (Twitter)",
+				href: "https://twitter.com/_baronha",
+			},
+		],
+	}
     const themes = [];
     themes.push(makePluginConfig("@gorhom/docusaurus-theme", theme));
     if (algolia) {


================================================
FILE: docs/sidebars.ts
================================================
import type { SidebarsConfig } from '@docusaurus/plugin-content-docs'

// This runs in Node.js - Don't use client-side code here (browser APIs, JSX...)

/**
 * Creating a sidebar enables you to:
 - create an ordered group of docs
 - render a sidebar for each doc of that group
 - provide next/previous navigation

 The sidebars can be generated from the filesystem, or explicitly defined here.

 Create as many sidebars as you want.
 */
const sidebars: SidebarsConfig = {
  'multiple-image-picker': [
    {
      type: 'category',
      label: 'RNMIP',
      link: {
        type: 'doc',
        id: 'index',
      },
      items: ['getting-started', 'usage', 'config', 'result'],
    },
    'crop',
    'preview',
    'camera',
  ],
}

export default sidebars


================================================
FILE: docs/src/css/custom.css
================================================


================================================
FILE: docs/static/.nojekyll
================================================


================================================
FILE: docs/tsconfig.json
================================================
{
  // This file is not used in compilation. It is here just for a nice editor experience.
  "extends": "@docusaurus/tsconfig",
  "compilerOptions": {
    "baseUrl": "."
  },
  "exclude": [".docusaurus", "build"]
}


================================================
FILE: example/.gitignore
================================================
# Learn more https://docs.github.com/en/get-started/getting-started-with-git/ignoring-files

# dependencies
node_modules/

# Expo
.expo/
dist/
web-build/

# Native
*.orig.*
*.jks
*.p8
*.p12
*.key
*.mobileprovision

# Metro
.metro-health-check*

# debug
npm-debug.*
yarn-debug.*
yarn-error.*

# macOS
.DS_Store
*.pem

# local env files
.env*.local

# typescript
*.tsbuildinfo

/ios
/android

================================================
FILE: example/App.tsx
================================================
import { LogBox, UIManager } from 'react-native'
import App from './src'

LogBox.ignoreAllLogs()

UIManager.setLayoutAnimationEnabledExperimental &&
  UIManager.setLayoutAnimationEnabledExperimental(true)

export default App


================================================
FILE: example/Gemfile
================================================
source 'https://rubygems.org'

# You may use http://rbenv.org/ or https://rvm.io/ to install and use this version
ruby ">= 3.0.0"

# Exclude problematic versions of cocoapods and activesupport that causes build failures.
gem 'cocoapods', '>= 1.13', '!= 1.15.0', '!= 1.15.1'
gem 'activesupport', '>= 6.1.7.5', '!= 7.1.0'

================================================
FILE: example/README.md
================================================
# Example

This website is built using [Expo](https://docs.expo.dev/)

https://github.com/user-attachments/assets/79580bc7-237c-46b7-b92e-1479cc6d9079



### Installation

```
$ yarn
$ yarn prebuild --clean
```

### Step 2

```
$ NNN Enjoy Bro 🐧
```


================================================
FILE: example/app.json
================================================
{
  "expo": {
    "name": "MultipleImagePickerExample",
    "slug": "MultipleImagePickerExample",
    "version": "1.0.0",
    "orientation": "portrait",
    "icon": "./assets/icon.png",
    "userInterfaceStyle": "automatic",
    "splash": {
      "image": "./assets/splash.png",
      "resizeMode": "contain",
      "backgroundColor": "#ffffff"
    },
    "ios": {
      "supportsTablet": true,
      "infoPlist": {
        "NSCameraUsageDescription": "We needs to access your camera so that you can upload your photo: (avatar, etc.)",
        "NSPhotoLibraryAddUsageDescription": "We needs photo library permissions to allow you to upload profile images.",
        "NSPhotoLibraryUsageDescription": "We needs photo library permissions to allow you to upload profile images.",
        "NSMicrophoneUsageDescription": "We needs to access your microphone so that you can take your photo: (avatar, etc.)"
      },
      "bundleIdentifier": "com.baoha.imagepicker"
    },
    "android": {
      "adaptiveIcon": {
        "foregroundImage": "./assets/adaptive-icon.png",
        "backgroundColor": "#ffffff"
      },
      "package": "com.baoha.imagepicker"
    },

    "plugins": [
      [
        "expo-build-properties",
        {
          "ios": {
            "deploymentTarget": "15.6",
            "useFrameworks": "static"
          },
          "android": {
            "compileSdkVersion": 34,
            "targetSdkVersion": 34,
            "buildToolsVersion": "34.0.0"
          }
        }
      ]
    ]
  }
}


================================================
FILE: example/babel.config.js
================================================
const path = require('path')
module.exports = function (api) {
  api.cache(true)
  return {
    presets: ['babel-preset-expo'],
    plugins: [
      [
        'module-resolver',
        {
          extensions: ['.tsx', '.ts', '.js', '.json'],
          alias: {
            // For development, we want to alias the library to the source
            '@baronha/react-native-multiple-image-picker': path.join(
              __dirname,
              '..',
              'src',
              'index.ts'
            ),
          },
        },
      ],
    ],
  }
}


================================================
FILE: example/metro.config.js
================================================
// Learn more https://docs.expo.io/guides/customizing-metro
const { getDefaultConfig } = require('expo/metro-config')
const path = require('path')

const config = getDefaultConfig(__dirname)

// npm v7+ will install ../node_modules/react-native because of peerDependencies.
// To prevent the incompatible react-native bewtween ./node_modules/react-native and ../node_modules/react-native,
// excludes the one from the parent folder when bundling.
config.resolver.blockList = [
  ...Array.from(config.resolver.blockList ?? []),
  new RegExp(path.resolve('..', 'node_modules', 'react-native')),
]

config.resolver.nodeModulesPaths = [
  path.resolve(__dirname, './node_modules'),
  path.resolve(__dirname, '../node_modules'),
]

config.watchFolders = [path.resolve(__dirname, '..')]

config.transformer.getTransformOptions = async () => ({
  transform: {
    experimentalImportSupport: false,
    inlineRequires: true,
  },
})

module.exports = config


================================================
FILE: example/package.json
================================================
{
  "name": "multipleimagepickerexample",
  "version": "2.2.3",
  "main": "expo/AppEntry.js",
  "scripts": {
    "start": "expo start",
    "android": "expo run:android",
    "ios": "expo run:ios",
    "web": "expo start --web",
    "pod": "cd ios && bundle exec pod update",
    "pod-new-arch": "cd ios && RCT_NEW_ARCH_ENABLED=1 bundle exec pod install",
    "prebuild": "expo prebuild",
    "gradle": "cd android && ./gradlew clean && ./gradlew build"
  },
  "dependencies": {
    "@react-native-segmented-control/segmented-control": "2.5.7",
    "expo": "^54.0.27",
    "expo-build-properties": "~1.0.10",
    "expo-status-bar": "~3.0.9",
    "expo-system-ui": "~6.0.9",
    "immer": "^10.1.1",
    "react": "19.1.0",
    "react-native": "0.81.5",
    "use-immer": "^0.10.0"
  },
  "devDependencies": {
    "@babel/core": "^7.20.0",
    "@react-native/babel-preset": "0.75.2",
    "@react-native/metro-config": "0.75.2",
    "@react-native/typescript-config": "0.75.2",
    "@types/react": "~19.1.10",
    "react-native-builder-bob": "^0.30.0",
    "react-native-nitro-modules": "^0.25.2",
    "typescript": "~5.9.2"
  },
  "private": true
}


================================================
FILE: example/react-native.config.js
================================================
const path = require('path')
const pkg = require('../package.json')

module.exports = {
  project: {
    ios: {
      automaticPodsInstallation: true,
    },
  },
  dependencies: {
    [pkg.name]: {
      root: path.join(__dirname, '..'),
    },
  },
}


================================================
FILE: example/src/assets/index.ts
================================================
const images = {
  logo: require('./logo.png'),
  plusSign: require('./plus-sign.png'),
  check: require('./check.png'),
}

export default images


================================================
FILE: example/src/common/const.ts
================================================
import { Platform } from 'react-native'

export const IS_IOS = Platform.OS === 'ios'
export const IS_ANDROID = Platform.OS === 'android'

export const LOCALIZED_LANGUAGES = [
  {
    key: 'system',
    label: 'System 🌐',
  },
  {
    key: 'vi',
    label: 'Tiếng Việt 🇻🇳',
  },
  {
    key: 'zh-Hans',
    label: '简体中文 🇨🇳',
  },
  {
    key: 'zh-Hant',
    label: '繁體中文 🇹🇼',
  },
  {
    key: 'ja',
    label: '日本語 🇯🇵',
  },
  {
    key: 'ko',
    label: '한국어 🇰🇷',
  },
  {
    key: 'en',
    label: 'English 🇺🇸',
  },
  {
    key: 'ru',
    label: 'Русский 🇷🇺',
  },
  {
    key: 'de',
    label: 'Deutsch 🇩🇪',
  },
  {
    key: 'fr',
    label: 'Français 🇫🇷',
  },
  {
    key: 'ar',
    label: 'العربية 🇸🇦',
  },

  ...(IS_IOS
    ? [
        {
          key: 'th',
          label: 'ไทย 🇹🇭',
        },
        {
          key: 'id',
          label: 'Bahasa Indonesia 🇮🇩',
        },
      ]
    : []),
]


================================================
FILE: example/src/components/BottomSheet.tsx
================================================
import React from 'react'
import { View } from 'react-native'

export function BottomSheet() {
  return (
    <View>
      
    </View>
  )
}


================================================
FILE: example/src/components/Button.tsx
================================================
import React from 'react'
import {
  StyleSheet,
  TouchableOpacity,
  TouchableOpacityProps,
} from 'react-native'
import useTheme from '../hook/useTheme'
import { Text } from './Text'

interface Props extends TouchableOpacityProps {
  children: React.ReactNode | string
  type?: 'full' | 'outline'
}

export function Button({
  children,
  style: containerStyle,
  onPress,
  type = 'full',
}: Props) {
  const { foreground, background } = useTheme()
  const isFull = type === 'full'

  return (
    <TouchableOpacity
      style={[
        style.button,
        containerStyle,
        // eslint-disable-next-line react-native/no-inline-styles
        {
          backgroundColor: isFull ? foreground : 'transparent',
          borderColor: isFull ? 'transparent' : foreground,
        },
      ]}
      onPress={onPress}
    >
      {typeof children === 'string' ? (
        <Text style={[style.text, { color: isFull ? background : foreground }]}>
          {children}
        </Text>
      ) : (
        children
      )}
    </TouchableOpacity>
  )
}

const style = StyleSheet.create({
  button: {
    padding: 12,
    alignItems: 'center',
    borderWidth: 1.5,
  },
  text: {
    fontFamily: 'Avenir',
    fontWeight: 'bold',
  },
})


================================================
FILE: example/src/components/CheckBox.tsx
================================================
import React from 'react'
import {
  Image,
  StyleSheet,
  TouchableOpacity,
  TouchableOpacityProps,
} from 'react-native'
import images from '../assets'
import useTheme from '../hook/useTheme'

interface CheckBoxProps extends TouchableOpacityProps {
  checked?: boolean
  onChecked?: (checked: boolean) => void
}

export function CheckBox({
  checked = false,
  onChecked,
  ...props
}: CheckBoxProps) {
  const { foreground, background_2 } = useTheme()

  return (
    <TouchableOpacity
      activeOpacity={0.9}
      onPress={() => onChecked?.(!checked)}
      {...props}
      style={[
        style.container,
        props.style,
        {
          backgroundColor: checked ? foreground : background_2,
          borderColor: foreground + '64',
        },
      ]}
    >
      {checked && (
        <Image
          style={[style.check, { tintColor: background_2 }]}
          source={images.check}
        />
      )}
    </TouchableOpacity>
  )
}

const style = StyleSheet.create({
  container: {
    width: 24,
    height: 24,
    alignItems: 'center',
    justifyContent: 'center',
    borderRadius: 4,
  },
  check: {
    width: 16,
    height: 16,
  },
})


================================================
FILE: example/src/components/CodeTag.tsx
================================================
import React from 'react'
import { View } from './View'
import { StyleSheet, TextProps, ViewProps } from 'react-native'
import { Text } from './Text'

interface CodeTagProps extends ViewProps {
  children: string
  textProps?: TextProps
}

export function CodeTag({ children, textProps, ...props }: CodeTagProps) {
  return (
    <View level={3} {...props} style={[style.container, props.style]}>
      <Text {...textProps} style={[style.text, textProps?.style]}>
        {children}
      </Text>
    </View>
  )
}

const style = StyleSheet.create({
  text: {
    // fontFamily: 'monospace',
    fontWeight: 600,
    fontSize: 16,
  },
  container: {
    padding: 8,
    paddingVertical: 6,
    borderRadius: 4,
    alignSelf: 'baseline',
  },
})


================================================
FILE: example/src/components/Container.tsx
================================================
import React from 'react'
import { StyleSheet, ViewProps } from 'react-native'
import useTheme from '../hook/useTheme'
import { View } from './View'

interface Props extends ViewProps {
  level?: 0 | 1 | 2 | 3
}

export function Container({
  children,
  style: containerStyle,
  level = 0,
}: Props) {
  const theme = useTheme()
  const backgroundColor = !level
    ? theme.background
    : theme[`background_${level}` as keyof typeof theme]

  return (
    <View style={[style.container, { backgroundColor }, containerStyle]}>
      {children}
    </View>
  )
}

const style = StyleSheet.create({
  container: {
    flex: 1,
  },
})


================================================
FILE: example/src/components/CounterView.tsx
================================================
import React from 'react'
import { View } from './View'
import { Row, RowProps } from './Row'
import { StyleSheet, TouchableOpacity } from 'react-native'
import { Text } from './Text'
import useTheme from '../hook/useTheme'

interface CounterViewProps extends RowProps {
  value?: number
  onChange: (value: number) => void
  range?: {
    min?: number
    max?: number
  }
}

export function CounterView({
  value = 0,
  onChange,
  range,
  ...props
}: CounterViewProps) {
  const { background_2 } = useTheme()

  return (
    <Row gap={8} {...props}>
      <TouchableOpacity
        activeOpacity={0.9}
        style={[style.button, { backgroundColor: background_2 }]}
        onPress={() => {
          const min = range?.min ?? 0
          onChange(value - 1 < min ? min : value - 1)
        }}
      >
        <Text style={style.buttonText}>-</Text>
      </TouchableOpacity>
      <View style={style.counterView}>
        <Text style={style.buttonText}>{value}</Text>
      </View>
      <TouchableOpacity
        activeOpacity={0.9}
        style={[style.button, { backgroundColor: background_2 }]}
        onPress={() => {
          const max = range?.max
          if (max) onChange(value + 1 > max ? max : value + 1)
          else onChange(value + 1)
        }}
      >
        <Text style={style.buttonText}>+</Text>
      </TouchableOpacity>
    </Row>
  )
}

const style = StyleSheet.create({
  counterView: {
    //
    height: 32,
    paddingHorizontal: 12,
    borderRadius: 4,
    alignItems: 'center',
    justifyContent: 'center',
  },
  button: {
    borderRadius: 4,
    height: 32,
    width: 32,
    alignItems: 'center',
    justifyContent: 'center',
  },
  buttonText: {
    fontSize: 16,
    fontWeight: 'bold',
    fontFamily: 'Avenir',
  },
})


================================================
FILE: example/src/components/Divider.tsx
================================================
import React from 'react'
import { StyleSheet } from 'react-native'
import useTheme from '../hook/useTheme'
import { View } from './View'

export default function Divider() {
  const { foreground } = useTheme()
  return <View style={[style.container, { backgroundColor: foreground }]} />
}

const style = StyleSheet.create({
  container: {
    height: 1,
    width: '100%',
    opacity: 0.2,
  },
})


================================================
FILE: example/src/components/Input.tsx
================================================
import React from 'react'
import { StyleSheet, TextInput, TextInputProps } from 'react-native'
import useTheme from '../hook/useTheme'

interface InputProps extends TextInputProps {}

export function Input({ ...props }: InputProps) {
  const { background_2, foreground } = useTheme()

  return (
    <TextInput
      {...props}
      selectionColor={foreground}
      placeholderTextColor={foreground + '92'}
      style={[
        style.input,
        { backgroundColor: background_2, color: foreground },
      ]}
    />
  )
}

const style = StyleSheet.create({
  input: {
    paddingHorizontal: 12,
    paddingVertical: 12,
    borderRadius: 8,
    fontSize: 16,
  },
})


================================================
FILE: example/src/components/Row.tsx
================================================
import React from 'react'
import { StyleSheet, ViewStyle } from 'react-native'
import { View, ViewProps } from './View'

export interface RowProps extends ViewProps {
  alignItems?: ViewStyle['alignItems']
  gap?: number
}

export function Row({
  children,
  gap,
  alignItems = 'center',
  ...props
}: RowProps) {
  return (
    <View
      {...props}
      style={[style.container, props.style, { alignItems, gap }]}
    >
      {children}
    </View>
  )
}

const style = StyleSheet.create({
  container: {
    flexDirection: 'row',
  },
})


================================================
FILE: example/src/components/SectionView.tsx
================================================
import React from 'react'
import { Row } from './Row'
import { CodeTag } from './CodeTag'
import { View } from './View'
import { Text } from './Text'
import { StyleSheet, Switch } from 'react-native'
import { useAppContext } from '../hook/context'
import { Config } from '@baronha/react-native-multiple-image-picker'
import { SegmentControl } from './SegmentControl'

type key = keyof Config
interface SectionViewProps {
  title: key
  description: string
  optionKey?: key
  children?: React.ReactNode
  defaultValue?: boolean
  segmentControl?: string[]
}

export default function SectionView({
  title,
  description,
  optionKey,
  children,
  defaultValue = false,
  segmentControl,
}: SectionViewProps) {
  const { options, setOptions } = useAppContext()

  return (
    <View style={style.section}>
      <Row style={style.section}>
        <View flex={1} style={style.sectionTitle}>
          <CodeTag>{title}</CodeTag>
          <Text style={style.des}>{description}</Text>
        </View>
        {children ||
          (optionKey ? (
            !segmentControl ? (
              <Switch
                value={(options?.[optionKey] as any) ?? defaultValue}
                onValueChange={(valueChange) =>
                  setOptions(optionKey, valueChange)
                }
              />
            ) : null
          ) : null)}
      </Row>

      {segmentControl && optionKey ? (
        <SegmentControl
          selectedIndex={
            segmentControl.indexOf(
              (options?.[optionKey] as any) ?? defaultValue ?? ''
            ) ?? 0
          }
          values={segmentControl}
          onValueChange={(valueChange) => setOptions(optionKey, valueChange)}
        />
      ) : null}
    </View>
  )
}

const style = StyleSheet.create({
  section: {
    rowGap: 12,
    columnGap: 24,
  },
  sectionTitle: {
    gap: 8,
  },

  des: {
    fontSize: 12,
    // marginBottom: 12,
  },
})


================================================
FILE: example/src/components/SegmentControl.tsx
================================================
import React from 'react'
import SegmentedControl, {
  SegmentedControlProps,
} from '@react-native-segmented-control/segmented-control'

export function SegmentControl({ ...props }: SegmentedControlProps) {
  return <SegmentedControl {...props} />
}


================================================
FILE: example/src/components/Text.tsx
================================================
import React from 'react'
import { Text as RNText, TextProps } from 'react-native'
import useTheme from '../hook/useTheme'

export function Text({ children, style: containerStyle }: TextProps) {
  const { foreground } = useTheme()

  return (
    <RNText style={[{ color: foreground }, containerStyle]}>{children}</RNText>
  )
}


================================================
FILE: example/src/components/View.tsx
================================================
import React from 'react'
import { View as RNView, ViewProps as RNViewProps } from 'react-native'
import useTheme from '../hook/useTheme'

export interface ViewProps extends RNViewProps {
  level?: 0 | 1 | 2 | 3
  flex?: number
}

export function View({
  children,
  style: containerStyle,
  level = 0,
  flex,
}: ViewProps) {
  const theme = useTheme()
  const backgroundColor = !level
    ? theme.background
    : theme[`background_${level}` as keyof typeof theme]

  return (
    <RNView style={[{ backgroundColor, flex }, containerStyle]}>
      {children}
    </RNView>
  )
}


================================================
FILE: example/src/components/index.tsx
================================================
export * from './Container'
export * from './Button'
export * from './SegmentControl'
export * from './Text'
export * from './View'
export * from './CodeTag'
export * from './Row'
export * from './Divider'
export * from './CheckBox'
export * from './SectionView'
export * from './Input'
export * from './CounterView'


================================================
FILE: example/src/hook/context.ts
================================================
import { createContext, useContext } from 'react'
import {
  Config,
  defaultOptions,
} from '@baronha/react-native-multiple-image-picker'

export const AppContext = createContext<{
  options: Config
  setOptions: (key: keyof Config, value: Config[keyof Config]) => void
}>({
  options: defaultOptions,
  setOptions: () => {},
})

export const useAppContext = () => useContext(AppContext)


================================================
FILE: example/src/hook/index.ts
================================================
export * from './useTheme'


================================================
FILE: example/src/hook/useTheme.ts
================================================
import { useColorScheme } from 'react-native'
import * as color from '../theme/color'

export default function useTheme() {
  const colorScheme = useColorScheme() as keyof typeof color

  return color[colorScheme]
}


================================================
FILE: example/src/index.tsx
================================================
import React, { useCallback, useMemo, useState } from 'react'
import {
  ActionSheetIOS,
  Alert,
  Appearance,
  ColorSchemeName,
  Image,
  KeyboardAvoidingView,
  LayoutAnimation,
  Platform,
  SafeAreaView,
  ScrollView,
  Switch,
  TouchableOpacity,
  useColorScheme,
} from 'react-native'

import { StyleSheet } from 'react-native'
import {
  openPicker,
  PickerResult,
  defaultOptions,
  Config,
  openCropper,
  openPreview,
  openCamera,
} from '@baronha/react-native-multiple-image-picker'
import { useImmer } from 'use-immer'
import { StatusBar } from 'expo-status-bar'
import {
  Button,
  CodeTag,
  Container,
  CounterView,
  Input,
  Row,
  SegmentControl,
  Text,
  View,
} from './components'
import useTheme from './hook/useTheme'
import assets from './assets'
import { WIDTH } from './theme/size'
import { IS_IOS, LOCALIZED_LANGUAGES } from './common/const'
import { AppContext } from './hook/context'
import SectionView from './components/SectionView'

const layoutEffect = () => {
  LayoutAnimation.configureNext({
    duration: 350,
    create: {
      type: LayoutAnimation.Types.easeInEaseOut,
      property: LayoutAnimation.Properties.opacity,
    },
    update: {
      type: LayoutAnimation.Types.easeInEaseOut,
    },
  })
}

const parseNumber = (value: string): number | undefined => {
  const parsed = Number(value)
  return value === '' || Number.isNaN(parsed) ? undefined : parsed
}

export default function App() {
  const { background, foreground } = useTheme()
  const [images, setImages] = useState<PickerResult[]>([])
  const [options, changeOptions] = useImmer<Config>(defaultOptions)

  const colorScheme = useColorScheme()

  const setOptions = (key: keyof Config, value: Config[keyof Config]) => {
    changeOptions((draft) => {
      draft[key] = value as any
    })
  }

  console.log('images: ', images)

  const onPressImage = useCallback(
    (_: PickerResult, index: number) => {
      openPreview(images, index, {
        onLongPress: () => {
          if (Platform.OS === 'ios') {
            ActionSheetIOS.showActionSheetWithOptions(
              {
                options: ['Download', 'Cancel'],
                cancelButtonIndex: 1,
                userInterfaceStyle: colorScheme ?? 'light',
              },
              (buttonIndex) => {
                if (buttonIndex === 0) {
                  // Download
                } else if (buttonIndex === 1) {
                  // Cancel
                }
              }
            )
          } else {
            Alert.alert('Options', '', [
              {
                text: 'Cancel',
                style: 'cancel',
                onPress: () => {
                  console.log('Cancel')
                },
              },
              {
                text: 'Download',
                onPress: () => {
                  console.log('Download')
                },
              },
            ])
          }
        },
      })
    },
    [images, colorScheme]
  )

  const onPicker = async () => {
    try {
      const response = await openPicker({
        ...options,
        selectedAssets: images.filter((item) => item.localIdentifier),
      })

      setImages(Array.isArray(response) ? response : [response])
      layoutEffect()
    } catch (e) {
      console.log('e: ', e)
    }
  }

  const onCamera = async () => {
    try {
      const response = await openCamera()

      setImages((prev) => {
        return [response as PickerResult, ...prev]
      })

      layoutEffect()
    } catch (e) {
      console.log('e: ', e)
    }
  }

  const onCrop = async () => {
    try {
      const response = await openCropper(images[0].path, {
        ratio: [
          { title: 'Instagram', width: 1, height: 1 },
          { title: 'Twitter', width: 16, height: 9 },
          { title: 'Facebook', width: 12, height: 11 },
        ],
      })

      setImages((prev) => {
        const data = [...prev]
        data[0].path = response.path
        data[0].width = response.width
        data[0].height = response.height
        return data
      })
      layoutEffect()
    } catch (e) {
      console.log('e: ', e)
    }
  }

  const onRemovePhoto = useCallback(
    (_: PickerResult, index: number) => {
      const data = [...images].filter((__, idx) => idx !== index)
      setImages(data)
    },
    [images, setImages]
  )

  const onChangeTheme = (value: string) => {
    Appearance.setColorScheme(value as ColorSchemeName)
  }

  const renderImage = useMemo(() => {
    return (
      <View style={style.imageContainer}>
        {images.map((image, index) => (
          <TouchableOpacity
            key={index}
            onPress={() => onPressImage(image, index)}
            style={style.image}
          >
            <Image source={{ uri: image.path }} style={style.image} />
            <TouchableOpacity
              style={style.removeButton}
              onPress={() => onRemovePhoto(image, index)}
            >
              <Image source={assets.plusSign} style={style.trash} />
            </TouchableOpacity>
          </TouchableOpacity>
        ))}
      </View>
    )
  }, [images, onPressImage, onRemovePhoto])

  return (
    <Container>
      <SafeAreaView />
      {Platform.OS === 'android' && (
        <StatusBar
          translucent={false}
          networkActivityIndicatorVisible
          backgroundColor={background}
        />
      )}

      <View style={style.titleView}>
        <Image source={assets.logo} style={style.logo} />
        <View style={style.textView}>
          <Text style={style.mip}>Multiple Image Picker</Text>
          <CodeTag textProps={{ style: { fontSize: 8 } }}>BY BAOHA</CodeTag>
        </View>
      </View>

      <KeyboardAvoidingView
        behavior={Platform.OS === 'ios' ? 'padding' : 'height'}
        style={style.keyboardAvoidingView}
      >
        <AppContext.Provider value={{ options, setOptions }}>
          <ScrollView
            keyboardDismissMode="on-drag"
            keyboardShouldPersistTaps="handled"
            showsVerticalScrollIndicator={false}
            contentContainerStyle={[
              style.scrollView,
              { backgroundColor: background },
            ]}
            scrollEventThrottle={16}
          >
            {images.length > 0 ? (
              <>
                {renderImage}
                <Button style={style.buttonOpen} onPress={onCrop}>
                  Open Cropping
                </Button>
              </>
            ) : (
              <TouchableOpacity style={style.buttonPlus} onPress={onPicker}>
                <Image source={assets.plusSign} style={style.plusSign} />
              </TouchableOpacity>
            )}

            <View style={style.content}>
              <Text style={style.title}>Config</Text>

              {/* mediaType */}

              <View style={style.section}>
                <SectionView
                  title="mediaType"
                  description="The type of media that can be selected."
                />
                <SegmentControl
                  selectedIndex={
                    ['all', 'image', 'video'].indexOf(
                      options.mediaType ?? ''
                    ) ?? 0
                  }
                  values={['all', 'image', 'video']}
                  onValueChange={(value) => setOptions('mediaType', value)}
                />
              </View>

              {/* theme */}
              <View style={style.section}>
                <SectionView
                  title="theme"
                  description="Theme mode for the picker."
                />
                <SegmentControl
                  selectedIndex={
                    ['light', 'dark'].indexOf(colorScheme ?? '') ?? 0
                  }
                  values={['light', 'dark']}
                  onValueChange={onChangeTheme}
                />
              </View>

              {/* selectMode */}
              <View style={style.section}>
                <SectionView
                  title="selectMode"
                  description="Mode of selection in the picker."
                />
                <SegmentControl
                  selectedIndex={
                    ['single', 'multiple'].indexOf(options.selectMode ?? '') ??
                    0
                  }
                  values={['single', 'multiple']}
                  onValueChange={(value) => setOptions('selectMode', value)}
                />
              </View>

              {/* selectBoxStyle */}
              <View style={style.section}>
                <SectionView
                  title="selectBoxStyle"
                  description="Select box style for the picker."
                  optionKey="selectBoxStyle"
                  segmentControl={['number', 'tick']}
                />
              </View>

              {/* presentation */}
              {IS_IOS ? (
                <SectionView
                  title="presentation"
                  description="Presentation style for the picker."
                  optionKey="presentation"
                  segmentControl={['fullScreenModal', 'formSheet']}
                />
              ) : null}

              <Text style={style.title}>Camera 📸</Text>
              <View style={style.section}>
                <SectionView
                  title="camera"
                  description="Enable camera functionality."
                >
                  <Switch
                    value={options.camera !== undefined}
                    onValueChange={(value) =>
                      setOptions('camera', value ? {} : undefined)
                    }
                  />
                </SectionView>

                {/* camera videoMaximumDuration */}
                <SectionView
                  title={'camera.videoMaximumDuration' as any}
                  description="The maximum duration of video that can be selected."
                >
                  <Input
                    value={
                      options.camera?.videoMaximumDuration?.toString() ?? ''
                    }
                    placeholder="Video Duration"
                    onChangeText={(value) => {
                      setOptions('camera', {
                        ...(options.camera ?? { cameraDevice: 'back' }),
                        videoMaximumDuration: parseNumber(value),
                      })
                    }}
                  />
                </SectionView>
              </View>

              {IS_IOS ? (
                <>
                  {/* allowedLimit */}
                  <SectionView
                    title="allowedLimit"
                    description="Display additional select more media when permission on iOS is limited."
                    optionKey="allowedLimit"
                  />
                </>
              ) : null}

              {/* allowSwipeToSelect */}
              <SectionView
                title="allowSwipeToSelect"
                description="Allow swipe to select media."
                optionKey="allowSwipeToSelect"
              />

              {/* isHiddenOriginalButton */}
              <SectionView
                title="isHiddenOriginalButton"
                description="Hide the original button in the picker."
                optionKey="isHiddenOriginalButton"
              />

              {/* maxSelect */}
              <SectionView
                title="maxSelect"
                description="The maximum number of media that can be selected."
              >
                <CounterView
                  range={{ min: 1 }}
                  value={options.maxSelect}
                  onChange={(value) => setOptions('maxSelect', value)}
                />
              </SectionView>

              {/* maxVideo */}
              <SectionView
                title="maxVideo"
                description="The maximum number of video that can be selected."
              >
                <CounterView
                  range={{ min: 1 }}
                  value={options.maxVideo}
                  onChange={(value) => setOptions('maxVideo', value)}
                />
              </SectionView>

              {/* numberOfColumn */}
              <SectionView
                title="numberOfColumn"
                description="The number of columns in the picker."
              >
                <CounterView
                  range={{ min: 1, max: 10 }}
                  value={options.numberOfColumn}
                  onChange={(value) => setOptions('numberOfColumn', value)}
                />
              </SectionView>

              {/* spacing */}
              <SectionView
                title="spacing"
                description="The spacing between the media in the picker."
              >
                <CounterView
                  range={{ min: 1, max: 10 }}
                  value={options.spacing ?? 2}
                  onChange={(value) => setOptions('spacing', value)}
                />
              </SectionView>
              {/* Filter data 🎞️ */}

              <Text style={style.title}>Filter data 🎞️</Text>
              {/* maxVideoDuration */}
              <SectionView
                title="maxVideoDuration"
                description="The maximum duration of video that can be selected."
              >
                <Input
                  value={options.maxVideoDuration?.toString() ?? ''}
                  placeholder="Max Duration"
                  onChangeText={(value) => {
                    setOptions('maxVideoDuration', parseNumber(value))
                  }}
                />
              </SectionView>

              {/* minVideoDuration */}
              <SectionView
                title="minVideoDuration"
                description="The minimum duration of video that can be selected."
              >
                <Input
                  value={options.minVideoDuration?.toString() ?? ''}
                  placeholder="Min Duration"
                  onChangeText={(value) => {
                    setOptions('minVideoDuration', parseNumber(value))
                  }}
                />
              </SectionView>

              {/* maxFileSize */}
              <SectionView
                title="maxFileSize"
                description="The maximum size of file that can be selected."
              >
                <Input
                  value={options.maxFileSize?.toString() ?? ''}
                  placeholder="File Size"
                  onChangeText={(value) => {
                    setOptions('maxFileSize', parseNumber(value))
                  }}
                />
              </SectionView>

              <Text style={style.title}>Crop 🌠</Text>
              <View style={style.section}>
                <SectionView
                  title="crop"
                  description="Enable crop functionality."
                >
                  <Switch
                    value={options.crop !== undefined}
                    onValueChange={(value) =>
                      setOptions('crop', value ? true : undefined)
                    }
                  />
                </SectionView>
              </View>

              <View style={style.section}>
                <SectionView
                  title={'crop.circle' as any}
                  description="Enable crop circle functionality."
                >
                  <Switch
                    value={
                      typeof options.crop === 'boolean'
                        ? options.crop
                        : options.crop?.circle
                    }
                    onValueChange={(value) =>
                      setOptions(
                        'crop',
                        value ? { circle: true } : { circle: false }
                      )
                    }
                  />
                </SectionView>
              </View>

              {/* Preview */}
              <Text style={style.title}>Preview 🌠</Text>
              {/* isPreview */}
              <SectionView
                title="isPreview"
                description="Hide the preview button in the picker."
                optionKey="isPreview"
              />

              {/* isShowPreviewList */}
              <SectionView
                title="isShowPreviewList"
                description="Show the preview list."
                optionKey="isShowPreviewList"
              />

              {/* isHiddenPreviewButton */}
              <SectionView
                title="isHiddenPreviewButton"
                description="Hide the preview button in the picker."
                optionKey="isHiddenPreviewButton"
              />

              {/* allowHapticTouchPreview */}
              {IS_IOS ? (
                <SectionView
                  title="allowHapticTouchPreview"
                  description="Allow haptic touch preview."
                  optionKey="allowHapticTouchPreview"
                />
              ) : null}

              <Text style={style.title}>Localization 🌐</Text>

              <View style={style.section}>
                <SectionView
                  title="text"
                  description="The locale of the picker."
                />

                {(
                  [
                    'finish',
                    'preview',
                    'original',
                    'edit',
                  ] as (keyof Config['text'])[]
                ).map((key) => (
                  <Input
                    value={options.text?.[key] ?? ''}
                    placeholder={key}
                    key={key}
                    onChangeText={(value) => {
                      const object = {
                        ...options.text,
                        [key]: value,
                      }

                      Object.entries(object).forEach(([textKey, textValue]) => {
                        if (textValue === '' || !textValue)
                          delete object[textKey as keyof Config['text']]
                      })

                      setOptions(
                        'text',
                        Object.entries(object).length > 0 ? object : undefined
                      )
                    }}
                  />
                ))}
              </View>

              <View style={style.section}>
                <SectionView
                  title="language"
                  description="The language of the picker."
                />

                <Row style={style.language}>
                  {LOCALIZED_LANGUAGES.map(({ key, label }) => {
                    const onPress = () => {
                      setOptions('language', key)
                    }
                    const active = options.language === key

                    return (
                      <TouchableOpacity
                        style={[
                          style.languageItem,
                          {
                            backgroundColor: active ? foreground : background,
                            borderColor: foreground + '32',
                          },
                        ]}
                        onPress={onPress}
                      >
                        <Text
                          style={{ color: active ? background : foreground }}
                        >
                          {label}
                        </Text>
                      </TouchableOpacity>
                    )
                  })}
                </Row>
              </View>
            </View>
          </ScrollView>
        </AppContext.Provider>
      </KeyboardAvoidingView>

      <View level={2}>
        <Row style={style.bottom} level={2} gap={12}>
          <Button type="outline" onPress={onCamera}>
            Open Camera
          </Button>
          <Button style={style.openPicker} onPress={onPicker}>
            Open Picker
          </Button>
        </Row>
        <SafeAreaView />
      </View>
    </Container>
  )
}

const numberOfColumn = 3

const style = StyleSheet.create({
  titleView: {
    padding: 16,
    flexDirection: 'row',
    gap: 12,
  },
  mip: {
    // flex: 1,
  },
  textView: {
    alignItems: 'flex-start',
    flex: 1,
    height: 48,
    gap: 4,
  },
  title: {
    fontWeight: 900,
    fontSize: 20,
    fontFamily: 'Avenir',
    textTransform: 'uppercase',
    paddingTop: 12,
    marginBottom: -12,
  },
  buttonOpen: {
    margin: 16,
  },
  scrollView: {
    gap: 12,
    paddingTop: 12,
    paddingBottom: 24,
  },
  content: {
    flexDirection: 'column',
    gap: 32,
    padding: 16,
  },

  logo: {
    aspectRatio: 1,
    objectFit: 'cover',
    height: 48,
    width: 48,
  },
  buttonPlus: {
    alignItems: 'center',
    justifyContent: 'center',
    padding: 48,
    marginHorizontal: 16,
    // backgroundColor: '#D4D4D432',
    borderStyle: 'dashed',
    borderWidth: 2,
    borderColor: '#D4D4D492',
    borderRadius: 8,
  },
  plusSign: {
    width: 16,
    height: 16,
  },
  section: {
    rowGap: 12,
    columnGap: 24,
  },
  sectionTitle: {
    gap: 8,
  },

  des: {
    fontSize: 12,
  },
  keyboardAvoidingView: {
    flex: 1,
  },
  language: {
    flexWrap: 'wrap',
    rowGap: 12,
    columnGap: 12,
  },
  languageItem: {
    paddingHorizontal: 12,
    paddingVertical: 8,
    borderRadius: 6,
    borderWidth: 1,
  },
  bottom: {
    padding: 16,
    paddingHorizontal: 24,
  },
  openPicker: {
    flex: 1,
  },
  imageContainer: {
    flexDirection: 'row',
    flexWrap: 'wrap',
    gap: 6,
    paddingHorizontal: 6,
  },
  image: {
    width: (WIDTH - 24) / numberOfColumn,
    height: (WIDTH - 24) / numberOfColumn,
  },

  removeButton: {
    position: 'absolute',
    top: 6,
    right: 6,
    backgroundColor: 'rgba(0, 0, 0, 0.9)',
    borderRadius: 100,
    padding: 6,
  },
  trash: {
    width: 16,
    height: 16,
    transform: [{ rotate: '45deg' }],
  },
})


================================================
FILE: example/src/theme/color.ts
================================================
export const light = {
  background: '#ffffff',
  foreground: '#000000',
  primary: '#000000',

  // background level
  background_1: '#f0f0f0',
  background_2: '#f3f3f3',
  background_3: '#f5f5f5',
}

export const dark = {
  background: '#000000',
  foreground: '#ffffff',
  primary: '#ffffff',

  // background level
  background_1: '#101010',
  background_2: '#202020',
  background_3: '#303030',
}

export const colors = {
  ...light,
  divider: '#D4D4D499',
}


================================================
FILE: example/src/theme/size.ts
================================================
import { Dimensions } from 'react-native'

export const { width: WIDTH, height: HEIGHT } = Dimensions.get('window')
export const HALF_HEIGHT = HEIGHT / 2
export const HALF_WIDTH = WIDTH / 2


================================================
FILE: example/tsconfig.json
================================================
{
  "compilerOptions": {
    "outDir": "./lib"
  },
  "extends": "../tsconfig"
}


================================================
FILE: ios/Assets.swift
================================================
//
//  Assets.swift
//  Pods
//
//  Created by BAO HA on 4/12/24.
//

import UIKit

class Assets {
    class func bundle() -> Bundle {
        let podBundle = Bundle(for: Assets.self)
        if let url = podBundle.url(forResource: "MultipleImagePicker", withExtension: "bundle") {
            let bundle = Bundle(url: url)
            return bundle ?? podBundle
        }
        return podBundle
    }
}

extension UIImage {
    static var close = UIImage(name: "close")

    convenience init(name: String) {
        self.init(named: name, in: Assets.bundle(), compatibleWith: nil)!
    }
}


================================================
FILE: ios/Assets.xcassets/Contents.json
================================================
{
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: ios/Assets.xcassets/close.imageset/Contents.json
================================================
{
  "images" : [
    {
      "filename" : "close.png",
      "idiom" : "universal",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "scale" : "3x"
    }
  ],
  "info" : {
    "author" : "xcode",
    "version" : 1
  }
}


================================================
FILE: ios/ErrorCode.swift
================================================
//
//  ErrorCode.swift
//  Pods
//
//  Created by BAO HA on 3/12/24.
//

// enum ErrorCode: Int, Error {
//
// }


================================================
FILE: ios/HybridMultipleImagePicker+Camera.swift
================================================
//
//  HybridMultipleImagePicker+Camera.swift
//  Pods
//
//  Created by BAO HA on 13/12/24.
//

import AVFoundation
import HXPhotoPicker
import Photos

extension HybridMultipleImagePicker {
    func openCamera(config: NitroCameraConfig, resolved: @escaping ((CameraResult) -> Void), rejected: @escaping ((Double) -> Void)) throws {
        var captureType: CameraController.CaptureType = .all

        // check media type
        switch config.mediaType {
        case .image:
            captureType = .photo
        case .video:
            captureType = .video
        default:
            break
        }

        // config
        var cameraConfig = CameraConfiguration()

        cameraConfig.videoMaximumDuration = config.videoMaximumDuration ?? 60

        cameraConfig.modalPresentationStyle = self.setPresentation(config.presentation)

        cameraConfig.editor.modalPresentationStyle = .fullScreen

        if let crop = config.crop {
            let editor = PickerCropConfig(circle: crop.circle, ratio: crop.ratio, defaultRatio: crop.defaultRatio, freeStyle: crop.freeStyle)
            cameraConfig.editor = setCropConfig(editor)
        } else {
            cameraConfig.allowsEditing = false
        }

        cameraConfig.languageType = setLocale(language: config.language)
        cameraConfig.isSaveSystemAlbum = config.isSaveSystemAlbum ?? false
        cameraConfig.sessionPreset = .hd4K3840x2160
        cameraConfig.aspectRatio = .fullScreen

        if let color = config.color, let focusColor = getReactColor(Int(color)) {
            cameraConfig.focusColor = focusColor
        }

        switch Int(config.cameraDevice?.rawValue ?? 1) {
        case 0:
            cameraConfig.position = .front
        default:
            cameraConfig.position = .back
        }

        func getCameraResult(_ result: CameraController.Result, _ asset: PHAsset?) {
            if let asset {
                Task {
                    let photoAsset = PhotoAsset(asset)
                    let urlResult = try await photoAsset.urlResult()
                    let path = urlResult.url.absoluteString

                    let phAsset = photoAsset.phAsset
                    let thumbnail = phAsset?.getVideoAssetThumbnail(from: path, in: 1)

                    resolved(CameraResult(path: path, type: photoAsset.mediaType == .photo ? ResultType.image : ResultType.video, width: photoAsset.imageSize.width, height: photoAsset.imageSize.height, duration: photoAsset.videoDuration, thumbnail: thumbnail, fileName: phAsset?.fileName))
                }

            } else {
                switch result {
                case .image(let uiImage):

                    let fileName = "IMG_\(Int(Date().timeIntervalSince1970)).jpg"
                    let filePath = uiImage.getPath(fileName: fileName, quality: 1.0)

                    if let filePath {
                        resolved(CameraResult(path: filePath, type: ResultType.image, width: uiImage.size.width, height: uiImage.size.height, duration: nil, thumbnail: nil, fileName: fileName))
                    } else {
                        rejected(1)
                    }

                case .video(let url):

                    let asset = AVAsset(url: url)

                    let thumbnail = getVideoThumbnail(from: url.absoluteString, in: 1)

                    var result = CameraResult(path: "file://\(url.absoluteString)",
                                              type: ResultType.video,
                                              width: nil,
                                              height: nil,
                                              duration: asset.duration.seconds,
                                              thumbnail: thumbnail,
                                              fileName: url.lastPathComponent)

                    if let track = asset.tracks(withMediaType: AVMediaType.video).first {
                        let trackSize = track.naturalSize.applying(track.preferredTransform)
                        let size = CGSize(width: abs(trackSize.width), height: abs(trackSize.height))

                        result.width = Double(size.width)
                        result.height = Double(size.height)
                    }

                    resolved(result)
                }
            }
        }

        DispatchQueue.main.async {
            Photo.capture(cameraConfig, type: captureType) { result, asset, _ in
                getCameraResult(result, asset)
            }
        }
    }

    func setCameraConfig(_ options: PickerCameraConfig) -> SystemCameraConfiguration {
        var config = SystemCameraConfiguration()

        config.editExportPreset = .highQuality
        config.videoQuality = .typeHigh

        switch Int(options.cameraDevice?.rawValue ?? 1) {
        case 0:
            config.cameraDevice = .front
        default:
            config.cameraDevice = .rear
        }

        config.videoMaximumDuration = options.videoMaximumDuration ?? 60

        return config
    }
}


================================================
FILE: ios/HybridMultipleImagePicker+Config.swift
================================================
//
//  HybridMultipleImagePicker+Config.swift
//  react-native-multiple-image-picker
//
//  Created by BAO HA on 15/10/2024.
//

import HXPhotoPicker
import UIKit

// Swift enum
// @objc enum MediaType: SelectBoxView.Style

extension HybridMultipleImagePicker {
    func setConfig(_ options: NitroConfig) {
        config = PickerConfiguration.default

        var photoList = config.photoList
        var previewView = config.previewView

        if let spacing = options.spacing { photoList.spacing = spacing }
        if let rowNumber = options.numberOfColumn { photoList.rowNumber = Int(rowNumber) }

        if let isHiddenPreviewButton = options.isHiddenPreviewButton {
            previewView.bottomView.isHiddenPreviewButton = isHiddenPreviewButton
            photoList.bottomView.isHiddenOriginalButton = isHiddenPreviewButton
        }

        if let isHiddenOriginalButton = options.isHiddenOriginalButton {
            previewView.bottomView.isHiddenOriginalButton = isHiddenOriginalButton
            photoList.bottomView.isHiddenOriginalButton = isHiddenOriginalButton
        }

        photoList.allowHapticTouchPreview = options.allowHapticTouchPreview ?? true

        photoList.allowSwipeToSelect = options.allowSwipeToSelect ?? true

        photoList.allowAddLimit = options.allowedLimit ?? true

        // check media type
        switch options.mediaType {
        case .image:
            config.selectOptions = [.photo, .livePhoto, .gifPhoto]
        case .video:
            config.selectOptions = .video
        default:
            config.selectOptions = [.video, .photo, .gifPhoto, .livePhoto]
        }

        config.indicatorType = .system
        config.photoList.cell.kf_indicatorColor = .black

        if let boxStyle = SelectBoxView.Style(rawValue: Int(options.selectBoxStyle.rawValue)) {
            previewView.selectBox.style = boxStyle
            photoList.cell.selectBox.style = boxStyle
        }

        photoList.isShowFilterItem = false
        photoList.sort = .desc
        photoList.isShowAssetNumber = false

        previewView.disableFinishButtonWhenNotSelected = false

        if let selectMode = PickerSelectMode(rawValue: Int(options.selectMode.rawValue)) {
            config.selectMode = selectMode
        }

        if let maxFileSize = options.maxFileSize {
            config.maximumSelectedPhotoFileSize = Int(maxFileSize)
            config.maximumSelectedVideoFileSize = Int(maxFileSize)
        }

        // Setting for video
        if options.mediaType == .all || options.mediaType == .video {
            if let maxVideo = options.maxVideo {
                config.maximumSelectedVideoCount = Int(maxVideo)
            }

            if let maxVideoDuration = options.maxVideoDuration {
                config.maximumSelectedVideoDuration = Int(maxVideoDuration)
            }

            if let minVideoDuration = options.minVideoDuration {
                config.minimumSelectedVideoDuration = Int(minVideoDuration)
            }
        }

        if let maxSelect = options.maxSelect {
            config.maximumSelectedCount = Int(maxSelect)
        }

        config.allowSyncICloudWhenSelectPhoto = true

        config.allowCustomTransitionAnimation = true

        config.isSelectedOriginal = false

        let isPreview = options.isPreview ?? true

        previewView.bottomView.isShowPreviewList = isPreview
        photoList.bottomView.isHiddenPreviewButton = !isPreview
        photoList.allowHapticTouchPreview = isPreview
        photoList.bottomView.previewListTickColor = .clear
        photoList.bottomView.isShowSelectedView = isPreview

        if isPreview {
            config.videoSelectionTapAction = .preview
            config.photoSelectionTapAction = .preview
        } else {
            config.videoSelectionTapAction = .quickSelect
            config.photoSelectionTapAction = .quickSelect
        }

        config.editorOptions = [.photo, .gifPhoto, .livePhoto]

        if let crop = options.crop {
            config.editor = setCropConfig(crop)
        } else {
            previewView.bottomView.isHiddenEditButton = true
        }

        photoList.finishSelectionAfterTakingPhoto = true

        if let cameraOption = options.camera {
            photoList.allowAddCamera = true

            photoList.cameraType = .system(setCameraConfig(cameraOption))
        } else {
            photoList.allowAddCamera = false
        }

        config.photoList = photoList
        config.previewView = previewView

        setLanguage(options)
        setTheme(options)

        config.modalPresentationStyle = setPresentation(options.presentation)
    }

    private func setTheme(_ options: NitroConfig) {
        let isDark = options.theme == Theme.dark

        // custom background dark
        if let background = options.backgroundDark, let backgroundDark = getReactColor(Int(background)), isDark {
            config.photoList.backgroundDarkColor = backgroundDark
            config.photoList.backgroundColor = backgroundDark
        }

        // LIGHT THEME
        if !isDark {
            let background = UIColor.white
            let barStyle = UIBarStyle.default

            config.statusBarStyle = .darkContent
            config.appearanceStyle = .normal
            config.photoList.bottomView.barStyle = barStyle
            config.navigationBarStyle = barStyle
            config.previewView.bottomView.barStyle = barStyle
            config.previewView.backgroundColor = background
            config.previewView.bottomView.backgroundColor = background

            config.photoList.leftNavigationItems = [PhotoCancelItem.self]

            config.photoList.backgroundColor = .white
            config.photoList.emptyView.titleColor = .black
            config.photoList.emptyView.subTitleColor = .darkGray
            config.photoList.titleView.backgroundColor = UIColor.black.withAlphaComponent(0.5)

            config.albumList.backgroundColor = .white
            config.albumList.cellBackgroundColor = .white
            config.albumList.albumNameColor = .black
            config.albumList.photoCountColor = .black
            config.albumList.cellSelectedColor = "#e1e1e1".hx.color
            config.albumList.separatorLineColor = "#e1e1e1".hx.color
        }

        if let primaryColor = options.primaryColor, let color = getReactColor(Int(primaryColor)) {
            config.setThemeColor(color)
        }

        config.navigationTitleColor = .white
        config.photoList.titleView.arrow.arrowColor = .white
        config.photoList.cell.customSelectableCellClass = nil
    }

    func setPresentation(_ presentation: Presentation?) -> UIModalPresentationStyle {
        if let presentation {
            switch Int(presentation.rawValue) {
            case 1:
                return .formSheet
            default:
                return .fullScreen
            }
        }

        return .fullScreen
    }

    private func setLanguage(_ options: NitroConfig) {
        if let text = options.text {
            if let finish = text.finish {
                config.textManager.picker.photoList.bottomView.finishTitle = .custom(finish)
                config.textManager.picker.preview.bottomView.finishTitle = .custom(finish)
                config.textManager.editor.crop.maskListFinishTitle = .custom(finish)
            }

            if let original = text.original {
                config.textManager.picker.photoList.bottomView.originalTitle = .custom(original)
                config.textManager.picker.preview.bottomView.originalTitle = .custom(original)
            }

            if let preview = text.preview {
                config.textManager.picker.photoList.bottomView.previewTitle = .custom(preview)
            }

            if let edit = text.edit {
                config.textManager.picker.preview.bottomView.editTitle = .custom(edit)
            }
        }

        config.languageType = setLocale(language: options.language)
    }

    func setLocale(language: Language) -> LanguageType {
        switch language {
        case .vi:
            return .vietnamese // -> 🇻🇳 My country. Yeahhh
        case .zhHans:
            return .simplifiedChinese
        case .zhHant:
            return .traditionalChinese
        case .ja:
            return .japanese
        case .ko:
            return .korean
        case .en:
            return .english
        case .th:
            return .thai
        case .id:
            return .indonesia
        case .ru:
            return .russian
        case .de:
            return .german
        case .fr:
            return .french
        case .ar:
            return .arabic
        default:
            return .system
        }
    }
}


================================================
FILE: ios/HybridMultipleImagePicker+Crop.swift
================================================
//
//  HybridMultipleImagePicker+Crop.swift
//  Pods
//
//  Created by BAO HA on 9/12/24.
//

import HXPhotoPicker

extension HybridMultipleImagePicker {
    func openCrop(image: String, config: NitroCropConfig, resolved: @escaping ((CropResult) -> Void), rejected: @escaping ((Double) -> Void)) throws {
        let asset: EditorAsset

        if image.hasPrefix("http://") || image.hasPrefix("https://") || image.hasPrefix("file://") {
            guard let url = URL(string: image),
                  let data = try? Data(contentsOf: url)

            else {
                rejected(0)
                return
            }

            asset = .init(type: .imageData(data))
        } else {
            asset = .init(type: .photoAsset(.init(localIdentifier: image)))
        }

        let cropOption = PickerCropConfig(circle: config.circle, ratio: config.ratio, defaultRatio: config.defaultRatio, freeStyle: config.freeStyle)

        var editConfig = setCropConfig(cropOption)

        editConfig.languageType = setLocale(language: config.language)

        DispatchQueue.main.async {
            Photo.edit(asset: asset, config: editConfig) { result, _ in

                if let path = result.result?.url.absoluteString, let size = result.result?.image?.size {
                    let result = CropResult(path: path, width: size.width, height: size.height)

                    resolved(result)
                }
            }
        }
    }

    func setCropConfig(_ cropConfig: PickerCropConfig) -> EditorConfiguration {
        var config = EditorConfiguration()

        if let defaultRatio = cropConfig.defaultRatio {
            config.cropSize.aspectRatio = .init(width: defaultRatio.width, height: defaultRatio.height)
        }

        config.photo.defaultSelectedToolOption = .cropSize

        config.isFixedCropSizeState = true

        config.cropSize.defaultSeletedIndex = 0

        let freeStyle = cropConfig.freeStyle ?? true

        config.cropSize.isFixedRatio = !freeStyle

        config.isWhetherFinishButtonDisabledInUneditedState = true

        config.cropSize.isRoundCrop = cropConfig.circle ?? false

        config.cropSize.isResetToOriginal = true

        config.toolsView = .init(toolOptions: [.init(imageType: PickerConfiguration.default.editor.imageResource.editor.tools.cropSize, type: .cropSize)])

        config.photo.defaultSelectedToolOption = .cropSize

        if config.cropSize.isRoundCrop {
            config.cropSize.aspectRatios = []
        } else {
            var aspectRatios: [EditorRatioToolConfig] = PickerConfiguration.default.editor.cropSize.aspectRatios

            let ratio = cropConfig.ratio
            // custom ratio
            if ratio.count > 0 {
                ratio.forEach { ratio in
                    let width = Int(ratio.width)
                    let height = Int(ratio.height)

                    aspectRatios.insert(.init(title: .custom(ratio.title ?? "\(width)/\(height)"), ratio: .init(width: width, height: height)), at: 3)
                }
            }

            config.cropSize.aspectRatios = freeStyle ? aspectRatios : aspectRatios.filter {
                // check freeStyle crop
                if $0.ratio == .zero { return false }

                return true
            }
        }

        return config
    }
}


================================================
FILE: ios/HybridMultipleImagePicker+Preview.swift
================================================
//
//  HybridMultipleImagePicker+Preview.swift
//  Pods
//
//  Created by BAO HA on 11/12/24.
//

import HXPhotoPicker

extension HybridMultipleImagePicker {
    func openPreview(media: [MediaPreview], index: Double, config: NitroPreviewConfig, onLongPress: @escaping ((Double) -> Void)) throws {
        var previewConfig = HXPhotoPicker.PhotoBrowser.Configuration()
        previewConfig.showDelete = false

        var assets: [PhotoAsset] = []

        previewConfig.tintColor = .white
        previewConfig.videoPlayType = config.videoAutoPlay == true ? .auto : .normal
        previewConfig.livePhotoPlayType = .auto

        previewConfig.languageType = setLocale(language: config.language)

        media.forEach { mediaItem in

            var asset: PhotoAsset?

            if let localIdentifier = mediaItem.localIdentifier {
                asset = .init(localIdentifier: localIdentifier)

                // auto play gif
                if let filePath = mediaItem.path,
                   let url = URL(string: filePath), isGifFile(url) == true
                {
                    asset = .init(.init(imageURL: url))
                }

            } else if let path = mediaItem.path, let url = URL(string: path) {
                let thumbnail = URL(string: mediaItem.thumbnail ?? "") ?? url

                if mediaItem.type == .image {
                    // network asset
                    if path.hasPrefix("https://") || path.hasPrefix("http://") {
                        asset = PhotoAsset(NetworkImageAsset(
                            thumbnailURL: thumbnail,
                            originalURL: url,
                            thumbnailLoadMode: .alwaysThumbnail,
                            originalLoadMode: .alwaysThumbnail
                        ))

                    } else {
                        asset = .init(.init(imageURL: url))
                    }
                } else {
                    asset = .init(networkVideoAsset: .init(videoURL: url, coverImageURL: thumbnail))
                }
            }

            if let asset {
                assets.append(asset)
            }
        }

        if Int(index) > assets.count - 1 { return }

        DispatchQueue.main.async {
            HXPhotoPicker.PhotoBrowser.show(
                assets,
                pageIndex: Int(index),
                config: previewConfig,
                longPressHandler: { index, _, _ in
                    onLongPress(Double(index))
                }
            )
        }
    }
}


================================================
FILE: ios/HybridMultipleImagePicker+Result.swift
================================================
//
//  HybridMultipleImagePicker+Result.swift
//  Pods
//
//  Created by BAO HA on 24/10/24.
//

import HXPhotoPicker

extension HybridMultipleImagePicker {
    func getResult(_ asset: PhotoAsset) async throws -> PickerResult {
        let urlResult = try await asset.urlResult()
        let url = urlResult.url

        let creationDate = Int(asset.phAsset?.creationDate?.timeIntervalSince1970 ?? 0)

        let mime = url.getMimeType()

        let phAsset = asset.phAsset

        let type: ResultType = .init(fromString: asset.mediaType == .video ? "video" : "image")!
        let thumbnail = asset.phAsset?.getVideoAssetThumbnail(from: url.absoluteString, in: 1)

        return PickerResult(localIdentifier: phAsset!.localIdentifier,
                            width: asset.imageSize.width,
                            height: asset.imageSize.height,
                            mime: mime,
                            size: Double(asset.fileSize),
                            bucketId: nil,
                            realPath: nil,
                            parentFolderName: nil,
                            creationDate: creationDate > 0 ? Double(creationDate) : nil,
                            crop: false,
                            path: "file://\(url.absoluteString)",
                            type: type,
                            duration: asset.videoDuration,
                            thumbnail: thumbnail,
                            fileName: phAsset?.fileName)
    }
}


================================================
FILE: ios/HybridMultipleImagePicker.swift
================================================
//
//  HybridMultipleImagePicker.swift
//
//  Created by Marc Rousavy on 18.07.24.
//

import Foundation
import HXPhotoPicker
import NitroModules
import Photos

class HybridMultipleImagePicker: HybridMultipleImagePickerSpec {
    var selectedAssets: [PhotoAsset] = .init()

    var config: PickerConfiguration = .init()

    func openPicker(config: NitroConfig, resolved: @escaping (([PickerResult]) -> Void), rejected: @escaping ((Double) -> Void)) throws {
        setConfig(config)

        // get selected photo
        selectedAssets = selectedAssets.filter { asset in
            config.s
Download .txt
gitextract_k5e7rspq/

├── .circleci/
│   └── config.yml
├── .github/
│   ├── FUNDING.yml
│   └── workflows/
│       └── docs.yml
├── .gitignore
├── .npmignore
├── CONTRIBUTING.md
├── LICENSE
├── MultipleImagePicker.podspec
├── README.md
├── android/
│   ├── CMakeLists.txt
│   ├── build.gradle
│   ├── gradle.properties
│   └── src/
│       └── main/
│           ├── AndroidManifest.xml
│           ├── cpp/
│           │   └── cpp-adapter.cpp
│           ├── java/
│           │   └── com/
│           │       └── margelo/
│           │           └── nitro/
│           │               └── multipleimagepicker/
│           │                   ├── CameraEngine.kt
│           │                   ├── Constant.kt
│           │                   ├── CropEngine.kt
│           │                   ├── ExoPlayerEngine.kt
│           │                   ├── GlideEngine.kt
│           │                   ├── ImageLoaderUtils.kt
│           │                   ├── LoadingDialog.kt
│           │                   ├── MultipleImagePicker.kt
│           │                   ├── MultipleImagePickerImp.kt
│           │                   ├── MultipleImagePickerPackage.java
│           │                   ├── PictureSelectorEngineImp.kt
│           │                   └── VideoThumbnailEngine.kt
│           └── res/
│               ├── anim/
│               │   └── anim_modal_in.xml
│               ├── drawable/
│               │   ├── checkbox_selector.xml
│               │   ├── complete_button.xml
│               │   ├── ic_checkmark.xml
│               │   ├── ic_down.xml
│               │   ├── num_oval.xml
│               │   ├── picture_not_selected.xml
│               │   ├── picture_selector.xml
│               │   ├── preview_gallery_item.xml
│               │   └── preview_gallery_white_bg.xml
│               ├── layout/
│               │   └── loading_dialog.xml
│               └── values/
│                   ├── colors.xml
│                   └── styles.xml
├── babel.config.js
├── docs/
│   ├── .gitignore
│   ├── docs/
│   │   ├── CAMERA.mdx
│   │   ├── CONFIG.mdx
│   │   ├── CROP.mdx
│   │   ├── GETTING_STARTED.mdx
│   │   ├── PREVIEW.mdx
│   │   ├── RESULT.mdx
│   │   ├── SHOWCASE/
│   │   │   ├── index.mdx
│   │   │   ├── showcase.css
│   │   │   └── showcase.json
│   │   ├── USAGE.mdx
│   │   └── index.md
│   ├── docusaurus.config.ts
│   ├── package.json
│   ├── patches/
│   │   └── @gorhom+docusaurus-preset+1.0.2.patch
│   ├── sidebars.ts
│   ├── src/
│   │   └── css/
│   │       └── custom.css
│   ├── static/
│   │   └── .nojekyll
│   └── tsconfig.json
├── example/
│   ├── .gitignore
│   ├── App.tsx
│   ├── Gemfile
│   ├── README.md
│   ├── app.json
│   ├── babel.config.js
│   ├── metro.config.js
│   ├── package.json
│   ├── react-native.config.js
│   ├── src/
│   │   ├── assets/
│   │   │   └── index.ts
│   │   ├── common/
│   │   │   └── const.ts
│   │   ├── components/
│   │   │   ├── BottomSheet.tsx
│   │   │   ├── Button.tsx
│   │   │   ├── CheckBox.tsx
│   │   │   ├── CodeTag.tsx
│   │   │   ├── Container.tsx
│   │   │   ├── CounterView.tsx
│   │   │   ├── Divider.tsx
│   │   │   ├── Input.tsx
│   │   │   ├── Row.tsx
│   │   │   ├── SectionView.tsx
│   │   │   ├── SegmentControl.tsx
│   │   │   ├── Text.tsx
│   │   │   ├── View.tsx
│   │   │   └── index.tsx
│   │   ├── hook/
│   │   │   ├── context.ts
│   │   │   ├── index.ts
│   │   │   └── useTheme.ts
│   │   ├── index.tsx
│   │   └── theme/
│   │       ├── color.ts
│   │       └── size.ts
│   └── tsconfig.json
├── ios/
│   ├── Assets.swift
│   ├── Assets.xcassets/
│   │   ├── Contents.json
│   │   └── close.imageset/
│   │       └── Contents.json
│   ├── ErrorCode.swift
│   ├── HybridMultipleImagePicker+Camera.swift
│   ├── HybridMultipleImagePicker+Config.swift
│   ├── HybridMultipleImagePicker+Crop.swift
│   ├── HybridMultipleImagePicker+Preview.swift
│   ├── HybridMultipleImagePicker+Result.swift
│   ├── HybridMultipleImagePicker.swift
│   ├── MultipleImagePickerOnLoad.mm
│   ├── PHAsset+Thumbnail.swift
│   ├── PhotoCancelItem.swift
│   ├── TopViewController.swift
│   ├── UIColor+Hex.swift
│   ├── UIColor+React.swift
│   ├── UIImage.swift
│   ├── URL+Mime.swift
│   └── Utils.swift
├── nitro.json
├── nitrogen/
│   └── generated/
│       ├── .gitattributes
│       ├── android/
│       │   ├── MultipleImagePicker+autolinking.cmake
│       │   ├── MultipleImagePicker+autolinking.gradle
│       │   ├── MultipleImagePickerOnLoad.cpp
│       │   ├── MultipleImagePickerOnLoad.hpp
│       │   ├── c++/
│       │   │   ├── JCameraDevice.hpp
│       │   │   ├── JCameraResult.hpp
│       │   │   ├── JCropRatio.hpp
│       │   │   ├── JCropResult.hpp
│       │   │   ├── JFunc_void_CameraResult.hpp
│       │   │   ├── JFunc_void_CropResult.hpp
│       │   │   ├── JFunc_void_double.hpp
│       │   │   ├── JFunc_void_std__vector_PickerResult_.hpp
│       │   │   ├── JHybridMultipleImagePickerSpec.cpp
│       │   │   ├── JHybridMultipleImagePickerSpec.hpp
│       │   │   ├── JLanguage.hpp
│       │   │   ├── JMediaPreview.hpp
│       │   │   ├── JMediaType.hpp
│       │   │   ├── JNitroCameraConfig.hpp
│       │   │   ├── JNitroConfig.hpp
│       │   │   ├── JNitroCropConfig.hpp
│       │   │   ├── JNitroPreviewConfig.hpp
│       │   │   ├── JPickerCameraConfig.hpp
│       │   │   ├── JPickerCropConfig.hpp
│       │   │   ├── JPickerResult.hpp
│       │   │   ├── JPresentation.hpp
│       │   │   ├── JResultType.hpp
│       │   │   ├── JSelectBoxStyle.hpp
│       │   │   ├── JSelectMode.hpp
│       │   │   ├── JText.hpp
│       │   │   └── JTheme.hpp
│       │   └── kotlin/
│       │       └── com/
│       │           └── margelo/
│       │               └── nitro/
│       │                   └── multipleimagepicker/
│       │                       ├── CameraDevice.kt
│       │                       ├── CameraResult.kt
│       │                       ├── CropRatio.kt
│       │                       ├── CropResult.kt
│       │                       ├── Func_void_CameraResult.kt
│       │                       ├── Func_void_CropResult.kt
│       │                       ├── Func_void_double.kt
│       │                       ├── Func_void_std__vector_PickerResult_.kt
│       │                       ├── HybridMultipleImagePickerSpec.kt
│       │                       ├── Language.kt
│       │                       ├── MediaPreview.kt
│       │                       ├── MediaType.kt
│       │                       ├── MultipleImagePickerOnLoad.kt
│       │                       ├── NitroCameraConfig.kt
│       │                       ├── NitroConfig.kt
│       │                       ├── NitroCropConfig.kt
│       │                       ├── NitroPreviewConfig.kt
│       │                       ├── PickerCameraConfig.kt
│       │                       ├── PickerCropConfig.kt
│       │                       ├── PickerResult.kt
│       │                       ├── Presentation.kt
│       │                       ├── ResultType.kt
│       │                       ├── SelectBoxStyle.kt
│       │                       ├── SelectMode.kt
│       │                       ├── Text.kt
│       │                       └── Theme.kt
│       ├── ios/
│       │   ├── MultipleImagePicker+autolinking.rb
│       │   ├── MultipleImagePicker-Swift-Cxx-Bridge.cpp
│       │   ├── MultipleImagePicker-Swift-Cxx-Bridge.hpp
│       │   ├── MultipleImagePicker-Swift-Cxx-Umbrella.hpp
│       │   ├── MultipleImagePickerAutolinking.mm
│       │   ├── MultipleImagePickerAutolinking.swift
│       │   ├── c++/
│       │   │   ├── HybridMultipleImagePickerSpecSwift.cpp
│       │   │   └── HybridMultipleImagePickerSpecSwift.hpp
│       │   └── swift/
│       │       ├── CameraDevice.swift
│       │       ├── CameraResult.swift
│       │       ├── CropRatio.swift
│       │       ├── CropResult.swift
│       │       ├── Func_void_CameraResult.swift
│       │       ├── Func_void_CropResult.swift
│       │       ├── Func_void_double.swift
│       │       ├── Func_void_std__vector_PickerResult_.swift
│       │       ├── HybridMultipleImagePickerSpec.swift
│       │       ├── HybridMultipleImagePickerSpec_cxx.swift
│       │       ├── Language.swift
│       │       ├── MediaPreview.swift
│       │       ├── MediaType.swift
│       │       ├── NitroCameraConfig.swift
│       │       ├── NitroConfig.swift
│       │       ├── NitroCropConfig.swift
│       │       ├── NitroPreviewConfig.swift
│       │       ├── PickerCameraConfig.swift
│       │       ├── PickerCropConfig.swift
│       │       ├── PickerResult.swift
│       │       ├── Presentation.swift
│       │       ├── ResultType.swift
│       │       ├── SelectBoxStyle.swift
│       │       ├── SelectMode.swift
│       │       ├── Text.swift
│       │       └── Theme.swift
│       └── shared/
│           └── c++/
│               ├── CameraDevice.hpp
│               ├── CameraResult.hpp
│               ├── CropRatio.hpp
│               ├── CropResult.hpp
│               ├── HybridMultipleImagePickerSpec.cpp
│               ├── HybridMultipleImagePickerSpec.hpp
│               ├── Language.hpp
│               ├── MediaPreview.hpp
│               ├── MediaType.hpp
│               ├── NitroCameraConfig.hpp
│               ├── NitroConfig.hpp
│               ├── NitroCropConfig.hpp
│               ├── NitroPreviewConfig.hpp
│               ├── PickerCameraConfig.hpp
│               ├── PickerCropConfig.hpp
│               ├── PickerResult.hpp
│               ├── Presentation.hpp
│               ├── ResultType.hpp
│               ├── SelectBoxStyle.hpp
│               ├── SelectMode.hpp
│               ├── Text.hpp
│               └── Theme.hpp
├── package.json
├── react-native.config.js
├── scripts/
│   └── bootstrap.js
├── src/
│   ├── index.ts
│   ├── specs/
│   │   └── MultipleImagePicker.nitro.ts
│   └── types/
│       ├── camera.ts
│       ├── config.ts
│       ├── crop.ts
│       ├── error.ts
│       ├── index.ts
│       ├── picker.ts
│       ├── preview.ts
│       └── result.ts
├── tsconfig.build.json
└── tsconfig.json
Download .txt
SYMBOL INDEX (617 symbols across 84 files)

FILE: android/src/main/cpp/cpp-adapter.cpp
  function JNIEXPORT (line 4) | JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void*) {

FILE: android/src/main/java/com/margelo/nitro/multipleimagepicker/MultipleImagePickerPackage.java
  class MultipleImagePickerPackage (line 14) | public class MultipleImagePickerPackage extends TurboReactPackage {
    method getModule (line 15) | @Nullable
    method getReactModuleInfoProvider (line 21) | @Override

FILE: example/src/common/const.ts
  constant IS_IOS (line 3) | const IS_IOS = Platform.OS === 'ios'
  constant IS_ANDROID (line 4) | const IS_ANDROID = Platform.OS === 'android'
  constant LOCALIZED_LANGUAGES (line 6) | const LOCALIZED_LANGUAGES = [

FILE: example/src/components/BottomSheet.tsx
  function BottomSheet (line 4) | function BottomSheet() {

FILE: example/src/components/Button.tsx
  type Props (line 10) | interface Props extends TouchableOpacityProps {
  function Button (line 15) | function Button({

FILE: example/src/components/CheckBox.tsx
  type CheckBoxProps (line 11) | interface CheckBoxProps extends TouchableOpacityProps {
  function CheckBox (line 16) | function CheckBox({

FILE: example/src/components/CodeTag.tsx
  type CodeTagProps (line 6) | interface CodeTagProps extends ViewProps {
  function CodeTag (line 11) | function CodeTag({ children, textProps, ...props }: CodeTagProps) {

FILE: example/src/components/Container.tsx
  type Props (line 6) | interface Props extends ViewProps {
  function Container (line 10) | function Container({

FILE: example/src/components/CounterView.tsx
  type CounterViewProps (line 8) | interface CounterViewProps extends RowProps {
  function CounterView (line 17) | function CounterView({

FILE: example/src/components/Divider.tsx
  function Divider (line 6) | function Divider() {

FILE: example/src/components/Input.tsx
  type InputProps (line 5) | interface InputProps extends TextInputProps {}
  function Input (line 7) | function Input({ ...props }: InputProps) {

FILE: example/src/components/Row.tsx
  type RowProps (line 5) | interface RowProps extends ViewProps {
  function Row (line 10) | function Row({

FILE: example/src/components/SectionView.tsx
  type key (line 11) | type key = keyof Config
  type SectionViewProps (line 12) | interface SectionViewProps {
  function SectionView (line 21) | function SectionView({

FILE: example/src/components/SegmentControl.tsx
  function SegmentControl (line 6) | function SegmentControl({ ...props }: SegmentedControlProps) {

FILE: example/src/components/Text.tsx
  function Text (line 5) | function Text({ children, style: containerStyle }: TextProps) {

FILE: example/src/components/View.tsx
  type ViewProps (line 5) | interface ViewProps extends RNViewProps {
  function View (line 10) | function View({

FILE: example/src/hook/useTheme.ts
  function useTheme (line 4) | function useTheme() {

FILE: example/src/index.tsx
  function App (line 66) | function App() {

FILE: example/src/theme/size.ts
  constant HALF_HEIGHT (line 4) | const HALF_HEIGHT = HEIGHT / 2
  constant HALF_WIDTH (line 5) | const HALF_WIDTH = WIDTH / 2

FILE: nitrogen/generated/android/MultipleImagePickerOnLoad.cpp
  type margelo::nitro::multipleimagepicker (line 26) | namespace margelo::nitro::multipleimagepicker {
    function initialize (line 28) | int initialize(JavaVM* vm) {

FILE: nitrogen/generated/android/MultipleImagePickerOnLoad.hpp
  type margelo::nitro::multipleimagepicker (line 11) | namespace margelo::nitro::multipleimagepicker {

FILE: nitrogen/generated/android/c++/JCameraDevice.hpp
  type margelo::nitro::multipleimagepicker (line 13) | namespace margelo::nitro::multipleimagepicker {
    type JCameraDevice (line 20) | struct JCameraDevice final: public jni::JavaClass<JCameraDevice> {
      method CameraDevice (line 28) | [[maybe_unused]]
      method fromCpp (line 41) | [[maybe_unused]]

FILE: nitrogen/generated/android/c++/JCameraResult.hpp
  type margelo::nitro::multipleimagepicker (line 18) | namespace margelo::nitro::multipleimagepicker {
    type JCameraResult (line 25) | struct JCameraResult final: public jni::JavaClass<JCameraResult> {
      method CameraResult (line 33) | [[maybe_unused]]
      method fromCpp (line 66) | [[maybe_unused]]

FILE: nitrogen/generated/android/c++/JCropRatio.hpp
  type margelo::nitro::multipleimagepicker (line 16) | namespace margelo::nitro::multipleimagepicker {
    type JCropRatio (line 23) | struct JCropRatio final: public jni::JavaClass<JCropRatio> {
      method CropRatio (line 31) | [[maybe_unused]]
      method fromCpp (line 52) | [[maybe_unused]]

FILE: nitrogen/generated/android/c++/JCropResult.hpp
  type margelo::nitro::multipleimagepicker (line 15) | namespace margelo::nitro::multipleimagepicker {
    type JCropResult (line 22) | struct JCropResult final: public jni::JavaClass<JCropResult> {
      method CropResult (line 30) | [[maybe_unused]]
      method fromCpp (line 51) | [[maybe_unused]]

FILE: nitrogen/generated/android/c++/JFunc_void_CameraResult.hpp
  type margelo::nitro::multipleimagepicker (line 21) | namespace margelo::nitro::multipleimagepicker {
    type JFunc_void_CameraResult (line 29) | struct JFunc_void_CameraResult: public jni::JavaClass<JFunc_void_Camer...
      method invoke (line 37) | void invoke(const CameraResult& result) const {
    type JFunc_void_CameraResult_cxx (line 46) | struct JFunc_void_CameraResult_cxx final: public jni::HybridClass<JFun...
      method fromCpp (line 48) | static jni::local_ref<JFunc_void_CameraResult::javaobject> fromCpp(c...
      method invoke_cxx (line 56) | void invoke_cxx(jni::alias_ref<JCameraResult> result) {
      method registerNatives (line 68) | static void registerNatives() {
      method JFunc_void_CameraResult_cxx (line 73) | explicit JFunc_void_CameraResult_cxx(const std::function<void(const ...

FILE: nitrogen/generated/android/c++/JFunc_void_CropResult.hpp
  type margelo::nitro::multipleimagepicker (line 18) | namespace margelo::nitro::multipleimagepicker {
    type JFunc_void_CropResult (line 26) | struct JFunc_void_CropResult: public jni::JavaClass<JFunc_void_CropRes...
      method invoke (line 34) | void invoke(const CropResult& result) const {
    type JFunc_void_CropResult_cxx (line 43) | struct JFunc_void_CropResult_cxx final: public jni::HybridClass<JFunc_...
      method fromCpp (line 45) | static jni::local_ref<JFunc_void_CropResult::javaobject> fromCpp(con...
      method invoke_cxx (line 53) | void invoke_cxx(jni::alias_ref<JCropResult> result) {
      method registerNatives (line 65) | static void registerNatives() {
      method JFunc_void_CropResult_cxx (line 70) | explicit JFunc_void_CropResult_cxx(const std::function<void(const Cr...

FILE: nitrogen/generated/android/c++/JFunc_void_double.hpp
  type margelo::nitro::multipleimagepicker (line 15) | namespace margelo::nitro::multipleimagepicker {
    type JFunc_void_double (line 23) | struct JFunc_void_double: public jni::JavaClass<JFunc_void_double> {
      method invoke (line 31) | void invoke(double index) const {
    type JFunc_void_double_cxx (line 40) | struct JFunc_void_double_cxx final: public jni::HybridClass<JFunc_void...
      method fromCpp (line 42) | static jni::local_ref<JFunc_void_double::javaobject> fromCpp(const s...
      method invoke_cxx (line 50) | void invoke_cxx(double index) {
      method registerNatives (line 62) | static void registerNatives() {
      method JFunc_void_double_cxx (line 67) | explicit JFunc_void_double_cxx(const std::function<void(double /* in...

FILE: nitrogen/generated/android/c++/JFunc_void_std__vector_PickerResult_.hpp
  type margelo::nitro::multipleimagepicker (line 22) | namespace margelo::nitro::multipleimagepicker {
    type JFunc_void_std__vector_PickerResult_ (line 30) | struct JFunc_void_std__vector_PickerResult_: public jni::JavaClass<JFu...
      method invoke (line 38) | void invoke(const std::vector<PickerResult>& result) const {
    type JFunc_void_std__vector_PickerResult__cxx (line 55) | struct JFunc_void_std__vector_PickerResult__cxx final: public jni::Hyb...
      method fromCpp (line 57) | static jni::local_ref<JFunc_void_std__vector_PickerResult_::javaobje...
      method invoke_cxx (line 65) | void invoke_cxx(jni::alias_ref<jni::JArrayClass<JPickerResult>> resu...
      method registerNatives (line 86) | static void registerNatives() {
      method JFunc_void_std__vector_PickerResult__cxx (line 91) | explicit JFunc_void_std__vector_PickerResult__cxx(const std::functio...

FILE: nitrogen/generated/android/c++/JHybridMultipleImagePickerSpec.cpp
  type margelo::nitro::multipleimagepicker (line 11) | namespace margelo::nitro::multipleimagepicker { struct NitroConfig; }
    type NitroConfig (line 11) | struct NitroConfig
    type MediaType (line 13) | enum class MediaType
    type PickerResult (line 15) | struct PickerResult
    type ResultType (line 17) | enum class ResultType
    type SelectBoxStyle (line 19) | enum class SelectBoxStyle
    type SelectMode (line 21) | enum class SelectMode
    type PickerCropConfig (line 23) | struct PickerCropConfig
    type CropRatio (line 25) | struct CropRatio
    type Text (line 27) | struct Text
    type Language (line 29) | enum class Language
    type Theme (line 31) | enum class Theme
    type Presentation (line 33) | enum class Presentation
    type PickerCameraConfig (line 35) | struct PickerCameraConfig
    type CameraDevice (line 37) | enum class CameraDevice
    type NitroCropConfig (line 39) | struct NitroCropConfig
    type CropResult (line 41) | struct CropResult
    type MediaPreview (line 43) | struct MediaPreview
    type NitroPreviewConfig (line 45) | struct NitroPreviewConfig
    type NitroCameraConfig (line 47) | struct NitroCameraConfig
    type CameraResult (line 49) | struct CameraResult
  type margelo::nitro::multipleimagepicker (line 13) | namespace margelo::nitro::multipleimagepicker { enum class MediaType; }
    type NitroConfig (line 11) | struct NitroConfig
    type MediaType (line 13) | enum class MediaType
    type PickerResult (line 15) | struct PickerResult
    type ResultType (line 17) | enum class ResultType
    type SelectBoxStyle (line 19) | enum class SelectBoxStyle
    type SelectMode (line 21) | enum class SelectMode
    type PickerCropConfig (line 23) | struct PickerCropConfig
    type CropRatio (line 25) | struct CropRatio
    type Text (line 27) | struct Text
    type Language (line 29) | enum class Language
    type Theme (line 31) | enum class Theme
    type Presentation (line 33) | enum class Presentation
    type PickerCameraConfig (line 35) | struct PickerCameraConfig
    type CameraDevice (line 37) | enum class CameraDevice
    type NitroCropConfig (line 39) | struct NitroCropConfig
    type CropResult (line 41) | struct CropResult
    type MediaPreview (line 43) | struct MediaPreview
    type NitroPreviewConfig (line 45) | struct NitroPreviewConfig
    type NitroCameraConfig (line 47) | struct NitroCameraConfig
    type CameraResult (line 49) | struct CameraResult
  type margelo::nitro::multipleimagepicker (line 15) | namespace margelo::nitro::multipleimagepicker { struct PickerResult; }
    type NitroConfig (line 11) | struct NitroConfig
    type MediaType (line 13) | enum class MediaType
    type PickerResult (line 15) | struct PickerResult
    type ResultType (line 17) | enum class ResultType
    type SelectBoxStyle (line 19) | enum class SelectBoxStyle
    type SelectMode (line 21) | enum class SelectMode
    type PickerCropConfig (line 23) | struct PickerCropConfig
    type CropRatio (line 25) | struct CropRatio
    type Text (line 27) | struct Text
    type Language (line 29) | enum class Language
    type Theme (line 31) | enum class Theme
    type Presentation (line 33) | enum class Presentation
    type PickerCameraConfig (line 35) | struct PickerCameraConfig
    type CameraDevice (line 37) | enum class CameraDevice
    type NitroCropConfig (line 39) | struct NitroCropConfig
    type CropResult (line 41) | struct CropResult
    type MediaPreview (line 43) | struct MediaPreview
    type NitroPreviewConfig (line 45) | struct NitroPreviewConfig
    type NitroCameraConfig (line 47) | struct NitroCameraConfig
    type CameraResult (line 49) | struct CameraResult
  type margelo::nitro::multipleimagepicker (line 17) | namespace margelo::nitro::multipleimagepicker { enum class ResultType; }
    type NitroConfig (line 11) | struct NitroConfig
    type MediaType (line 13) | enum class MediaType
    type PickerResult (line 15) | struct PickerResult
    type ResultType (line 17) | enum class ResultType
    type SelectBoxStyle (line 19) | enum class SelectBoxStyle
    type SelectMode (line 21) | enum class SelectMode
    type PickerCropConfig (line 23) | struct PickerCropConfig
    type CropRatio (line 25) | struct CropRatio
    type Text (line 27) | struct Text
    type Language (line 29) | enum class Language
    type Theme (line 31) | enum class Theme
    type Presentation (line 33) | enum class Presentation
    type PickerCameraConfig (line 35) | struct PickerCameraConfig
    type CameraDevice (line 37) | enum class CameraDevice
    type NitroCropConfig (line 39) | struct NitroCropConfig
    type CropResult (line 41) | struct CropResult
    type MediaPreview (line 43) | struct MediaPreview
    type NitroPreviewConfig (line 45) | struct NitroPreviewConfig
    type NitroCameraConfig (line 47) | struct NitroCameraConfig
    type CameraResult (line 49) | struct CameraResult
  type margelo::nitro::multipleimagepicker (line 19) | namespace margelo::nitro::multipleimagepicker { enum class SelectBoxStyl...
    type NitroConfig (line 11) | struct NitroConfig
    type MediaType (line 13) | enum class MediaType
    type PickerResult (line 15) | struct PickerResult
    type ResultType (line 17) | enum class ResultType
    type SelectBoxStyle (line 19) | enum class SelectBoxStyle
    type SelectMode (line 21) | enum class SelectMode
    type PickerCropConfig (line 23) | struct PickerCropConfig
    type CropRatio (line 25) | struct CropRatio
    type Text (line 27) | struct Text
    type Language (line 29) | enum class Language
    type Theme (line 31) | enum class Theme
    type Presentation (line 33) | enum class Presentation
    type PickerCameraConfig (line 35) | struct PickerCameraConfig
    type CameraDevice (line 37) | enum class CameraDevice
    type NitroCropConfig (line 39) | struct NitroCropConfig
    type CropResult (line 41) | struct CropResult
    type MediaPreview (line 43) | struct MediaPreview
    type NitroPreviewConfig (line 45) | struct NitroPreviewConfig
    type NitroCameraConfig (line 47) | struct NitroCameraConfig
    type CameraResult (line 49) | struct CameraResult
  type margelo::nitro::multipleimagepicker (line 21) | namespace margelo::nitro::multipleimagepicker { enum class SelectMode; }
    type NitroConfig (line 11) | struct NitroConfig
    type MediaType (line 13) | enum class MediaType
    type PickerResult (line 15) | struct PickerResult
    type ResultType (line 17) | enum class ResultType
    type SelectBoxStyle (line 19) | enum class SelectBoxStyle
    type SelectMode (line 21) | enum class SelectMode
    type PickerCropConfig (line 23) | struct PickerCropConfig
    type CropRatio (line 25) | struct CropRatio
    type Text (line 27) | struct Text
    type Language (line 29) | enum class Language
    type Theme (line 31) | enum class Theme
    type Presentation (line 33) | enum class Presentation
    type PickerCameraConfig (line 35) | struct PickerCameraConfig
    type CameraDevice (line 37) | enum class CameraDevice
    type NitroCropConfig (line 39) | struct NitroCropConfig
    type CropResult (line 41) | struct CropResult
    type MediaPreview (line 43) | struct MediaPreview
    type NitroPreviewConfig (line 45) | struct NitroPreviewConfig
    type NitroCameraConfig (line 47) | struct NitroCameraConfig
    type CameraResult (line 49) | struct CameraResult
  type margelo::nitro::multipleimagepicker (line 23) | namespace margelo::nitro::multipleimagepicker { struct PickerCropConfig; }
    type NitroConfig (line 11) | struct NitroConfig
    type MediaType (line 13) | enum class MediaType
    type PickerResult (line 15) | struct PickerResult
    type ResultType (line 17) | enum class ResultType
    type SelectBoxStyle (line 19) | enum class SelectBoxStyle
    type SelectMode (line 21) | enum class SelectMode
    type PickerCropConfig (line 23) | struct PickerCropConfig
    type CropRatio (line 25) | struct CropRatio
    type Text (line 27) | struct Text
    type Language (line 29) | enum class Language
    type Theme (line 31) | enum class Theme
    type Presentation (line 33) | enum class Presentation
    type PickerCameraConfig (line 35) | struct PickerCameraConfig
    type CameraDevice (line 37) | enum class CameraDevice
    type NitroCropConfig (line 39) | struct NitroCropConfig
    type CropResult (line 41) | struct CropResult
    type MediaPreview (line 43) | struct MediaPreview
    type NitroPreviewConfig (line 45) | struct NitroPreviewConfig
    type NitroCameraConfig (line 47) | struct NitroCameraConfig
    type CameraResult (line 49) | struct CameraResult
  type margelo::nitro::multipleimagepicker (line 25) | namespace margelo::nitro::multipleimagepicker { struct CropRatio; }
    type NitroConfig (line 11) | struct NitroConfig
    type MediaType (line 13) | enum class MediaType
    type PickerResult (line 15) | struct PickerResult
    type ResultType (line 17) | enum class ResultType
    type SelectBoxStyle (line 19) | enum class SelectBoxStyle
    type SelectMode (line 21) | enum class SelectMode
    type PickerCropConfig (line 23) | struct PickerCropConfig
    type CropRatio (line 25) | struct CropRatio
    type Text (line 27) | struct Text
    type Language (line 29) | enum class Language
    type Theme (line 31) | enum class Theme
    type Presentation (line 33) | enum class Presentation
    type PickerCameraConfig (line 35) | struct PickerCameraConfig
    type CameraDevice (line 37) | enum class CameraDevice
    type NitroCropConfig (line 39) | struct NitroCropConfig
    type CropResult (line 41) | struct CropResult
    type MediaPreview (line 43) | struct MediaPreview
    type NitroPreviewConfig (line 45) | struct NitroPreviewConfig
    type NitroCameraConfig (line 47) | struct NitroCameraConfig
    type CameraResult (line 49) | struct CameraResult
  type margelo::nitro::multipleimagepicker (line 27) | namespace margelo::nitro::multipleimagepicker { struct Text; }
    type NitroConfig (line 11) | struct NitroConfig
    type MediaType (line 13) | enum class MediaType
    type PickerResult (line 15) | struct PickerResult
    type ResultType (line 17) | enum class ResultType
    type SelectBoxStyle (line 19) | enum class SelectBoxStyle
    type SelectMode (line 21) | enum class SelectMode
    type PickerCropConfig (line 23) | struct PickerCropConfig
    type CropRatio (line 25) | struct CropRatio
    type Text (line 27) | struct Text
    type Language (line 29) | enum class Language
    type Theme (line 31) | enum class Theme
    type Presentation (line 33) | enum class Presentation
    type PickerCameraConfig (line 35) | struct PickerCameraConfig
    type CameraDevice (line 37) | enum class CameraDevice
    type NitroCropConfig (line 39) | struct NitroCropConfig
    type CropResult (line 41) | struct CropResult
    type MediaPreview (line 43) | struct MediaPreview
    type NitroPreviewConfig (line 45) | struct NitroPreviewConfig
    type NitroCameraConfig (line 47) | struct NitroCameraConfig
    type CameraResult (line 49) | struct CameraResult
  type margelo::nitro::multipleimagepicker (line 29) | namespace margelo::nitro::multipleimagepicker { enum class Language; }
    type NitroConfig (line 11) | struct NitroConfig
    type MediaType (line 13) | enum class MediaType
    type PickerResult (line 15) | struct PickerResult
    type ResultType (line 17) | enum class ResultType
    type SelectBoxStyle (line 19) | enum class SelectBoxStyle
    type SelectMode (line 21) | enum class SelectMode
    type PickerCropConfig (line 23) | struct PickerCropConfig
    type CropRatio (line 25) | struct CropRatio
    type Text (line 27) | struct Text
    type Language (line 29) | enum class Language
    type Theme (line 31) | enum class Theme
    type Presentation (line 33) | enum class Presentation
    type PickerCameraConfig (line 35) | struct PickerCameraConfig
    type CameraDevice (line 37) | enum class CameraDevice
    type NitroCropConfig (line 39) | struct NitroCropConfig
    type CropResult (line 41) | struct CropResult
    type MediaPreview (line 43) | struct MediaPreview
    type NitroPreviewConfig (line 45) | struct NitroPreviewConfig
    type NitroCameraConfig (line 47) | struct NitroCameraConfig
    type CameraResult (line 49) | struct CameraResult
  type margelo::nitro::multipleimagepicker (line 31) | namespace margelo::nitro::multipleimagepicker { enum class Theme; }
    type NitroConfig (line 11) | struct NitroConfig
    type MediaType (line 13) | enum class MediaType
    type PickerResult (line 15) | struct PickerResult
    type ResultType (line 17) | enum class ResultType
    type SelectBoxStyle (line 19) | enum class SelectBoxStyle
    type SelectMode (line 21) | enum class SelectMode
    type PickerCropConfig (line 23) | struct PickerCropConfig
    type CropRatio (line 25) | struct CropRatio
    type Text (line 27) | struct Text
    type Language (line 29) | enum class Language
    type Theme (line 31) | enum class Theme
    type Presentation (line 33) | enum class Presentation
    type PickerCameraConfig (line 35) | struct PickerCameraConfig
    type CameraDevice (line 37) | enum class CameraDevice
    type NitroCropConfig (line 39) | struct NitroCropConfig
    type CropResult (line 41) | struct CropResult
    type MediaPreview (line 43) | struct MediaPreview
    type NitroPreviewConfig (line 45) | struct NitroPreviewConfig
    type NitroCameraConfig (line 47) | struct NitroCameraConfig
    type CameraResult (line 49) | struct CameraResult
  type margelo::nitro::multipleimagepicker (line 33) | namespace margelo::nitro::multipleimagepicker { enum class Presentation; }
    type NitroConfig (line 11) | struct NitroConfig
    type MediaType (line 13) | enum class MediaType
    type PickerResult (line 15) | struct PickerResult
    type ResultType (line 17) | enum class ResultType
    type SelectBoxStyle (line 19) | enum class SelectBoxStyle
    type SelectMode (line 21) | enum class SelectMode
    type PickerCropConfig (line 23) | struct PickerCropConfig
    type CropRatio (line 25) | struct CropRatio
    type Text (line 27) | struct Text
    type Language (line 29) | enum class Language
    type Theme (line 31) | enum class Theme
    type Presentation (line 33) | enum class Presentation
    type PickerCameraConfig (line 35) | struct PickerCameraConfig
    type CameraDevice (line 37) | enum class CameraDevice
    type NitroCropConfig (line 39) | struct NitroCropConfig
    type CropResult (line 41) | struct CropResult
    type MediaPreview (line 43) | struct MediaPreview
    type NitroPreviewConfig (line 45) | struct NitroPreviewConfig
    type NitroCameraConfig (line 47) | struct NitroCameraConfig
    type CameraResult (line 49) | struct CameraResult
  type margelo::nitro::multipleimagepicker (line 35) | namespace margelo::nitro::multipleimagepicker { struct PickerCameraConfi...
    type NitroConfig (line 11) | struct NitroConfig
    type MediaType (line 13) | enum class MediaType
    type PickerResult (line 15) | struct PickerResult
    type ResultType (line 17) | enum class ResultType
    type SelectBoxStyle (line 19) | enum class SelectBoxStyle
    type SelectMode (line 21) | enum class SelectMode
    type PickerCropConfig (line 23) | struct PickerCropConfig
    type CropRatio (line 25) | struct CropRatio
    type Text (line 27) | struct Text
    type Language (line 29) | enum class Language
    type Theme (line 31) | enum class Theme
    type Presentation (line 33) | enum class Presentation
    type PickerCameraConfig (line 35) | struct PickerCameraConfig
    type CameraDevice (line 37) | enum class CameraDevice
    type NitroCropConfig (line 39) | struct NitroCropConfig
    type CropResult (line 41) | struct CropResult
    type MediaPreview (line 43) | struct MediaPreview
    type NitroPreviewConfig (line 45) | struct NitroPreviewConfig
    type NitroCameraConfig (line 47) | struct NitroCameraConfig
    type CameraResult (line 49) | struct CameraResult
  type margelo::nitro::multipleimagepicker (line 37) | namespace margelo::nitro::multipleimagepicker { enum class CameraDevice; }
    type NitroConfig (line 11) | struct NitroConfig
    type MediaType (line 13) | enum class MediaType
    type PickerResult (line 15) | struct PickerResult
    type ResultType (line 17) | enum class ResultType
    type SelectBoxStyle (line 19) | enum class SelectBoxStyle
    type SelectMode (line 21) | enum class SelectMode
    type PickerCropConfig (line 23) | struct PickerCropConfig
    type CropRatio (line 25) | struct CropRatio
    type Text (line 27) | struct Text
    type Language (line 29) | enum class Language
    type Theme (line 31) | enum class Theme
    type Presentation (line 33) | enum class Presentation
    type PickerCameraConfig (line 35) | struct PickerCameraConfig
    type CameraDevice (line 37) | enum class CameraDevice
    type NitroCropConfig (line 39) | struct NitroCropConfig
    type CropResult (line 41) | struct CropResult
    type MediaPreview (line 43) | struct MediaPreview
    type NitroPreviewConfig (line 45) | struct NitroPreviewConfig
    type NitroCameraConfig (line 47) | struct NitroCameraConfig
    type CameraResult (line 49) | struct CameraResult
  type margelo::nitro::multipleimagepicker (line 39) | namespace margelo::nitro::multipleimagepicker { struct NitroCropConfig; }
    type NitroConfig (line 11) | struct NitroConfig
    type MediaType (line 13) | enum class MediaType
    type PickerResult (line 15) | struct PickerResult
    type ResultType (line 17) | enum class ResultType
    type SelectBoxStyle (line 19) | enum class SelectBoxStyle
    type SelectMode (line 21) | enum class SelectMode
    type PickerCropConfig (line 23) | struct PickerCropConfig
    type CropRatio (line 25) | struct CropRatio
    type Text (line 27) | struct Text
    type Language (line 29) | enum class Language
    type Theme (line 31) | enum class Theme
    type Presentation (line 33) | enum class Presentation
    type PickerCameraConfig (line 35) | struct PickerCameraConfig
    type CameraDevice (line 37) | enum class CameraDevice
    type NitroCropConfig (line 39) | struct NitroCropConfig
    type CropResult (line 41) | struct CropResult
    type MediaPreview (line 43) | struct MediaPreview
    type NitroPreviewConfig (line 45) | struct NitroPreviewConfig
    type NitroCameraConfig (line 47) | struct NitroCameraConfig
    type CameraResult (line 49) | struct CameraResult
  type margelo::nitro::multipleimagepicker (line 41) | namespace margelo::nitro::multipleimagepicker { struct CropResult; }
    type NitroConfig (line 11) | struct NitroConfig
    type MediaType (line 13) | enum class MediaType
    type PickerResult (line 15) | struct PickerResult
    type ResultType (line 17) | enum class ResultType
    type SelectBoxStyle (line 19) | enum class SelectBoxStyle
    type SelectMode (line 21) | enum class SelectMode
    type PickerCropConfig (line 23) | struct PickerCropConfig
    type CropRatio (line 25) | struct CropRatio
    type Text (line 27) | struct Text
    type Language (line 29) | enum class Language
    type Theme (line 31) | enum class Theme
    type Presentation (line 33) | enum class Presentation
    type PickerCameraConfig (line 35) | struct PickerCameraConfig
    type CameraDevice (line 37) | enum class CameraDevice
    type NitroCropConfig (line 39) | struct NitroCropConfig
    type CropResult (line 41) | struct CropResult
    type MediaPreview (line 43) | struct MediaPreview
    type NitroPreviewConfig (line 45) | struct NitroPreviewConfig
    type NitroCameraConfig (line 47) | struct NitroCameraConfig
    type CameraResult (line 49) | struct CameraResult
  type margelo::nitro::multipleimagepicker (line 43) | namespace margelo::nitro::multipleimagepicker { struct MediaPreview; }
    type NitroConfig (line 11) | struct NitroConfig
    type MediaType (line 13) | enum class MediaType
    type PickerResult (line 15) | struct PickerResult
    type ResultType (line 17) | enum class ResultType
    type SelectBoxStyle (line 19) | enum class SelectBoxStyle
    type SelectMode (line 21) | enum class SelectMode
    type PickerCropConfig (line 23) | struct PickerCropConfig
    type CropRatio (line 25) | struct CropRatio
    type Text (line 27) | struct Text
    type Language (line 29) | enum class Language
    type Theme (line 31) | enum class Theme
    type Presentation (line 33) | enum class Presentation
    type PickerCameraConfig (line 35) | struct PickerCameraConfig
    type CameraDevice (line 37) | enum class CameraDevice
    type NitroCropConfig (line 39) | struct NitroCropConfig
    type CropResult (line 41) | struct CropResult
    type MediaPreview (line 43) | struct MediaPreview
    type NitroPreviewConfig (line 45) | struct NitroPreviewConfig
    type NitroCameraConfig (line 47) | struct NitroCameraConfig
    type CameraResult (line 49) | struct CameraResult
  type margelo::nitro::multipleimagepicker (line 45) | namespace margelo::nitro::multipleimagepicker { struct NitroPreviewConfi...
    type NitroConfig (line 11) | struct NitroConfig
    type MediaType (line 13) | enum class MediaType
    type PickerResult (line 15) | struct PickerResult
    type ResultType (line 17) | enum class ResultType
    type SelectBoxStyle (line 19) | enum class SelectBoxStyle
    type SelectMode (line 21) | enum class SelectMode
    type PickerCropConfig (line 23) | struct PickerCropConfig
    type CropRatio (line 25) | struct CropRatio
    type Text (line 27) | struct Text
    type Language (line 29) | enum class Language
    type Theme (line 31) | enum class Theme
    type Presentation (line 33) | enum class Presentation
    type PickerCameraConfig (line 35) | struct PickerCameraConfig
    type CameraDevice (line 37) | enum class CameraDevice
    type NitroCropConfig (line 39) | struct NitroCropConfig
    type CropResult (line 41) | struct CropResult
    type MediaPreview (line 43) | struct MediaPreview
    type NitroPreviewConfig (line 45) | struct NitroPreviewConfig
    type NitroCameraConfig (line 47) | struct NitroCameraConfig
    type CameraResult (line 49) | struct CameraResult
  type margelo::nitro::multipleimagepicker (line 47) | namespace margelo::nitro::multipleimagepicker { struct NitroCameraConfig; }
    type NitroConfig (line 11) | struct NitroConfig
    type MediaType (line 13) | enum class MediaType
    type PickerResult (line 15) | struct PickerResult
    type ResultType (line 17) | enum class ResultType
    type SelectBoxStyle (line 19) | enum class SelectBoxStyle
    type SelectMode (line 21) | enum class SelectMode
    type PickerCropConfig (line 23) | struct PickerCropConfig
    type CropRatio (line 25) | struct CropRatio
    type Text (line 27) | struct Text
    type Language (line 29) | enum class Language
    type Theme (line 31) | enum class Theme
    type Presentation (line 33) | enum class Presentation
    type PickerCameraConfig (line 35) | struct PickerCameraConfig
    type CameraDevice (line 37) | enum class CameraDevice
    type NitroCropConfig (line 39) | struct NitroCropConfig
    type CropResult (line 41) | struct CropResult
    type MediaPreview (line 43) | struct MediaPreview
    type NitroPreviewConfig (line 45) | struct NitroPreviewConfig
    type NitroCameraConfig (line 47) | struct NitroCameraConfig
    type CameraResult (line 49) | struct CameraResult
  type margelo::nitro::multipleimagepicker (line 49) | namespace margelo::nitro::multipleimagepicker { struct CameraResult; }
    type NitroConfig (line 11) | struct NitroConfig
    type MediaType (line 13) | enum class MediaType
    type PickerResult (line 15) | struct PickerResult
    type ResultType (line 17) | enum class ResultType
    type SelectBoxStyle (line 19) | enum class SelectBoxStyle
    type SelectMode (line 21) | enum class SelectMode
    type PickerCropConfig (line 23) | struct PickerCropConfig
    type CropRatio (line 25) | struct CropRatio
    type Text (line 27) | struct Text
    type Language (line 29) | enum class Language
    type Theme (line 31) | enum class Theme
    type Presentation (line 33) | enum class Presentation
    type PickerCameraConfig (line 35) | struct PickerCameraConfig
    type CameraDevice (line 37) | enum class CameraDevice
    type NitroCropConfig (line 39) | struct NitroCropConfig
    type CropResult (line 41) | struct CropResult
    type MediaPreview (line 43) | struct MediaPreview
    type NitroPreviewConfig (line 45) | struct NitroPreviewConfig
    type NitroCameraConfig (line 47) | struct NitroCameraConfig
    type CameraResult (line 49) | struct CameraResult
  type margelo::nitro::multipleimagepicker (line 100) | namespace margelo::nitro::multipleimagepicker {
    type NitroConfig (line 11) | struct NitroConfig
    type MediaType (line 13) | enum class MediaType
    type PickerResult (line 15) | struct PickerResult
    type ResultType (line 17) | enum class ResultType
    type SelectBoxStyle (line 19) | enum class SelectBoxStyle
    type SelectMode (line 21) | enum class SelectMode
    type PickerCropConfig (line 23) | struct PickerCropConfig
    type CropRatio (line 25) | struct CropRatio
    type Text (line 27) | struct Text
    type Language (line 29) | enum class Language
    type Theme (line 31) | enum class Theme
    type Presentation (line 33) | enum class Presentation
    type PickerCameraConfig (line 35) | struct PickerCameraConfig
    type CameraDevice (line 37) | enum class CameraDevice
    type NitroCropConfig (line 39) | struct NitroCropConfig
    type CropResult (line 41) | struct CropResult
    type MediaPreview (line 43) | struct MediaPreview
    type NitroPreviewConfig (line 45) | struct NitroPreviewConfig
    type NitroCameraConfig (line 47) | struct NitroCameraConfig
    type CameraResult (line 49) | struct CameraResult

FILE: nitrogen/generated/android/c++/JHybridMultipleImagePickerSpec.hpp
  type margelo::nitro::multipleimagepicker (line 17) | namespace margelo::nitro::multipleimagepicker {
    class JHybridMultipleImagePickerSpec (line 21) | class JHybridMultipleImagePickerSpec: public jni::HybridClass<JHybridM...
      method JHybridMultipleImagePickerSpec (line 30) | explicit JHybridMultipleImagePickerSpec(jni::alias_ref<jhybridobject...

FILE: nitrogen/generated/android/c++/JLanguage.hpp
  type margelo::nitro::multipleimagepicker (line 13) | namespace margelo::nitro::multipleimagepicker {
    type JLanguage (line 20) | struct JLanguage final: public jni::JavaClass<JLanguage> {
      method Language (line 28) | [[maybe_unused]]
      method fromCpp (line 41) | [[maybe_unused]]

FILE: nitrogen/generated/android/c++/JMediaPreview.hpp
  type margelo::nitro::multipleimagepicker (line 18) | namespace margelo::nitro::multipleimagepicker {
    type JMediaPreview (line 25) | struct JMediaPreview final: public jni::JavaClass<JMediaPreview> {
      method MediaPreview (line 33) | [[maybe_unused]]
      method fromCpp (line 57) | [[maybe_unused]]

FILE: nitrogen/generated/android/c++/JMediaType.hpp
  type margelo::nitro::multipleimagepicker (line 13) | namespace margelo::nitro::multipleimagepicker {
    type JMediaType (line 20) | struct JMediaType final: public jni::JavaClass<JMediaType> {
      method MediaType (line 28) | [[maybe_unused]]
      method fromCpp (line 41) | [[maybe_unused]]

FILE: nitrogen/generated/android/c++/JNitroCameraConfig.hpp
  type margelo::nitro::multipleimagepicker (line 29) | namespace margelo::nitro::multipleimagepicker {
    type JNitroCameraConfig (line 36) | struct JNitroCameraConfig final: public jni::JavaClass<JNitroCameraCon...
      method NitroCameraConfig (line 44) | [[maybe_unused]]
      method fromCpp (line 80) | [[maybe_unused]]

FILE: nitrogen/generated/android/c++/JNitroConfig.hpp
  type margelo::nitro::multipleimagepicker (line 43) | namespace margelo::nitro::multipleimagepicker {
    type JNitroConfig (line 50) | struct JNitroConfig final: public jni::JavaClass<JNitroConfig> {
      method NitroConfig (line 58) | [[maybe_unused]]
      method fromCpp (line 157) | [[maybe_unused]]

FILE: nitrogen/generated/android/c++/JNitroCropConfig.hpp
  type margelo::nitro::multipleimagepicker (line 23) | namespace margelo::nitro::multipleimagepicker {
    type JNitroCropConfig (line 30) | struct JNitroCropConfig final: public jni::JavaClass<JNitroCropConfig> {
      method NitroCropConfig (line 38) | [[maybe_unused]]
      method fromCpp (line 77) | [[maybe_unused]]

FILE: nitrogen/generated/android/c++/JNitroPreviewConfig.hpp
  type margelo::nitro::multipleimagepicker (line 17) | namespace margelo::nitro::multipleimagepicker {
    type JNitroPreviewConfig (line 24) | struct JNitroPreviewConfig final: public jni::JavaClass<JNitroPreviewC...
      method NitroPreviewConfig (line 32) | [[maybe_unused]]
      method fromCpp (line 50) | [[maybe_unused]]

FILE: nitrogen/generated/android/c++/JPickerCameraConfig.hpp
  type margelo::nitro::multipleimagepicker (line 17) | namespace margelo::nitro::multipleimagepicker {
    type JPickerCameraConfig (line 24) | struct JPickerCameraConfig final: public jni::JavaClass<JPickerCameraC...
      method PickerCameraConfig (line 32) | [[maybe_unused]]
      method fromCpp (line 50) | [[maybe_unused]]

FILE: nitrogen/generated/android/c++/JPickerCropConfig.hpp
  type margelo::nitro::multipleimagepicker (line 19) | namespace margelo::nitro::multipleimagepicker {
    type JPickerCropConfig (line 26) | struct JPickerCropConfig final: public jni::JavaClass<JPickerCropConfi...
      method PickerCropConfig (line 34) | [[maybe_unused]]
      method fromCpp (line 67) | [[maybe_unused]]

FILE: nitrogen/generated/android/c++/JPickerResult.hpp
  type margelo::nitro::multipleimagepicker (line 18) | namespace margelo::nitro::multipleimagepicker {
    type JPickerResult (line 25) | struct JPickerResult final: public jni::JavaClass<JPickerResult> {
      method PickerResult (line 33) | [[maybe_unused]]
      method fromCpp (line 90) | [[maybe_unused]]

FILE: nitrogen/generated/android/c++/JPresentation.hpp
  type margelo::nitro::multipleimagepicker (line 13) | namespace margelo::nitro::multipleimagepicker {
    type JPresentation (line 20) | struct JPresentation final: public jni::JavaClass<JPresentation> {
      method Presentation (line 28) | [[maybe_unused]]
      method fromCpp (line 41) | [[maybe_unused]]

FILE: nitrogen/generated/android/c++/JResultType.hpp
  type margelo::nitro::multipleimagepicker (line 13) | namespace margelo::nitro::multipleimagepicker {
    type JResultType (line 20) | struct JResultType final: public jni::JavaClass<JResultType> {
      method ResultType (line 28) | [[maybe_unused]]
      method fromCpp (line 41) | [[maybe_unused]]

FILE: nitrogen/generated/android/c++/JSelectBoxStyle.hpp
  type margelo::nitro::multipleimagepicker (line 13) | namespace margelo::nitro::multipleimagepicker {
    type JSelectBoxStyle (line 20) | struct JSelectBoxStyle final: public jni::JavaClass<JSelectBoxStyle> {
      method SelectBoxStyle (line 28) | [[maybe_unused]]
      method fromCpp (line 41) | [[maybe_unused]]

FILE: nitrogen/generated/android/c++/JSelectMode.hpp
  type margelo::nitro::multipleimagepicker (line 13) | namespace margelo::nitro::multipleimagepicker {
    type JSelectMode (line 20) | struct JSelectMode final: public jni::JavaClass<JSelectMode> {
      method SelectMode (line 28) | [[maybe_unused]]
      method fromCpp (line 41) | [[maybe_unused]]

FILE: nitrogen/generated/android/c++/JText.hpp
  type margelo::nitro::multipleimagepicker (line 16) | namespace margelo::nitro::multipleimagepicker {
    type JText (line 23) | struct JText final: public jni::JavaClass<JText> {
      method Text (line 31) | [[maybe_unused]]
      method fromCpp (line 55) | [[maybe_unused]]

FILE: nitrogen/generated/android/c++/JTheme.hpp
  type margelo::nitro::multipleimagepicker (line 13) | namespace margelo::nitro::multipleimagepicker {
    type JTheme (line 20) | struct JTheme final: public jni::JavaClass<JTheme> {
      method Theme (line 28) | [[maybe_unused]]
      method fromCpp (line 41) | [[maybe_unused]]

FILE: nitrogen/generated/ios/MultipleImagePicker+autolinking.rb
  function add_nitrogen_files (line 22) | def add_nitrogen_files(spec)

FILE: nitrogen/generated/ios/MultipleImagePicker-Swift-Cxx-Bridge.cpp
  type margelo::nitro::multipleimagepicker::bridge::swift (line 14) | namespace margelo::nitro::multipleimagepicker::bridge::swift {
    function Func_void_std__vector_PickerResult_ (line 17) | Func_void_std__vector_PickerResult_ create_Func_void_std__vector_Picke...
    function Func_void_double (line 25) | Func_void_double create_Func_void_double(void* _Nonnull swiftClosureWr...
    function Func_void_CropResult (line 33) | Func_void_CropResult create_Func_void_CropResult(void* _Nonnull swiftC...
    function Func_void_CameraResult (line 41) | Func_void_CameraResult create_Func_void_CameraResult(void* _Nonnull sw...
    function create_std__shared_ptr_margelo__nitro__multipleimagepicker__HybridMultipleImagePickerSpec_ (line 49) | std::shared_ptr<margelo::nitro::multipleimagepicker::HybridMultipleIma...

FILE: nitrogen/generated/ios/MultipleImagePicker-Swift-Cxx-Bridge.hpp
  type margelo::nitro::multipleimagepicker (line 12) | namespace margelo::nitro::multipleimagepicker { enum class CameraDevice; }
    type CameraDevice (line 12) | enum class CameraDevice
    type CameraResult (line 14) | struct CameraResult
    type CropRatio (line 16) | struct CropRatio
    type CropResult (line 18) | struct CropResult
    class HybridMultipleImagePickerSpec (line 20) | class HybridMultipleImagePickerSpec
    type MediaPreview (line 22) | struct MediaPreview
    type PickerCameraConfig (line 24) | struct PickerCameraConfig
    type PickerCropConfig (line 26) | struct PickerCropConfig
    type PickerResult (line 28) | struct PickerResult
    type ResultType (line 30) | enum class ResultType
    type Text (line 32) | struct Text
  type margelo::nitro::multipleimagepicker (line 14) | namespace margelo::nitro::multipleimagepicker { struct CameraResult; }
    type CameraDevice (line 12) | enum class CameraDevice
    type CameraResult (line 14) | struct CameraResult
    type CropRatio (line 16) | struct CropRatio
    type CropResult (line 18) | struct CropResult
    class HybridMultipleImagePickerSpec (line 20) | class HybridMultipleImagePickerSpec
    type MediaPreview (line 22) | struct MediaPreview
    type PickerCameraConfig (line 24) | struct PickerCameraConfig
    type PickerCropConfig (line 26) | struct PickerCropConfig
    type PickerResult (line 28) | struct PickerResult
    type ResultType (line 30) | enum class ResultType
    type Text (line 32) | struct Text
  type margelo::nitro::multipleimagepicker (line 16) | namespace margelo::nitro::multipleimagepicker { struct CropRatio; }
    type CameraDevice (line 12) | enum class CameraDevice
    type CameraResult (line 14) | struct CameraResult
    type CropRatio (line 16) | struct CropRatio
    type CropResult (line 18) | struct CropResult
    class HybridMultipleImagePickerSpec (line 20) | class HybridMultipleImagePickerSpec
    type MediaPreview (line 22) | struct MediaPreview
    type PickerCameraConfig (line 24) | struct PickerCameraConfig
    type PickerCropConfig (line 26) | struct PickerCropConfig
    type PickerResult (line 28) | struct PickerResult
    type ResultType (line 30) | enum class ResultType
    type Text (line 32) | struct Text
  type margelo::nitro::multipleimagepicker (line 18) | namespace margelo::nitro::multipleimagepicker { struct CropResult; }
    type CameraDevice (line 12) | enum class CameraDevice
    type CameraResult (line 14) | struct CameraResult
    type CropRatio (line 16) | struct CropRatio
    type CropResult (line 18) | struct CropResult
    class HybridMultipleImagePickerSpec (line 20) | class HybridMultipleImagePickerSpec
    type MediaPreview (line 22) | struct MediaPreview
    type PickerCameraConfig (line 24) | struct PickerCameraConfig
    type PickerCropConfig (line 26) | struct PickerCropConfig
    type PickerResult (line 28) | struct PickerResult
    type ResultType (line 30) | enum class ResultType
    type Text (line 32) | struct Text
  type margelo::nitro::multipleimagepicker (line 20) | namespace margelo::nitro::multipleimagepicker { class HybridMultipleImag...
    type CameraDevice (line 12) | enum class CameraDevice
    type CameraResult (line 14) | struct CameraResult
    type CropRatio (line 16) | struct CropRatio
    type CropResult (line 18) | struct CropResult
    class HybridMultipleImagePickerSpec (line 20) | class HybridMultipleImagePickerSpec
    type MediaPreview (line 22) | struct MediaPreview
    type PickerCameraConfig (line 24) | struct PickerCameraConfig
    type PickerCropConfig (line 26) | struct PickerCropConfig
    type PickerResult (line 28) | struct PickerResult
    type ResultType (line 30) | enum class ResultType
    type Text (line 32) | struct Text
  type margelo::nitro::multipleimagepicker (line 22) | namespace margelo::nitro::multipleimagepicker { struct MediaPreview; }
    type CameraDevice (line 12) | enum class CameraDevice
    type CameraResult (line 14) | struct CameraResult
    type CropRatio (line 16) | struct CropRatio
    type CropResult (line 18) | struct CropResult
    class HybridMultipleImagePickerSpec (line 20) | class HybridMultipleImagePickerSpec
    type MediaPreview (line 22) | struct MediaPreview
    type PickerCameraConfig (line 24) | struct PickerCameraConfig
    type PickerCropConfig (line 26) | struct PickerCropConfig
    type PickerResult (line 28) | struct PickerResult
    type ResultType (line 30) | enum class ResultType
    type Text (line 32) | struct Text
  type margelo::nitro::multipleimagepicker (line 24) | namespace margelo::nitro::multipleimagepicker { struct PickerCameraConfi...
    type CameraDevice (line 12) | enum class CameraDevice
    type CameraResult (line 14) | struct CameraResult
    type CropRatio (line 16) | struct CropRatio
    type CropResult (line 18) | struct CropResult
    class HybridMultipleImagePickerSpec (line 20) | class HybridMultipleImagePickerSpec
    type MediaPreview (line 22) | struct MediaPreview
    type PickerCameraConfig (line 24) | struct PickerCameraConfig
    type PickerCropConfig (line 26) | struct PickerCropConfig
    type PickerResult (line 28) | struct PickerResult
    type ResultType (line 30) | enum class ResultType
    type Text (line 32) | struct Text
  type margelo::nitro::multipleimagepicker (line 26) | namespace margelo::nitro::multipleimagepicker { struct PickerCropConfig; }
    type CameraDevice (line 12) | enum class CameraDevice
    type CameraResult (line 14) | struct CameraResult
    type CropRatio (line 16) | struct CropRatio
    type CropResult (line 18) | struct CropResult
    class HybridMultipleImagePickerSpec (line 20) | class HybridMultipleImagePickerSpec
    type MediaPreview (line 22) | struct MediaPreview
    type PickerCameraConfig (line 24) | struct PickerCameraConfig
    type PickerCropConfig (line 26) | struct PickerCropConfig
    type PickerResult (line 28) | struct PickerResult
    type ResultType (line 30) | enum class ResultType
    type Text (line 32) | struct Text
  type margelo::nitro::multipleimagepicker (line 28) | namespace margelo::nitro::multipleimagepicker { struct PickerResult; }
    type CameraDevice (line 12) | enum class CameraDevice
    type CameraResult (line 14) | struct CameraResult
    type CropRatio (line 16) | struct CropRatio
    type CropResult (line 18) | struct CropResult
    class HybridMultipleImagePickerSpec (line 20) | class HybridMultipleImagePickerSpec
    type MediaPreview (line 22) | struct MediaPreview
    type PickerCameraConfig (line 24) | struct PickerCameraConfig
    type PickerCropConfig (line 26) | struct PickerCropConfig
    type PickerResult (line 28) | struct PickerResult
    type ResultType (line 30) | enum class ResultType
    type Text (line 32) | struct Text
  type margelo::nitro::multipleimagepicker (line 30) | namespace margelo::nitro::multipleimagepicker { enum class ResultType; }
    type CameraDevice (line 12) | enum class CameraDevice
    type CameraResult (line 14) | struct CameraResult
    type CropRatio (line 16) | struct CropRatio
    type CropResult (line 18) | struct CropResult
    class HybridMultipleImagePickerSpec (line 20) | class HybridMultipleImagePickerSpec
    type MediaPreview (line 22) | struct MediaPreview
    type PickerCameraConfig (line 24) | struct PickerCameraConfig
    type PickerCropConfig (line 26) | struct PickerCropConfig
    type PickerResult (line 28) | struct PickerResult
    type ResultType (line 30) | enum class ResultType
    type Text (line 32) | struct Text
  type margelo::nitro::multipleimagepicker (line 32) | namespace margelo::nitro::multipleimagepicker { struct Text; }
    type CameraDevice (line 12) | enum class CameraDevice
    type CameraResult (line 14) | struct CameraResult
    type CropRatio (line 16) | struct CropRatio
    type CropResult (line 18) | struct CropResult
    class HybridMultipleImagePickerSpec (line 20) | class HybridMultipleImagePickerSpec
    type MediaPreview (line 22) | struct MediaPreview
    type PickerCameraConfig (line 24) | struct PickerCameraConfig
    type PickerCropConfig (line 26) | struct PickerCropConfig
    type PickerResult (line 28) | struct PickerResult
    type ResultType (line 30) | enum class ResultType
    type Text (line 32) | struct Text
  type MultipleImagePicker (line 36) | namespace MultipleImagePicker { class HybridMultipleImagePickerSpec_cxx; }
    class HybridMultipleImagePickerSpec_cxx (line 36) | class HybridMultipleImagePickerSpec_cxx
  type margelo::nitro::multipleimagepicker::bridge::swift (line 62) | namespace margelo::nitro::multipleimagepicker::bridge::swift {
    function create_std__optional_double_ (line 69) | inline std::optional<double> create_std__optional_double_(const double...
    function create_std__optional_std__string_ (line 78) | inline std::optional<std::string> create_std__optional_std__string_(co...
    function create_std__optional_bool_ (line 87) | inline std::optional<bool> create_std__optional_bool_(const bool& valu...
    function create_std__vector_PickerResult_ (line 96) | inline std::vector<PickerResult> create_std__vector_PickerResult_(size...
    function create_std__vector_CropRatio_ (line 107) | inline std::vector<CropRatio> create_std__vector_CropRatio_(size_t siz...
    function create_std__optional_CropRatio_ (line 118) | inline std::optional<CropRatio> create_std__optional_CropRatio_(const ...
    function create_std__optional_PickerCropConfig_ (line 127) | inline std::optional<PickerCropConfig> create_std__optional_PickerCrop...
    function create_std__optional_Text_ (line 136) | inline std::optional<Text> create_std__optional_Text_(const Text& valu...
    function create_std__optional_CameraDevice_ (line 145) | inline std::optional<CameraDevice> create_std__optional_CameraDevice_(...
    function create_std__optional_PickerCameraConfig_ (line 154) | inline std::optional<PickerCameraConfig> create_std__optional_PickerCa...
    class Func_void_std__vector_PickerResult__Wrapper (line 166) | class Func_void_std__vector_PickerResult__Wrapper final {
      method Func_void_std__vector_PickerResult__Wrapper (line 168) | explicit Func_void_std__vector_PickerResult__Wrapper(std::function<v...
      method call (line 169) | inline void call(std::vector<PickerResult> result) const {
    function Func_void_std__vector_PickerResult__Wrapper (line 176) | inline Func_void_std__vector_PickerResult__Wrapper wrap_Func_void_std_...
      method Func_void_std__vector_PickerResult__Wrapper (line 168) | explicit Func_void_std__vector_PickerResult__Wrapper(std::function<v...
      method call (line 169) | inline void call(std::vector<PickerResult> result) const {
    class Func_void_double_Wrapper (line 188) | class Func_void_double_Wrapper final {
      method Func_void_double_Wrapper (line 190) | explicit Func_void_double_Wrapper(std::function<void(double /* rejec...
      method call (line 191) | inline void call(double reject) const {
    function Func_void_double_Wrapper (line 198) | inline Func_void_double_Wrapper wrap_Func_void_double(Func_void_double...
      method Func_void_double_Wrapper (line 190) | explicit Func_void_double_Wrapper(std::function<void(double /* rejec...
      method call (line 191) | inline void call(double reject) const {
    class Func_void_CropResult_Wrapper (line 210) | class Func_void_CropResult_Wrapper final {
      method Func_void_CropResult_Wrapper (line 212) | explicit Func_void_CropResult_Wrapper(std::function<void(const CropR...
      method call (line 213) | inline void call(CropResult result) const {
    function Func_void_CropResult_Wrapper (line 220) | inline Func_void_CropResult_Wrapper wrap_Func_void_CropResult(Func_voi...
      method Func_void_CropResult_Wrapper (line 212) | explicit Func_void_CropResult_Wrapper(std::function<void(const CropR...
      method call (line 213) | inline void call(CropResult result) const {
    function create_std__vector_MediaPreview_ (line 229) | inline std::vector<MediaPreview> create_std__vector_MediaPreview_(size...
    class Func_void_CameraResult_Wrapper (line 243) | class Func_void_CameraResult_Wrapper final {
      method Func_void_CameraResult_Wrapper (line 245) | explicit Func_void_CameraResult_Wrapper(std::function<void(const Cam...
      method call (line 246) | inline void call(CameraResult result) const {
    function Func_void_CameraResult_Wrapper (line 253) | inline Func_void_CameraResult_Wrapper wrap_Func_void_CameraResult(Func...
      method Func_void_CameraResult_Wrapper (line 245) | explicit Func_void_CameraResult_Wrapper(std::function<void(const Cam...
      method call (line 246) | inline void call(CameraResult result) const {
    function std__weak_ptr_margelo__nitro__multipleimagepicker__HybridMultipleImagePickerSpec_ (line 267) | inline std__weak_ptr_margelo__nitro__multipleimagepicker__HybridMultip...
    function Result_void_ (line 271) | inline Result_void_ create_Result_void_() {
    function Result_void_ (line 274) | inline Result_void_ create_Result_void_(const std::exception_ptr& erro...

FILE: nitrogen/generated/ios/MultipleImagePicker-Swift-Cxx-Umbrella.hpp
  type margelo::nitro::multipleimagepicker (line 12) | namespace margelo::nitro::multipleimagepicker { enum class CameraDevice; }
    type CameraDevice (line 12) | enum class CameraDevice
    type CameraResult (line 14) | struct CameraResult
    type CropRatio (line 16) | struct CropRatio
    type CropResult (line 18) | struct CropResult
    class HybridMultipleImagePickerSpec (line 20) | class HybridMultipleImagePickerSpec
    type Language (line 22) | enum class Language
    type MediaPreview (line 24) | struct MediaPreview
    type MediaType (line 26) | enum class MediaType
    type NitroCameraConfig (line 28) | struct NitroCameraConfig
    type NitroConfig (line 30) | struct NitroConfig
    type NitroCropConfig (line 32) | struct NitroCropConfig
    type NitroPreviewConfig (line 34) | struct NitroPreviewConfig
    type PickerCameraConfig (line 36) | struct PickerCameraConfig
    type PickerCropConfig (line 38) | struct PickerCropConfig
    type PickerResult (line 40) | struct PickerResult
    type Presentation (line 42) | enum class Presentation
    type ResultType (line 44) | enum class ResultType
    type SelectBoxStyle (line 46) | enum class SelectBoxStyle
    type SelectMode (line 48) | enum class SelectMode
    type Text (line 50) | struct Text
    type Theme (line 52) | enum class Theme
  type margelo::nitro::multipleimagepicker (line 14) | namespace margelo::nitro::multipleimagepicker { struct CameraResult; }
    type CameraDevice (line 12) | enum class CameraDevice
    type CameraResult (line 14) | struct CameraResult
    type CropRatio (line 16) | struct CropRatio
    type CropResult (line 18) | struct CropResult
    class HybridMultipleImagePickerSpec (line 20) | class HybridMultipleImagePickerSpec
    type Language (line 22) | enum class Language
    type MediaPreview (line 24) | struct MediaPreview
    type MediaType (line 26) | enum class MediaType
    type NitroCameraConfig (line 28) | struct NitroCameraConfig
    type NitroConfig (line 30) | struct NitroConfig
    type NitroCropConfig (line 32) | struct NitroCropConfig
    type NitroPreviewConfig (line 34) | struct NitroPreviewConfig
    type PickerCameraConfig (line 36) | struct PickerCameraConfig
    type PickerCropConfig (line 38) | struct PickerCropConfig
    type PickerResult (line 40) | struct PickerResult
    type Presentation (line 42) | enum class Presentation
    type ResultType (line 44) | enum class ResultType
    type SelectBoxStyle (line 46) | enum class SelectBoxStyle
    type SelectMode (line 48) | enum class SelectMode
    type Text (line 50) | struct Text
    type Theme (line 52) | enum class Theme
  type margelo::nitro::multipleimagepicker (line 16) | namespace margelo::nitro::multipleimagepicker { struct CropRatio; }
    type CameraDevice (line 12) | enum class CameraDevice
    type CameraResult (line 14) | struct CameraResult
    type CropRatio (line 16) | struct CropRatio
    type CropResult (line 18) | struct CropResult
    class HybridMultipleImagePickerSpec (line 20) | class HybridMultipleImagePickerSpec
    type Language (line 22) | enum class Language
    type MediaPreview (line 24) | struct MediaPreview
    type MediaType (line 26) | enum class MediaType
    type NitroCameraConfig (line 28) | struct NitroCameraConfig
    type NitroConfig (line 30) | struct NitroConfig
    type NitroCropConfig (line 32) | struct NitroCropConfig
    type NitroPreviewConfig (line 34) | struct NitroPreviewConfig
    type PickerCameraConfig (line 36) | struct PickerCameraConfig
    type PickerCropConfig (line 38) | struct PickerCropConfig
    type PickerResult (line 40) | struct PickerResult
    type Presentation (line 42) | enum class Presentation
    type ResultType (line 44) | enum class ResultType
    type SelectBoxStyle (line 46) | enum class SelectBoxStyle
    type SelectMode (line 48) | enum class SelectMode
    type Text (line 50) | struct Text
    type Theme (line 52) | enum class Theme
  type margelo::nitro::multipleimagepicker (line 18) | namespace margelo::nitro::multipleimagepicker { struct CropResult; }
    type CameraDevice (line 12) | enum class CameraDevice
    type CameraResult (line 14) | struct CameraResult
    type CropRatio (line 16) | struct CropRatio
    type CropResult (line 18) | struct CropResult
    class HybridMultipleImagePickerSpec (line 20) | class HybridMultipleImagePickerSpec
    type Language (line 22) | enum class Language
    type MediaPreview (line 24) | struct MediaPreview
    type MediaType (line 26) | enum class MediaType
    type NitroCameraConfig (line 28) | struct NitroCameraConfig
    type NitroConfig (line 30) | struct NitroConfig
    type NitroCropConfig (line 32) | struct NitroCropConfig
    type NitroPreviewConfig (line 34) | struct NitroPreviewConfig
    type PickerCameraConfig (line 36) | struct PickerCameraConfig
    type PickerCropConfig (line 38) | struct PickerCropConfig
    type PickerResult (line 40) | struct PickerResult
    type Presentation (line 42) | enum class Presentation
    type ResultType (line 44) | enum class ResultType
    type SelectBoxStyle (line 46) | enum class SelectBoxStyle
    type SelectMode (line 48) | enum class SelectMode
    type Text (line 50) | struct Text
    type Theme (line 52) | enum class Theme
  type margelo::nitro::multipleimagepicker (line 20) | namespace margelo::nitro::multipleimagepicker { class HybridMultipleImag...
    type CameraDevice (line 12) | enum class CameraDevice
    type CameraResult (line 14) | struct CameraResult
    type CropRatio (line 16) | struct CropRatio
    type CropResult (line 18) | struct CropResult
    class HybridMultipleImagePickerSpec (line 20) | class HybridMultipleImagePickerSpec
    type Language (line 22) | enum class Language
    type MediaPreview (line 24) | struct MediaPreview
    type MediaType (line 26) | enum class MediaType
    type NitroCameraConfig (line 28) | struct NitroCameraConfig
    type NitroConfig (line 30) | struct NitroConfig
    type NitroCropConfig (line 32) | struct NitroCropConfig
    type NitroPreviewConfig (line 34) | struct NitroPreviewConfig
    type PickerCameraConfig (line 36) | struct PickerCameraConfig
    type PickerCropConfig (line 38) | struct PickerCropConfig
    type PickerResult (line 40) | struct PickerResult
    type Presentation (line 42) | enum class Presentation
    type ResultType (line 44) | enum class ResultType
    type SelectBoxStyle (line 46) | enum class SelectBoxStyle
    type SelectMode (line 48) | enum class SelectMode
    type Text (line 50) | struct Text
    type Theme (line 52) | enum class Theme
  type margelo::nitro::multipleimagepicker (line 22) | namespace margelo::nitro::multipleimagepicker { enum class Language; }
    type CameraDevice (line 12) | enum class CameraDevice
    type CameraResult (line 14) | struct CameraResult
    type CropRatio (line 16) | struct CropRatio
    type CropResult (line 18) | struct CropResult
    class HybridMultipleImagePickerSpec (line 20) | class HybridMultipleImagePickerSpec
    type Language (line 22) | enum class Language
    type MediaPreview (line 24) | struct MediaPreview
    type MediaType (line 26) | enum class MediaType
    type NitroCameraConfig (line 28) | struct NitroCameraConfig
    type NitroConfig (line 30) | struct NitroConfig
    type NitroCropConfig (line 32) | struct NitroCropConfig
    type NitroPreviewConfig (line 34) | struct NitroPreviewConfig
    type PickerCameraConfig (line 36) | struct PickerCameraConfig
    type PickerCropConfig (line 38) | struct PickerCropConfig
    type PickerResult (line 40) | struct PickerResult
    type Presentation (line 42) | enum class Presentation
    type ResultType (line 44) | enum class ResultType
    type SelectBoxStyle (line 46) | enum class SelectBoxStyle
    type SelectMode (line 48) | enum class SelectMode
    type Text (line 50) | struct Text
    type Theme (line 52) | enum class Theme
  type margelo::nitro::multipleimagepicker (line 24) | namespace margelo::nitro::multipleimagepicker { struct MediaPreview; }
    type CameraDevice (line 12) | enum class CameraDevice
    type CameraResult (line 14) | struct CameraResult
    type CropRatio (line 16) | struct CropRatio
    type CropResult (line 18) | struct CropResult
    class HybridMultipleImagePickerSpec (line 20) | class HybridMultipleImagePickerSpec
    type Language (line 22) | enum class Language
    type MediaPreview (line 24) | struct MediaPreview
    type MediaType (line 26) | enum class MediaType
    type NitroCameraConfig (line 28) | struct NitroCameraConfig
    type NitroConfig (line 30) | struct NitroConfig
    type NitroCropConfig (line 32) | struct NitroCropConfig
    type NitroPreviewConfig (line 34) | struct NitroPreviewConfig
    type PickerCameraConfig (line 36) | struct PickerCameraConfig
    type PickerCropConfig (line 38) | struct PickerCropConfig
    type PickerResult (line 40) | struct PickerResult
    type Presentation (line 42) | enum class Presentation
    type ResultType (line 44) | enum class ResultType
    type SelectBoxStyle (line 46) | enum class SelectBoxStyle
    type SelectMode (line 48) | enum class SelectMode
    type Text (line 50) | struct Text
    type Theme (line 52) | enum class Theme
  type margelo::nitro::multipleimagepicker (line 26) | namespace margelo::nitro::multipleimagepicker { enum class MediaType; }
    type CameraDevice (line 12) | enum class CameraDevice
    type CameraResult (line 14) | struct CameraResult
    type CropRatio (line 16) | struct CropRatio
    type CropResult (line 18) | struct CropResult
    class HybridMultipleImagePickerSpec (line 20) | class HybridMultipleImagePickerSpec
    type Language (line 22) | enum class Language
    type MediaPreview (line 24) | struct MediaPreview
    type MediaType (line 26) | enum class MediaType
    type NitroCameraConfig (line 28) | struct NitroCameraConfig
    type NitroConfig (line 30) | struct NitroConfig
    type NitroCropConfig (line 32) | struct NitroCropConfig
    type NitroPreviewConfig (line 34) | struct NitroPreviewConfig
    type PickerCameraConfig (line 36) | struct PickerCameraConfig
    type PickerCropConfig (line 38) | struct PickerCropConfig
    type PickerResult (line 40) | struct PickerResult
    type Presentation (line 42) | enum class Presentation
    type ResultType (line 44) | enum class ResultType
    type SelectBoxStyle (line 46) | enum class SelectBoxStyle
    type SelectMode (line 48) | enum class SelectMode
    type Text (line 50) | struct Text
    type Theme (line 52) | enum class Theme
  type margelo::nitro::multipleimagepicker (line 28) | namespace margelo::nitro::multipleimagepicker { struct NitroCameraConfig; }
    type CameraDevice (line 12) | enum class CameraDevice
    type CameraResult (line 14) | struct CameraResult
    type CropRatio (line 16) | struct CropRatio
    type CropResult (line 18) | struct CropResult
    class HybridMultipleImagePickerSpec (line 20) | class HybridMultipleImagePickerSpec
    type Language (line 22) | enum class Language
    type MediaPreview (line 24) | struct MediaPreview
    type MediaType (line 26) | enum class MediaType
    type NitroCameraConfig (line 28) | struct NitroCameraConfig
    type NitroConfig (line 30) | struct NitroConfig
    type NitroCropConfig (line 32) | struct NitroCropConfig
    type NitroPreviewConfig (line 34) | struct NitroPreviewConfig
    type PickerCameraConfig (line 36) | struct PickerCameraConfig
    type PickerCropConfig (line 38) | struct PickerCropConfig
    type PickerResult (line 40) | struct PickerResult
    type Presentation (line 42) | enum class Presentation
    type ResultType (line 44) | enum class ResultType
    type SelectBoxStyle (line 46) | enum class SelectBoxStyle
    type SelectMode (line 48) | enum class SelectMode
    type Text (line 50) | struct Text
    type Theme (line 52) | enum class Theme
  type margelo::nitro::multipleimagepicker (line 30) | namespace margelo::nitro::multipleimagepicker { struct NitroConfig; }
    type CameraDevice (line 12) | enum class CameraDevice
    type CameraResult (line 14) | struct CameraResult
    type CropRatio (line 16) | struct CropRatio
    type CropResult (line 18) | struct CropResult
    class HybridMultipleImagePickerSpec (line 20) | class HybridMultipleImagePickerSpec
    type Language (line 22) | enum class Language
    type MediaPreview (line 24) | struct MediaPreview
    type MediaType (line 26) | enum class MediaType
    type NitroCameraConfig (line 28) | struct NitroCameraConfig
    type NitroConfig (line 30) | struct NitroConfig
    type NitroCropConfig (line 32) | struct NitroCropConfig
    type NitroPreviewConfig (line 34) | struct NitroPreviewConfig
    type PickerCameraConfig (line 36) | struct PickerCameraConfig
    type PickerCropConfig (line 38) | struct PickerCropConfig
    type PickerResult (line 40) | struct PickerResult
    type Presentation (line 42) | enum class Presentation
    type ResultType (line 44) | enum class ResultType
    type SelectBoxStyle (line 46) | enum class SelectBoxStyle
    type SelectMode (line 48) | enum class SelectMode
    type Text (line 50) | struct Text
    type Theme (line 52) | enum class Theme
  type margelo::nitro::multipleimagepicker (line 32) | namespace margelo::nitro::multipleimagepicker { struct NitroCropConfig; }
    type CameraDevice (line 12) | enum class CameraDevice
    type CameraResult (line 14) | struct CameraResult
    type CropRatio (line 16) | struct CropRatio
    type CropResult (line 18) | struct CropResult
    class HybridMultipleImagePickerSpec (line 20) | class HybridMultipleImagePickerSpec
    type Language (line 22) | enum class Language
    type MediaPreview (line 24) | struct MediaPreview
    type MediaType (line 26) | enum class MediaType
    type NitroCameraConfig (line 28) | struct NitroCameraConfig
    type NitroConfig (line 30) | struct NitroConfig
    type NitroCropConfig (line 32) | struct NitroCropConfig
    type NitroPreviewConfig (line 34) | struct NitroPreviewConfig
    type PickerCameraConfig (line 36) | struct PickerCameraConfig
    type PickerCropConfig (line 38) | struct PickerCropConfig
    type PickerResult (line 40) | struct PickerResult
    type Presentation (line 42) | enum class Presentation
    type ResultType (line 44) | enum class ResultType
    type SelectBoxStyle (line 46) | enum class SelectBoxStyle
    type SelectMode (line 48) | enum class SelectMode
    type Text (line 50) | struct Text
    type Theme (line 52) | enum class Theme
  type margelo::nitro::multipleimagepicker (line 34) | namespace margelo::nitro::multipleimagepicker { struct NitroPreviewConfi...
    type CameraDevice (line 12) | enum class CameraDevice
    type CameraResult (line 14) | struct CameraResult
    type CropRatio (line 16) | struct CropRatio
    type CropResult (line 18) | struct CropResult
    class HybridMultipleImagePickerSpec (line 20) | class HybridMultipleImagePickerSpec
    type Language (line 22) | enum class Language
    type MediaPreview (line 24) | struct MediaPreview
    type MediaType (line 26) | enum class MediaType
    type NitroCameraConfig (line 28) | struct NitroCameraConfig
    type NitroConfig (line 30) | struct NitroConfig
    type NitroCropConfig (line 32) | struct NitroCropConfig
    type NitroPreviewConfig (line 34) | struct NitroPreviewConfig
    type PickerCameraConfig (line 36) | struct PickerCameraConfig
    type PickerCropConfig (line 38) | struct PickerCropConfig
    type PickerResult (line 40) | struct PickerResult
    type Presentation (line 42) | enum class Presentation
    type ResultType (line 44) | enum class ResultType
    type SelectBoxStyle (line 46) | enum class SelectBoxStyle
    type SelectMode (line 48) | enum class SelectMode
    type Text (line 50) | struct Text
    type Theme (line 52) | enum class Theme
  type margelo::nitro::multipleimagepicker (line 36) | namespace margelo::nitro::multipleimagepicker { struct PickerCameraConfi...
    type CameraDevice (line 12) | enum class CameraDevice
    type CameraResult (line 14) | struct CameraResult
    type CropRatio (line 16) | struct CropRatio
    type CropResult (line 18) | struct CropResult
    class HybridMultipleImagePickerSpec (line 20) | class HybridMultipleImagePickerSpec
    type Language (line 22) | enum class Language
    type MediaPreview (line 24) | struct MediaPreview
    type MediaType (line 26) | enum class MediaType
    type NitroCameraConfig (line 28) | struct NitroCameraConfig
    type NitroConfig (line 30) | struct NitroConfig
    type NitroCropConfig (line 32) | struct NitroCropConfig
    type NitroPreviewConfig (line 34) | struct NitroPreviewConfig
    type PickerCameraConfig (line 36) | struct PickerCameraConfig
    type PickerCropConfig (line 38) | struct PickerCropConfig
    type PickerResult (line 40) | struct PickerResult
    type Presentation (line 42) | enum class Presentation
    type ResultType (line 44) | enum class ResultType
    type SelectBoxStyle (line 46) | enum class SelectBoxStyle
    type SelectMode (line 48) | enum class SelectMode
    type Text (line 50) | struct Text
    type Theme (line 52) | enum class Theme
  type margelo::nitro::multipleimagepicker (line 38) | namespace margelo::nitro::multipleimagepicker { struct PickerCropConfig; }
    type CameraDevice (line 12) | enum class CameraDevice
    type CameraResult (line 14) | struct CameraResult
    type CropRatio (line 16) | struct CropRatio
    type CropResult (line 18) | struct CropResult
    class HybridMultipleImagePickerSpec (line 20) | class HybridMultipleImagePickerSpec
    type Language (line 22) | enum class Language
    type MediaPreview (line 24) | struct MediaPreview
    type MediaType (line 26) | enum class MediaType
    type NitroCameraConfig (line 28) | struct NitroCameraConfig
    type NitroConfig (line 30) | struct NitroConfig
    type NitroCropConfig (line 32) | struct NitroCropConfig
    type NitroPreviewConfig (line 34) | struct NitroPreviewConfig
    type PickerCameraConfig (line 36) | struct PickerCameraConfig
    type PickerCropConfig (line 38) | struct PickerCropConfig
    type PickerResult (line 40) | struct PickerResult
    type Presentation (line 42) | enum class Presentation
    type ResultType (line 44) | enum class ResultType
    type SelectBoxStyle (line 46) | enum class SelectBoxStyle
    type SelectMode (line 48) | enum class SelectMode
    type Text (line 50) | struct Text
    type Theme (line 52) | enum class Theme
  type margelo::nitro::multipleimagepicker (line 40) | namespace margelo::nitro::multipleimagepicker { struct PickerResult; }
    type CameraDevice (line 12) | enum class CameraDevice
    type CameraResult (line 14) | struct CameraResult
    type CropRatio (line 16) | struct CropRatio
    type CropResult (line 18) | struct CropResult
    class HybridMultipleImagePickerSpec (line 20) | class HybridMultipleImagePickerSpec
    type Language (line 22) | enum class Language
    type MediaPreview (line 24) | struct MediaPreview
    type MediaType (line 26) | enum class MediaType
    type NitroCameraConfig (line 28) | struct NitroCameraConfig
    type NitroConfig (line 30) | struct NitroConfig
    type NitroCropConfig (line 32) | struct NitroCropConfig
    type NitroPreviewConfig (line 34) | struct NitroPreviewConfig
    type PickerCameraConfig (line 36) | struct PickerCameraConfig
    type PickerCropConfig (line 38) | struct PickerCropConfig
    type PickerResult (line 40) | struct PickerResult
    type Presentation (line 42) | enum class Presentation
    type ResultType (line 44) | enum class ResultType
    type SelectBoxStyle (line 46) | enum class SelectBoxStyle
    type SelectMode (line 48) | enum class SelectMode
    type Text (line 50) | struct Text
    type Theme (line 52) | enum class Theme
  type margelo::nitro::multipleimagepicker (line 42) | namespace margelo::nitro::multipleimagepicker { enum class Presentation; }
    type CameraDevice (line 12) | enum class CameraDevice
    type CameraResult (line 14) | struct CameraResult
    type CropRatio (line 16) | struct CropRatio
    type CropResult (line 18) | struct CropResult
    class HybridMultipleImagePickerSpec (line 20) | class HybridMultipleImagePickerSpec
    type Language (line 22) | enum class Language
    type MediaPreview (line 24) | struct MediaPreview
    type MediaType (line 26) | enum class MediaType
    type NitroCameraConfig (line 28) | struct NitroCameraConfig
    type NitroConfig (line 30) | struct NitroConfig
    type NitroCropConfig (line 32) | struct NitroCropConfig
    type NitroPreviewConfig (line 34) | struct NitroPreviewConfig
    type PickerCameraConfig (line 36) | struct PickerCameraConfig
    type PickerCropConfig (line 38) | struct PickerCropConfig
    type PickerResult (line 40) | struct PickerResult
    type Presentation (line 42) | enum class Presentation
    type ResultType (line 44) | enum class ResultType
    type SelectBoxStyle (line 46) | enum class SelectBoxStyle
    type SelectMode (line 48) | enum class SelectMode
    type Text (line 50) | struct Text
    type Theme (line 52) | enum class Theme
  type margelo::nitro::multipleimagepicker (line 44) | namespace margelo::nitro::multipleimagepicker { enum class ResultType; }
    type CameraDevice (line 12) | enum class CameraDevice
    type CameraResult (line 14) | struct CameraResult
    type CropRatio (line 16) | struct CropRatio
    type CropResult (line 18) | struct CropResult
    class HybridMultipleImagePickerSpec (line 20) | class HybridMultipleImagePickerSpec
    type Language (line 22) | enum class Language
    type MediaPreview (line 24) | struct MediaPreview
    type MediaType (line 26) | enum class MediaType
    type NitroCameraConfig (line 28) | struct NitroCameraConfig
    type NitroConfig (line 30) | struct NitroConfig
    type NitroCropConfig (line 32) | struct NitroCropConfig
    type NitroPreviewConfig (line 34) | struct NitroPreviewConfig
    type PickerCameraConfig (line 36) | struct PickerCameraConfig
    type PickerCropConfig (line 38) | struct PickerCropConfig
    type PickerResult (line 40) | struct PickerResult
    type Presentation (line 42) | enum class Presentation
    type ResultType (line 44) | enum class ResultType
    type SelectBoxStyle (line 46) | enum class SelectBoxStyle
    type SelectMode (line 48) | enum class SelectMode
    type Text (line 50) | struct Text
    type Theme (line 52) | enum class Theme
  type margelo::nitro::multipleimagepicker (line 46) | namespace margelo::nitro::multipleimagepicker { enum class SelectBoxStyl...
    type CameraDevice (line 12) | enum class CameraDevice
    type CameraResult (line 14) | struct CameraResult
    type CropRatio (line 16) | struct CropRatio
    type CropResult (line 18) | struct CropResult
    class HybridMultipleImagePickerSpec (line 20) | class HybridMultipleImagePickerSpec
    type Language (line 22) | enum class Language
    type MediaPreview (line 24) | struct MediaPreview
    type MediaType (line 26) | enum class MediaType
    type NitroCameraConfig (line 28) | struct NitroCameraConfig
    type NitroConfig (line 30) | struct NitroConfig
    type NitroCropConfig (line 32) | struct NitroCropConfig
    type NitroPreviewConfig (line 34) | struct NitroPreviewConfig
    type PickerCameraConfig (line 36) | struct PickerCameraConfig
    type PickerCropConfig (line 38) | struct PickerCropConfig
    type PickerResult (line 40) | struct PickerResult
    type Presentation (line 42) | enum class Presentation
    type ResultType (line 44) | enum class ResultType
    type SelectBoxStyle (line 46) | enum class SelectBoxStyle
    type SelectMode (line 48) | enum class SelectMode
    type Text (line 50) | struct Text
    type Theme (line 52) | enum class Theme
  type margelo::nitro::multipleimagepicker (line 48) | namespace margelo::nitro::multipleimagepicker { enum class SelectMode; }
    type CameraDevice (line 12) | enum class CameraDevice
    type CameraResult (line 14) | struct CameraResult
    type CropRatio (line 16) | struct CropRatio
    type CropResult (line 18) | struct CropResult
    class HybridMultipleImagePickerSpec (line 20) | class HybridMultipleImagePickerSpec
    type Language (line 22) | enum class Language
    type MediaPreview (line 24) | struct MediaPreview
    type MediaType (line 26) | enum class MediaType
    type NitroCameraConfig (line 28) | struct NitroCameraConfig
    type NitroConfig (line 30) | struct NitroConfig
    type NitroCropConfig (line 32) | struct NitroCropConfig
    type NitroPreviewConfig (line 34) | struct NitroPreviewConfig
    type PickerCameraConfig (line 36) | struct PickerCameraConfig
    type PickerCropConfig (line 38) | struct PickerCropConfig
    type PickerResult (line 40) | struct PickerResult
    type Presentation (line 42) | enum class Presentation
    type ResultType (line 44) | enum class ResultType
    type SelectBoxStyle (line 46) | enum class SelectBoxStyle
    type SelectMode (line 48) | enum class SelectMode
    type Text (line 50) | struct Text
    type Theme (line 52) | enum class Theme
  type margelo::nitro::multipleimagepicker (line 50) | namespace margelo::nitro::multipleimagepicker { struct Text; }
    type CameraDevice (line 12) | enum class CameraDevice
    type CameraResult (line 14) | struct CameraResult
    type CropRatio (line 16) | struct CropRatio
    type CropResult (line 18) | struct CropResult
    class HybridMultipleImagePickerSpec (line 20) | class HybridMultipleImagePickerSpec
    type Language (line 22) | enum class Language
    type MediaPreview (line 24) | struct MediaPreview
    type MediaType (line 26) | enum class MediaType
    type NitroCameraConfig (line 28) | struct NitroCameraConfig
    type NitroConfig (line 30) | struct NitroConfig
    type NitroCropConfig (line 32) | struct NitroCropConfig
    type NitroPreviewConfig (line 34) | struct NitroPreviewConfig
    type PickerCameraConfig (line 36) | struct PickerCameraConfig
    type PickerCropConfig (line 38) | struct PickerCropConfig
    type PickerResult (line 40) | struct PickerResult
    type Presentation (line 42) | enum class Presentation
    type ResultType (line 44) | enum class ResultType
    type SelectBoxStyle (line 46) | enum class SelectBoxStyle
    type SelectMode (line 48) | enum class SelectMode
    type Text (line 50) | struct Text
    type Theme (line 52) | enum class Theme
  type margelo::nitro::multipleimagepicker (line 52) | namespace margelo::nitro::multipleimagepicker { enum class Theme; }
    type CameraDevice (line 12) | enum class CameraDevice
    type CameraResult (line 14) | struct CameraResult
    type CropRatio (line 16) | struct CropRatio
    type CropResult (line 18) | struct CropResult
    class HybridMultipleImagePickerSpec (line 20) | class HybridMultipleImagePickerSpec
    type Language (line 22) | enum class Language
    type MediaPreview (line 24) | struct MediaPreview
    type MediaType (line 26) | enum class MediaType
    type NitroCameraConfig (line 28) | struct NitroCameraConfig
    type NitroConfig (line 30) | struct NitroConfig
    type NitroCropConfig (line 32) | struct NitroCropConfig
    type NitroPreviewConfig (line 34) | struct NitroPreviewConfig
    type PickerCameraConfig (line 36) | struct PickerCameraConfig
    type PickerCropConfig (line 38) | struct PickerCropConfig
    type PickerResult (line 40) | struct PickerResult
    type Presentation (line 42) | enum class Presentation
    type ResultType (line 44) | enum class ResultType
    type SelectBoxStyle (line 46) | enum class SelectBoxStyle
    type SelectMode (line 48) | enum class SelectMode
    type Text (line 50) | struct Text
    type Theme (line 52) | enum class Theme
  type MultipleImagePicker (line 94) | namespace MultipleImagePicker { class HybridMultipleImagePickerSpec_cxx; }
    class HybridMultipleImagePickerSpec_cxx (line 94) | class HybridMultipleImagePickerSpec_cxx

FILE: nitrogen/generated/ios/c++/HybridMultipleImagePickerSpecSwift.cpp
  type margelo::nitro::multipleimagepicker (line 10) | namespace margelo::nitro::multipleimagepicker {

FILE: nitrogen/generated/ios/c++/HybridMultipleImagePickerSpecSwift.hpp
  type MultipleImagePicker (line 13) | namespace MultipleImagePicker { class HybridMultipleImagePickerSpec_cxx; }
    class HybridMultipleImagePickerSpec_cxx (line 13) | class HybridMultipleImagePickerSpec_cxx
  type margelo::nitro::multipleimagepicker (line 16) | namespace margelo::nitro::multipleimagepicker { struct NitroConfig; }
    type NitroConfig (line 16) | struct NitroConfig
    type MediaType (line 18) | enum class MediaType
    type PickerResult (line 20) | struct PickerResult
    type ResultType (line 22) | enum class ResultType
    type SelectBoxStyle (line 24) | enum class SelectBoxStyle
    type SelectMode (line 26) | enum class SelectMode
    type PickerCropConfig (line 28) | struct PickerCropConfig
    type CropRatio (line 30) | struct CropRatio
    type Text (line 32) | struct Text
    type Language (line 34) | enum class Language
    type Theme (line 36) | enum class Theme
    type Presentation (line 38) | enum class Presentation
    type PickerCameraConfig (line 40) | struct PickerCameraConfig
    type CameraDevice (line 42) | enum class CameraDevice
    type NitroCropConfig (line 44) | struct NitroCropConfig
    type CropResult (line 46) | struct CropResult
    type MediaPreview (line 48) | struct MediaPreview
    type NitroPreviewConfig (line 50) | struct NitroPreviewConfig
    type NitroCameraConfig (line 52) | struct NitroCameraConfig
    type CameraResult (line 54) | struct CameraResult
    class HybridMultipleImagePickerSpecSwift (line 95) | class HybridMultipleImagePickerSpecSwift: public virtual HybridMultipl...
      method HybridMultipleImagePickerSpecSwift (line 98) | explicit HybridMultipleImagePickerSpecSwift(const MultipleImagePicke...
      method getExternalMemorySize (line 110) | inline size_t getExternalMemorySize() noexcept override {
      method openPicker (line 120) | inline void openPicker(const NitroConfig& config, const std::functio...
      method openCrop (line 126) | inline void openCrop(const std::string& image, const NitroCropConfig...
      method openPreview (line 132) | inline void openPreview(const std::vector<MediaPreview>& media, doub...
      method openCamera (line 138) | inline void openCamera(const NitroCameraConfig& config, const std::f...
  type margelo::nitro::multipleimagepicker (line 18) | namespace margelo::nitro::multipleimagepicker { enum class MediaType; }
    type NitroConfig (line 16) | struct NitroConfig
    type MediaType (line 18) | enum class MediaType
    type PickerResult (line 20) | struct PickerResult
    type ResultType (line 22) | enum class ResultType
    type SelectBoxStyle (line 24) | enum class SelectBoxStyle
    type SelectMode (line 26) | enum class SelectMode
    type PickerCropConfig (line 28) | struct PickerCropConfig
    type CropRatio (line 30) | struct CropRatio
    type Text (line 32) | struct Text
    type Language (line 34) | enum class Language
    type Theme (line 36) | enum class Theme
    type Presentation (line 38) | enum class Presentation
    type PickerCameraConfig (line 40) | struct PickerCameraConfig
    type CameraDevice (line 42) | enum class CameraDevice
    type NitroCropConfig (line 44) | struct NitroCropConfig
    type CropResult (line 46) | struct CropResult
    type MediaPreview (line 48) | struct MediaPreview
    type NitroPreviewConfig (line 50) | struct NitroPreviewConfig
    type NitroCameraConfig (line 52) | struct NitroCameraConfig
    type CameraResult (line 54) | struct CameraResult
    class HybridMultipleImagePickerSpecSwift (line 95) | class HybridMultipleImagePickerSpecSwift: public virtual HybridMultipl...
      method HybridMultipleImagePickerSpecSwift (line 98) | explicit HybridMultipleImagePickerSpecSwift(const MultipleImagePicke...
      method getExternalMemorySize (line 110) | inline size_t getExternalMemorySize() noexcept override {
      method openPicker (line 120) | inline void openPicker(const NitroConfig& config, const std::functio...
      method openCrop (line 126) | inline void openCrop(const std::string& image, const NitroCropConfig...
      method openPreview (line 132) | inline void openPreview(const std::vector<MediaPreview>& media, doub...
      method openCamera (line 138) | inline void openCamera(const NitroCameraConfig& config, const std::f...
  type margelo::nitro::multipleimagepicker (line 20) | namespace margelo::nitro::multipleimagepicker { struct PickerResult; }
    type NitroConfig (line 16) | struct NitroConfig
    type MediaType (line 18) | enum class MediaType
    type PickerResult (line 20) | struct PickerResult
    type ResultType (line 22) | enum class ResultType
    type SelectBoxStyle (line 24) | enum class SelectBoxStyle
    type SelectMode (line 26) | enum class SelectMode
    type PickerCropConfig (line 28) | struct PickerCropConfig
    type CropRatio (line 30) | struct CropRatio
    type Text (line 32) | struct Text
    type Language (line 34) | enum class Language
    type Theme (line 36) | enum class Theme
    type Presentation (line 38) | enum class Presentation
    type PickerCameraConfig (line 40) | struct PickerCameraConfig
    type CameraDevice (line 42) | enum class CameraDevice
    type NitroCropConfig (line 44) | struct NitroCropConfig
    type CropResult (line 46) | struct CropResult
    type MediaPreview (line 48) | struct MediaPreview
    type NitroPreviewConfig (line 50) | struct NitroPreviewConfig
    type NitroCameraConfig (line 52) | struct NitroCameraConfig
    type CameraResult (line 54) | struct CameraResult
    class HybridMultipleImagePickerSpecSwift (line 95) | class HybridMultipleImagePickerSpecSwift: public virtual HybridMultipl...
      method HybridMultipleImagePickerSpecSwift (line 98) | explicit HybridMultipleImagePickerSpecSwift(const MultipleImagePicke...
      method getExternalMemorySize (line 110) | inline size_t getExternalMemorySize() noexcept override {
      method openPicker (line 120) | inline void openPicker(const NitroConfig& config, const std::functio...
      method openCrop (line 126) | inline void openCrop(const std::string& image, const NitroCropConfig...
      method openPreview (line 132) | inline void openPreview(const std::vector<MediaPreview>& media, doub...
      method openCamera (line 138) | inline void openCamera(const NitroCameraConfig& config, const std::f...
  type margelo::nitro::multipleimagepicker (line 22) | namespace margelo::nitro::multipleimagepicker { enum class ResultType; }
    type NitroConfig (line 16) | struct NitroConfig
    type MediaType (line 18) | enum class MediaType
    type PickerResult (line 20) | struct PickerResult
    type ResultType (line 22) | enum class ResultType
    type SelectBoxStyle (line 24) | enum class SelectBoxStyle
    type SelectMode (line 26) | enum class SelectMode
    type PickerCropConfig (line 28) | struct PickerCropConfig
    type CropRatio (line 30) | struct CropRatio
    type Text (line 32) | struct Text
    type Language (line 34) | enum class Language
    type Theme (line 36) | enum class Theme
    type Presentation (line 38) | enum class Presentation
    type PickerCameraConfig (line 40) | struct PickerCameraConfig
    type CameraDevice (line 42) | enum class CameraDevice
    type NitroCropConfig (line 44) | struct NitroCropConfig
    type CropResult (line 46) | struct CropResult
    type MediaPreview (line 48) | struct MediaPreview
    type NitroPreviewConfig (line 50) | struct NitroPreviewConfig
    type NitroCameraConfig (line 52) | struct NitroCameraConfig
    type CameraResult (line 54) | struct CameraResult
    class HybridMultipleImagePickerSpecSwift (line 95) | class HybridMultipleImagePickerSpecSwift: public virtual HybridMultipl...
      method HybridMultipleImagePickerSpecSwift (line 98) | explicit HybridMultipleImagePickerSpecSwift(const MultipleImagePicke...
      method getExternalMemorySize (line 110) | inline size_t getExternalMemorySize() noexcept override {
      method openPicker (line 120) | inline void openPicker(const NitroConfig& config, const std::functio...
      method openCrop (line 126) | inline void openCrop(const std::string& image, const NitroCropConfig...
      method openPreview (line 132) | inline void openPreview(const std::vector<MediaPreview>& media, doub...
      method openCamera (line 138) | inline void openCamera(const NitroCameraConfig& config, const std::f...
  type margelo::nitro::multipleimagepicker (line 24) | namespace margelo::nitro::multipleimagepicker { enum class SelectBoxStyl...
    type NitroConfig (line 16) | struct NitroConfig
    type MediaType (line 18) | enum class MediaType
    type PickerResult (line 20) | struct PickerResult
    type ResultType (line 22) | enum class ResultType
    type SelectBoxStyle (line 24) | enum class SelectBoxStyle
    type SelectMode (line 26) | enum class SelectMode
    type PickerCropConfig (line 28) | struct PickerCropConfig
    type CropRatio (line 30) | struct CropRatio
    type Text (line 32) | struct Text
    type Language (line 34) | enum class Language
    type Theme (line 36) | enum class Theme
    type Presentation (line 38) | enum class Presentation
    type PickerCameraConfig (line 40) | struct PickerCameraConfig
    type CameraDevice (line 42) | enum class CameraDevice
    type NitroCropConfig (line 44) | struct NitroCropConfig
    type CropResult (line 46) | struct CropResult
    type MediaPreview (line 48) | struct MediaPreview
    type NitroPreviewConfig (line 50) | struct NitroPreviewConfig
    type NitroCameraConfig (line 52) | struct NitroCameraConfig
    type CameraResult (line 54) | struct CameraResult
    class HybridMultipleImagePickerSpecSwift (line 95) | class HybridMultipleImagePickerSpecSwift: public virtual HybridMultipl...
      method HybridMultipleImagePickerSpecSwift (line 98) | explicit HybridMultipleImagePickerSpecSwift(const MultipleImagePicke...
      method getExternalMemorySize (line 110) | inline size_t getExternalMemorySize() noexcept override {
      method openPicker (line 120) | inline void openPicker(const NitroConfig& config, const std::functio...
      method openCrop (line 126) | inline void openCrop(const std::string& image, const NitroCropConfig...
      method openPreview (line 132) | inline void openPreview(const std::vector<MediaPreview>& media, doub...
      method openCamera (line 138) | inline void openCamera(const NitroCameraConfig& config, const std::f...
  type margelo::nitro::multipleimagepicker (line 26) | namespace margelo::nitro::multipleimagepicker { enum class SelectMode; }
    type NitroConfig (line 16) | struct NitroConfig
    type MediaType (line 18) | enum class MediaType
    type PickerResult (line 20) | struct PickerResult
    type ResultType (line 22) | enum class ResultType
    type SelectBoxStyle (line 24) | enum class SelectBoxStyle
    type SelectMode (line 26) | enum class SelectMode
    type PickerCropConfig (line 28) | struct PickerCropConfig
    type CropRatio (line 30) | struct CropRatio
    type Text (line 32) | struct Text
    type Language (line 34) | enum class Language
    type Theme (line 36) | enum class Theme
    type Presentation (line 38) | enum class Presentation
    type PickerCameraConfig (line 40) | struct PickerCameraConfig
    type CameraDevice (line 42) | enum class CameraDevice
    type NitroCropConfig (line 44) | struct NitroCropConfig
    type CropResult (line 46) | struct CropResult
    type MediaPreview (line 48) | struct MediaPreview
    type NitroPreviewConfig (line 50) | struct NitroPreviewConfig
    type NitroCameraConfig (line 52) | struct NitroCameraConfig
    type CameraResult (line 54) | struct CameraResult
    class HybridMultipleImagePickerSpecSwift (line 95) | class HybridMultipleImagePickerSpecSwift: public virtual HybridMultipl...
      method HybridMultipleImagePickerSpecSwift (line 98) | explicit HybridMultipleImagePickerSpecSwift(const MultipleImagePicke...
      method getExternalMemorySize (line 110) | inline size_t getExternalMemorySize() noexcept override {
      method openPicker (line 120) | inline void openPicker(const NitroConfig& config, const std::functio...
      method openCrop (line 126) | inline void openCrop(const std::string& image, const NitroCropConfig...
      method openPreview (line 132) | inline void openPreview(const std::vector<MediaPreview>& media, doub...
      method openCamera (line 138) | inline void openCamera(const NitroCameraConfig& config, const std::f...
  type margelo::nitro::multipleimagepicker (line 28) | namespace margelo::nitro::multipleimagepicker { struct PickerCropConfig; }
    type NitroConfig (line 16) | struct NitroConfig
    type MediaType (line 18) | enum class MediaType
    type PickerResult (line 20) | struct PickerResult
    type ResultType (line 22) | enum class ResultType
    type SelectBoxStyle (line 24) | enum class SelectBoxStyle
    type SelectMode (line 26) | enum class SelectMode
    type PickerCropConfig (line 28) | struct PickerCropConfig
    type CropRatio (line 30) | struct CropRatio
    type Text (line 32) | struct Text
    type Language (line 34) | enum class Language
    type Theme (line 36) | enum class Theme
    type Presentation (line 38) | enum class Presentation
    type PickerCameraConfig (line 40) | struct PickerCameraConfig
    type CameraDevice (line 42) | enum class CameraDevice
    type NitroCropConfig (line 44) | struct NitroCropConfig
    type CropResult (line 46) | struct CropResult
    type MediaPreview (line 48) | struct MediaPreview
    type NitroPreviewConfig (line 50) | struct NitroPreviewConfig
    type NitroCameraConfig (line 52) | struct NitroCameraConfig
    type CameraResult (line 54) | struct CameraResult
    class HybridMultipleImagePickerSpecSwift (line 95) | class HybridMultipleImagePickerSpecSwift: public virtual HybridMultipl...
      method HybridMultipleImagePickerSpecSwift (line 98) | explicit HybridMultipleImagePickerSpecSwift(const MultipleImagePicke...
      method getExternalMemorySize (line 110) | inline size_t getExternalMemorySize() noexcept override {
      method openPicker (line 120) | inline void openPicker(const NitroConfig& config, const std::functio...
      method openCrop (line 126) | inline void openCrop(const std::string& image, const NitroCropConfig...
      method openPreview (line 132) | inline void openPreview(const std::vector<MediaPreview>& media, doub...
      method openCamera (line 138) | inline void openCamera(const NitroCameraConfig& config, const std::f...
  type margelo::nitro::multipleimagepicker (line 30) | namespace margelo::nitro::multipleimagepicker { struct CropRatio; }
    type NitroConfig (line 16) | struct NitroConfig
    type MediaType (line 18) | enum class MediaType
    type PickerResult (line 20) | struct PickerResult
    type ResultType (line 22) | enum class ResultType
    type SelectBoxStyle (line 24) | enum class SelectBoxStyle
    type SelectMode (line 26) | enum class SelectMode
    type PickerCropConfig (line 28) | struct PickerCropConfig
    type CropRatio (line 30) | struct CropRatio
    type Text (line 32) | struct Text
    type Language (line 34) | enum class Language
    type Theme (line 36) | enum class Theme
    type Presentation (line 38) | enum class Presentation
    type PickerCameraConfig (line 40) | struct PickerCameraConfig
    type CameraDevice (line 42) | enum class CameraDevice
    type NitroCropConfig (line 44) | struct NitroCropConfig
    type CropResult (line 46) | struct CropResult
    type MediaPreview (line 48) | struct MediaPreview
    type NitroPreviewConfig (line 50) | struct NitroPreviewConfig
    type NitroCameraConfig (line 52) | struct NitroCameraConfig
    type CameraResult (line 54) | struct CameraResult
    class HybridMultipleImagePickerSpecSwift (line 95) | class HybridMultipleImagePickerSpecSwift: public virtual HybridMultipl...
      method HybridMultipleImagePickerSpecSwift (line 98) | explicit HybridMultipleImagePickerSpecSwift(const MultipleImagePicke...
      method getExternalMemorySize (line 110) | inline size_t getExternalMemorySize() noexcept override {
      method openPicker (line 120) | inline void openPicker(const NitroConfig& config, const std::functio...
      method openCrop (line 126) | inline void openCrop(const std::string& image, const NitroCropConfig...
      method openPreview (line 132) | inline void openPreview(const std::vector<MediaPreview>& media, doub...
      method openCamera (line 138) | inline void openCamera(const NitroCameraConfig& config, const std::f...
  type margelo::nitro::multipleimagepicker (line 32) | namespace margelo::nitro::multipleimagepicker { struct Text; }
    type NitroConfig (line 16) | struct NitroConfig
    type MediaType (line 18) | enum class MediaType
    type PickerResult (line 20) | struct PickerResult
    type ResultType (line 22) | enum class ResultType
    type SelectBoxStyle (line 24) | enum class SelectBoxStyle
    type SelectMode (line 26) | enum class SelectMode
    type PickerCropConfig (line 28) | struct PickerCropConfig
    type CropRatio (line 30) | struct CropRatio
    type Text (line 32) | struct Text
    type Language (line 34) | enum class Language
    type Theme (line 36) | enum class Theme
    type Presentation (line 38) | enum class Presentation
    type PickerCameraConfig (line 40) | struct PickerCameraConfig
    type CameraDevice (line 42) | enum class CameraDevice
    type NitroCropConfig (line 44) | struct NitroCropConfig
    type CropResult (line 46) | struct CropResult
    type MediaPreview (line 48) | struct MediaPreview
    type NitroPreviewConfig (line 50) | struct NitroPreviewConfig
    type NitroCameraConfig (line 52) | struct NitroCameraConfig
    type CameraResult (line 54) | struct CameraResult
    class HybridMultipleImagePickerSpecSwift (line 95) | class HybridMultipleImagePickerSpecSwift: public virtual HybridMultipl...
      method HybridMultipleImagePickerSpecSwift (line 98) | explicit HybridMultipleImagePickerSpecSwift(const MultipleImagePicke...
      method getExternalMemorySize (line 110) | inline size_t getExternalMemorySize() noexcept override {
      method openPicker (line 120) | inline void openPicker(const NitroConfig& config, const std::functio...
      method openCrop (line 126) | inline void openCrop(const std::string& image, const NitroCropConfig...
      method openPreview (line 132) | inline void openPreview(const std::vector<MediaPreview>& media, doub...
      method openCamera (line 138) | inline void openCamera(const NitroCameraConfig& config, const std::f...
  type margelo::nitro::multipleimagepicker (line 34) | namespace margelo::nitro::multipleimagepicker { enum class Language; }
    type NitroConfig (line 16) | struct NitroConfig
    type MediaType (line 18) | enum class MediaType
    type PickerResult (line 20) | struct PickerResult
    type ResultType (line 22) | enum class ResultType
    type SelectBoxStyle (line 24) | enum class SelectBoxStyle
    type SelectMode (line 26) | enum class SelectMode
    type PickerCropConfig (line 28) | struct PickerCropConfig
    type CropRatio (line 30) | struct CropRatio
    type Text (line 32) | struct Text
    type Language (line 34) | enum class Language
    type Theme (line 36) | enum class Theme
    type Presentation (line 38) | enum class Presentation
    type PickerCameraConfig (line 40) | struct PickerCameraConfig
    type CameraDevice (line 42) | enum class CameraDevice
    type NitroCropConfig (line 44) | struct NitroCropConfig
    type CropResult (line 46) | struct CropResult
    type MediaPreview (line 48) | struct MediaPreview
    type NitroPreviewConfig (line 50) | struct NitroPreviewConfig
    type NitroCameraConfig (line 52) | struct NitroCameraConfig
    type CameraResult (line 54) | struct CameraResult
    class HybridMultipleImagePickerSpecSwift (line 95) | class HybridMultipleImagePickerSpecSwift: public virtual HybridMultipl...
      method HybridMultipleImagePickerSpecSwift (line 98) | explicit HybridMultipleImagePickerSpecSwift(const MultipleImagePicke...
      method getExternalMemorySize (line 110) | inline size_t getExternalMemorySize() noexcept override {
      method openPicker (line 120) | inline void openPicker(const NitroConfig& config, const std::functio...
      method openCrop (line 126) | inline void openCrop(const std::string& image, const NitroCropConfig...
      method openPreview (line 132) | inline void openPreview(const std::vector<MediaPreview>& media, doub...
      method openCamera (line 138) | inline void openCamera(const NitroCameraConfig& config, const std::f...
  type margelo::nitro::multipleimagepicker (line 36) | namespace margelo::nitro::multipleimagepicker { enum class Theme; }
    type NitroConfig (line 16) | struct NitroConfig
    type MediaType (line 18) | enum class MediaType
    type PickerResult (line 20) | struct PickerResult
    type ResultType (line 22) | enum class ResultType
    type SelectBoxStyle (line 24) | enum class SelectBoxStyle
    type SelectMode (line 26) | enum class SelectMode
    type PickerCropConfig (line 28) | struct PickerCropConfig
    type CropRatio (line 30) | struct CropRatio
    type Text (line 32) | struct Text
    type Language (line 34) | enum class Language
    type Theme (line 36) | enum class Theme
    type Presentation (line 38) | enum class Presentation
    type PickerCameraConfig (line 40) | struct PickerCameraConfig
    type CameraDevice (line 42) | enum class CameraDevice
    type NitroCropConfig (line 44) | struct NitroCropConfig
    type CropResult (line 46) | struct CropResult
    type MediaPreview (line 48) | struct MediaPreview
    type NitroPreviewConfig (line 50) | struct NitroPreviewConfig
    type NitroCameraConfig (line 52) | struct NitroCameraConfig
    type CameraResult (line 54) | struct CameraResult
    class HybridMultipleImagePickerSpecSwift (line 95) | class HybridMultipleImagePickerSpecSwift: public virtual HybridMultipl...
      method HybridMultipleImagePickerSpecSwift (line 98) | explicit HybridMultipleImagePickerSpecSwift(const MultipleImagePicke...
      method getExternalMemorySize (line 110) | inline size_t getExternalMemorySize() noexcept override {
      method openPicker (line 120) | inline void openPicker(const NitroConfig& config, const std::functio...
      method openCrop (line 126) | inline void openCrop(const std::string& image, const NitroCropConfig...
      method openPreview (line 132) | inline void openPreview(const std::vector<MediaPreview>& media, doub...
      method openCamera (line 138) | inline void openCamera(const NitroCameraConfig& config, const std::f...
  type margelo::nitro::multipleimagepicker (line 38) | namespace margelo::nitro::multipleimagepicker { enum class Presentation; }
    type NitroConfig (line 16) | struct NitroConfig
    type MediaType (line 18) | enum class MediaType
    type PickerResult (line 20) | struct PickerResult
    type ResultType (line 22) | enum class ResultType
    type SelectBoxStyle (line 24) | enum class SelectBoxStyle
    type SelectMode (line 26) | enum class SelectMode
    type PickerCropConfig (line 28) | struct PickerCropConfig
    type CropRatio (line 30) | struct CropRatio
    type Text (line 32) | struct Text
    type Language (line 34) | enum class Language
    type Theme (line 36) | enum class Theme
    type Presentation (line 38) | enum class Presentation
    type PickerCameraConfig (line 40) | struct PickerCameraConfig
    type CameraDevice (line 42) | enum class CameraDevice
    type NitroCropConfig (line 44) | struct NitroCropConfig
    type CropResult (line 46) | struct CropResult
    type MediaPreview (line 48) | struct MediaPreview
    type NitroPreviewConfig (line 50) | struct NitroPreviewConfig
    type NitroCameraConfig (line 52) | struct NitroCameraConfig
    type CameraResult (line 54) | struct CameraResult
    class HybridMultipleImagePickerSpecSwift (line 95) | class HybridMultipleImagePickerSpecSwift: public virtual HybridMultipl...
      method HybridMultipleImagePickerSpecSwift (line 98) | explicit HybridMultipleImagePickerSpecSwift(const MultipleImagePicke...
      method getExternalMemorySize (line 110) | inline size_t getExternalMemorySize() noexcept override {
      method openPicker (line 120) | inline void openPicker(const NitroConfig& config, const std::functio...
      method openCrop (line 126) | inline void openCrop(const std::string& image, const NitroCropConfig...
      method openPreview (line 132) | inline void openPreview(const std::vector<MediaPreview>& media, doub...
      method openCamera (line 138) | inline void openCamera(const NitroCameraConfig& config, const std::f...
  type margelo::nitro::multipleimagepicker (line 40) | namespace margelo::nitro::multipleimagepicker { struct PickerCameraConfi...
    type NitroConfig (line 16) | struct NitroConfig
    type MediaType (line 18) | enum class MediaType
    type PickerResult (line 20) | struct PickerResult
    type ResultType (line 22) | enum class ResultType
    type SelectBoxStyle (line 24) | enum class SelectBoxStyle
    type SelectMode (line 26) | enum class SelectMode
    type PickerCropConfig (line 28) | struct PickerCropConfig
    type CropRatio (line 30) | struct CropRatio
    type Text (line 32) | struct Text
    type Language (line 34) | enum class Language
    type Theme (line 36) | enum class Theme
    type Presentation (line 38) | enum class Presentation
    type PickerCameraConfig (line 40) | struct PickerCameraConfig
    type CameraDevice (line 42) | enum class CameraDevice
    type NitroCropConfig (line 44) | struct NitroCropConfig
    type CropResult (line 46) | struct CropResult
    type MediaPreview (line 48) | struct MediaPreview
    type NitroPreviewConfig (line 50) | struct NitroPreviewConfig
    type NitroCameraConfig (line 52) | struct NitroCameraConfig
    type CameraResult (line 54) | struct CameraResult
    class HybridMultipleImagePickerSpecSwift (line 95) | class HybridMultipleImagePickerSpecSwift: public virtual HybridMultipl...
      method HybridMultipleImagePickerSpecSwift (line 98) | explicit HybridMultipleImagePickerSpecSwift(const MultipleImagePicke...
      method getExternalMemorySize (line 110) | inline size_t getExternalMemorySize() noexcept override {
      method openPicker (line 120) | inline void openPicker(const NitroConfig& config, const std::functio...
      method openCrop (line 126) | inline void openCrop(const std::string& image, const NitroCropConfig...
      method openPreview (line 132) | inline void openPreview(const std::vector<MediaPreview>& media, doub...
      method openCamera (line 138) | inline void openCamera(const NitroCameraConfig& config, const std::f...
  type margelo::nitro::multipleimagepicker (line 42) | namespace margelo::nitro::multipleimagepicker { enum class CameraDevice; }
    type NitroConfig (line 16) | struct NitroConfig
    type MediaType (line 18) | enum class MediaType
    type PickerResult (line 20) | struct PickerResult
    type ResultType (line 22) | enum class ResultType
    type SelectBoxStyle (line 24) | enum class SelectBoxStyle
    type SelectMode (line 26) | enum class SelectMode
    type PickerCropConfig (line 28) | struct PickerCropConfig
    type CropRatio (line 30) | struct CropRatio
    type Text (line 32) | struct Text
    type Language (line 34) | enum class Language
    type Theme (line 36) | enum class Theme
    type Presentation (line 38) | enum class Presentation
    type PickerCameraConfig (line 40) | struct PickerCameraConfig
    type CameraDevice (line 42) | enum class CameraDevice
    type NitroCropConfig (line 44) | struct NitroCropConfig
    type CropResult (line 46) | struct CropResult
    type MediaPreview (line 48) | struct MediaPreview
    type NitroPreviewConfig (line 50) | struct NitroPreviewConfig
    type NitroCameraConfig (line 52) | struct NitroCameraConfig
    type CameraResult (line 54) | struct CameraResult
    class HybridMultipleImagePickerSpecSwift (line 95) | class HybridMultipleImagePickerSpecSwift: public virtual HybridMultipl...
      method HybridMultipleImagePickerSpecSwift (line 98) | explicit HybridMultipleImagePickerSpecSwift(const MultipleImagePicke...
      method getExternalMemorySize (line 110) | inline size_t getExternalMemorySize() noexcept override {
      method openPicker (line 120) | inline void openPicker(const NitroConfig& config, const std::functio...
      method openCrop (line 126) | inline void openCrop(const std::string& image, const NitroCropConfig...
      method openPreview (line 132) | inline void openPreview(const std::vector<MediaPreview>& media, doub...
      method openCamera (line 138) | inline void openCamera(const NitroCameraConfig& config, const std::f...
  type margelo::nitro::multipleimagepicker (line 44) | namespace margelo::nitro::multipleimagepicker { struct NitroCropConfig; }
    type NitroConfig (line 16) | struct NitroConfig
    type MediaType (line 18) | enum class MediaType
    type PickerResult (line 20) | struct PickerResult
    type ResultType (line 22) | enum class ResultType
    type SelectBoxStyle (line 24) | enum class SelectBoxStyle
    type SelectMode (line 26) | enum class SelectMode
    type PickerCropConfig (line 28) | struct PickerCropConfig
    type CropRatio (line 30) | struct CropRatio
    type Text (line 32) | struct Text
    type Language (line 34) | enum class Language
    type Theme (line 36) | enum class Theme
    type Presentation (line 38) | enum class Presentation
    type PickerCameraConfig (line 40) | struct PickerCameraConfig
    type CameraDevice (line 42) | enum class CameraDevice
    type NitroCropConfig (line 44) | struct NitroCropConfig
    type CropResult (line 46) | struct CropResult
    type MediaPreview (line 48) | struct MediaPreview
    type NitroPreviewConfig (line 50) | struct NitroPreviewConfig
    type NitroCameraConfig (line 52) | struct NitroCameraConfig
    type CameraResult (line 54) | struct CameraResult
    class HybridMultipleImagePickerSpecSwift (line 95) | class HybridMultipleImagePickerSpecSwift: public virtual HybridMultipl...
      method HybridMultipleImagePickerSpecSwift (line 98) | explicit HybridMultipleImagePickerSpecSwift(const MultipleImagePicke...
      method getExternalMemorySize (line 110) | inline size_t getExternalMemorySize() noexcept override {
      method openPicker (line 120) | inline void openPicker(const NitroConfig& config, const std::functio...
      method openCrop (line 126) | inline void openCrop(const std::string& image, const NitroCropConfig...
      method openPreview (line 132) | inline void openPreview(const std::vector<MediaPreview>& media, doub...
      method openCamera (line 138) | inline void openCamera(const NitroCameraConfig& config, const std::f...
  type margelo::nitro::multipleimagepicker (line 46) | namespace margelo::nitro::multipleimagepicker { struct CropResult; }
    type NitroConfig (line 16) | struct NitroConfig
    type MediaType (line 18) | enum class MediaType
    type PickerResult (line 20) | struct PickerResult
    type ResultType (line 22) | enum class ResultType
    type SelectBoxStyle (line 24) | enum class SelectBoxStyle
    type SelectMode (line 26) | enum class SelectMode
    type PickerCropConfig (line 28) | struct PickerCropConfig
    type CropRatio (line 30) | struct CropRatio
    type Text (line 32) | struct Text
    type Language (line 34) | enum class Language
    type Theme (line 36) | enum class Theme
    type Presentation (line 38) | enum class Presentation
    type PickerCameraConfig (line 40) | struct PickerCameraConfig
    type CameraDevice (line 42) | enum class CameraDevice
    type NitroCropConfig (line 44) | struct NitroCropConfig
    type CropResult (line 46) | struct CropResult
    type MediaPreview (line 48) | struct MediaPreview
    type NitroPreviewConfig (line 50) | struct NitroPreviewConfig
    type NitroCameraConfig (line 52) | struct NitroCameraConfig
    type CameraResult (line 54) | struct CameraResult
    class HybridMultipleImagePickerSpecSwift (line 95) | class HybridMultipleImagePickerSpecSwift: public virtual HybridMultipl...
      method HybridMultipleImagePickerSpecSwift (line 98) | explicit HybridMultipleImagePickerSpecSwift(const MultipleImagePicke...
      method getExternalMemorySize (line 110) | inline size_t getExternalMemorySize() noexcept override {
      method openPicker (line 120) | inline void openPicker(const NitroConfig& config, const std::functio...
      method openCrop (line 126) | inline void openCrop(const std::string& image, const NitroCropConfig...
      method openPreview (line 132) | inline void openPreview(const std::vector<MediaPreview>& media, doub...
      method openCamera (line 138) | inline void openCamera(const NitroCameraConfig& config, const std::f...
  type margelo::nitro::multipleimagepicker (line 48) | namespace margelo::nitro::multipleimagepicker { struct MediaPreview; }
    type NitroConfig (line 16) | struct NitroConfig
    type MediaType (line 18) | enum class MediaType
    type PickerResult (line 20) | struct PickerResult
    type ResultType (line 22) | enum class ResultType
    type SelectBoxStyle (line 24) | enum class SelectBoxStyle
    type SelectMode (line 26) | enum class SelectMode
    type PickerCropConfig (line 28) | struct PickerCropConfig
    type CropRatio (line 30) | struct CropRatio
    type Text (line 32) | struct Text
    type Language (line 34) | enum class Language
    type Theme (line 36) | enum class Theme
    type Presentation (line 38) | enum class Presentation
    type PickerCameraConfig (line 40) | struct PickerCameraConfig
    type CameraDevice (line 42) | enum class CameraDevice
    type NitroCropConfig (line 44) | struct NitroCropConfig
    type CropResult (line 46) | struct CropResult
    type MediaPreview (line 48) | struct MediaPreview
    type NitroPreviewConfig (line 50) | struct NitroPreviewConfig
    type NitroCameraConfig (line 52) | struct NitroCameraConfig
    type CameraResult (line 54) | struct CameraResult
    class HybridMultipleImagePickerSpecSwift (line 95) | class HybridMultipleImagePickerSpecSwift: public virtual HybridMultipl...
      method HybridMultipleImagePickerSpecSwift (line 98) | explicit HybridMultipleImagePickerSpecSwift(const MultipleImagePicke...
      method getExternalMemorySize (line 110) | inline size_t getExternalMemorySize() noexcept override {
      method openPicker (line 120) | inline void openPicker(const NitroConfig& config, const std::functio...
      method openCrop (line 126) | inline void openCrop(const std::string& image, const NitroCropConfig...
      method openPreview (line 132) | inline void openPreview(const std::vector<MediaPreview>& media, doub...
      method openCamera (line 138) | inline void openCamera(const NitroCameraConfig& config, const std::f...
  type margelo::nitro::multipleimagepicker (line 50) | namespace margelo::nitro::multipleimagepicker { struct NitroPreviewConfi...
    type NitroConfig (line 16) | struct NitroConfig
    type MediaType (line 18) | enum class MediaType
    type PickerResult (line 20) | struct PickerResult
    type ResultType (line 22) | enum class ResultType
    type SelectBoxStyle (line 24) | enum class SelectBoxStyle
    type SelectMode (line 26) | enum class SelectMode
    type PickerCropConfig (line 28) | struct PickerCropConfig
    type CropRatio (line 30) | struct CropRatio
    type Text (line 32) | struct Text
    type Language (line 34) | enum class Language
    type Theme (line 36) | enum class Theme
    type Presentation (line 38) | enum class Presentation
    type PickerCameraConfig (line 40) | struct PickerCameraConfig
    type CameraDevice (line 42) | enum class CameraDevice
    type NitroCropConfig (line 44) | struct NitroCropConfig
    type CropResult (line 46) | struct CropResult
    type MediaPreview (line 48) | struct MediaPreview
    type NitroPreviewConfig (line 50) | struct NitroPreviewConfig
    type NitroCameraConfig (line 52) | struct NitroCameraConfig
    type CameraResult (line 54) | struct CameraResult
    class HybridMultipleImagePickerSpecSwift (line 95) | class HybridMultipleImagePickerSpecSwift: public virtual HybridMultipl...
      method HybridMultipleImagePickerSpecSwift (line 98) | explicit HybridMultipleImagePickerSpecSwift(const MultipleImagePicke...
      method getExternalMemorySize (line 110) | inline size_t getExternalMemorySize() noexcept override {
      method openPicker (line 120) | inline void openPicker(const NitroConfig& config, const std::functio...
      method openCrop (line 126) | inline void openCrop(const std::string& image, const NitroCropConfig...
      method openPreview (line 132) | inline void openPreview(const std::vector<MediaPreview>& media, doub...
      method openCamera (line 138) | inline void openCamera(const NitroCameraConfig& config, const std::f...
  type margelo::nitro::multipleimagepicker (line 52) | namespace margelo::nitro::multipleimagepicker { struct NitroCameraConfig; }
    type NitroConfig (line 16) | struct NitroConfig
    type MediaType (line 18) | enum class MediaType
    type PickerResult (line 20) | struct PickerResult
    type ResultType (line 22) | enum class ResultType
    type SelectBoxStyle (line 24) | enum class SelectBoxStyle
    type SelectMode (line 26) | enum class SelectMode
    type PickerCropConfig (line 28) | struct PickerCropConfig
    type CropRatio (line 30) | struct CropRatio
    type Text (line 32) | struct Text
    type Language (line 34) | enum class Language
    type Theme (line 36) | enum class Theme
    type Presentation (line 38) | enum class Presentation
    type PickerCameraConfig (line 40) | struct PickerCameraConfig
    type CameraDevice (line 42) | enum class CameraDevice
    type NitroCropConfig (line 44) | struct NitroCropConfig
    type CropResult (line 46) | struct CropResult
    type MediaPreview (line 48) | struct MediaPreview
    type NitroPreviewConfig (line 50) | struct NitroPreviewConfig
    type NitroCameraConfig (line 52) | struct NitroCameraConfig
    type CameraResult (line 54) | struct CameraResult
    class HybridMultipleImagePickerSpecSwift (line 95) | class HybridMultipleImagePickerSpecSwift: public virtual HybridMultipl...
      method HybridMultipleImagePickerSpecSwift (line 98) | explicit HybridMultipleImagePickerSpecSwift(const MultipleImagePicke...
      method getExternalMemorySize (line 110) | inline size_t getExternalMemorySize() noexcept override {
      method openPicker (line 120) | inline void openPicker(const NitroConfig& config, const std::functio...
      method openCrop (line 126) | inline void openCrop(const std::string& image, const NitroCropConfig...
      method openPreview (line 132) | inline void openPreview(const std::vector<MediaPreview>& media, doub...
      method openCamera (line 138) | inline void openCamera(const NitroCameraConfig& config, const std::f...
  type margelo::nitro::multipleimagepicker (line 54) | namespace margelo::nitro::multipleimagepicker { struct CameraResult; }
    type NitroConfig (line 16) | struct NitroConfig
    type MediaType (line 18) | enum class MediaType
    type PickerResult (line 20) | struct PickerResult
    type ResultType (line 22) | enum class ResultType
    type SelectBoxStyle (line 24) | enum class SelectBoxStyle
    type SelectMode (line 26) | enum class SelectMode
    type PickerCropConfig (line 28) | struct PickerCropConfig
    type CropRatio (line 30) | struct CropRatio
    type Text (line 32) | struct Text
    type Language (line 34) | enum class Language
    type Theme (line 36) | enum class Theme
    type Presentation (line 38) | enum class Presentation
    type PickerCameraConfig (line 40) | struct PickerCameraConfig
    type CameraDevice (line 42) | enum class CameraDevice
    type NitroCropConfig (line 44) | struct NitroCropConfig
    type CropResult (line 46) | struct CropResult
    type MediaPreview (line 48) | struct MediaPreview
    type NitroPreviewConfig (line 50) | struct NitroPreviewConfig
    type NitroCameraConfig (line 52) | struct NitroCameraConfig
    type CameraResult (line 54) | struct CameraResult
    class HybridMultipleImagePickerSpecSwift (line 95) | class HybridMultipleImagePickerSpecSwift: public virtual HybridMultipl...
      method HybridMultipleImagePickerSpecSwift (line 98) | explicit HybridMultipleImagePickerSpecSwift(const MultipleImagePicke...
      method getExternalMemorySize (line 110) | inline size_t getExternalMemorySize() noexcept override {
      method openPicker (line 120) | inline void openPicker(const NitroConfig& config, const std::functio...
      method openCrop (line 126) | inline void openCrop(const std::string& image, const NitroCropConfig...
      method openPreview (line 132) | inline void openPreview(const std::vector<MediaPreview>& media, doub...
      method openCamera (line 138) | inline void openCamera(const NitroCameraConfig& config, const std::f...
  type margelo::nitro::multipleimagepicker (line 83) | namespace margelo::nitro::multipleimagepicker {
    type NitroConfig (line 16) | struct NitroConfig
    type MediaType (line 18) | enum class MediaType
    type PickerResult (line 20) | struct PickerResult
    type ResultType (line 22) | enum class ResultType
    type SelectBoxStyle (line 24) | enum class SelectBoxStyle
    type SelectMode (line 26) | enum class SelectMode
    type PickerCropConfig (line 28) | struct PickerCropConfig
    type CropRatio (line 30) | struct CropRatio
    type Text (line 32) | struct Text
    type Language (line 34) | enum class Language
    type Theme (line 36) | enum class Theme
    type Presentation (line 38) | enum class Presentation
    type PickerCameraConfig (line 40) | struct PickerCameraConfig
    type CameraDevice (line 42) | enum class CameraDevice
    type NitroCropConfig (line 44) | struct NitroCropConfig
    type CropResult (line 46) | struct CropResult
    type MediaPreview (line 48) | struct MediaPreview
    type NitroPreviewConfig (line 50) | struct NitroPreviewConfig
    type NitroCameraConfig (line 52) | struct NitroCameraConfig
    type CameraResult (line 54) | struct CameraResult
    class HybridMultipleImagePickerSpecSwift (line 95) | class HybridMultipleImagePickerSpecSwift: public virtual HybridMultipl...
      method HybridMultipleImagePickerSpecSwift (line 98) | explicit HybridMultipleImagePickerSpecSwift(const MultipleImagePicke...
      method getExternalMemorySize (line 110) | inline size_t getExternalMemorySize() noexcept override {
      method openPicker (line 120) | inline void openPicker(const NitroConfig& config, const std::functio...
      method openCrop (line 126) | inline void openCrop(const std::string& image, const NitroCropConfig...
      method openPreview (line 132) | inline void openPreview(const std::vector<MediaPreview>& media, doub...
      method openCamera (line 138) | inline void openCamera(const NitroCameraConfig& config, const std::f...

FILE: nitrogen/generated/shared/c++/CameraDevice.hpp
  type margelo::nitro::multipleimagepicker (line 26) | namespace margelo::nitro::multipleimagepicker {
    type CameraDevice (line 31) | enum class CameraDevice {
  type margelo::nitro (line 38) | namespace margelo::nitro {
    type JSIConverter<CameraDevice> (line 44) | struct JSIConverter<CameraDevice> final {
      method CameraDevice (line 45) | static inline CameraDevice fromJSI(jsi::Runtime& runtime, const jsi:...
      method toJSI (line 54) | static inline jsi::Value toJSI(jsi::Runtime& runtime, CameraDevice a...
      method canConvert (line 63) | static inline bool canConvert(jsi::Runtime& runtime, const jsi::Valu...

FILE: nitrogen/generated/shared/c++/CameraResult.hpp
  type margelo::nitro::multipleimagepicker (line 22) | namespace margelo::nitro::multipleimagepicker { enum class ResultType; }
    type ResultType (line 22) | enum class ResultType
    type CameraResult (line 33) | struct CameraResult {
      method CameraResult (line 44) | CameraResult() = default;
      method CameraResult (line 45) | explicit CameraResult(std::string path, ResultType type, std::option...
  type margelo::nitro::multipleimagepicker (line 28) | namespace margelo::nitro::multipleimagepicker {
    type ResultType (line 22) | enum class ResultType
    type CameraResult (line 33) | struct CameraResult {
      method CameraResult (line 44) | CameraResult() = default;
      method CameraResult (line 45) | explicit CameraResult(std::string path, ResultType type, std::option...
  type margelo::nitro (line 50) | namespace margelo::nitro {
    type JSIConverter<CameraResult> (line 56) | struct JSIConverter<CameraResult> final {
      method CameraResult (line 57) | static inline CameraResult fromJSI(jsi::Runtime& runtime, const jsi:...
      method toJSI (line 69) | static inline jsi::Value toJSI(jsi::Runtime& runtime, const CameraRe...
      method canConvert (line 80) | static inline bool canConvert(jsi::Runtime& runtime, const jsi::Valu...

FILE: nitrogen/generated/shared/c++/CropRatio.hpp
  type margelo::nitro::multipleimagepicker (line 26) | namespace margelo::nitro::multipleimagepicker {
    type CropRatio (line 31) | struct CropRatio {
      method CropRatio (line 38) | CropRatio() = default;
      method CropRatio (line 39) | explicit CropRatio(std::optional<std::string> title, double width, d...
  type margelo::nitro (line 44) | namespace margelo::nitro {
    type JSIConverter<CropRatio> (line 50) | struct JSIConverter<CropRatio> final {
      method CropRatio (line 51) | static inline CropRatio fromJSI(jsi::Runtime& runtime, const jsi::Va...
      method toJSI (line 59) | static inline jsi::Value toJSI(jsi::Runtime& runtime, const CropRati...
      method canConvert (line 66) | static inline bool canConvert(jsi::Runtime& runtime, const jsi::Valu...

FILE: nitrogen/generated/shared/c++/CropResult.hpp
  type margelo::nitro::multipleimagepicker (line 25) | namespace margelo::nitro::multipleimagepicker {
    type CropResult (line 30) | struct CropResult {
      method CropResult (line 37) | CropResult() = default;
      method CropResult (line 38) | explicit CropResult(std::string path, double width, double height): ...
  type margelo::nitro (line 43) | namespace margelo::nitro {
    type JSIConverter<CropResult> (line 49) | struct JSIConverter<CropResult> final {
      method CropResult (line 50) | static inline CropResult fromJSI(jsi::Runtime& runtime, const jsi::V...
      method toJSI (line 58) | static inline jsi::Value toJSI(jsi::Runtime& runtime, const CropResu...
      method canConvert (line 65) | static inline bool canConvert(jsi::Runtime& runtime, const jsi::Valu...

FILE: nitrogen/generated/shared/c++/HybridMultipleImagePickerSpec.cpp
  type margelo::nitro::multipleimagepicker (line 10) | namespace margelo::nitro::multipleimagepicker {

FILE: nitrogen/generated/shared/c++/HybridMultipleImagePickerSpec.hpp
  type margelo::nitro::multipleimagepicker (line 17) | namespace margelo::nitro::multipleimagepicker { struct NitroConfig; }
    type NitroConfig (line 17) | struct NitroConfig
    type PickerResult (line 19) | struct PickerResult
    type NitroCropConfig (line 21) | struct NitroCropConfig
    type CropResult (line 23) | struct CropResult
    type MediaPreview (line 25) | struct MediaPreview
    type NitroPreviewConfig (line 27) | struct NitroPreviewConfig
    type NitroCameraConfig (line 29) | struct NitroCameraConfig
    type CameraResult (line 31) | struct CameraResult
    class HybridMultipleImagePickerSpec (line 62) | class HybridMultipleImagePickerSpec: public virtual HybridObject {
      method HybridMultipleImagePickerSpec (line 65) | explicit HybridMultipleImagePickerSpec(): HybridObject(TAG) { }
  type margelo::nitro::multipleimagepicker (line 19) | namespace margelo::nitro::multipleimagepicker { struct PickerResult; }
    type NitroConfig (line 17) | struct NitroConfig
    type PickerResult (line 19) | struct PickerResult
    type NitroCropConfig (line 21) | struct NitroCropConfig
    type CropResult (line 23) | struct CropResult
    type MediaPreview (line 25) | struct MediaPreview
    type NitroPreviewConfig (line 27) | struct NitroPreviewConfig
    type NitroCameraConfig (line 29) | struct NitroCameraConfig
    type CameraResult (line 31) | struct CameraResult
    class HybridMultipleImagePickerSpec (line 62) | class HybridMultipleImagePickerSpec: public virtual HybridObject {
      method HybridMultipleImagePickerSpec (line 65) | explicit HybridMultipleImagePickerSpec(): HybridObject(TAG) { }
  type margelo::nitro::multipleimagepicker (line 21) | namespace margelo::nitro::multipleimagepicker { struct NitroCropConfig; }
    type NitroConfig (line 17) | struct NitroConfig
    type PickerResult (line 19) | struct PickerResult
    type NitroCropConfig (line 21) | struct NitroCropConfig
    type CropResult (line 23) | struct CropResult
    type MediaPreview (line 25) | struct MediaPreview
    type NitroPreviewConfig (line 27) | struct NitroPreviewConfig
    type NitroCameraConfig (line 29) | struct NitroCameraConfig
    type CameraResult (line 31) | struct CameraResult
    class HybridMultipleImagePickerSpec (line 62) | class HybridMultipleImagePickerSpec: public virtual HybridObject {
      method HybridMultipleImagePickerSpec (line 65) | explicit HybridMultipleImagePickerSpec(): HybridObject(TAG) { }
  type margelo::nitro::multipleimagepicker (line 23) | namespace margelo::nitro::multipleimagepicker { struct CropResult; }
    type NitroConfig (line 17) | struct NitroConfig
    type PickerResult (line 19) | struct PickerResult
    type NitroCropConfig (line 21) | struct NitroCropConfig
    type CropResult (line 23) | struct CropResult
    type MediaPreview (line 25) | struct MediaPreview
    type NitroPreviewConfig (line 27) | struct NitroPreviewConfig
    type NitroCameraConfig (line 29) | struct NitroCameraConfig
    type CameraResult (line 31) | struct CameraResult
    class HybridMultipleImagePickerSpec (line 62) | class HybridMultipleImagePickerSpec: public virtual HybridObject {
      method HybridMultipleImagePickerSpec (line 65) | explicit HybridMultipleImagePickerSpec(): HybridObject(TAG) { }
  type margelo::nitro::multipleimagepicker (line 25) | namespace margelo::nitro::multipleimagepicker { struct MediaPreview; }
    type NitroConfig (line 17) | struct NitroConfig
    type PickerResult (line 19) | struct PickerResult
    type NitroCropConfig (line 21) | struct NitroCropConfig
    type CropResult (line 23) | struct CropResult
    type MediaPreview (line 25) | struct MediaPreview
    type NitroPreviewConfig (line 27) | struct NitroPreviewConfig
    type NitroCameraConfig (line 29) | struct NitroCameraConfig
    type CameraResult (line 31) | struct CameraResult
    class HybridMultipleImagePickerSpec (line 62) | class HybridMultipleImagePickerSpec: public virtual HybridObject {
      method HybridMultipleImagePickerSpec (line 65) | explicit HybridMultipleImagePickerSpec(): HybridObject(TAG) { }
  type margelo::nitro::multipleimagepicker (line 27) | namespace margelo::nitro::multipleimagepicker { struct NitroPreviewConfi...
    type NitroConfig (line 17) | struct NitroConfig
    type PickerResult (line 19) | struct PickerResult
    type NitroCropConfig (line 21) | struct NitroCropConfig
    type CropResult (line 23) | struct CropResult
    type MediaPreview (line 25) | struct MediaPreview
    type NitroPreviewConfig (line 27) | struct NitroPreviewConfig
    type NitroCameraConfig (line 29) | struct NitroCameraConfig
    type CameraResult (line 31) | struct CameraResult
    class HybridMultipleImagePickerSpec (line 62) | class HybridMultipleImagePickerSpec: public virtual HybridObject {
      method HybridMultipleImagePickerSpec (line 65) | explicit HybridMultipleImagePickerSpec(): HybridObject(TAG) { }
  type margelo::nitro::multipleimagepicker (line 29) | namespace margelo::nitro::multipleimagepicker { struct NitroCameraConfig; }
    type NitroConfig (line 17) | struct NitroConfig
    type PickerResult (line 19) | struct PickerResult
    type NitroCropConfig (line 21) | struct NitroCropConfig
    type CropResult (line 23) | struct CropResult
    type MediaPreview (line 25) | struct MediaPreview
    type NitroPreviewConfig (line 27) | struct NitroPreviewConfig
    type NitroCameraConfig (line 29) | struct NitroCameraConfig
    type CameraResult (line 31) | struct CameraResult
    class HybridMultipleImagePickerSpec (line 62) | class HybridMultipleImagePickerSpec: public virtual HybridObject {
      method HybridMultipleImagePickerSpec (line 65) | explicit HybridMultipleImagePickerSpec(): HybridObject(TAG) { }
  type margelo::nitro::multipleimagepicker (line 31) | namespace margelo::nitro::multipleimagepicker { struct CameraResult; }
    type NitroConfig (line 17) | struct NitroConfig
    type PickerResult (line 19) | struct PickerResult
    type NitroCropConfig (line 21) | struct NitroCropConfig
    type CropResult (line 23) | struct CropResult
    type MediaPreview (line 25) | struct MediaPreview
    type NitroPreviewConfig (line 27) | struct NitroPreviewConfig
    type NitroCameraConfig (line 29) | struct NitroCameraConfig
    type CameraResult (line 31) | struct CameraResult
    class HybridMultipleImagePickerSpec (line 62) | class HybridMultipleImagePickerSpec: public virtual HybridObject {
      method HybridMultipleImagePickerSpec (line 65) | explicit HybridMultipleImagePickerSpec(): HybridObject(TAG) { }
  type margelo::nitro::multipleimagepicker (line 45) | namespace margelo::nitro::multipleimagepicker {
    type NitroConfig (line 17) | struct NitroConfig
    type PickerResult (line 19) | struct PickerResult
    type NitroCropConfig (line 21) | struct NitroCropConfig
    type CropResult (line 23) | struct CropResult
    type MediaPreview (line 25) | struct MediaPreview
    type NitroPreviewConfig (line 27) | struct NitroPreviewConfig
    type NitroCameraConfig (line 29) | struct NitroCameraConfig
    type CameraResult (line 31) | struct CameraResult
    class HybridMultipleImagePickerSpec (line 62) | class HybridMultipleImagePickerSpec: public virtual HybridObject {
      method HybridMultipleImagePickerSpec (line 65) | explicit HybridMultipleImagePickerSpec(): HybridObject(TAG) { }

FILE: nitrogen/generated/shared/c++/Language.hpp
  type margelo::nitro::multipleimagepicker (line 26) | namespace margelo::nitro::multipleimagepicker {
    type Language (line 31) | enum class Language {
  type margelo::nitro (line 49) | namespace margelo::nitro {
    type JSIConverter<Language> (line 55) | struct JSIConverter<Language> final {
      method Language (line 56) | static inline Language fromJSI(jsi::Runtime& runtime, const jsi::Val...
      method toJSI (line 76) | static inline jsi::Value toJSI(jsi::Runtime& runtime, Language arg) {
      method canConvert (line 96) | static inline bool canConvert(jsi::Runtime& runtime, const jsi::Valu...

FILE: nitrogen/generated/shared/c++/MediaPreview.hpp
  type margelo::nitro::multipleimagepicker (line 22) | namespace margelo::nitro::multipleimagepicker { enum class ResultType; }
    type ResultType (line 22) | enum class ResultType
    type MediaPreview (line 33) | struct MediaPreview {
      method MediaPreview (line 41) | MediaPreview() = default;
      method MediaPreview (line 42) | explicit MediaPreview(ResultType type, std::optional<std::string> pa...
  type margelo::nitro::multipleimagepicker (line 28) | namespace margelo::nitro::multipleimagepicker {
    type ResultType (line 22) | enum class ResultType
    type MediaPreview (line 33) | struct MediaPreview {
      method MediaPreview (line 41) | MediaPreview() = default;
      method MediaPreview (line 42) | explicit MediaPreview(ResultType type, std::optional<std::string> pa...
  type margelo::nitro (line 47) | namespace margelo::nitro {
    type JSIConverter<MediaPreview> (line 53) | struct JSIConverter<MediaPreview> final {
      method MediaPreview (line 54) | static inline MediaPreview fromJSI(jsi::Runtime& runtime, const jsi:...
      method toJSI (line 63) | static inline jsi::Value toJSI(jsi::Runtime& runtime, const MediaPre...
      method canConvert (line 71) | static inline bool canConvert(jsi::Runtime& runtime, const jsi::Valu...

FILE: nitrogen/generated/shared/c++/MediaType.hpp
  type margelo::nitro::multipleimagepicker (line 26) | namespace margelo::nitro::multipleimagepicker {
    type MediaType (line 31) | enum class MediaType {
  type margelo::nitro (line 39) | namespace margelo::nitro {
    type JSIConverter<MediaType> (line 45) | struct JSIConverter<MediaType> final {
      method MediaType (line 46) | static inline MediaType fromJSI(jsi::Runtime& runtime, const jsi::Va...
      method toJSI (line 56) | static inline jsi::Value toJSI(jsi::Runtime& runtime, MediaType arg) {
      method canConvert (line 66) | static inline bool canConvert(jsi::Runtime& runtime, const jsi::Valu...

FILE: nitrogen/generated/shared/c++/NitroCameraConfig.hpp
  type margelo::nitro::multipleimagepicker (line 22) | namespace margelo::nitro::multipleimagepicker { enum class MediaType; }
    type MediaType (line 22) | enum class MediaType
    type Presentation (line 24) | enum class Presentation
    type Language (line 26) | enum class Language
    type PickerCropConfig (line 28) | struct PickerCropConfig
    type CameraDevice (line 30) | enum class CameraDevice
    type NitroCameraConfig (line 44) | struct NitroCameraConfig {
      method NitroCameraConfig (line 56) | NitroCameraConfig() = default;
      method NitroCameraConfig (line 57) | explicit NitroCameraConfig(MediaType mediaType, Presentation present...
  type margelo::nitro::multipleimagepicker (line 24) | namespace margelo::nitro::multipleimagepicker { enum class Presentation; }
    type MediaType (line 22) | enum class MediaType
    type Presentation (line 24) | enum class Presentation
    type Language (line 26) | enum class Language
    type PickerCropConfig (line 28) | struct PickerCropConfig
    type CameraDevice (line 30) | enum class CameraDevice
    type NitroCameraConfig (line 44) | struct NitroCameraConfig {
      method NitroCameraConfig (line 56) | NitroCameraConfig() = default;
      method NitroCameraConfig (line 57) | explicit NitroCameraConfig(MediaType mediaType, Presentation present...
  type margelo::nitro::multipleimagepicker (line 26) | namespace margelo::nitro::multipleimagepicker { enum class Language; }
    type MediaType (line 22) | enum class MediaType
    type Presentation (line 24) | enum class Presentation
    type Language (line 26) | enum class Language
    type PickerCropConfig (line 28) | struct PickerCropConfig
    type CameraDevice (line 30) | enum class CameraDevice
    type NitroCameraConfig (line 44) | struct NitroCameraConfig {
      method NitroCameraConfig (line 56) | NitroCameraConfig() = default;
      method NitroCameraConfig (line 57) | explicit NitroCameraConfig(MediaType mediaType, Presentation present...
  type margelo::nitro::multipleimagepicker (line 28) | namespace margelo::nitro::multipleimagepicker { struct PickerCropConfig; }
    type MediaType (line 22) | enum class MediaType
    type Presentation (line 24) | enum class Presentation
    type Language (line 26) | enum class Language
    type PickerCropConfig (line 28) | struct PickerCropConfig
    type CameraDevice (line 30) | enum class CameraDevice
    type NitroCameraConfig (line 44) | struct NitroCameraConfig {
      method NitroCameraConfig (line 56) | NitroCameraConfig() = default;
      method NitroCameraConfig (line 57) | explicit NitroCameraConfig(MediaType mediaType, Presentation present...
  type margelo::nitro::multipleimagepicker (line 30) | namespace margelo::nitro::multipleimagepicker { enum class CameraDevice; }
    type MediaType (line 22) | enum class MediaType
    type Presentation (line 24) | enum class Presentation
    type Language (line 26) | enum class Language
    type PickerCropConfig (line 28) | struct PickerCropConfig
    type CameraDevice (line 30) | enum class CameraDevice
    type NitroCameraConfig (line 44) | struct NitroCameraConfig {
      method NitroCameraConfig (line 56) | NitroCameraConfig() = default;
      method NitroCameraConfig (line 57) | explicit NitroCameraConfig(MediaType mediaType, Presentation present...
  type margelo::nitro::multipleimagepicker (line 39) | namespace margelo::nitro::multipleimagepicker {
    type MediaType (line 22) | enum class MediaType
    type Presentation (line 24) | enum class Presentation
    type Language (line 26) | enum class Language
    type PickerCropConfig (line 28) | struct PickerCropConfig
    type CameraDevice (line 30) | enum class CameraDevice
    type NitroCameraConfig (line 44) | struct NitroCameraConfig {
      method NitroCameraConfig (line 56) | NitroCameraConfig() = default;
      method NitroCameraConfig (line 57) | explicit NitroCameraConfig(MediaType mediaType, Presentation present...
  type margelo::nitro (line 62) | namespace margelo::nitro {
    type JSIConverter<NitroCameraConfig> (line 68) | struct JSIConverter<NitroCameraConfig> final {
      method NitroCameraConfig (line 69) | static inline NitroCameraConfig fromJSI(jsi::Runtime& runtime, const...
      method toJSI (line 82) | static inline jsi::Value toJSI(jsi::Runtime& runtime, const NitroCam...
      method canConvert (line 94) | static inline bool canConvert(jsi::Runtime& runtime, const jsi::Valu...

FILE: nitrogen/generated/shared/c++/NitroConfig.hpp
  type margelo::nitro::multipleimagepicker (line 22) | namespace margelo::nitro::multipleimagepicker { enum class MediaType; }
    type MediaType (line 22) | enum class MediaType
    type PickerResult (line 24) | struct PickerResult
    type SelectBoxStyle (line 26) | enum class SelectBoxStyle
    type SelectMode (line 28) | enum class SelectMode
    type PickerCropConfig (line 30) | struct PickerCropConfig
    type Text (line 32) | struct Text
    type Language (line 34) | enum class Language
    type Theme (line 36) | enum class Theme
    type Presentation (line 38) | enum class Presentation
    type PickerCameraConfig (line 40) | struct PickerCameraConfig
    type NitroConfig (line 60) | struct NitroConfig {
      method NitroConfig (line 90) | NitroConfig() = default;
      method NitroConfig (line 91) | explicit NitroConfig(MediaType mediaType, std::vector<PickerResult> ...
  type margelo::nitro::multipleimagepicker (line 24) | namespace margelo::nitro::multipleimagepicker { struct PickerResult; }
    type MediaType (line 22) | enum class MediaType
    type PickerResult (line 24) | struct PickerResult
    type SelectBoxStyle (line 26) | enum class SelectBoxStyle
    type SelectMode (line 28) | enum class SelectMode
    type PickerCropConfig (line 30) | struct PickerCropConfig
    type Text (line 32) | struct Text
    type Language (line 34) | enum class Language
    type Theme (line 36) | enum class Theme
    type Presentation (line 38) | enum class Presentation
    type PickerCameraConfig (line 40) | struct PickerCameraConfig
    type NitroConfig (line 60) | struct NitroConfig {
      method NitroConfig (line 90) | NitroConfig() = default;
      method NitroConfig (line 91) | explicit NitroConfig(MediaType mediaType, std::vector<PickerResult> ...
  type margelo::nitro::multipleimagepicker (line 26) | namespace margelo::nitro::multipleimagepicker { enum class SelectBoxStyl...
    type MediaType (line 22) | enum class MediaType
    type PickerResult (line 24) | struct PickerResult
    type SelectBoxStyle (line 26) | enum class SelectBoxStyle
    type SelectMode (line 28) | enum class SelectMode
    type PickerCropConfig (line 30) | struct PickerCropConfig
    type Text (line 32) | struct Text
    type Language (line 34) | enum class Language
    type Theme (line 36) | enum class Theme
    type Presentation (line 38) | enum class Presentation
    type PickerCameraConfig (line 40) | struct PickerCameraConfig
    type NitroConfig (line 60) | struct NitroConfig {
      method NitroConfig (line 90) | NitroConfig() = default;
      method NitroConfig (line 91) | explicit NitroConfig(MediaType mediaType, std::vector<PickerResult> ...
  type margelo::nitro::multipleimagepicker (line 28) | namespace margelo::nitro::multipleimagepicker { enum class SelectMode; }
    type MediaType (line 22) | enum class MediaType
    type PickerResult (line 24) | struct PickerResult
    type SelectBoxStyle (line 26) | enum class SelectBoxStyle
    type SelectMode (line 28) | enum class SelectMode
    type PickerCropConfig (line 30) | struct PickerCropConfig
    type Text (line 32) | struct Text
    type Language (line 34) | enum class Language
    type Theme (line 36) | enum class Theme
    type Presentation (line 38) | enum class Presentation
    type PickerCameraConfig (line 40) | struct PickerCameraConfig
    type NitroConfig (line 60) | struct NitroConfig {
      method NitroConfig (line 90) | NitroConfig() = default;
      method NitroConfig (line 91) | explicit NitroConfig(MediaType mediaType, std::vector<PickerResult> ...
  type margelo::nitro::multipleimagepicker (line 30) | namespace margelo::nitro::multipleimagepicker { struct PickerCropConfig; }
    type MediaType (line 22) | enum class MediaType
    type PickerResult (line 24) | struct PickerResult
    type SelectBoxStyle (line 26) | enum class SelectBoxStyle
    type SelectMode (line 28) | enum class SelectMode
    type PickerCropConfig (line 30) | struct PickerCropConfig
    type Text (line 32) | struct Text
    type Language (line 34) | enum class Language
    type Theme (line 36) | enum class Theme
    type Presentation (line 38) | enum class Presentation
    type PickerCameraConfig (line 40) | struct PickerCameraConfig
    type NitroConfig (line 60) | struct NitroConfig {
      method NitroConfig (line 90) | NitroConfig() = default;
      method NitroConfig (line 91) | explicit NitroConfig(MediaType mediaType, std::vector<PickerResult> ...
  type margelo::nitro::multipleimagepicker (line 32) | namespace margelo::nitro::multipleimagepicker { struct Text; }
    type MediaType (line 22) | enum class MediaType
    type PickerResult (line 24) | struct PickerResult
    type SelectBoxStyle (line 26) | enum class SelectBoxStyle
    type SelectMode (line 28) | enum class SelectMode
    type PickerCropConfig (line 30) | struct PickerCropConfig
    type Text (line 32) | struct Text
    type Language (line 34) | enum class Language
    type Theme (line 36) | enum class Theme
    type Presentation (line 38) | enum class Presentation
    type PickerCameraConfig (line 40) | struct PickerCameraConfig
    type NitroConfig (line 60) | struct NitroConfig {
      method NitroConfig (line 90) | NitroConfig() = default;
      method NitroConfig (line 91) | explicit NitroConfig(MediaType mediaType, std::vector<PickerResult> ...
  type margelo::nitro::multipleimagepicker (line 34) | namespace margelo::nitro::multipleimagepicker { enum class Language; }
    type MediaType (line 22) | enum class MediaType
    type PickerResult (line 24) | struct PickerResult
    type SelectBoxStyle (line 26) | enum class SelectBoxStyle
    type SelectMode (line 28) | enum class SelectMode
    type PickerCropConfig (line 30) | struct PickerCropConfig
    type Text (line 32) | struct Text
    type Language (line 34) | enum class Language
    type Theme (line 36) | enum class Theme
    type Presentation (line 38) | enum class Presentation
    type PickerCameraConfig (line 40) | struct PickerCameraConfig
    type NitroConfig (line 60) | struct NitroConfig {
      method NitroConfig (line 90) | NitroConfig() = default;
      method NitroConfig (line 91) | explicit NitroConfig(MediaType mediaType, std::vector<PickerResult> ...
  type margelo::nitro::multipleimagepicker (line 36) | namespace margelo::nitro::multipleimagepicker { enum class Theme; }
    type MediaType (line 22) | enum class MediaType
    type PickerResult (line 24) | struct PickerResult
    type SelectBoxStyle (line 26) | enum class SelectBoxStyle
    type SelectMode (line 28) | enum class SelectMode
    type PickerCropConfig (line 30) | struct PickerCropConfig
    type Text (line 32) | struct Text
    type Language (line 34) | enum class Language
    type Theme (line 36) | enum class Theme
    type Presentation (line 38) | enum class Presentation
    type PickerCameraConfig (line 40) | struct PickerCameraConfig
    type NitroConfig (line 60) | struct NitroConfig {
      method NitroConfig (line 90) | NitroConfig() = default;
      method NitroConfig (line 91) | explicit NitroConfig(MediaType mediaType, std::vector<PickerResult> ...
  type margelo::nitro::multipleimagepicker (line 38) | namespace margelo::nitro::multipleimagepicker { enum class Presentation; }
    type MediaType (line 22) | enum class MediaType
    type PickerResult (line 24) | struct PickerResult
    type SelectBoxStyle (line 26) | enum class SelectBoxStyle
    type SelectMode (line 28) | enum class SelectMode
    type PickerCropConfig (line 30) | struct PickerCropConfig
    type Text (line 32) | struct Text
    type Language (line 34) | enum class Language
    type Theme (line 36) | enum class Theme
    type Presentation (line 38) | enum class Presentation
    type PickerCameraConfig (line 40) | struct PickerCameraConfig
    type NitroConfig (line 60) | struct NitroConfig {
      method NitroConfig (line 90) | NitroConfig() = default;
      method NitroConfig (line 91) | explicit NitroConfig(MediaType mediaType, std::vector<PickerResult> ...
  type margelo::nitro::multipleimagepicker (line 40) | namespace margelo::nitro::multipleimagepicker { struct PickerCameraConfi...
    type MediaType (line 22) | enum class MediaType
    type PickerResult (line 24) | struct PickerResult
    type SelectBoxStyle (line 26) | enum class SelectBoxStyle
    type SelectMode (line 28) | enum class SelectMode
    type PickerCropConfig (line 30) | struct PickerCropConfig
    type Text (line 32) | struct Text
    type Language (line 34) | enum class Language
    type Theme (line 36) | enum class Theme
    type Presentation (line 38) | enum class Presentation
    type PickerCameraConfig (line 40) | struct PickerCameraConfig
    type NitroConfig (line 60) | struct NitroConfig {
      method NitroConfig (line 90) | NitroConfig() = default;
      method NitroConfig (line 91) | explicit NitroConfig(MediaType mediaType, std::vector<PickerResult> ...
  type margelo::nitro::multipleimagepicker (line 55) | namespace margelo::nitro::multipleimagepicker {
    type MediaType (line 22) | enum class MediaType
    type PickerResult (line 24) | struct PickerResult
    type SelectBoxStyle (line 26) | enum class SelectBoxStyle
    type SelectMode (line 28) | enum class SelectMode
    type PickerCropConfig (line 30) | struct PickerCropConfig
    type Text (line 32) | struct Text
    type Language (line 34) | enum class Language
    type Theme (line 36) | enum class Theme
    type Presentation (line 38) | enum class Presentation
    type PickerCameraConfig (line 40) | struct PickerCameraConfig
    type NitroConfig (line 60) | struct NitroConfig {
      method NitroConfig (line 90) | NitroConfig() = default;
      method NitroConfig (line 91) | explicit NitroConfig(MediaType mediaType, std::vector<PickerResult> ...
  type margelo::nitro (line 96) | namespace margelo::nitro {
    type JSIConverter<NitroConfig> (line 102) | struct JSIConverter<NitroConfig> final {
      method NitroConfig (line 103) | static inline NitroConfig fromJSI(jsi::Runtime& runtime, const jsi::...
      method toJSI (line 134) | static inline jsi::Value toJSI(jsi::Runtime& runtime, const NitroCon...
      method canConvert (line 164) | static inline bool canConvert(jsi::Runtime& runtime, const jsi::Valu...

FILE: nitrogen/generated/shared/c++/NitroCropConfig.hpp
  type margelo::nitro::multipleimagepicker (line 22) | namespace margelo::nitro::multipleimagepicker { enum class Language; }
    type Language (line 22) | enum class Language
    type Presentation (line 24) | enum class Presentation
    type CropRatio (line 26) | struct CropRatio
    type NitroCropConfig (line 39) | struct NitroCropConfig {
      method NitroCropConfig (line 49) | NitroCropConfig() = default;
      method NitroCropConfig (line 50) | explicit NitroCropConfig(Language language, Presentation presentatio...
  type margelo::nitro::multipleimagepicker (line 24) | namespace margelo::nitro::multipleimagepicker { enum class Presentation; }
    type Language (line 22) | enum class Language
    type Presentation (line 24) | enum class Presentation
    type CropRatio (line 26) | struct CropRatio
    type NitroCropConfig (line 39) | struct NitroCropConfig {
      method NitroCropConfig (line 49) | NitroCropConfig() = default;
      method NitroCropConfig (line 50) | explicit NitroCropConfig(Language language, Presentation presentatio...
  type margelo::nitro::multipleimagepicker (line 26) | namespace margelo::nitro::multipleimagepicker { struct CropRatio; }
    type Language (line 22) | enum class Language
    type Presentation (line 24) | enum class Presentation
    type CropRatio (line 26) | struct CropRatio
    type NitroCropConfig (line 39) | struct NitroCropConfig {
      method NitroCropConfig (line 49) | NitroCropConfig() = default;
      method NitroCropConfig (line 50) | explicit NitroCropConfig(Language language, Presentation presentatio...
  type margelo::nitro::multipleimagepicker (line 34) | namespace margelo::nitro::multipleimagepicker {
    type Language (line 22) | enum class Language
    type Presentation (line 24) | enum class Presentation
    type CropRatio (line 26) | struct CropRatio
    type NitroCropConfig (line 39) | struct NitroCropConfig {
      method NitroCropConfig (line 49) | NitroCropConfig() = default;
      method NitroCropConfig (line 50) | explicit NitroCropConfig(Language language, Presentation presentatio...
  type margelo::nitro (line 55) | namespace margelo::nitro {
    type JSIConverter<NitroCropConfig> (line 61) | struct JSIConverter<NitroCropConfig> final {
      method NitroCropConfig (line 62) | static inline NitroCropConfig fromJSI(jsi::Runtime& runtime, const j...
      method toJSI (line 73) | static inline jsi::Value toJSI(jsi::Runtime& runtime, const NitroCro...
      method canConvert (line 83) | static inline bool canConvert(jsi::Runtime& runtime, const jsi::Valu...

FILE: nitrogen/generated/shared/c++/NitroPreviewConfig.hpp
  type margelo::nitro::multipleimagepicker (line 22) | namespace margelo::nitro::multipleimagepicker { enum class Language; }
    type Language (line 22) | enum class Language
    type NitroPreviewConfig (line 32) | struct NitroPreviewConfig {
      method NitroPreviewConfig (line 38) | NitroPreviewConfig() = default;
      method NitroPreviewConfig (line 39) | explicit NitroPreviewConfig(Language language, std::optional<bool> v...
  type margelo::nitro::multipleimagepicker (line 27) | namespace margelo::nitro::multipleimagepicker {
    type Language (line 22) | enum class Language
    type NitroPreviewConfig (line 32) | struct NitroPreviewConfig {
      method NitroPreviewConfig (line 38) | NitroPreviewConfig() = default;
      method NitroPreviewConfig (line 39) | explicit NitroPreviewConfig(Language language, std::optional<bool> v...
  type margelo::nitro (line 44) | namespace margelo::nitro {
    type JSIConverter<NitroPreviewConfig> (line 50) | struct JSIConverter<NitroPreviewConfig> final {
      method NitroPreviewConfig (line 51) | static inline NitroPreviewConfig fromJSI(jsi::Runtime& runtime, cons...
      method toJSI (line 58) | static inline jsi::Value toJSI(jsi::Runtime& runtime, const NitroPre...
      method canConvert (line 64) | static inline bool canConvert(jsi::Runtime& runtime, const jsi::Valu...

FILE: nitrogen/generated/shared/c++/PickerCameraConfig.hpp
  type margelo::nitro::multipleimagepicker (line 22) | namespace margelo::nitro::multipleimagepicker { enum class CameraDevice; }
    type CameraDevice (line 22) | enum class CameraDevice
    type PickerCameraConfig (line 32) | struct PickerCameraConfig {
      method PickerCameraConfig (line 38) | PickerCameraConfig() = default;
      method PickerCameraConfig (line 39) | explicit PickerCameraConfig(std::optional<CameraDevice> cameraDevice...
  type margelo::nitro::multipleimagepicker (line 27) | namespace margelo::nitro::multipleimagepicker {
    type CameraDevice (line 22) | enum class CameraDevice
    type PickerCameraConfig (line 32) | struct PickerCameraConfig {
      method PickerCameraConfig (line 38) | PickerCameraConfig() = default;
      method PickerCameraConfig (line 39) | explicit PickerCameraConfig(std::optional<CameraDevice> cameraDevice...
  type margelo::nitro (line 44) | namespace margelo::nitro {
    type JSIConverter<PickerCameraConfig> (line 50) | struct JSIConverter<PickerCameraConfig> final {
      method PickerCameraConfig (line 51) | static inline PickerCameraConfig fromJSI(jsi::Runtime& runtime, cons...
      method toJSI (line 58) | static inline jsi::Value toJSI(jsi::Runtime& runtime, const PickerCa...
      method canConvert (line 64) | static inline bool canConvert(jsi::Runtime& runtime, const jsi::Valu...

FILE: nitrogen/generated/shared/c++/PickerCropConfig.hpp
  type margelo::nitro::multipleimagepicker (line 22) | namespace margelo::nitro::multipleimagepicker { struct CropRatio; }
    type CropRatio (line 22) | struct CropRatio
    type PickerCropConfig (line 33) | struct PickerCropConfig {
      method PickerCropConfig (line 41) | PickerCropConfig() = default;
      method PickerCropConfig (line 42) | explicit PickerCropConfig(std::optional<bool> circle, std::vector<Cr...
  type margelo::nitro::multipleimagepicker (line 28) | namespace margelo::nitro::multipleimagepicker {
    type CropRatio (line 22) | struct CropRatio
    type PickerCropConfig (line 33) | struct PickerCropConfig {
      method PickerCropConfig (line 41) | PickerCropConfig() = default;
      method PickerCropConfig (line 42) | explicit PickerCropConfig(std::optional<bool> circle, std::vector<Cr...
  type margelo::nitro (line 47) | namespace margelo::nitro {
    type JSIConverter<PickerCropConfig> (line 53) | struct JSIConverter<PickerCropConfig> final {
      method PickerCropConfig (line 54) | static inline PickerCropConfig fromJSI(jsi::Runtime& runtime, const ...
      method toJSI (line 63) | static inline jsi::Value toJSI(jsi::Runtime& runtime, const PickerCr...
      method canConvert (line 71) | static inline bool canConvert(jsi::Runtime& runtime, const jsi::Valu...

FILE: nitrogen/generated/shared/c++/PickerResult.hpp
  type margelo::nitro::multipleimagepicker (line 22) | namespace margelo::nitro::multipleimagepicker { enum class ResultType; }
    type ResultType (line 22) | enum class ResultType
    type PickerResult (line 33) | struct PickerResult {
      method PickerResult (line 52) | PickerResult() = default;
      method PickerResult (line 53) | explicit PickerResult(std::string localIdentifier, double width, dou...
  type margelo::nitro::multipleimagepicker (line 28) | namespace margelo::nitro::multipleimagepicker {
    type ResultType (line 22) | enum class ResultType
    type PickerResult (line 33) | struct PickerResult {
      method PickerResult (line 52) | PickerResult() = default;
      method PickerResult (line 53) | explicit PickerResult(std::string localIdentifier, double width, dou...
  type margelo::nitro (line 58) | namespace margelo::nitro {
    type JSIConverter<PickerResult> (line 64) | struct JSIConverter<PickerResult> final {
      method PickerResult (line 65) | static inline PickerResult fromJSI(jsi::Runtime& runtime, const jsi:...
      method toJSI (line 85) | static inline jsi::Value toJSI(jsi::Runtime& runtime, const PickerRe...
      method canConvert (line 104) | static inline bool canConvert(jsi::Runtime& runtime, const jsi::Valu...

FILE: nitrogen/generated/shared/c++/Presentation.hpp
  type margelo::nitro::multipleimagepicker (line 26) | namespace margelo::nitro::multipleimagepicker {
    type Presentation (line 31) | enum class Presentation {
  type margelo::nitro (line 38) | namespace margelo::nitro {
    type JSIConverter<Presentation> (line 44) | struct JSIConverter<Presentation> final {
      method Presentation (line 45) | static inline Presentation fromJSI(jsi::Runtime& runtime, const jsi:...
      method toJSI (line 54) | static inline jsi::Value toJSI(jsi::Runtime& runtime, Presentation a...
      method canConvert (line 63) | static inline bool canConvert(jsi::Runtime& runtime, const jsi::Valu...

FILE: nitrogen/generated/shared/c++/ResultType.hpp
  type margelo::nitro::multipleimagepicker (line 26) | namespace margelo::nitro::multipleimagepicker {
    type ResultType (line 31) | enum class ResultType {
  type margelo::nitro (line 38) | namespace margelo::nitro {
    type JSIConverter<ResultType> (line 44) | struct JSIConverter<ResultType> final {
      method ResultType (line 45) | static inline ResultType fromJSI(jsi::Runtime& runtime, const jsi::V...
      method toJSI (line 54) | static inline jsi::Value toJSI(jsi::Runtime& runtime, ResultType arg) {
      method canConvert (line 63) | static inline bool canConvert(jsi::Runtime& runtime, const jsi::Valu...

FILE: nitrogen/generated/shared/c++/SelectBoxStyle.hpp
  type margelo::nitro::multipleimagepicker (line 26) | namespace margelo::nitro::multipleimagepicker {
    type SelectBoxStyle (line 31) | enum class SelectBoxStyle {
  type margelo::nitro (line 38) | namespace margelo::nitro {
    type JSIConverter<SelectBoxStyle> (line 44) | struct JSIConverter<SelectBoxStyle> final {
      method SelectBoxStyle (line 45) | static inline SelectBoxStyle fromJSI(jsi::Runtime& runtime, const js...
      method toJSI (line 54) | static inline jsi::Value toJSI(jsi::Runtime& runtime, SelectBoxStyle...
      method canConvert (line 63) | static inline bool canConvert(jsi::Runtime& runtime, const jsi::Valu...

FILE: nitrogen/generated/shared/c++/SelectMode.hpp
  type margelo::nitro::multipleimagepicker (line 26) | namespace margelo::nitro::multipleimagepicker {
    type SelectMode (line 31) | enum class SelectMode {
  type margelo::nitro (line 38) | namespace margelo::nitro {
    type JSIConverter<SelectMode> (line 44) | struct JSIConverter<SelectMode> final {
      method SelectMode (line 45) | static inline SelectMode fromJSI(jsi::Runtime& runtime, const jsi::V...
      method toJSI (line 54) | static inline jsi::Value toJSI(jsi::Runtime& runtime, SelectMode arg) {
      method canConvert (line 63) | static inline bool canConvert(jsi::Runtime& runtime, const jsi::Valu...

FILE: nitrogen/generated/shared/c++/Text.hpp
  type margelo::nitro::multipleimagepicker (line 26) | namespace margelo::nitro::multipleimagepicker {
    type Text (line 31) | struct Text {
      method Text (line 39) | Text() = default;
      method Text (line 40) | explicit Text(std::optional<std::string> finish, std::optional<std::...
  type margelo::nitro (line 45) | namespace margelo::nitro {
    type JSIConverter<Text> (line 51) | struct JSIConverter<Text> final {
      method Text (line 52) | static inline Text fromJSI(jsi::Runtime& runtime, const jsi::Value& ...
      method toJSI (line 61) | static inline jsi::Value toJSI(jsi::Runtime& runtime, const Text& ar...
      method canConvert (line 69) | static inline bool canConvert(jsi::Runtime& runtime, const jsi::Valu...

FILE: nitrogen/generated/shared/c++/Theme.hpp
  type margelo::nitro::multipleimagepicker (line 26) | namespace margelo::nitro::multipleimagepicker {
    type Theme (line 31) | enum class Theme {
  type margelo::nitro (line 38) | namespace margelo::nitro {
    type JSIConverter<Theme> (line 44) | struct JSIConverter<Theme> final {
      method Theme (line 45) | static inline Theme fromJSI(jsi::Runtime& runtime, const jsi::Value&...
      method toJSI (line 54) | static inline jsi::Value toJSI(jsi::Runtime& runtime, Theme arg) {
      method canConvert (line 63) | static inline bool canConvert(jsi::Runtime& runtime, const jsi::Valu...

FILE: src/index.ts
  type IPromisePicker (line 31) | type IPromisePicker<T extends Config> = T['selectMode'] extends 'single'
  function openPicker (line 35) | async function openPicker<T extends Config>(
  function openCropper (line 68) | async function openCropper(
  function openPreview (line 97) | function openPreview(
  function openCamera (line 124) | async function openCamera(config?: CameraConfig): Promise<CameraResult> {
  constant DEFAULT_COUNT (line 159) | const DEFAULT_COUNT = 20
  constant LANGUAGES (line 193) | const LANGUAGES = [

FILE: src/specs/MultipleImagePicker.nitro.ts
  type MultipleImagePicker (line 13) | interface MultipleImagePicker

FILE: src/types/camera.ts
  type CameraDevice (line 6) | type CameraDevice = 'front' | 'back'
  type PickerCameraConfig (line 8) | type PickerCameraConfig = {
  type NitroCameraConfig (line 22) | interface NitroCameraConfig extends PickerCameraConfig {
  type CameraConfig (line 40) | interface CameraConfig
  type CameraResult (line 136) | interface CameraResult extends BaseResult {

FILE: src/types/config.ts
  type Theme (line 1) | type Theme = 'light' | 'dark'
  type Presentation (line 3) | type Presentation = 'fullScreenModal' | 'formSheet'
  type Language (line 5) | type Language =
  type MediaType (line 20) | type MediaType = 'video' | 'image' | 'all'

FILE: src/types/crop.ts
  type CropRatio (line 3) | type CropRatio = { title?: string; width: number; height: number }
  type PickerCropConfig (line 9) | type PickerCropConfig = {
  type NitroCropConfig (line 33) | interface NitroCropConfig extends PickerCropConfig {
  type CropConfig (line 43) | interface CropConfig
  type CropResult (line 90) | interface CropResult {

FILE: src/types/error.ts
  type MultipleImagePickerError (line 1) | enum MultipleImagePickerError {
  type CameraError (line 5) | enum CameraError {

FILE: src/types/picker.ts
  type SelectBoxStyle (line 7) | type SelectBoxStyle = 'number' | 'tick'
  type SelectMode (line 9) | type SelectMode = 'single' | 'multiple'
  type Text (line 15) | interface Text {
  type NitroConfig (line 30) | interface NitroConfig {
  type Config (line 221) | interface Config

FILE: src/types/preview.ts
  type NitroPreviewConfig (line 5) | type NitroPreviewConfig = {
  type PreviewConfig (line 16) | interface PreviewConfig
  type MediaPreview (line 43) | interface MediaPreview {

FILE: src/types/result.ts
  type ResultType (line 7) | type ResultType = 'image' | 'video'
  type BaseResult (line 22) | interface BaseResult {
  type PickerResult (line 88) | interface PickerResult extends BaseResult {
Condensed preview — 239 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (581K chars).
[
  {
    "path": ".circleci/config.yml",
    "chars": 2150,
    "preview": "version: 2.1\n\nexecutors:\n  default:\n    docker:\n      - image: circleci/node:10\n    working_directory: ~/project\n\ncomman"
  },
  {
    "path": ".github/FUNDING.yml",
    "chars": 667,
    "preview": "# These are supported funding model platforms\n\ngithub: baronha\npatreon: baronha\nopen_collective: # Replace with a single"
  },
  {
    "path": ".github/workflows/docs.yml",
    "chars": 1235,
    "preview": "name: Deploy to GitHub Pages\n\non:\n  push:\n    branches:\n      - main\n    paths:\n      - 'docs/**'\n      \njobs:\n  build:\n"
  },
  {
    "path": ".gitignore",
    "chars": 749,
    "preview": "# OSX\n#\n.DS_Store\n\n# XDE\n.expo/\n\n# VSCode\n.vscode/\njsconfig.json\n\n# Xcode\n#\nbuild/\n*.pbxuser\n!default.pbxuser\n*.mode1v3\n"
  },
  {
    "path": ".npmignore",
    "chars": 62,
    "preview": "example/\nfiles/\nnode_modules/\nnpm-debug.log\npackage-lock.json\n"
  },
  {
    "path": "CONTRIBUTING.md",
    "chars": 8566,
    "preview": "# Contributing\n\nWe want this community to be friendly and respectful to each other. Please follow it in all your interac"
  },
  {
    "path": "LICENSE",
    "chars": 1066,
    "preview": "MIT License\n\nCopyright (c) 2020 Baron Ha.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\n"
  },
  {
    "path": "MultipleImagePicker.podspec",
    "chars": 1821,
    "preview": "require \"json\"\n\npackage = JSON.parse(File.read(File.join(__dir__, \"package.json\")))\n\nPod::Spec.new do |s|\n  s.name      "
  },
  {
    "path": "README.md",
    "chars": 7097,
    "preview": "![Logo][Logo]\n\n<p align=\"center\">\n  <img src=\"./files/banner.png\" width=\"100%\">\n</p>\n\n[![iOS][iOS]][iOS-URL] [![Android]"
  },
  {
    "path": "android/CMakeLists.txt",
    "chars": 688,
    "preview": "project(MultipleImagePicker)\ncmake_minimum_required(VERSION 3.9.0)\n\nset (PACKAGE_NAME MultipleImagePicker)\nset (CMAKE_VE"
  },
  {
    "path": "android/build.gradle",
    "chars": 4501,
    "preview": "buildscript {\n    repositories {\n        google()\n        mavenCentral()\n    }\n\n    dependencies {\n        classpath \"co"
  },
  {
    "path": "android/gradle.properties",
    "chars": 204,
    "preview": "MultipleImagePicker_kotlinVersion=1.9.24\nMultipleImagePicker_minSdkVersion=23\nMultipleImagePicker_targetSdkVersion=34\nMu"
  },
  {
    "path": "android/src/main/AndroidManifest.xml",
    "chars": 1364,
    "preview": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\" xmlns:tools=\"http://schemas.android.com/tools\">\n   "
  },
  {
    "path": "android/src/main/cpp/cpp-adapter.cpp",
    "chars": 178,
    "preview": "#include <jni.h>\n#include \"MultipleImagePickerOnLoad.hpp\"\n\nJNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void*) {\n  retu"
  },
  {
    "path": "android/src/main/java/com/margelo/nitro/multipleimagepicker/CameraEngine.kt",
    "chars": 1785,
    "preview": "package com.margelo.nitro.multipleimagepicker\n\nimport android.content.Context\nimport android.graphics.Color\nimport andro"
  },
  {
    "path": "android/src/main/java/com/margelo/nitro/multipleimagepicker/Constant.kt",
    "chars": 103,
    "preview": "package com.margelo.nitro.multipleimagepicker\n\nobject Constant {\n    const val TOOLBAR_TEXT_SIZE = 12\n}"
  },
  {
    "path": "android/src/main/java/com/margelo/nitro/multipleimagepicker/CropEngine.kt",
    "chars": 3530,
    "preview": "package com.margelo.nitro.multipleimagepicker\n\n\nimport android.content.Context\nimport android.graphics.Bitmap\nimport and"
  },
  {
    "path": "android/src/main/java/com/margelo/nitro/multipleimagepicker/ExoPlayerEngine.kt",
    "chars": 4407,
    "preview": "package com.margelo.nitro.multipleimagepicker\n\nimport android.content.Context\nimport android.net.Uri\nimport android.view"
  },
  {
    "path": "android/src/main/java/com/margelo/nitro/multipleimagepicker/GlideEngine.kt",
    "chars": 2489,
    "preview": "package com.margelo.nitro.multipleimagepicker\n\nimport android.content.Context\nimport android.widget.ImageView\nimport com"
  },
  {
    "path": "android/src/main/java/com/margelo/nitro/multipleimagepicker/ImageLoaderUtils.kt",
    "chars": 740,
    "preview": "package com.margelo.nitro.multipleimagepicker\n\nimport android.app.Activity\nimport android.content.Context\nimport android"
  },
  {
    "path": "android/src/main/java/com/margelo/nitro/multipleimagepicker/LoadingDialog.kt",
    "chars": 909,
    "preview": "package com.margelo.nitro.multipleimagepicker\n\n\nimport android.app.Dialog\nimport android.content.Context\nimport android."
  },
  {
    "path": "android/src/main/java/com/margelo/nitro/multipleimagepicker/MultipleImagePicker.kt",
    "chars": 1271,
    "preview": "package com.margelo.nitro.multipleimagepicker\n\nimport com.margelo.nitro.NitroModules\n\n\nclass MultipleImagePicker : Hybri"
  },
  {
    "path": "android/src/main/java/com/margelo/nitro/multipleimagepicker/MultipleImagePickerImp.kt",
    "chars": 25112,
    "preview": "package com.margelo.nitro.multipleimagepicker\n\nimport android.app.Activity\nimport android.content.Context\nimport android"
  },
  {
    "path": "android/src/main/java/com/margelo/nitro/multipleimagepicker/MultipleImagePickerPackage.java",
    "chars": 781,
    "preview": "package com.margelo.nitro.multipleimagepicker;\n\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable"
  },
  {
    "path": "android/src/main/java/com/margelo/nitro/multipleimagepicker/PictureSelectorEngineImp.kt",
    "chars": 2340,
    "preview": "package com.margelo.nitro.multipleimagepicker\n\nimport android.util.Log\nimport com.luck.picture.lib.basic.IBridgeLoaderFa"
  },
  {
    "path": "android/src/main/java/com/margelo/nitro/multipleimagepicker/VideoThumbnailEngine.kt",
    "chars": 2187,
    "preview": "package com.margelo.nitro.multipleimagepicker\n\nimport android.content.Context\nimport android.graphics.Bitmap\nimport andr"
  },
  {
    "path": "android/src/main/res/anim/anim_modal_in.xml",
    "chars": 543,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<set xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:inte"
  },
  {
    "path": "android/src/main/res/drawable/checkbox_selector.xml",
    "chars": 300,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item a"
  },
  {
    "path": "android/src/main/res/drawable/complete_button.xml",
    "chars": 330,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <solid and"
  },
  {
    "path": "android/src/main/res/drawable/ic_checkmark.xml",
    "chars": 1005,
    "preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n  "
  },
  {
    "path": "android/src/main/res/drawable/ic_down.xml",
    "chars": 397,
    "preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n  "
  },
  {
    "path": "android/src/main/res/drawable/num_oval.xml",
    "chars": 383,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:sha"
  },
  {
    "path": "android/src/main/res/drawable/picture_not_selected.xml",
    "chars": 327,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:sha"
  },
  {
    "path": "android/src/main/res/drawable/picture_selector.xml",
    "chars": 326,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector android:id=\"@+id/picture_selector\" xmlns:android=\"http://schemas.androi"
  },
  {
    "path": "android/src/main/res/drawable/preview_gallery_item.xml",
    "chars": 262,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <solid and"
  },
  {
    "path": "android/src/main/res/drawable/preview_gallery_white_bg.xml",
    "chars": 504,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layer-list xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item"
  },
  {
    "path": "android/src/main/res/layout/loading_dialog.xml",
    "chars": 559,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    andr"
  },
  {
    "path": "android/src/main/res/values/colors.xml",
    "chars": 939,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n  <color name=\"app_color_grey\">#393a3e</color>\n  <color name=\"app_col"
  },
  {
    "path": "android/src/main/res/values/styles.xml",
    "chars": 2819,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <style name=\"Base.Theme.NoActionBar\" parent=\"Theme.AppCompat.Lig"
  },
  {
    "path": "babel.config.js",
    "chars": 77,
    "preview": "module.exports = {\n  presets: ['module:metro-react-native-babel-preset'],\n};\n"
  },
  {
    "path": "docs/.gitignore",
    "chars": 233,
    "preview": "# Dependencies\n/node_modules\n\n# Production\n/build\n\n# Generated files\n.docusaurus\n.cache-loader\n\n# Misc\n.DS_Store\n.env.lo"
  },
  {
    "path": "docs/docs/CAMERA.mdx",
    "chars": 5422,
    "preview": "---\nid: camera\ntitle: Camera 📸\nsidebar_label: Camera 📸\nslug: /camera\n---\n\nimport ReactPlayer from 'react-player'\n\nThe ca"
  },
  {
    "path": "docs/docs/CONFIG.mdx",
    "chars": 6517,
    "preview": "---\nid: config\ntitle: Configuration\nsidebar_label: Configuration\nslug: /config\n---\n\n# Configuration\n\n### `selectMode`\n\nM"
  },
  {
    "path": "docs/docs/CROP.mdx",
    "chars": 1717,
    "preview": "---\nid: crop\ntitle: Crop 🍕\nsidebar_label: Crop 🍕\nslug: /crop\n---\n\n## Usage\n\n```typescript\nimport { openCropper } from '@"
  },
  {
    "path": "docs/docs/GETTING_STARTED.mdx",
    "chars": 3245,
    "preview": "---\nid: getting-started\ntitle: Getting Started\nsidebar_label: Getting Started\nsidebar_id: getting-started\nslug: /getting"
  },
  {
    "path": "docs/docs/PREVIEW.mdx",
    "chars": 2782,
    "preview": "---\nid: preview\ntitle: Preview 🎑\nsidebar_label: Preview 🎑\nslug: /preview\n---\n\nimport ReactPlayer from 'react-player'\n\n##"
  },
  {
    "path": "docs/docs/RESULT.mdx",
    "chars": 1516,
    "preview": "---\nid: result\ntitle: Result\nsidebar_label: Result\nslug: /result\n---\n\nThe result object returned for each selected media"
  },
  {
    "path": "docs/docs/SHOWCASE/index.mdx",
    "chars": 931,
    "preview": "---\nid: showcase\ntitle: Showcase ✨\nsidebar_label: Showcase ✨\nslug: /showcase\n---\n\nimport style from './showcase.css'\nimp"
  },
  {
    "path": "docs/docs/SHOWCASE/showcase.css",
    "chars": 984,
    "preview": ".showcaseContainer {\n  display: flex;\n  /* justify-content: space-between; */\n  flex-wrap: wrap;\n  gap: 20px;\n}\n\n.showca"
  },
  {
    "path": "docs/docs/SHOWCASE/showcase.json",
    "chars": 795,
    "preview": "[\n  {\n    \"banner\": \"https://github.com/user-attachments/assets/84ec6432-1557-4649-965c-6100d9c4c12d\",\n    \"title\": \"✨ B"
  },
  {
    "path": "docs/docs/USAGE.mdx",
    "chars": 757,
    "preview": "---\nid: usage\ntitle: Usage\nsidebar_label: Usage\nslug: /usage\n---\n\nHere is a simple usage of the Multiple Image Picker. <"
  },
  {
    "path": "docs/docs/index.md",
    "chars": 4016,
    "preview": "---\nid: index\ntitle: Multiple Image Picker | BAO HA\nhide_title: true\nsidebar_label: Multiple Image Picker\ndescription: 🏞"
  },
  {
    "path": "docs/docusaurus.config.ts",
    "chars": 4635,
    "preview": "import { themes as prismThemes } from 'prism-react-renderer'\nimport type { Config } from '@docusaurus/types'\nimport type"
  },
  {
    "path": "docs/package.json",
    "chars": 1365,
    "preview": "{\n  \"name\": \"docs\",\n  \"version\": \"2.2.6\",\n  \"private\": true,\n  \"scripts\": {\n    \"docusaurus\": \"docusaurus\",\n    \"start\":"
  },
  {
    "path": "docs/patches/@gorhom+docusaurus-preset+1.0.2.patch",
    "chars": 1373,
    "preview": "diff --git a/node_modules/@gorhom/docusaurus-preset/lib/index.js b/node_modules/@gorhom/docusaurus-preset/lib/index.js\ni"
  },
  {
    "path": "docs/sidebars.ts",
    "chars": 761,
    "preview": "import type { SidebarsConfig } from '@docusaurus/plugin-content-docs'\n\n// This runs in Node.js - Don't use client-side c"
  },
  {
    "path": "docs/src/css/custom.css",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "docs/static/.nojekyll",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "docs/tsconfig.json",
    "chars": 215,
    "preview": "{\n  // This file is not used in compilation. It is here just for a nice editor experience.\n  \"extends\": \"@docusaurus/tsc"
  },
  {
    "path": "example/.gitignore",
    "chars": 389,
    "preview": "# Learn more https://docs.github.com/en/get-started/getting-started-with-git/ignoring-files\n\n# dependencies\nnode_modules"
  },
  {
    "path": "example/App.tsx",
    "chars": 225,
    "preview": "import { LogBox, UIManager } from 'react-native'\nimport App from './src'\n\nLogBox.ignoreAllLogs()\n\nUIManager.setLayoutAni"
  },
  {
    "path": "example/Gemfile",
    "chars": 319,
    "preview": "source 'https://rubygems.org'\n\n# You may use http://rbenv.org/ or https://rvm.io/ to install and use this version\nruby \""
  },
  {
    "path": "example/README.md",
    "chars": 250,
    "preview": "# Example\n\nThis website is built using [Expo](https://docs.expo.dev/)\n\nhttps://github.com/user-attachments/assets/79580b"
  },
  {
    "path": "example/app.json",
    "chars": 1519,
    "preview": "{\n  \"expo\": {\n    \"name\": \"MultipleImagePickerExample\",\n    \"slug\": \"MultipleImagePickerExample\",\n    \"version\": \"1.0.0\""
  },
  {
    "path": "example/babel.config.js",
    "chars": 559,
    "preview": "const path = require('path')\nmodule.exports = function (api) {\n  api.cache(true)\n  return {\n    presets: ['babel-preset-"
  },
  {
    "path": "example/metro.config.js",
    "chars": 950,
    "preview": "// Learn more https://docs.expo.io/guides/customizing-metro\nconst { getDefaultConfig } = require('expo/metro-config')\nco"
  },
  {
    "path": "example/package.json",
    "chars": 1145,
    "preview": "{\n  \"name\": \"multipleimagepickerexample\",\n  \"version\": \"2.2.3\",\n  \"main\": \"expo/AppEntry.js\",\n  \"scripts\": {\n    \"start\""
  },
  {
    "path": "example/react-native.config.js",
    "chars": 253,
    "preview": "const path = require('path')\nconst pkg = require('../package.json')\n\nmodule.exports = {\n  project: {\n    ios: {\n      au"
  },
  {
    "path": "example/src/assets/index.ts",
    "chars": 146,
    "preview": "const images = {\n  logo: require('./logo.png'),\n  plusSign: require('./plus-sign.png'),\n  check: require('./check.png'),"
  },
  {
    "path": "example/src/common/const.ts",
    "chars": 910,
    "preview": "import { Platform } from 'react-native'\n\nexport const IS_IOS = Platform.OS === 'ios'\nexport const IS_ANDROID = Platform."
  },
  {
    "path": "example/src/components/BottomSheet.tsx",
    "chars": 142,
    "preview": "import React from 'react'\nimport { View } from 'react-native'\n\nexport function BottomSheet() {\n  return (\n    <View>\n   "
  },
  {
    "path": "example/src/components/Button.tsx",
    "chars": 1242,
    "preview": "import React from 'react'\nimport {\n  StyleSheet,\n  TouchableOpacity,\n  TouchableOpacityProps,\n} from 'react-native'\nimpo"
  },
  {
    "path": "example/src/components/CheckBox.tsx",
    "chars": 1172,
    "preview": "import React from 'react'\nimport {\n  Image,\n  StyleSheet,\n  TouchableOpacity,\n  TouchableOpacityProps,\n} from 'react-nat"
  },
  {
    "path": "example/src/components/CodeTag.tsx",
    "chars": 747,
    "preview": "import React from 'react'\nimport { View } from './View'\nimport { StyleSheet, TextProps, ViewProps } from 'react-native'\n"
  },
  {
    "path": "example/src/components/Container.tsx",
    "chars": 635,
    "preview": "import React from 'react'\nimport { StyleSheet, ViewProps } from 'react-native'\nimport useTheme from '../hook/useTheme'\ni"
  },
  {
    "path": "example/src/components/CounterView.tsx",
    "chars": 1774,
    "preview": "import React from 'react'\nimport { View } from './View'\nimport { Row, RowProps } from './Row'\nimport { StyleSheet, Touch"
  },
  {
    "path": "example/src/components/Divider.tsx",
    "chars": 400,
    "preview": "import React from 'react'\nimport { StyleSheet } from 'react-native'\nimport useTheme from '../hook/useTheme'\nimport { Vie"
  },
  {
    "path": "example/src/components/Input.tsx",
    "chars": 674,
    "preview": "import React from 'react'\nimport { StyleSheet, TextInput, TextInputProps } from 'react-native'\nimport useTheme from '../"
  },
  {
    "path": "example/src/components/Row.tsx",
    "chars": 545,
    "preview": "import React from 'react'\nimport { StyleSheet, ViewStyle } from 'react-native'\nimport { View, ViewProps } from './View'\n"
  },
  {
    "path": "example/src/components/SectionView.tsx",
    "chars": 1924,
    "preview": "import React from 'react'\nimport { Row } from './Row'\nimport { CodeTag } from './CodeTag'\nimport { View } from './View'\n"
  },
  {
    "path": "example/src/components/SegmentControl.tsx",
    "chars": 251,
    "preview": "import React from 'react'\nimport SegmentedControl, {\n  SegmentedControlProps,\n} from '@react-native-segmented-control/se"
  },
  {
    "path": "example/src/components/Text.tsx",
    "chars": 329,
    "preview": "import React from 'react'\nimport { Text as RNText, TextProps } from 'react-native'\nimport useTheme from '../hook/useThem"
  },
  {
    "path": "example/src/components/View.tsx",
    "chars": 582,
    "preview": "import React from 'react'\nimport { View as RNView, ViewProps as RNViewProps } from 'react-native'\nimport useTheme from '"
  },
  {
    "path": "example/src/components/index.tsx",
    "chars": 317,
    "preview": "export * from './Container'\nexport * from './Button'\nexport * from './SegmentControl'\nexport * from './Text'\nexport * fr"
  },
  {
    "path": "example/src/hook/context.ts",
    "chars": 390,
    "preview": "import { createContext, useContext } from 'react'\nimport {\n  Config,\n  defaultOptions,\n} from '@baronha/react-native-mul"
  },
  {
    "path": "example/src/hook/index.ts",
    "chars": 27,
    "preview": "export * from './useTheme'\n"
  },
  {
    "path": "example/src/hook/useTheme.ts",
    "chars": 216,
    "preview": "import { useColorScheme } from 'react-native'\nimport * as color from '../theme/color'\n\nexport default function useTheme("
  },
  {
    "path": "example/src/index.tsx",
    "chars": 22010,
    "preview": "import React, { useCallback, useMemo, useState } from 'react'\nimport {\n  ActionSheetIOS,\n  Alert,\n  Appearance,\n  ColorS"
  },
  {
    "path": "example/src/theme/color.ts",
    "chars": 465,
    "preview": "export const light = {\n  background: '#ffffff',\n  foreground: '#000000',\n  primary: '#000000',\n\n  // background level\n  "
  },
  {
    "path": "example/src/theme/size.ts",
    "chars": 190,
    "preview": "import { Dimensions } from 'react-native'\n\nexport const { width: WIDTH, height: HEIGHT } = Dimensions.get('window')\nexpo"
  },
  {
    "path": "example/tsconfig.json",
    "chars": 81,
    "preview": "{\n  \"compilerOptions\": {\n    \"outDir\": \"./lib\"\n  },\n  \"extends\": \"../tsconfig\"\n}\n"
  },
  {
    "path": "ios/Assets.swift",
    "chars": 593,
    "preview": "//\n//  Assets.swift\n//  Pods\n//\n//  Created by BAO HA on 4/12/24.\n//\n\nimport UIKit\n\nclass Assets {\n    class func bundle"
  },
  {
    "path": "ios/Assets.xcassets/Contents.json",
    "chars": 62,
    "preview": "{\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "ios/Assets.xcassets/close.imageset/Contents.json",
    "chars": 303,
    "preview": "{\n  \"images\" : [\n    {\n      \"filename\" : \"close.png\",\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n  "
  },
  {
    "path": "ios/ErrorCode.swift",
    "chars": 113,
    "preview": "//\n//  ErrorCode.swift\n//  Pods\n//\n//  Created by BAO HA on 3/12/24.\n//\n\n// enum ErrorCode: Int, Error {\n//\n// }\n"
  },
  {
    "path": "ios/HybridMultipleImagePicker+Camera.swift",
    "chars": 5042,
    "preview": "//\n//  HybridMultipleImagePicker+Camera.swift\n//  Pods\n//\n//  Created by BAO HA on 13/12/24.\n//\n\nimport AVFoundation\nimp"
  },
  {
    "path": "ios/HybridMultipleImagePicker+Config.swift",
    "chars": 8763,
    "preview": "//\n//  HybridMultipleImagePicker+Config.swift\n//  react-native-multiple-image-picker\n//\n//  Created by BAO HA on 15/10/2"
  },
  {
    "path": "ios/HybridMultipleImagePicker+Crop.swift",
    "chars": 3322,
    "preview": "//\n//  HybridMultipleImagePicker+Crop.swift\n//  Pods\n//\n//  Created by BAO HA on 9/12/24.\n//\n\nimport HXPhotoPicker\n\nexte"
  },
  {
    "path": "ios/HybridMultipleImagePicker+Preview.swift",
    "chars": 2535,
    "preview": "//\n//  HybridMultipleImagePicker+Preview.swift\n//  Pods\n//\n//  Created by BAO HA on 11/12/24.\n//\n\nimport HXPhotoPicker\n\n"
  },
  {
    "path": "ios/HybridMultipleImagePicker+Result.swift",
    "chars": 1504,
    "preview": "//\n//  HybridMultipleImagePicker+Result.swift\n//  Pods\n//\n//  Created by BAO HA on 24/10/24.\n//\n\nimport HXPhotoPicker\n\ne"
  },
  {
    "path": "ios/HybridMultipleImagePicker.swift",
    "chars": 3590,
    "preview": "//\n//  HybridMultipleImagePicker.swift\n//\n//  Created by Marc Rousavy on 18.07.24.\n//\n\nimport Foundation\nimport HXPhotoP"
  },
  {
    "path": "ios/MultipleImagePickerOnLoad.mm",
    "chars": 476,
    "preview": "//\n//  MultipleImagePickerOnLoad.mm\n//  MultipleImagePicker\n//\n//  Created by Marc Rousavy on 22.07.24.\n//\n\n#import <Fou"
  },
  {
    "path": "ios/PHAsset+Thumbnail.swift",
    "chars": 1383,
    "preview": "//\n//  PHAsset+Thumbnail.swift\n//  Pods\n//\n//  Created by BAO HA on 24/10/24.\n//\n\nimport Photos\n\nextension PHAsset {\n   "
  },
  {
    "path": "ios/PhotoCancelItem.swift",
    "chars": 1375,
    "preview": "//\n//  PhotoCancelItem.swift\n//  Pods\n//\n//  Created by BAO HA on 4/12/24.\n//\n\nimport HXPhotoPicker\nimport UIKit\n\nextens"
  },
  {
    "path": "ios/TopViewController.swift",
    "chars": 373,
    "preview": "//\n//  TopViewController.swift\n//  Pods\n//\n//  Created by BAO HA on 11/12/24.\n//\n\nimport UIKit\n\nfunc getTopViewControlle"
  },
  {
    "path": "ios/UIColor+Hex.swift",
    "chars": 829,
    "preview": "//\n//  UIColor+Hex.swift\n//  react-native-multiple-image-picker\n//\n//  Created by BAO HA on 15/10/2024.\n//\n\nimport UIKit"
  },
  {
    "path": "ios/UIColor+React.swift",
    "chars": 185,
    "preview": "//\n//  UIColor+React.swift\n//  Pods\n//\n//  Created by BAO HA on 16/10/24.\n//\n\nimport React\nimport UIKit\n\nfunc getReactCo"
  },
  {
    "path": "ios/UIImage.swift",
    "chars": 744,
    "preview": "//\n//  UIImage.swift\n//  Pods\n//\n//  Created by BAO HA on 16/12/24.\n//\n\nextension UIImage {\n    func getPath(fileName na"
  },
  {
    "path": "ios/URL+Mime.swift",
    "chars": 1061,
    "preview": "//\n//  URL+Mime.swift\n//  Pods\n//\n//  Created by BAO HA on 23/10/24.\n//\n\nimport Foundation\nimport MobileCoreServices\nimp"
  },
  {
    "path": "ios/Utils.swift",
    "chars": 933,
    "preview": "//\n//  Utils.swift\n//  Pods\n//\n//  Created by BAO HA on 11/12/24.\n//\n\nimport MobileCoreServices\nimport UniformTypeIdenti"
  },
  {
    "path": "nitro.json",
    "chars": 458,
    "preview": "{\n  \"$schema\": \"https://nitro.margelo.com/nitro.schema.json\",\n  \"cxxNamespace\": [\"multipleimagepicker\"],\n  \"ios\": {\n    "
  },
  {
    "path": "nitrogen/generated/.gitattributes",
    "chars": 21,
    "preview": "* linguist-generated\n"
  },
  {
    "path": "nitrogen/generated/android/MultipleImagePicker+autolinking.cmake",
    "chars": 2864,
    "preview": "#\n# MultipleImagePicker+autolinking.cmake\n# This file was generated by nitrogen. DO NOT MODIFY THIS FILE.\n# https://gith"
  },
  {
    "path": "nitrogen/generated/android/MultipleImagePicker+autolinking.gradle",
    "chars": 712,
    "preview": "///\n/// MultipleImagePicker+autolinking.gradle\n/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.\n/// htt"
  },
  {
    "path": "nitrogen/generated/android/MultipleImagePickerOnLoad.cpp",
    "chars": 2169,
    "preview": "///\n/// MultipleImagePickerOnLoad.cpp\n/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.\n/// https://gith"
  },
  {
    "path": "nitrogen/generated/android/MultipleImagePickerOnLoad.hpp",
    "chars": 759,
    "preview": "///\n/// MultipleImagePickerOnLoad.hpp\n/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.\n/// https://gith"
  },
  {
    "path": "nitrogen/generated/android/c++/JCameraDevice.hpp",
    "chars": 1888,
    "preview": "///\n/// JCameraDevice.hpp\n/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.\n/// https://github.com/mrous"
  },
  {
    "path": "nitrogen/generated/android/c++/JCameraResult.hpp",
    "chars": 3462,
    "preview": "///\n/// JCameraResult.hpp\n/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.\n/// https://github.com/mrous"
  },
  {
    "path": "nitrogen/generated/android/c++/JCropRatio.hpp",
    "chars": 1906,
    "preview": "///\n/// JCropRatio.hpp\n/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.\n/// https://github.com/mrousavy"
  },
  {
    "path": "nitrogen/generated/android/c++/JCropResult.hpp",
    "chars": 1794,
    "preview": "///\n/// JCropResult.hpp\n/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.\n/// https://github.com/mrousav"
  },
  {
    "path": "nitrogen/generated/android/c++/JFunc_void_CameraResult.hpp",
    "chars": 2605,
    "preview": "///\n/// JFunc_void_CameraResult.hpp\n/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.\n/// https://github"
  },
  {
    "path": "nitrogen/generated/android/c++/JFunc_void_CropResult.hpp",
    "chars": 2480,
    "preview": "///\n/// JFunc_void_CropResult.hpp\n/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.\n/// https://github.c"
  },
  {
    "path": "nitrogen/generated/android/c++/JFunc_void_double.hpp",
    "chars": 2207,
    "preview": "///\n/// JFunc_void_double.hpp\n/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.\n/// https://github.com/m"
  },
  {
    "path": "nitrogen/generated/android/c++/JFunc_void_std__vector_PickerResult_.hpp",
    "chars": 3637,
    "preview": "///\n/// JFunc_void_std__vector_PickerResult_.hpp\n/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.\n/// h"
  },
  {
    "path": "nitrogen/generated/android/c++/JHybridMultipleImagePickerSpec.cpp",
    "chars": 8100,
    "preview": "///\n/// JHybridMultipleImagePickerSpec.cpp\n/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.\n/// https:/"
  },
  {
    "path": "nitrogen/generated/android/c++/JHybridMultipleImagePickerSpec.hpp",
    "chars": 2566,
    "preview": "///\n/// HybridMultipleImagePickerSpec.hpp\n/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.\n/// https://"
  },
  {
    "path": "nitrogen/generated/android/c++/JLanguage.hpp",
    "chars": 3565,
    "preview": "///\n/// JLanguage.hpp\n/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.\n/// https://github.com/mrousavy/"
  },
  {
    "path": "nitrogen/generated/android/c++/JMediaPreview.hpp",
    "chars": 2625,
    "preview": "///\n/// JMediaPreview.hpp\n/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.\n/// https://github.com/mrous"
  },
  {
    "path": "nitrogen/generated/android/c++/JMediaType.hpp",
    "chars": 2005,
    "preview": "///\n/// JMediaType.hpp\n/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.\n/// https://github.com/mrousavy"
  },
  {
    "path": "nitrogen/generated/android/c++/JNitroCameraConfig.hpp",
    "chars": 4335,
    "preview": "///\n/// JNitroCameraConfig.hpp\n/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.\n/// https://github.com/"
  },
  {
    "path": "nitrogen/generated/android/c++/JNitroConfig.hpp",
    "chars": 11917,
    "preview": "///\n/// JNitroConfig.hpp\n/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.\n/// https://github.com/mrousa"
  },
  {
    "path": "nitrogen/generated/android/c++/JNitroCropConfig.hpp",
    "chars": 4028,
    "preview": "///\n/// JNitroCropConfig.hpp\n/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.\n/// https://github.com/mr"
  },
  {
    "path": "nitrogen/generated/android/c++/JNitroPreviewConfig.hpp",
    "chars": 2031,
    "preview": "///\n/// JNitroPreviewConfig.hpp\n/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.\n/// https://github.com"
  },
  {
    "path": "nitrogen/generated/android/c++/JPickerCameraConfig.hpp",
    "chars": 2221,
    "preview": "///\n/// JPickerCameraConfig.hpp\n/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.\n/// https://github.com"
  },
  {
    "path": "nitrogen/generated/android/c++/JPickerCropConfig.hpp",
    "chars": 3438,
    "preview": "///\n/// JPickerCropConfig.hpp\n/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.\n/// https://github.com/m"
  },
  {
    "path": "nitrogen/generated/android/c++/JPickerResult.hpp",
    "chars": 5604,
    "preview": "///\n/// JPickerResult.hpp\n/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.\n/// https://github.com/mrous"
  },
  {
    "path": "nitrogen/generated/android/c++/JPresentation.hpp",
    "chars": 1948,
    "preview": "///\n/// JPresentation.hpp\n/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.\n/// https://github.com/mrous"
  },
  {
    "path": "nitrogen/generated/android/c++/JResultType.hpp",
    "chars": 1860,
    "preview": "///\n/// JResultType.hpp\n/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.\n/// https://github.com/mrousav"
  },
  {
    "path": "nitrogen/generated/android/c++/JSelectBoxStyle.hpp",
    "chars": 1924,
    "preview": "///\n/// JSelectBoxStyle.hpp\n/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.\n/// https://github.com/mro"
  },
  {
    "path": "nitrogen/generated/android/c++/JSelectMode.hpp",
    "chars": 1876,
    "preview": "///\n/// JSelectMode.hpp\n/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.\n/// https://github.com/mrousav"
  },
  {
    "path": "nitrogen/generated/android/c++/JText.hpp",
    "chars": 2521,
    "preview": "///\n/// JText.hpp\n/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.\n/// https://github.com/mrousavy/nitr"
  },
  {
    "path": "nitrogen/generated/android/c++/JTheme.hpp",
    "chars": 1776,
    "preview": "///\n/// JTheme.hpp\n/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.\n/// https://github.com/mrousavy/nit"
  },
  {
    "path": "nitrogen/generated/android/kotlin/com/margelo/nitro/multipleimagepicker/CameraDevice.kt",
    "chars": 492,
    "preview": "///\n/// CameraDevice.kt\n/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.\n/// https://github.com/mrousav"
  },
  {
    "path": "nitrogen/generated/android/kotlin/com/margelo/nitro/multipleimagepicker/CameraResult.kt",
    "chars": 698,
    "preview": "///\n/// CameraResult.kt\n/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.\n/// https://github.com/mrousav"
  },
  {
    "path": "nitrogen/generated/android/kotlin/com/margelo/nitro/multipleimagepicker/CropRatio.kt",
    "chars": 581,
    "preview": "///\n/// CropRatio.kt\n/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.\n/// https://github.com/mrousavy/n"
  },
  {
    "path": "nitrogen/generated/android/kotlin/com/margelo/nitro/multipleimagepicker/CropResult.kt",
    "chars": 582,
    "preview": "///\n/// CropResult.kt\n/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.\n/// https://github.com/mrousavy/"
  },
  {
    "path": "nitrogen/generated/android/kotlin/com/margelo/nitro/multipleimagepicker/Func_void_CameraResult.kt",
    "chars": 2319,
    "preview": "///\n/// Func_void_CameraResult.kt\n/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.\n/// https://github.c"
  },
  {
    "path": "nitrogen/generated/android/kotlin/com/margelo/nitro/multipleimagepicker/Func_void_CropResult.kt",
    "chars": 2293,
    "preview": "///\n/// Func_void_CropResult.kt\n/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.\n/// https://github.com"
  },
  {
    "path": "nitrogen/generated/android/kotlin/com/margelo/nitro/multipleimagepicker/Func_void_double.kt",
    "chars": 2232,
    "preview": "///\n/// Func_void_double.kt\n/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.\n/// https://github.com/mro"
  },
  {
    "path": "nitrogen/generated/android/kotlin/com/margelo/nitro/multipleimagepicker/Func_void_std__vector_PickerResult_.kt",
    "chars": 2443,
    "preview": "///\n/// Func_void_std__vector_PickerResult_.kt\n/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.\n/// htt"
  },
  {
    "path": "nitrogen/generated/android/kotlin/com/margelo/nitro/multipleimagepicker/HybridMultipleImagePickerSpec.kt",
    "chars": 2804,
    "preview": "///\n/// HybridMultipleImagePickerSpec.kt\n/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.\n/// https://g"
  },
  {
    "path": "nitrogen/generated/android/kotlin/com/margelo/nitro/multipleimagepicker/Language.kt",
    "chars": 555,
    "preview": "///\n/// Language.kt\n/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.\n/// https://github.com/mrousavy/ni"
  },
  {
    "path": "nitrogen/generated/android/kotlin/com/margelo/nitro/multipleimagepicker/MediaPreview.kt",
    "chars": 630,
    "preview": "///\n/// MediaPreview.kt\n/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.\n/// https://github.com/mrousav"
  },
  {
    "path": "nitrogen/generated/android/kotlin/com/margelo/nitro/multipleimagepicker/MediaType.kt",
    "chars": 491,
    "preview": "///\n/// MediaType.kt\n/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.\n/// https://github.com/mrousavy/n"
  },
  {
    "path": "nitrogen/generated/android/kotlin/com/margelo/nitro/multipleimagepicker/MultipleImagePickerOnLoad.kt",
    "chars": 1118,
    "preview": "///\n/// MultipleImagePickerOnLoad.kt\n/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.\n/// https://githu"
  },
  {
    "path": "nitrogen/generated/android/kotlin/com/margelo/nitro/multipleimagepicker/NitroCameraConfig.kt",
    "chars": 798,
    "preview": "///\n/// NitroCameraConfig.kt\n/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.\n/// https://github.com/mr"
  },
  {
    "path": "nitrogen/generated/android/kotlin/com/margelo/nitro/multipleimagepicker/NitroConfig.kt",
    "chars": 1380,
    "preview": "///\n/// NitroConfig.kt\n/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.\n/// https://github.com/mrousavy"
  },
  {
    "path": "nitrogen/generated/android/kotlin/com/margelo/nitro/multipleimagepicker/NitroCropConfig.kt",
    "chars": 714,
    "preview": "///\n/// NitroCropConfig.kt\n/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.\n/// https://github.com/mrou"
  },
  {
    "path": "nitrogen/generated/android/kotlin/com/margelo/nitro/multipleimagepicker/NitroPreviewConfig.kt",
    "chars": 598,
    "preview": "///\n/// NitroPreviewConfig.kt\n/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.\n/// https://github.com/m"
  },
  {
    "path": "nitrogen/generated/android/kotlin/com/margelo/nitro/multipleimagepicker/PickerCameraConfig.kt",
    "chars": 613,
    "preview": "///\n/// PickerCameraConfig.kt\n/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.\n/// https://github.com/m"
  },
  {
    "path": "nitrogen/generated/android/kotlin/com/margelo/nitro/multipleimagepicker/PickerCropConfig.kt",
    "chars": 653,
    "preview": "///\n/// PickerCropConfig.kt\n/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.\n/// https://github.com/mro"
  },
  {
    "path": "nitrogen/generated/android/kotlin/com/margelo/nitro/multipleimagepicker/PickerResult.kt",
    "chars": 917,
    "preview": "///\n/// PickerResult.kt\n/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.\n/// https://github.com/mrousav"
  },
  {
    "path": "nitrogen/generated/android/kotlin/com/margelo/nitro/multipleimagepicker/Presentation.kt",
    "chars": 507,
    "preview": "///\n/// Presentation.kt\n/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.\n/// https://github.com/mrousav"
  },
  {
    "path": "nitrogen/generated/android/kotlin/com/margelo/nitro/multipleimagepicker/ResultType.kt",
    "chars": 487,
    "preview": "///\n/// ResultType.kt\n/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.\n/// https://github.com/mrousavy/"
  },
  {
    "path": "nitrogen/generated/android/kotlin/com/margelo/nitro/multipleimagepicker/SelectBoxStyle.kt",
    "chars": 499,
    "preview": "///\n/// SelectBoxStyle.kt\n/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.\n/// https://github.com/mrous"
  },
  {
    "path": "nitrogen/generated/android/kotlin/com/margelo/nitro/multipleimagepicker/SelectMode.kt",
    "chars": 491,
    "preview": "///\n/// SelectMode.kt\n/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.\n/// https://github.com/mrousavy/"
  },
  {
    "path": "nitrogen/generated/android/kotlin/com/margelo/nitro/multipleimagepicker/Text.kt",
    "chars": 596,
    "preview": "///\n/// Text.kt\n/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.\n/// https://github.com/mrousavy/nitro\n"
  },
  {
    "path": "nitrogen/generated/android/kotlin/com/margelo/nitro/multipleimagepicker/Theme.kt",
    "chars": 471,
    "preview": "///\n/// Theme.kt\n/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.\n/// https://github.com/mrousavy/nitro"
  },
  {
    "path": "nitrogen/generated/ios/MultipleImagePicker+autolinking.rb",
    "chars": 2027,
    "preview": "#\n# MultipleImagePicker+autolinking.rb\n# This file was generated by nitrogen. DO NOT MODIFY THIS FILE.\n# https://github."
  },
  {
    "path": "nitrogen/generated/ios/MultipleImagePicker-Swift-Cxx-Bridge.cpp",
    "chars": 3530,
    "preview": "///\n/// MultipleImagePicker-Swift-Cxx-Bridge.cpp\n/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.\n/// h"
  },
  {
    "path": "nitrogen/generated/ios/MultipleImagePicker-Swift-Cxx-Bridge.hpp",
    "chars": 12559,
    "preview": "///\n/// MultipleImagePicker-Swift-Cxx-Bridge.hpp\n/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.\n/// h"
  },
  {
    "path": "nitrogen/generated/ios/MultipleImagePicker-Swift-Cxx-Umbrella.hpp",
    "chars": 5218,
    "preview": "///\n/// MultipleImagePicker-Swift-Cxx-Umbrella.hpp\n/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.\n///"
  },
  {
    "path": "nitrogen/generated/ios/MultipleImagePickerAutolinking.mm",
    "chars": 978,
    "preview": "///\n/// MultipleImagePickerAutolinking.mm\n/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.\n/// https://"
  },
  {
    "path": "nitrogen/generated/ios/MultipleImagePickerAutolinking.swift",
    "chars": 1131,
    "preview": "///\n/// MultipleImagePickerAutolinking.swift\n/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.\n/// https"
  },
  {
    "path": "nitrogen/generated/ios/c++/HybridMultipleImagePickerSpecSwift.cpp",
    "chars": 350,
    "preview": "///\n/// HybridMultipleImagePickerSpecSwift.cpp\n/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.\n/// htt"
  },
  {
    "path": "nitrogen/generated/ios/c++/HybridMultipleImagePickerSpecSwift.hpp",
    "chars": 6971,
    "preview": "///\n/// HybridMultipleImagePickerSpecSwift.hpp\n/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.\n/// htt"
  },
  {
    "path": "nitrogen/generated/ios/swift/CameraDevice.swift",
    "chars": 882,
    "preview": "///\n/// CameraDevice.swift\n/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.\n/// https://github.com/mrou"
  },
  {
    "path": "nitrogen/generated/ios/swift/CameraResult.swift",
    "chars": 4366,
    "preview": "///\n/// CameraResult.swift\n/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.\n/// https://github.com/mrou"
  },
  {
    "path": "nitrogen/generated/ios/swift/CropRatio.swift",
    "chars": 1691,
    "preview": "///\n/// CropRatio.swift\n/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.\n/// https://github.com/mrousav"
  },
  {
    "path": "nitrogen/generated/ios/swift/CropResult.swift",
    "chars": 1121,
    "preview": "///\n/// CropResult.swift\n/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.\n/// https://github.com/mrousa"
  },
  {
    "path": "nitrogen/generated/ios/swift/Func_void_CameraResult.swift",
    "chars": 1437,
    "preview": "///\n/// Func_void_CameraResult.swift\n/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.\n/// https://githu"
  },
  {
    "path": "nitrogen/generated/ios/swift/Func_void_CropResult.swift",
    "chars": 1417,
    "preview": "///\n/// Func_void_CropResult.swift\n/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.\n/// https://github."
  },
  {
    "path": "nitrogen/generated/ios/swift/Func_void_double.swift",
    "chars": 1372,
    "preview": "///\n/// Func_void_double.swift\n/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.\n/// https://github.com/"
  },
  {
    "path": "nitrogen/generated/ios/swift/Func_void_std__vector_PickerResult_.swift",
    "chars": 1567,
    "preview": "///\n/// Func_void_std__vector_PickerResult_.swift\n/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.\n/// "
  },
  {
    "path": "nitrogen/generated/ios/swift/HybridMultipleImagePickerSpec.swift",
    "chars": 2170,
    "preview": "///\n/// HybridMultipleImagePickerSpec.swift\n/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.\n/// https:"
  },
  {
    "path": "nitrogen/generated/ios/swift/HybridMultipleImagePickerSpec_cxx.swift",
    "chars": 7649,
    "preview": "///\n/// HybridMultipleImagePickerSpec_cxx.swift\n/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.\n/// ht"
  },
  {
    "path": "nitrogen/generated/ios/swift/Language.swift",
    "chars": 1678,
    "preview": "///\n/// Language.swift\n/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.\n/// https://github.com/mrousavy"
  },
  {
    "path": "nitrogen/generated/ios/swift/MediaPreview.swift",
    "chars": 3161,
    "preview": "///\n/// MediaPreview.swift\n/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.\n/// https://github.com/mrou"
  },
  {
    "path": "nitrogen/generated/ios/swift/MediaType.swift",
    "chars": 941,
    "preview": "///\n/// MediaType.swift\n/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.\n/// https://github.com/mrousav"
  },
  {
    "path": "nitrogen/generated/ios/swift/NitroCameraConfig.swift",
    "chars": 4604,
    "preview": "///\n/// NitroCameraConfig.swift\n/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.\n/// https://github.com"
  },
  {
    "path": "nitrogen/generated/ios/swift/NitroConfig.swift",
    "chars": 15098,
    "preview": "///\n/// NitroConfig.swift\n/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.\n/// https://github.com/mrous"
  },
  {
    "path": "nitrogen/generated/ios/swift/NitroCropConfig.swift",
    "chars": 3635,
    "preview": "///\n/// NitroCropConfig.swift\n/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.\n/// https://github.com/m"
  },
  {
    "path": "nitrogen/generated/ios/swift/NitroPreviewConfig.swift",
    "chars": 1415,
    "preview": "///\n/// NitroPreviewConfig.swift\n/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.\n/// https://github.co"
  },
  {
    "path": "nitrogen/generated/ios/swift/PickerCameraConfig.swift",
    "chars": 1928,
    "preview": "///\n/// PickerCameraConfig.swift\n/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.\n/// https://github.co"
  },
  {
    "path": "nitrogen/generated/ios/swift/PickerCropConfig.swift",
    "chars": 3209,
    "preview": "///\n/// PickerCropConfig.swift\n/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.\n/// https://github.com/"
  },
  {
    "path": "nitrogen/generated/ios/swift/PickerResult.swift",
    "chars": 7657,
    "preview": "///\n/// PickerResult.swift\n/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.\n/// https://github.com/mrou"
  },
  {
    "path": "nitrogen/generated/ios/swift/Presentation.swift",
    "chars": 942,
    "preview": "///\n/// Presentation.swift\n/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.\n/// https://github.com/mrou"
  },
  {
    "path": "nitrogen/generated/ios/swift/ResultType.swift",
    "chars": 872,
    "preview": "///\n/// ResultType.swift\n/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.\n/// https://github.com/mrousa"
  },
  {
    "path": "nitrogen/generated/ios/swift/SelectBoxStyle.swift",
    "chars": 900,
    "preview": "///\n/// SelectBoxStyle.swift\n/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.\n/// https://github.com/mr"
  },
  {
    "path": "nitrogen/generated/ios/swift/SelectMode.swift",
    "chars": 888,
    "preview": "///\n/// SelectMode.swift\n/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.\n/// https://github.com/mrousa"
  }
]

// ... and 39 more files (download for full content)

About this extraction

This page contains the full source code of the baronha/react-native-multiple-image-picker GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 239 files (528.8 KB), approximately 137.6k tokens, and a symbol index with 617 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!