├── .babelrc ├── .flowconfig ├── .gitattributes ├── .gitignore ├── .npmignore ├── LICENSE ├── README.md ├── example ├── App.js ├── app.json ├── index.js └── ios │ ├── DragDropExample.xcodeproj │ ├── project.pbxproj │ └── xcshareddata │ │ └── xcschemes │ │ └── DragDropExample.xcscheme │ └── DragDropExample │ ├── AppDelegate.h │ ├── AppDelegate.m │ ├── Base.lproj │ └── LaunchScreen.xib │ ├── Images.xcassets │ └── AppIcon.appiconset │ │ └── Contents.json │ ├── Info.plist │ └── main.m ├── images ├── draggable-custom-preview.gif ├── draggable-multiple-items.gif ├── draggable-single-item.gif └── draggable-url.gif ├── ios ├── MODragItem.h ├── MODragItem.m ├── MODragPreviewView.h ├── MODragPreviewView.m ├── MODragPreviewViewManager.h ├── MODragPreviewViewManager.m ├── MODragView.h ├── MODragView.m ├── MODragViewManager.h ├── MODragViewManager.m ├── MOReactNativeIosDragDrop.xcodeproj │ └── project.pbxproj └── MOReactNativeIosDragDrop.xcworkspace │ └── contents.xcworkspacedata ├── package.json ├── src ├── DragPreviewView.js ├── DragView.js └── index.js └── yarn.lock /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": ["react-native"], 3 | "plugins": [ 4 | [ 5 | "module-resolver", 6 | { 7 | "alias": { 8 | "react-native-ios-drag-drop": "./src" 9 | }, 10 | "cwd": "babelrc" 11 | } 12 | ] 13 | ] 14 | } -------------------------------------------------------------------------------- /.flowconfig: -------------------------------------------------------------------------------- 1 | [ignore] 2 | ; We fork some components by platform 3 | .*/*[.]android.js 4 | 5 | ; Ignore "BUCK" generated dirs 6 | /\.buckd/ 7 | 8 | ; Ignore unexpected extra "@providesModule" 9 | .*/node_modules/.*/node_modules/fbjs/.* 10 | 11 | ; Ignore duplicate module providers 12 | ; For RN Apps installed via npm, "Libraries" folder is inside 13 | ; "node_modules/react-native" but in the source repo it is in the root 14 | .*/Libraries/react-native/React.js 15 | 16 | ; Ignore polyfills 17 | .*/Libraries/polyfills/.* 18 | 19 | ; Ignore the example node_modules directory 20 | ; (this means that all the dependencies of the example also need a be a devDependency of the main project) 21 | /example/node_modules/.* 22 | 23 | ; Ignore the compiled library 24 | /lib/.* 25 | 26 | [include] 27 | 28 | [libs] 29 | node_modules/react-native/Libraries/react-native/react-native-interface.js 30 | node_modules/react-native/flow/ 31 | 32 | [options] 33 | emoji=true 34 | 35 | module.system=haste 36 | 37 | munge_underscores=true 38 | 39 | module.name_mapper='^[./a-zA-Z0-9$_-]+\.\(bmp\|gif\|jpg\|jpeg\|png\|psd\|svg\|webp\|m4v\|mov\|mp4\|mpeg\|mpg\|webm\|aac\|aiff\|caf\|m4a\|mp3\|wav\|html\|pdf\)$' -> 'RelativeImageStub' 40 | module.name_mapper='^react-native-ios-drag-drop$' -> '/src' 41 | module.name_mapper='^react-native-ios-drag-drop\/\(.*\)$' -> '/src/\1' 42 | 43 | suppress_type=$FlowIssue 44 | suppress_type=$FlowFixMe 45 | suppress_type=$FlowFixMeProps 46 | suppress_type=$FlowFixMeState 47 | suppress_type=$FixMe 48 | 49 | suppress_comment=\\(.\\|\n\\)*\\$FlowFixMe\\($\\|[^(]\\|(\\(>=0\\.\\(5[0-3]\\|[1-4][0-9]\\|[0-9]\\).[0-9]\\)? *\\(site=[a-z,_]*react_native[a-z,_]*\\)?)\\) 50 | suppress_comment=\\(.\\|\n\\)*\\$FlowIssue\\((\\(>=0\\.\\(5[0-3]\\|[1-4][0-9]\\|[0-9]\\).[0-9]\\)? *\\(site=[a-z,_]*react_native[a-z,_]*\\)?)\\)?:? #[0-9]+ 51 | suppress_comment=\\(.\\|\n\\)*\\$FlowFixedInNextDeploy 52 | suppress_comment=\\(.\\|\n\\)*\\$FlowExpectedError 53 | 54 | unsafe.enable_getters_and_setters=true 55 | 56 | [version] 57 | ^0.53.0 58 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | *.pbxproj -text -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | # OSX 3 | # 4 | .DS_Store 5 | 6 | # node.js 7 | # 8 | node_modules/ 9 | npm-debug.log 10 | yarn-error.log 11 | .yarnclean 12 | 13 | # Xcode 14 | # 15 | build/ 16 | *.pbxuser 17 | !default.pbxuser 18 | *.mode1v3 19 | !default.mode1v3 20 | *.mode2v3 21 | !default.mode2v3 22 | *.perspectivev3 23 | !default.perspectivev3 24 | xcuserdata 25 | *.xccheckout 26 | *.moved-aside 27 | DerivedData 28 | *.hmap 29 | *.ipa 30 | *.xcuserstate 31 | project.xcworkspace 32 | 33 | # VSCode 34 | .vscode 35 | 36 | # Project 37 | lib/ -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | .babelrc 2 | example/ 3 | images/ 4 | src/ 5 | yarn.lock 6 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright 2017 Matt Oakes 2 | 3 | Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 4 | 5 | 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 6 | 7 | 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 8 | 9 | 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. 10 | 11 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | # `react-native-ios-drag-drop` 3 | Support for the iOS 11+ drag and drop API in React Native. 4 | 5 | ## Installation 6 | `yarn add react-native-ios-drag-drop` or `npm install react-native-ios-drag-drop --save` 7 | 8 | ### Mostly automatic installation 9 | `react-native link react-native-ios-drag-drop` 10 | 11 | ### Manual installation 12 | #### iOS 13 | 1. In XCode, in the project navigator, right click `Libraries` ➜ `Add Files to [your project's name]` 14 | 2. Go to `node_modules` ➜ `react-native-ios-drag-drop` and add `MOReactNativeIosDragDrop.xcodeproj` 15 | 3. In XCode, in the project navigator, select your project. Add `libMOReactNativeIosDragDrop.a` to your project's `Build Phases` ➜ `Link Binary With Libraries` 16 | 4. Run your project (`Cmd+R`)< 17 | 18 | ## `DragView` 19 | The `DragView` allows you to make one of your React views draggable. A `DragView` has the same behaviour as a `View` except for it accepts a `dragItem` or `dragItems` prop (it must have _exactly_ one of these props). 20 | 21 | When used on an iOS 11+ iPad it will allow the user to long press on the view and drag it to a location which supports dropping (even across apps when used in multitasking mode). 22 | 23 | You can provide one drag item (`dragItem`) or multiple drag items (`dragItems`) and even customise the preview with any React view you like. 24 | 25 | ### Usage 26 | With a single drag item: 27 | 28 | ![React Native iOS Drag Drop Single Item](https://raw.github.com/matt-oakes/react-native-ios-drag-drop/master/images/draggable-single-item.gif) 29 | 30 | ```jsx 31 | import { DragView } from 'react-native-ios-drag-drop'; 32 | 33 | export default function() { 34 | return ( 35 | 36 | Draggable with a single item 37 | 38 | ); 39 | } 40 | ``` 41 | 42 | With a multiple drag items: 43 | 44 | ![React Native iOS Drag Drop Multiple Items](https://raw.github.com/matt-oakes/react-native-ios-drag-drop/master/images/draggable-multiple-items.gif) 45 | 46 | ```jsx 47 | import { DragView } from 'react-native-ios-drag-drop'; 48 | 49 | export default function() { 50 | return ( 51 | 52 | Draggable with multiple drag items 53 | 54 | ); 55 | } 56 | ``` 57 | 58 | With a URL drag items: 59 | 60 | ![React Native iOS Drag Drop URL](https://raw.github.com/matt-oakes/react-native-ios-drag-drop/master/images/draggable-url.gif) 61 | 62 | ```jsx 63 | import { DragView } from 'react-native-ios-drag-drop'; 64 | 65 | export default function() { 66 | return ( 67 | 68 | Draggable with a URL 69 | 70 | ); 71 | } 72 | ``` 73 | 74 | With a custom preview view: 75 | 76 | ![React Native iOS Drag Drop Custom Preview](https://raw.github.com/matt-oakes/react-native-ios-drag-drop/master/images/draggable-custom-preview.gif) 77 | 78 | ```jsx 79 | import { DragView } from 'react-native-ios-drag-drop'; 80 | 81 | export default function() { 82 | return ( 83 | 84 | Draggable with a custom preview 85 | 86 | Custom preview 87 | 88 | 89 | ); 90 | } 91 | ``` 92 | 93 | ## `DropView` 94 | *Not yet implemented* 95 | 96 | ## Contributing 97 | Contributions are always welcome! File an issue or open a pull request. 98 | 99 | You can use the `example` project to develop on. It is linked correctly to the code in `src`. When published the project is compiled using `babel` into `lib` along with the flow types. 100 | 101 | ## Tasks 102 | - [X] `DragView` 103 | - [X] Draggable 104 | - [X] Custom dragItem 105 | - [X] Multiple dragItems on a single component 106 | - [X] Custom preview 107 | - [ ] `DropView` 108 | - [ ] Droppable 109 | - [ ] Pass the dragItem to a Javascript callback 110 | - [ ] Allow the Javascipt to say if it can handle the dragItem on hover 111 | - [ ] Allow the accessory icon to be customised as a dragItem is hovered over 112 | - [ ] TypeScript types 113 | -------------------------------------------------------------------------------- /example/App.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | 3 | import React, { Component } from "react"; 4 | import { Image, StyleSheet, Text, View } from "react-native"; 5 | import { DragView } from "react-native-ios-drag-drop"; 6 | 7 | export default class App extends Component<{}> { 8 | render() { 9 | return ( 10 | 11 | 12 | Draggable with a single item 13 | 14 | Will share "Shared text" when dropped. 15 | 16 | 17 | 18 | 22 | Draggable with multiple items 23 | 24 | Will share "First item" and "Second item" when dropped. 25 | 26 | 27 | 28 | 29 | Draggable with a URL 30 | Will share a URL when dropped. 31 | 32 | 33 | 34 | 35 | 36 | Custom preview 37 | 38 | 39 | Draggable with a custom preview 40 | 41 | Will show a custom preview when dragged. 42 | 43 | 44 | 45 | ); 46 | } 47 | } 48 | 49 | const styles = StyleSheet.create({ 50 | container: { 51 | flex: 1, 52 | justifyContent: "center", 53 | alignItems: "flex-start", 54 | padding: 32 55 | }, 56 | draggable: { 57 | width: 300, 58 | backgroundColor: "pink", 59 | borderRadius: 16, 60 | padding: 16, 61 | marginVertical: 16 62 | }, 63 | title: { 64 | fontSize: 20, 65 | textAlign: "center", 66 | margin: 10 67 | }, 68 | details: { 69 | textAlign: "center", 70 | color: "#333333", 71 | marginBottom: 5 72 | }, 73 | customPreview: { 74 | backgroundColor: "lightgreen", 75 | width: 100, 76 | height: 100, 77 | justifyContent: "center", 78 | alignItems: "center" 79 | }, 80 | customPreviewText: { 81 | fontSize: 18, 82 | lineHeight: 22, 83 | textAlign: "center" 84 | } 85 | }); 86 | -------------------------------------------------------------------------------- /example/app.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "DragDropExample", 3 | "displayName": "DragDropExample" 4 | } -------------------------------------------------------------------------------- /example/index.js: -------------------------------------------------------------------------------- 1 | import { AppRegistry } from 'react-native'; 2 | import App from './App'; 3 | 4 | AppRegistry.registerComponent('DragDropExample', () => App); 5 | -------------------------------------------------------------------------------- /example/ios/DragDropExample.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 00C302E51ABCBA2D00DB3ED1 /* libRCTActionSheet.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */; }; 11 | 00C302E71ABCBA2D00DB3ED1 /* libRCTGeolocation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.a */; }; 12 | 00C302E81ABCBA2D00DB3ED1 /* libRCTImage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302C01ABCB91800DB3ED1 /* libRCTImage.a */; }; 13 | 00C302E91ABCBA2D00DB3ED1 /* libRCTNetwork.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */; }; 14 | 00C302EA1ABCBA2D00DB3ED1 /* libRCTVibration.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */; }; 15 | 133E29F31AD74F7200F7D852 /* libRCTLinking.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 78C398B91ACF4ADC00677621 /* libRCTLinking.a */; }; 16 | 139105C61AF99C1200B5F7CC /* libRCTSettings.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 139105C11AF99BAD00B5F7CC /* libRCTSettings.a */; }; 17 | 139FDEF61B0652A700C62182 /* libRCTWebSocket.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 139FDEF41B06529B00C62182 /* libRCTWebSocket.a */; }; 18 | 13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.m */; }; 19 | 13B07FBD1A68108700A75B9A /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB11A68108700A75B9A /* LaunchScreen.xib */; }; 20 | 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; }; 21 | 13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; }; 22 | 146834051AC3E58100842450 /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 146834041AC3E56700842450 /* libReact.a */; }; 23 | 5E9157361DD0AC6A00FF2AA8 /* libRCTAnimation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E9157331DD0AC6500FF2AA8 /* libRCTAnimation.a */; }; 24 | 832341BD1AAA6AB300B99B32 /* libRCTText.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 832341B51AAA6A8300B99B32 /* libRCTText.a */; }; 25 | ADBDB9381DFEBF1600ED6528 /* libRCTBlob.a in Frameworks */ = {isa = PBXBuildFile; fileRef = ADBDB9271DFEBF0700ED6528 /* libRCTBlob.a */; }; 26 | C9D53DAC1F8F744D00505AEC /* libMOReactNativeIosDragDrop.a in Frameworks */ = {isa = PBXBuildFile; fileRef = C9D53DAA1F8F743C00505AEC /* libMOReactNativeIosDragDrop.a */; }; 27 | /* End PBXBuildFile section */ 28 | 29 | /* Begin PBXContainerItemProxy section */ 30 | 00C302AB1ABCB8CE00DB3ED1 /* PBXContainerItemProxy */ = { 31 | isa = PBXContainerItemProxy; 32 | containerPortal = 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */; 33 | proxyType = 2; 34 | remoteGlobalIDString = 134814201AA4EA6300B7C361; 35 | remoteInfo = RCTActionSheet; 36 | }; 37 | 00C302B91ABCB90400DB3ED1 /* PBXContainerItemProxy */ = { 38 | isa = PBXContainerItemProxy; 39 | containerPortal = 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */; 40 | proxyType = 2; 41 | remoteGlobalIDString = 134814201AA4EA6300B7C361; 42 | remoteInfo = RCTGeolocation; 43 | }; 44 | 00C302BF1ABCB91800DB3ED1 /* PBXContainerItemProxy */ = { 45 | isa = PBXContainerItemProxy; 46 | containerPortal = 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */; 47 | proxyType = 2; 48 | remoteGlobalIDString = 58B5115D1A9E6B3D00147676; 49 | remoteInfo = RCTImage; 50 | }; 51 | 00C302DB1ABCB9D200DB3ED1 /* PBXContainerItemProxy */ = { 52 | isa = PBXContainerItemProxy; 53 | containerPortal = 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */; 54 | proxyType = 2; 55 | remoteGlobalIDString = 58B511DB1A9E6C8500147676; 56 | remoteInfo = RCTNetwork; 57 | }; 58 | 00C302E31ABCB9EE00DB3ED1 /* PBXContainerItemProxy */ = { 59 | isa = PBXContainerItemProxy; 60 | containerPortal = 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */; 61 | proxyType = 2; 62 | remoteGlobalIDString = 832C81801AAF6DEF007FA2F7; 63 | remoteInfo = RCTVibration; 64 | }; 65 | 139105C01AF99BAD00B5F7CC /* PBXContainerItemProxy */ = { 66 | isa = PBXContainerItemProxy; 67 | containerPortal = 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */; 68 | proxyType = 2; 69 | remoteGlobalIDString = 134814201AA4EA6300B7C361; 70 | remoteInfo = RCTSettings; 71 | }; 72 | 139FDEF31B06529B00C62182 /* PBXContainerItemProxy */ = { 73 | isa = PBXContainerItemProxy; 74 | containerPortal = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */; 75 | proxyType = 2; 76 | remoteGlobalIDString = 3C86DF461ADF2C930047B81A; 77 | remoteInfo = RCTWebSocket; 78 | }; 79 | 146834031AC3E56700842450 /* PBXContainerItemProxy */ = { 80 | isa = PBXContainerItemProxy; 81 | containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; 82 | proxyType = 2; 83 | remoteGlobalIDString = 83CBBA2E1A601D0E00E9B192; 84 | remoteInfo = React; 85 | }; 86 | 3DAD3E831DF850E9000B6D8A /* PBXContainerItemProxy */ = { 87 | isa = PBXContainerItemProxy; 88 | containerPortal = 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */; 89 | proxyType = 2; 90 | remoteGlobalIDString = 2D2A283A1D9B042B00D4039D; 91 | remoteInfo = "RCTImage-tvOS"; 92 | }; 93 | 3DAD3E871DF850E9000B6D8A /* PBXContainerItemProxy */ = { 94 | isa = PBXContainerItemProxy; 95 | containerPortal = 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */; 96 | proxyType = 2; 97 | remoteGlobalIDString = 2D2A28471D9B043800D4039D; 98 | remoteInfo = "RCTLinking-tvOS"; 99 | }; 100 | 3DAD3E8B1DF850E9000B6D8A /* PBXContainerItemProxy */ = { 101 | isa = PBXContainerItemProxy; 102 | containerPortal = 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */; 103 | proxyType = 2; 104 | remoteGlobalIDString = 2D2A28541D9B044C00D4039D; 105 | remoteInfo = "RCTNetwork-tvOS"; 106 | }; 107 | 3DAD3E8F1DF850E9000B6D8A /* PBXContainerItemProxy */ = { 108 | isa = PBXContainerItemProxy; 109 | containerPortal = 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */; 110 | proxyType = 2; 111 | remoteGlobalIDString = 2D2A28611D9B046600D4039D; 112 | remoteInfo = "RCTSettings-tvOS"; 113 | }; 114 | 3DAD3E931DF850E9000B6D8A /* PBXContainerItemProxy */ = { 115 | isa = PBXContainerItemProxy; 116 | containerPortal = 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */; 117 | proxyType = 2; 118 | remoteGlobalIDString = 2D2A287B1D9B048500D4039D; 119 | remoteInfo = "RCTText-tvOS"; 120 | }; 121 | 3DAD3E981DF850E9000B6D8A /* PBXContainerItemProxy */ = { 122 | isa = PBXContainerItemProxy; 123 | containerPortal = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */; 124 | proxyType = 2; 125 | remoteGlobalIDString = 2D2A28881D9B049200D4039D; 126 | remoteInfo = "RCTWebSocket-tvOS"; 127 | }; 128 | 3DAD3EA21DF850E9000B6D8A /* PBXContainerItemProxy */ = { 129 | isa = PBXContainerItemProxy; 130 | containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; 131 | proxyType = 2; 132 | remoteGlobalIDString = 2D2A28131D9B038B00D4039D; 133 | remoteInfo = "React-tvOS"; 134 | }; 135 | 3DAD3EA41DF850E9000B6D8A /* PBXContainerItemProxy */ = { 136 | isa = PBXContainerItemProxy; 137 | containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; 138 | proxyType = 2; 139 | remoteGlobalIDString = 3D3C059A1DE3340900C268FA; 140 | remoteInfo = yoga; 141 | }; 142 | 3DAD3EA61DF850E9000B6D8A /* PBXContainerItemProxy */ = { 143 | isa = PBXContainerItemProxy; 144 | containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; 145 | proxyType = 2; 146 | remoteGlobalIDString = 3D3C06751DE3340C00C268FA; 147 | remoteInfo = "yoga-tvOS"; 148 | }; 149 | 3DAD3EA81DF850E9000B6D8A /* PBXContainerItemProxy */ = { 150 | isa = PBXContainerItemProxy; 151 | containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; 152 | proxyType = 2; 153 | remoteGlobalIDString = 3D3CD9251DE5FBEC00167DC4; 154 | remoteInfo = cxxreact; 155 | }; 156 | 3DAD3EAA1DF850E9000B6D8A /* PBXContainerItemProxy */ = { 157 | isa = PBXContainerItemProxy; 158 | containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; 159 | proxyType = 2; 160 | remoteGlobalIDString = 3D3CD9321DE5FBEE00167DC4; 161 | remoteInfo = "cxxreact-tvOS"; 162 | }; 163 | 3DAD3EAC1DF850E9000B6D8A /* PBXContainerItemProxy */ = { 164 | isa = PBXContainerItemProxy; 165 | containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; 166 | proxyType = 2; 167 | remoteGlobalIDString = 3D3CD90B1DE5FBD600167DC4; 168 | remoteInfo = jschelpers; 169 | }; 170 | 3DAD3EAE1DF850E9000B6D8A /* PBXContainerItemProxy */ = { 171 | isa = PBXContainerItemProxy; 172 | containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; 173 | proxyType = 2; 174 | remoteGlobalIDString = 3D3CD9181DE5FBD800167DC4; 175 | remoteInfo = "jschelpers-tvOS"; 176 | }; 177 | 5E9157321DD0AC6500FF2AA8 /* PBXContainerItemProxy */ = { 178 | isa = PBXContainerItemProxy; 179 | containerPortal = 5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */; 180 | proxyType = 2; 181 | remoteGlobalIDString = 134814201AA4EA6300B7C361; 182 | remoteInfo = RCTAnimation; 183 | }; 184 | 5E9157341DD0AC6500FF2AA8 /* PBXContainerItemProxy */ = { 185 | isa = PBXContainerItemProxy; 186 | containerPortal = 5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */; 187 | proxyType = 2; 188 | remoteGlobalIDString = 2D2A28201D9B03D100D4039D; 189 | remoteInfo = "RCTAnimation-tvOS"; 190 | }; 191 | 78C398B81ACF4ADC00677621 /* PBXContainerItemProxy */ = { 192 | isa = PBXContainerItemProxy; 193 | containerPortal = 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */; 194 | proxyType = 2; 195 | remoteGlobalIDString = 134814201AA4EA6300B7C361; 196 | remoteInfo = RCTLinking; 197 | }; 198 | 832341B41AAA6A8300B99B32 /* PBXContainerItemProxy */ = { 199 | isa = PBXContainerItemProxy; 200 | containerPortal = 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */; 201 | proxyType = 2; 202 | remoteGlobalIDString = 58B5119B1A9E6C1200147676; 203 | remoteInfo = RCTText; 204 | }; 205 | ADBDB9261DFEBF0700ED6528 /* PBXContainerItemProxy */ = { 206 | isa = PBXContainerItemProxy; 207 | containerPortal = ADBDB91F1DFEBF0600ED6528 /* RCTBlob.xcodeproj */; 208 | proxyType = 2; 209 | remoteGlobalIDString = 358F4ED71D1E81A9004DF814; 210 | remoteInfo = RCTBlob; 211 | }; 212 | C9D53D261F8F6A4F00505AEC /* PBXContainerItemProxy */ = { 213 | isa = PBXContainerItemProxy; 214 | containerPortal = ADBDB91F1DFEBF0600ED6528 /* RCTBlob.xcodeproj */; 215 | proxyType = 2; 216 | remoteGlobalIDString = ADD01A681E09402E00F6D226; 217 | remoteInfo = "RCTBlob-tvOS"; 218 | }; 219 | C9D53D381F8F6A4F00505AEC /* PBXContainerItemProxy */ = { 220 | isa = PBXContainerItemProxy; 221 | containerPortal = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */; 222 | proxyType = 2; 223 | remoteGlobalIDString = 3DBE0D001F3B181A0099AA32; 224 | remoteInfo = fishhook; 225 | }; 226 | C9D53D3A1F8F6A4F00505AEC /* PBXContainerItemProxy */ = { 227 | isa = PBXContainerItemProxy; 228 | containerPortal = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */; 229 | proxyType = 2; 230 | remoteGlobalIDString = 3DBE0D0D1F3B181C0099AA32; 231 | remoteInfo = "fishhook-tvOS"; 232 | }; 233 | C9D53D6A1F8F6FDA00505AEC /* PBXContainerItemProxy */ = { 234 | isa = PBXContainerItemProxy; 235 | containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; 236 | proxyType = 2; 237 | remoteGlobalIDString = 139D7ECE1E25DB7D00323FB7; 238 | remoteInfo = "third-party"; 239 | }; 240 | C9D53D6C1F8F6FDA00505AEC /* PBXContainerItemProxy */ = { 241 | isa = PBXContainerItemProxy; 242 | containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; 243 | proxyType = 2; 244 | remoteGlobalIDString = 3D383D3C1EBD27B6005632C8; 245 | remoteInfo = "third-party-tvOS"; 246 | }; 247 | C9D53D6E1F8F6FDA00505AEC /* PBXContainerItemProxy */ = { 248 | isa = PBXContainerItemProxy; 249 | containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; 250 | proxyType = 2; 251 | remoteGlobalIDString = 139D7E881E25C6D100323FB7; 252 | remoteInfo = "double-conversion"; 253 | }; 254 | C9D53D701F8F6FDA00505AEC /* PBXContainerItemProxy */ = { 255 | isa = PBXContainerItemProxy; 256 | containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; 257 | proxyType = 2; 258 | remoteGlobalIDString = 3D383D621EBD27B9005632C8; 259 | remoteInfo = "double-conversion-tvOS"; 260 | }; 261 | C9D53DA91F8F743C00505AEC /* PBXContainerItemProxy */ = { 262 | isa = PBXContainerItemProxy; 263 | containerPortal = C9D53DA51F8F743C00505AEC /* MOReactNativeIosDragDrop.xcodeproj */; 264 | proxyType = 2; 265 | remoteGlobalIDString = 134814201AA4EA6300B7C361; 266 | remoteInfo = MOReactNativeIosDragDrop; 267 | }; 268 | /* End PBXContainerItemProxy section */ 269 | 270 | /* Begin PBXFileReference section */ 271 | 008F07F21AC5B25A0029DE68 /* main.jsbundle */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = main.jsbundle; sourceTree = ""; }; 272 | 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTActionSheet.xcodeproj; path = "../../node_modules/react-native/Libraries/ActionSheetIOS/RCTActionSheet.xcodeproj"; sourceTree = ""; }; 273 | 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTGeolocation.xcodeproj; path = "../../node_modules/react-native/Libraries/Geolocation/RCTGeolocation.xcodeproj"; sourceTree = ""; }; 274 | 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTImage.xcodeproj; path = "../../node_modules/react-native/Libraries/Image/RCTImage.xcodeproj"; sourceTree = ""; }; 275 | 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTNetwork.xcodeproj; path = "../../node_modules/react-native/Libraries/Network/RCTNetwork.xcodeproj"; sourceTree = ""; }; 276 | 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTVibration.xcodeproj; path = "../../node_modules/react-native/Libraries/Vibration/RCTVibration.xcodeproj"; sourceTree = ""; }; 277 | 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTSettings.xcodeproj; path = "../../node_modules/react-native/Libraries/Settings/RCTSettings.xcodeproj"; sourceTree = ""; }; 278 | 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTWebSocket.xcodeproj; path = "../../node_modules/react-native/Libraries/WebSocket/RCTWebSocket.xcodeproj"; sourceTree = ""; }; 279 | 13B07F961A680F5B00A75B9A /* DragDropExample.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = DragDropExample.app; sourceTree = BUILT_PRODUCTS_DIR; }; 280 | 13B07FAF1A68108700A75B9A /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = DragDropExample/AppDelegate.h; sourceTree = ""; }; 281 | 13B07FB01A68108700A75B9A /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AppDelegate.m; path = DragDropExample/AppDelegate.m; sourceTree = ""; }; 282 | 13B07FB21A68108700A75B9A /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = ""; }; 283 | 13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = DragDropExample/Images.xcassets; sourceTree = ""; }; 284 | 13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = DragDropExample/Info.plist; sourceTree = ""; }; 285 | 13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = DragDropExample/main.m; sourceTree = ""; }; 286 | 146833FF1AC3E56700842450 /* React.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = React.xcodeproj; path = "../../node_modules/react-native/React/React.xcodeproj"; sourceTree = ""; }; 287 | 5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTAnimation.xcodeproj; path = "../../node_modules/react-native/Libraries/NativeAnimation/RCTAnimation.xcodeproj"; sourceTree = ""; }; 288 | 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTLinking.xcodeproj; path = "../../node_modules/react-native/Libraries/LinkingIOS/RCTLinking.xcodeproj"; sourceTree = ""; }; 289 | 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTText.xcodeproj; path = "../../node_modules/react-native/Libraries/Text/RCTText.xcodeproj"; sourceTree = ""; }; 290 | ADBDB91F1DFEBF0600ED6528 /* RCTBlob.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTBlob.xcodeproj; path = "../../node_modules/react-native/Libraries/Blob/RCTBlob.xcodeproj"; sourceTree = ""; }; 291 | C9D53DA51F8F743C00505AEC /* MOReactNativeIosDragDrop.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = MOReactNativeIosDragDrop.xcodeproj; path = ../../ios/MOReactNativeIosDragDrop.xcodeproj; sourceTree = ""; }; 292 | /* End PBXFileReference section */ 293 | 294 | /* Begin PBXFrameworksBuildPhase section */ 295 | 13B07F8C1A680F5B00A75B9A /* Frameworks */ = { 296 | isa = PBXFrameworksBuildPhase; 297 | buildActionMask = 2147483647; 298 | files = ( 299 | ADBDB9381DFEBF1600ED6528 /* libRCTBlob.a in Frameworks */, 300 | 5E9157361DD0AC6A00FF2AA8 /* libRCTAnimation.a in Frameworks */, 301 | 146834051AC3E58100842450 /* libReact.a in Frameworks */, 302 | 5E9157361DD0AC6A00FF2AA8 /* libRCTAnimation.a in Frameworks */, 303 | 00C302E51ABCBA2D00DB3ED1 /* libRCTActionSheet.a in Frameworks */, 304 | 00C302E71ABCBA2D00DB3ED1 /* libRCTGeolocation.a in Frameworks */, 305 | 00C302E81ABCBA2D00DB3ED1 /* libRCTImage.a in Frameworks */, 306 | 133E29F31AD74F7200F7D852 /* libRCTLinking.a in Frameworks */, 307 | 00C302E91ABCBA2D00DB3ED1 /* libRCTNetwork.a in Frameworks */, 308 | 139105C61AF99C1200B5F7CC /* libRCTSettings.a in Frameworks */, 309 | 832341BD1AAA6AB300B99B32 /* libRCTText.a in Frameworks */, 310 | 00C302EA1ABCBA2D00DB3ED1 /* libRCTVibration.a in Frameworks */, 311 | 139FDEF61B0652A700C62182 /* libRCTWebSocket.a in Frameworks */, 312 | C9D53DAC1F8F744D00505AEC /* libMOReactNativeIosDragDrop.a in Frameworks */, 313 | ); 314 | runOnlyForDeploymentPostprocessing = 0; 315 | }; 316 | /* End PBXFrameworksBuildPhase section */ 317 | 318 | /* Begin PBXGroup section */ 319 | 00C302A81ABCB8CE00DB3ED1 /* Products */ = { 320 | isa = PBXGroup; 321 | children = ( 322 | 00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */, 323 | ); 324 | name = Products; 325 | sourceTree = ""; 326 | }; 327 | 00C302B61ABCB90400DB3ED1 /* Products */ = { 328 | isa = PBXGroup; 329 | children = ( 330 | 00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.a */, 331 | ); 332 | name = Products; 333 | sourceTree = ""; 334 | }; 335 | 00C302BC1ABCB91800DB3ED1 /* Products */ = { 336 | isa = PBXGroup; 337 | children = ( 338 | 00C302C01ABCB91800DB3ED1 /* libRCTImage.a */, 339 | 3DAD3E841DF850E9000B6D8A /* libRCTImage-tvOS.a */, 340 | ); 341 | name = Products; 342 | sourceTree = ""; 343 | }; 344 | 00C302D41ABCB9D200DB3ED1 /* Products */ = { 345 | isa = PBXGroup; 346 | children = ( 347 | 00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */, 348 | 3DAD3E8C1DF850E9000B6D8A /* libRCTNetwork-tvOS.a */, 349 | ); 350 | name = Products; 351 | sourceTree = ""; 352 | }; 353 | 00C302E01ABCB9EE00DB3ED1 /* Products */ = { 354 | isa = PBXGroup; 355 | children = ( 356 | 00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */, 357 | ); 358 | name = Products; 359 | sourceTree = ""; 360 | }; 361 | 139105B71AF99BAD00B5F7CC /* Products */ = { 362 | isa = PBXGroup; 363 | children = ( 364 | 139105C11AF99BAD00B5F7CC /* libRCTSettings.a */, 365 | 3DAD3E901DF850E9000B6D8A /* libRCTSettings-tvOS.a */, 366 | ); 367 | name = Products; 368 | sourceTree = ""; 369 | }; 370 | 139FDEE71B06529A00C62182 /* Products */ = { 371 | isa = PBXGroup; 372 | children = ( 373 | 139FDEF41B06529B00C62182 /* libRCTWebSocket.a */, 374 | 3DAD3E991DF850E9000B6D8A /* libRCTWebSocket-tvOS.a */, 375 | C9D53D391F8F6A4F00505AEC /* libfishhook.a */, 376 | C9D53D3B1F8F6A4F00505AEC /* libfishhook-tvOS.a */, 377 | ); 378 | name = Products; 379 | sourceTree = ""; 380 | }; 381 | 13B07FAE1A68108700A75B9A /* DragDropExample */ = { 382 | isa = PBXGroup; 383 | children = ( 384 | 008F07F21AC5B25A0029DE68 /* main.jsbundle */, 385 | 13B07FAF1A68108700A75B9A /* AppDelegate.h */, 386 | 13B07FB01A68108700A75B9A /* AppDelegate.m */, 387 | 13B07FB51A68108700A75B9A /* Images.xcassets */, 388 | 13B07FB61A68108700A75B9A /* Info.plist */, 389 | 13B07FB11A68108700A75B9A /* LaunchScreen.xib */, 390 | 13B07FB71A68108700A75B9A /* main.m */, 391 | ); 392 | name = DragDropExample; 393 | sourceTree = ""; 394 | }; 395 | 146834001AC3E56700842450 /* Products */ = { 396 | isa = PBXGroup; 397 | children = ( 398 | 146834041AC3E56700842450 /* libReact.a */, 399 | 3DAD3EA31DF850E9000B6D8A /* libReact.a */, 400 | 3DAD3EA51DF850E9000B6D8A /* libyoga.a */, 401 | 3DAD3EA71DF850E9000B6D8A /* libyoga.a */, 402 | 3DAD3EA91DF850E9000B6D8A /* libcxxreact.a */, 403 | 3DAD3EAB1DF850E9000B6D8A /* libcxxreact.a */, 404 | 3DAD3EAD1DF850E9000B6D8A /* libjschelpers.a */, 405 | 3DAD3EAF1DF850E9000B6D8A /* libjschelpers.a */, 406 | C9D53D6B1F8F6FDA00505AEC /* libthird-party.a */, 407 | C9D53D6D1F8F6FDA00505AEC /* libthird-party.a */, 408 | C9D53D6F1F8F6FDA00505AEC /* libdouble-conversion.a */, 409 | C9D53D711F8F6FDA00505AEC /* libdouble-conversion.a */, 410 | ); 411 | name = Products; 412 | sourceTree = ""; 413 | }; 414 | 5E91572E1DD0AC6500FF2AA8 /* Products */ = { 415 | isa = PBXGroup; 416 | children = ( 417 | 5E9157331DD0AC6500FF2AA8 /* libRCTAnimation.a */, 418 | 5E9157351DD0AC6500FF2AA8 /* libRCTAnimation.a */, 419 | ); 420 | name = Products; 421 | sourceTree = ""; 422 | }; 423 | 78C398B11ACF4ADC00677621 /* Products */ = { 424 | isa = PBXGroup; 425 | children = ( 426 | 78C398B91ACF4ADC00677621 /* libRCTLinking.a */, 427 | 3DAD3E881DF850E9000B6D8A /* libRCTLinking-tvOS.a */, 428 | ); 429 | name = Products; 430 | sourceTree = ""; 431 | }; 432 | 832341AE1AAA6A7D00B99B32 /* Libraries */ = { 433 | isa = PBXGroup; 434 | children = ( 435 | 5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */, 436 | 146833FF1AC3E56700842450 /* React.xcodeproj */, 437 | 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */, 438 | ADBDB91F1DFEBF0600ED6528 /* RCTBlob.xcodeproj */, 439 | 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */, 440 | 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */, 441 | 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */, 442 | 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */, 443 | 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */, 444 | 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */, 445 | 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */, 446 | 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */, 447 | C9D53DA51F8F743C00505AEC /* MOReactNativeIosDragDrop.xcodeproj */, 448 | ); 449 | name = Libraries; 450 | sourceTree = ""; 451 | }; 452 | 832341B11AAA6A8300B99B32 /* Products */ = { 453 | isa = PBXGroup; 454 | children = ( 455 | 832341B51AAA6A8300B99B32 /* libRCTText.a */, 456 | 3DAD3E941DF850E9000B6D8A /* libRCTText-tvOS.a */, 457 | ); 458 | name = Products; 459 | sourceTree = ""; 460 | }; 461 | 83CBB9F61A601CBA00E9B192 = { 462 | isa = PBXGroup; 463 | children = ( 464 | 13B07FAE1A68108700A75B9A /* DragDropExample */, 465 | 832341AE1AAA6A7D00B99B32 /* Libraries */, 466 | 83CBBA001A601CBA00E9B192 /* Products */, 467 | C9D53DAB1F8F744D00505AEC /* Frameworks */, 468 | ); 469 | indentWidth = 2; 470 | sourceTree = ""; 471 | tabWidth = 2; 472 | usesTabs = 0; 473 | }; 474 | 83CBBA001A601CBA00E9B192 /* Products */ = { 475 | isa = PBXGroup; 476 | children = ( 477 | 13B07F961A680F5B00A75B9A /* DragDropExample.app */, 478 | ); 479 | name = Products; 480 | sourceTree = ""; 481 | }; 482 | ADBDB9201DFEBF0600ED6528 /* Products */ = { 483 | isa = PBXGroup; 484 | children = ( 485 | ADBDB9271DFEBF0700ED6528 /* libRCTBlob.a */, 486 | C9D53D271F8F6A4F00505AEC /* libRCTBlob-tvOS.a */, 487 | ); 488 | name = Products; 489 | sourceTree = ""; 490 | }; 491 | C9D53DA61F8F743C00505AEC /* Products */ = { 492 | isa = PBXGroup; 493 | children = ( 494 | C9D53DAA1F8F743C00505AEC /* libMOReactNativeIosDragDrop.a */, 495 | ); 496 | name = Products; 497 | sourceTree = ""; 498 | }; 499 | C9D53DAB1F8F744D00505AEC /* Frameworks */ = { 500 | isa = PBXGroup; 501 | children = ( 502 | ); 503 | name = Frameworks; 504 | sourceTree = ""; 505 | }; 506 | /* End PBXGroup section */ 507 | 508 | /* Begin PBXNativeTarget section */ 509 | 13B07F861A680F5B00A75B9A /* DragDropExample */ = { 510 | isa = PBXNativeTarget; 511 | buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "DragDropExample" */; 512 | buildPhases = ( 513 | 13B07F871A680F5B00A75B9A /* Sources */, 514 | 13B07F8C1A680F5B00A75B9A /* Frameworks */, 515 | 13B07F8E1A680F5B00A75B9A /* Resources */, 516 | 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */, 517 | ); 518 | buildRules = ( 519 | ); 520 | dependencies = ( 521 | ); 522 | name = DragDropExample; 523 | productName = "Hello World"; 524 | productReference = 13B07F961A680F5B00A75B9A /* DragDropExample.app */; 525 | productType = "com.apple.product-type.application"; 526 | }; 527 | /* End PBXNativeTarget section */ 528 | 529 | /* Begin PBXProject section */ 530 | 83CBB9F71A601CBA00E9B192 /* Project object */ = { 531 | isa = PBXProject; 532 | attributes = { 533 | LastUpgradeCheck = 610; 534 | ORGANIZATIONNAME = "Matt Oakes"; 535 | }; 536 | buildConfigurationList = 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "DragDropExample" */; 537 | compatibilityVersion = "Xcode 3.2"; 538 | developmentRegion = English; 539 | hasScannedForEncodings = 0; 540 | knownRegions = ( 541 | en, 542 | Base, 543 | ); 544 | mainGroup = 83CBB9F61A601CBA00E9B192; 545 | productRefGroup = 83CBBA001A601CBA00E9B192 /* Products */; 546 | projectDirPath = ""; 547 | projectReferences = ( 548 | { 549 | ProductGroup = C9D53DA61F8F743C00505AEC /* Products */; 550 | ProjectRef = C9D53DA51F8F743C00505AEC /* MOReactNativeIosDragDrop.xcodeproj */; 551 | }, 552 | { 553 | ProductGroup = 00C302A81ABCB8CE00DB3ED1 /* Products */; 554 | ProjectRef = 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */; 555 | }, 556 | { 557 | ProductGroup = 5E91572E1DD0AC6500FF2AA8 /* Products */; 558 | ProjectRef = 5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */; 559 | }, 560 | { 561 | ProductGroup = ADBDB9201DFEBF0600ED6528 /* Products */; 562 | ProjectRef = ADBDB91F1DFEBF0600ED6528 /* RCTBlob.xcodeproj */; 563 | }, 564 | { 565 | ProductGroup = 00C302B61ABCB90400DB3ED1 /* Products */; 566 | ProjectRef = 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */; 567 | }, 568 | { 569 | ProductGroup = 00C302BC1ABCB91800DB3ED1 /* Products */; 570 | ProjectRef = 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */; 571 | }, 572 | { 573 | ProductGroup = 78C398B11ACF4ADC00677621 /* Products */; 574 | ProjectRef = 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */; 575 | }, 576 | { 577 | ProductGroup = 00C302D41ABCB9D200DB3ED1 /* Products */; 578 | ProjectRef = 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */; 579 | }, 580 | { 581 | ProductGroup = 139105B71AF99BAD00B5F7CC /* Products */; 582 | ProjectRef = 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */; 583 | }, 584 | { 585 | ProductGroup = 832341B11AAA6A8300B99B32 /* Products */; 586 | ProjectRef = 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */; 587 | }, 588 | { 589 | ProductGroup = 00C302E01ABCB9EE00DB3ED1 /* Products */; 590 | ProjectRef = 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */; 591 | }, 592 | { 593 | ProductGroup = 139FDEE71B06529A00C62182 /* Products */; 594 | ProjectRef = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */; 595 | }, 596 | { 597 | ProductGroup = 146834001AC3E56700842450 /* Products */; 598 | ProjectRef = 146833FF1AC3E56700842450 /* React.xcodeproj */; 599 | }, 600 | ); 601 | projectRoot = ""; 602 | targets = ( 603 | 13B07F861A680F5B00A75B9A /* DragDropExample */, 604 | ); 605 | }; 606 | /* End PBXProject section */ 607 | 608 | /* Begin PBXReferenceProxy section */ 609 | 00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */ = { 610 | isa = PBXReferenceProxy; 611 | fileType = archive.ar; 612 | path = libRCTActionSheet.a; 613 | remoteRef = 00C302AB1ABCB8CE00DB3ED1 /* PBXContainerItemProxy */; 614 | sourceTree = BUILT_PRODUCTS_DIR; 615 | }; 616 | 00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.a */ = { 617 | isa = PBXReferenceProxy; 618 | fileType = archive.ar; 619 | path = libRCTGeolocation.a; 620 | remoteRef = 00C302B91ABCB90400DB3ED1 /* PBXContainerItemProxy */; 621 | sourceTree = BUILT_PRODUCTS_DIR; 622 | }; 623 | 00C302C01ABCB91800DB3ED1 /* libRCTImage.a */ = { 624 | isa = PBXReferenceProxy; 625 | fileType = archive.ar; 626 | path = libRCTImage.a; 627 | remoteRef = 00C302BF1ABCB91800DB3ED1 /* PBXContainerItemProxy */; 628 | sourceTree = BUILT_PRODUCTS_DIR; 629 | }; 630 | 00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */ = { 631 | isa = PBXReferenceProxy; 632 | fileType = archive.ar; 633 | path = libRCTNetwork.a; 634 | remoteRef = 00C302DB1ABCB9D200DB3ED1 /* PBXContainerItemProxy */; 635 | sourceTree = BUILT_PRODUCTS_DIR; 636 | }; 637 | 00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */ = { 638 | isa = PBXReferenceProxy; 639 | fileType = archive.ar; 640 | path = libRCTVibration.a; 641 | remoteRef = 00C302E31ABCB9EE00DB3ED1 /* PBXContainerItemProxy */; 642 | sourceTree = BUILT_PRODUCTS_DIR; 643 | }; 644 | 139105C11AF99BAD00B5F7CC /* libRCTSettings.a */ = { 645 | isa = PBXReferenceProxy; 646 | fileType = archive.ar; 647 | path = libRCTSettings.a; 648 | remoteRef = 139105C01AF99BAD00B5F7CC /* PBXContainerItemProxy */; 649 | sourceTree = BUILT_PRODUCTS_DIR; 650 | }; 651 | 139FDEF41B06529B00C62182 /* libRCTWebSocket.a */ = { 652 | isa = PBXReferenceProxy; 653 | fileType = archive.ar; 654 | path = libRCTWebSocket.a; 655 | remoteRef = 139FDEF31B06529B00C62182 /* PBXContainerItemProxy */; 656 | sourceTree = BUILT_PRODUCTS_DIR; 657 | }; 658 | 146834041AC3E56700842450 /* libReact.a */ = { 659 | isa = PBXReferenceProxy; 660 | fileType = archive.ar; 661 | path = libReact.a; 662 | remoteRef = 146834031AC3E56700842450 /* PBXContainerItemProxy */; 663 | sourceTree = BUILT_PRODUCTS_DIR; 664 | }; 665 | 3DAD3E841DF850E9000B6D8A /* libRCTImage-tvOS.a */ = { 666 | isa = PBXReferenceProxy; 667 | fileType = archive.ar; 668 | path = "libRCTImage-tvOS.a"; 669 | remoteRef = 3DAD3E831DF850E9000B6D8A /* PBXContainerItemProxy */; 670 | sourceTree = BUILT_PRODUCTS_DIR; 671 | }; 672 | 3DAD3E881DF850E9000B6D8A /* libRCTLinking-tvOS.a */ = { 673 | isa = PBXReferenceProxy; 674 | fileType = archive.ar; 675 | path = "libRCTLinking-tvOS.a"; 676 | remoteRef = 3DAD3E871DF850E9000B6D8A /* PBXContainerItemProxy */; 677 | sourceTree = BUILT_PRODUCTS_DIR; 678 | }; 679 | 3DAD3E8C1DF850E9000B6D8A /* libRCTNetwork-tvOS.a */ = { 680 | isa = PBXReferenceProxy; 681 | fileType = archive.ar; 682 | path = "libRCTNetwork-tvOS.a"; 683 | remoteRef = 3DAD3E8B1DF850E9000B6D8A /* PBXContainerItemProxy */; 684 | sourceTree = BUILT_PRODUCTS_DIR; 685 | }; 686 | 3DAD3E901DF850E9000B6D8A /* libRCTSettings-tvOS.a */ = { 687 | isa = PBXReferenceProxy; 688 | fileType = archive.ar; 689 | path = "libRCTSettings-tvOS.a"; 690 | remoteRef = 3DAD3E8F1DF850E9000B6D8A /* PBXContainerItemProxy */; 691 | sourceTree = BUILT_PRODUCTS_DIR; 692 | }; 693 | 3DAD3E941DF850E9000B6D8A /* libRCTText-tvOS.a */ = { 694 | isa = PBXReferenceProxy; 695 | fileType = archive.ar; 696 | path = "libRCTText-tvOS.a"; 697 | remoteRef = 3DAD3E931DF850E9000B6D8A /* PBXContainerItemProxy */; 698 | sourceTree = BUILT_PRODUCTS_DIR; 699 | }; 700 | 3DAD3E991DF850E9000B6D8A /* libRCTWebSocket-tvOS.a */ = { 701 | isa = PBXReferenceProxy; 702 | fileType = archive.ar; 703 | path = "libRCTWebSocket-tvOS.a"; 704 | remoteRef = 3DAD3E981DF850E9000B6D8A /* PBXContainerItemProxy */; 705 | sourceTree = BUILT_PRODUCTS_DIR; 706 | }; 707 | 3DAD3EA31DF850E9000B6D8A /* libReact.a */ = { 708 | isa = PBXReferenceProxy; 709 | fileType = archive.ar; 710 | path = libReact.a; 711 | remoteRef = 3DAD3EA21DF850E9000B6D8A /* PBXContainerItemProxy */; 712 | sourceTree = BUILT_PRODUCTS_DIR; 713 | }; 714 | 3DAD3EA51DF850E9000B6D8A /* libyoga.a */ = { 715 | isa = PBXReferenceProxy; 716 | fileType = archive.ar; 717 | path = libyoga.a; 718 | remoteRef = 3DAD3EA41DF850E9000B6D8A /* PBXContainerItemProxy */; 719 | sourceTree = BUILT_PRODUCTS_DIR; 720 | }; 721 | 3DAD3EA71DF850E9000B6D8A /* libyoga.a */ = { 722 | isa = PBXReferenceProxy; 723 | fileType = archive.ar; 724 | path = libyoga.a; 725 | remoteRef = 3DAD3EA61DF850E9000B6D8A /* PBXContainerItemProxy */; 726 | sourceTree = BUILT_PRODUCTS_DIR; 727 | }; 728 | 3DAD3EA91DF850E9000B6D8A /* libcxxreact.a */ = { 729 | isa = PBXReferenceProxy; 730 | fileType = archive.ar; 731 | path = libcxxreact.a; 732 | remoteRef = 3DAD3EA81DF850E9000B6D8A /* PBXContainerItemProxy */; 733 | sourceTree = BUILT_PRODUCTS_DIR; 734 | }; 735 | 3DAD3EAB1DF850E9000B6D8A /* libcxxreact.a */ = { 736 | isa = PBXReferenceProxy; 737 | fileType = archive.ar; 738 | path = libcxxreact.a; 739 | remoteRef = 3DAD3EAA1DF850E9000B6D8A /* PBXContainerItemProxy */; 740 | sourceTree = BUILT_PRODUCTS_DIR; 741 | }; 742 | 3DAD3EAD1DF850E9000B6D8A /* libjschelpers.a */ = { 743 | isa = PBXReferenceProxy; 744 | fileType = archive.ar; 745 | path = libjschelpers.a; 746 | remoteRef = 3DAD3EAC1DF850E9000B6D8A /* PBXContainerItemProxy */; 747 | sourceTree = BUILT_PRODUCTS_DIR; 748 | }; 749 | 3DAD3EAF1DF850E9000B6D8A /* libjschelpers.a */ = { 750 | isa = PBXReferenceProxy; 751 | fileType = archive.ar; 752 | path = libjschelpers.a; 753 | remoteRef = 3DAD3EAE1DF850E9000B6D8A /* PBXContainerItemProxy */; 754 | sourceTree = BUILT_PRODUCTS_DIR; 755 | }; 756 | 5E9157331DD0AC6500FF2AA8 /* libRCTAnimation.a */ = { 757 | isa = PBXReferenceProxy; 758 | fileType = archive.ar; 759 | path = libRCTAnimation.a; 760 | remoteRef = 5E9157321DD0AC6500FF2AA8 /* PBXContainerItemProxy */; 761 | sourceTree = BUILT_PRODUCTS_DIR; 762 | }; 763 | 5E9157351DD0AC6500FF2AA8 /* libRCTAnimation.a */ = { 764 | isa = PBXReferenceProxy; 765 | fileType = archive.ar; 766 | path = libRCTAnimation.a; 767 | remoteRef = 5E9157341DD0AC6500FF2AA8 /* PBXContainerItemProxy */; 768 | sourceTree = BUILT_PRODUCTS_DIR; 769 | }; 770 | 78C398B91ACF4ADC00677621 /* libRCTLinking.a */ = { 771 | isa = PBXReferenceProxy; 772 | fileType = archive.ar; 773 | path = libRCTLinking.a; 774 | remoteRef = 78C398B81ACF4ADC00677621 /* PBXContainerItemProxy */; 775 | sourceTree = BUILT_PRODUCTS_DIR; 776 | }; 777 | 832341B51AAA6A8300B99B32 /* libRCTText.a */ = { 778 | isa = PBXReferenceProxy; 779 | fileType = archive.ar; 780 | path = libRCTText.a; 781 | remoteRef = 832341B41AAA6A8300B99B32 /* PBXContainerItemProxy */; 782 | sourceTree = BUILT_PRODUCTS_DIR; 783 | }; 784 | ADBDB9271DFEBF0700ED6528 /* libRCTBlob.a */ = { 785 | isa = PBXReferenceProxy; 786 | fileType = archive.ar; 787 | path = libRCTBlob.a; 788 | remoteRef = ADBDB9261DFEBF0700ED6528 /* PBXContainerItemProxy */; 789 | sourceTree = BUILT_PRODUCTS_DIR; 790 | }; 791 | C9D53D271F8F6A4F00505AEC /* libRCTBlob-tvOS.a */ = { 792 | isa = PBXReferenceProxy; 793 | fileType = archive.ar; 794 | path = "libRCTBlob-tvOS.a"; 795 | remoteRef = C9D53D261F8F6A4F00505AEC /* PBXContainerItemProxy */; 796 | sourceTree = BUILT_PRODUCTS_DIR; 797 | }; 798 | C9D53D391F8F6A4F00505AEC /* libfishhook.a */ = { 799 | isa = PBXReferenceProxy; 800 | fileType = archive.ar; 801 | path = libfishhook.a; 802 | remoteRef = C9D53D381F8F6A4F00505AEC /* PBXContainerItemProxy */; 803 | sourceTree = BUILT_PRODUCTS_DIR; 804 | }; 805 | C9D53D3B1F8F6A4F00505AEC /* libfishhook-tvOS.a */ = { 806 | isa = PBXReferenceProxy; 807 | fileType = archive.ar; 808 | path = "libfishhook-tvOS.a"; 809 | remoteRef = C9D53D3A1F8F6A4F00505AEC /* PBXContainerItemProxy */; 810 | sourceTree = BUILT_PRODUCTS_DIR; 811 | }; 812 | C9D53D6B1F8F6FDA00505AEC /* libthird-party.a */ = { 813 | isa = PBXReferenceProxy; 814 | fileType = archive.ar; 815 | path = "libthird-party.a"; 816 | remoteRef = C9D53D6A1F8F6FDA00505AEC /* PBXContainerItemProxy */; 817 | sourceTree = BUILT_PRODUCTS_DIR; 818 | }; 819 | C9D53D6D1F8F6FDA00505AEC /* libthird-party.a */ = { 820 | isa = PBXReferenceProxy; 821 | fileType = archive.ar; 822 | path = "libthird-party.a"; 823 | remoteRef = C9D53D6C1F8F6FDA00505AEC /* PBXContainerItemProxy */; 824 | sourceTree = BUILT_PRODUCTS_DIR; 825 | }; 826 | C9D53D6F1F8F6FDA00505AEC /* libdouble-conversion.a */ = { 827 | isa = PBXReferenceProxy; 828 | fileType = archive.ar; 829 | path = "libdouble-conversion.a"; 830 | remoteRef = C9D53D6E1F8F6FDA00505AEC /* PBXContainerItemProxy */; 831 | sourceTree = BUILT_PRODUCTS_DIR; 832 | }; 833 | C9D53D711F8F6FDA00505AEC /* libdouble-conversion.a */ = { 834 | isa = PBXReferenceProxy; 835 | fileType = archive.ar; 836 | path = "libdouble-conversion.a"; 837 | remoteRef = C9D53D701F8F6FDA00505AEC /* PBXContainerItemProxy */; 838 | sourceTree = BUILT_PRODUCTS_DIR; 839 | }; 840 | C9D53DAA1F8F743C00505AEC /* libMOReactNativeIosDragDrop.a */ = { 841 | isa = PBXReferenceProxy; 842 | fileType = archive.ar; 843 | path = libMOReactNativeIosDragDrop.a; 844 | remoteRef = C9D53DA91F8F743C00505AEC /* PBXContainerItemProxy */; 845 | sourceTree = BUILT_PRODUCTS_DIR; 846 | }; 847 | /* End PBXReferenceProxy section */ 848 | 849 | /* Begin PBXResourcesBuildPhase section */ 850 | 13B07F8E1A680F5B00A75B9A /* Resources */ = { 851 | isa = PBXResourcesBuildPhase; 852 | buildActionMask = 2147483647; 853 | files = ( 854 | 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */, 855 | 13B07FBD1A68108700A75B9A /* LaunchScreen.xib in Resources */, 856 | ); 857 | runOnlyForDeploymentPostprocessing = 0; 858 | }; 859 | /* End PBXResourcesBuildPhase section */ 860 | 861 | /* Begin PBXShellScriptBuildPhase section */ 862 | 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */ = { 863 | isa = PBXShellScriptBuildPhase; 864 | buildActionMask = 2147483647; 865 | files = ( 866 | ); 867 | inputPaths = ( 868 | ); 869 | name = "Bundle React Native code and images"; 870 | outputPaths = ( 871 | ); 872 | runOnlyForDeploymentPostprocessing = 0; 873 | shellPath = /bin/sh; 874 | shellScript = "export NODE_BINARY=node\n../../node_modules/react-native/scripts/react-native-xcode.sh"; 875 | }; 876 | /* End PBXShellScriptBuildPhase section */ 877 | 878 | /* Begin PBXSourcesBuildPhase section */ 879 | 13B07F871A680F5B00A75B9A /* Sources */ = { 880 | isa = PBXSourcesBuildPhase; 881 | buildActionMask = 2147483647; 882 | files = ( 883 | 13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */, 884 | 13B07FC11A68108700A75B9A /* main.m in Sources */, 885 | ); 886 | runOnlyForDeploymentPostprocessing = 0; 887 | }; 888 | /* End PBXSourcesBuildPhase section */ 889 | 890 | /* Begin PBXVariantGroup section */ 891 | 13B07FB11A68108700A75B9A /* LaunchScreen.xib */ = { 892 | isa = PBXVariantGroup; 893 | children = ( 894 | 13B07FB21A68108700A75B9A /* Base */, 895 | ); 896 | name = LaunchScreen.xib; 897 | path = DragDropExample; 898 | sourceTree = ""; 899 | }; 900 | /* End PBXVariantGroup section */ 901 | 902 | /* Begin XCBuildConfiguration section */ 903 | 13B07F941A680F5B00A75B9A /* Debug */ = { 904 | isa = XCBuildConfiguration; 905 | buildSettings = { 906 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 907 | CURRENT_PROJECT_VERSION = 1; 908 | DEAD_CODE_STRIPPING = NO; 909 | HEADER_SEARCH_PATHS = ( 910 | "$(inherited)", 911 | "$(SRCROOT)/../../node_modules/react-native-ios-drag-drop/ios", 912 | ); 913 | INFOPLIST_FILE = DragDropExample/Info.plist; 914 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 915 | LIBRARY_SEARCH_PATHS = ( 916 | "$(inherited)", 917 | "\"$(SRCROOT)/DragDropExample\"", 918 | ); 919 | OTHER_LDFLAGS = ( 920 | "$(inherited)", 921 | "-ObjC", 922 | "-lc++", 923 | ); 924 | PRODUCT_NAME = DragDropExample; 925 | TARGETED_DEVICE_FAMILY = "1,2"; 926 | VERSIONING_SYSTEM = "apple-generic"; 927 | }; 928 | name = Debug; 929 | }; 930 | 13B07F951A680F5B00A75B9A /* Release */ = { 931 | isa = XCBuildConfiguration; 932 | buildSettings = { 933 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 934 | CURRENT_PROJECT_VERSION = 1; 935 | HEADER_SEARCH_PATHS = ( 936 | "$(inherited)", 937 | "$(SRCROOT)/../../node_modules/react-native-ios-drag-drop/ios", 938 | ); 939 | INFOPLIST_FILE = DragDropExample/Info.plist; 940 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 941 | LIBRARY_SEARCH_PATHS = ( 942 | "$(inherited)", 943 | "\"$(SRCROOT)/DragDropExample\"", 944 | ); 945 | OTHER_LDFLAGS = ( 946 | "$(inherited)", 947 | "-ObjC", 948 | "-lc++", 949 | ); 950 | PRODUCT_NAME = DragDropExample; 951 | TARGETED_DEVICE_FAMILY = "1,2"; 952 | VERSIONING_SYSTEM = "apple-generic"; 953 | }; 954 | name = Release; 955 | }; 956 | 83CBBA201A601CBA00E9B192 /* Debug */ = { 957 | isa = XCBuildConfiguration; 958 | buildSettings = { 959 | ALWAYS_SEARCH_USER_PATHS = NO; 960 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 961 | CLANG_CXX_LIBRARY = "libc++"; 962 | CLANG_ENABLE_MODULES = YES; 963 | CLANG_ENABLE_OBJC_ARC = YES; 964 | CLANG_WARN_BOOL_CONVERSION = YES; 965 | CLANG_WARN_CONSTANT_CONVERSION = YES; 966 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 967 | CLANG_WARN_EMPTY_BODY = YES; 968 | CLANG_WARN_ENUM_CONVERSION = YES; 969 | CLANG_WARN_INT_CONVERSION = YES; 970 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 971 | CLANG_WARN_UNREACHABLE_CODE = YES; 972 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 973 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 974 | COPY_PHASE_STRIP = NO; 975 | ENABLE_STRICT_OBJC_MSGSEND = YES; 976 | GCC_C_LANGUAGE_STANDARD = gnu99; 977 | GCC_DYNAMIC_NO_PIC = NO; 978 | GCC_OPTIMIZATION_LEVEL = 0; 979 | GCC_PREPROCESSOR_DEFINITIONS = ( 980 | "DEBUG=1", 981 | "$(inherited)", 982 | ); 983 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 984 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 985 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 986 | GCC_WARN_UNDECLARED_SELECTOR = YES; 987 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 988 | GCC_WARN_UNUSED_FUNCTION = YES; 989 | GCC_WARN_UNUSED_VARIABLE = YES; 990 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 991 | MTL_ENABLE_DEBUG_INFO = YES; 992 | ONLY_ACTIVE_ARCH = YES; 993 | SDKROOT = iphoneos; 994 | }; 995 | name = Debug; 996 | }; 997 | 83CBBA211A601CBA00E9B192 /* Release */ = { 998 | isa = XCBuildConfiguration; 999 | buildSettings = { 1000 | ALWAYS_SEARCH_USER_PATHS = NO; 1001 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 1002 | CLANG_CXX_LIBRARY = "libc++"; 1003 | CLANG_ENABLE_MODULES = YES; 1004 | CLANG_ENABLE_OBJC_ARC = YES; 1005 | CLANG_WARN_BOOL_CONVERSION = YES; 1006 | CLANG_WARN_CONSTANT_CONVERSION = YES; 1007 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 1008 | CLANG_WARN_EMPTY_BODY = YES; 1009 | CLANG_WARN_ENUM_CONVERSION = YES; 1010 | CLANG_WARN_INT_CONVERSION = YES; 1011 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 1012 | CLANG_WARN_UNREACHABLE_CODE = YES; 1013 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 1014 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 1015 | COPY_PHASE_STRIP = YES; 1016 | ENABLE_NS_ASSERTIONS = NO; 1017 | ENABLE_STRICT_OBJC_MSGSEND = YES; 1018 | GCC_C_LANGUAGE_STANDARD = gnu99; 1019 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 1020 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 1021 | GCC_WARN_UNDECLARED_SELECTOR = YES; 1022 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 1023 | GCC_WARN_UNUSED_FUNCTION = YES; 1024 | GCC_WARN_UNUSED_VARIABLE = YES; 1025 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 1026 | MTL_ENABLE_DEBUG_INFO = NO; 1027 | SDKROOT = iphoneos; 1028 | VALIDATE_PRODUCT = YES; 1029 | }; 1030 | name = Release; 1031 | }; 1032 | /* End XCBuildConfiguration section */ 1033 | 1034 | /* Begin XCConfigurationList section */ 1035 | 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "DragDropExample" */ = { 1036 | isa = XCConfigurationList; 1037 | buildConfigurations = ( 1038 | 13B07F941A680F5B00A75B9A /* Debug */, 1039 | 13B07F951A680F5B00A75B9A /* Release */, 1040 | ); 1041 | defaultConfigurationIsVisible = 0; 1042 | defaultConfigurationName = Release; 1043 | }; 1044 | 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "DragDropExample" */ = { 1045 | isa = XCConfigurationList; 1046 | buildConfigurations = ( 1047 | 83CBBA201A601CBA00E9B192 /* Debug */, 1048 | 83CBBA211A601CBA00E9B192 /* Release */, 1049 | ); 1050 | defaultConfigurationIsVisible = 0; 1051 | defaultConfigurationName = Release; 1052 | }; 1053 | /* End XCConfigurationList section */ 1054 | }; 1055 | rootObject = 83CBB9F71A601CBA00E9B192 /* Project object */; 1056 | } 1057 | -------------------------------------------------------------------------------- /example/ios/DragDropExample.xcodeproj/xcshareddata/xcschemes/DragDropExample.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 29 | 35 | 36 | 37 | 38 | 39 | 45 | 46 | 47 | 48 | 54 | 55 | 56 | 57 | 58 | 59 | 70 | 72 | 78 | 79 | 80 | 81 | 82 | 83 | 89 | 91 | 97 | 98 | 99 | 100 | 102 | 103 | 106 | 107 | 108 | -------------------------------------------------------------------------------- /example/ios/DragDropExample/AppDelegate.h: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) 2015-present, Facebook, Inc. 3 | * All rights reserved. 4 | * 5 | * This source code is licensed under the BSD-style license found in the 6 | * LICENSE file in the root directory of this source tree. An additional grant 7 | * of patent rights can be found in the PATENTS file in the same directory. 8 | */ 9 | 10 | #import 11 | 12 | @interface AppDelegate : UIResponder 13 | 14 | @property (nonatomic, strong) UIWindow *window; 15 | 16 | @end 17 | -------------------------------------------------------------------------------- /example/ios/DragDropExample/AppDelegate.m: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) 2015-present, Facebook, Inc. 3 | * All rights reserved. 4 | * 5 | * This source code is licensed under the BSD-style license found in the 6 | * LICENSE file in the root directory of this source tree. An additional grant 7 | * of patent rights can be found in the PATENTS file in the same directory. 8 | */ 9 | 10 | #import "AppDelegate.h" 11 | 12 | #import 13 | #import 14 | 15 | @implementation AppDelegate 16 | 17 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 18 | { 19 | NSURL *jsCodeLocation; 20 | 21 | jsCodeLocation = [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"example/index" fallbackResource:nil]; 22 | 23 | RCTRootView *rootView = [[RCTRootView alloc] initWithBundleURL:jsCodeLocation 24 | moduleName:@"DragDropExample" 25 | initialProperties:nil 26 | launchOptions:launchOptions]; 27 | rootView.backgroundColor = [[UIColor alloc] initWithRed:1.0f green:1.0f blue:1.0f alpha:1]; 28 | 29 | self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; 30 | UIViewController *rootViewController = [UIViewController new]; 31 | rootViewController.view = rootView; 32 | self.window.rootViewController = rootViewController; 33 | [self.window makeKeyAndVisible]; 34 | return YES; 35 | } 36 | 37 | @end 38 | -------------------------------------------------------------------------------- /example/ios/DragDropExample/Base.lproj/LaunchScreen.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 21 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | -------------------------------------------------------------------------------- /example/ios/DragDropExample/Images.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "size" : "29x29", 6 | "scale" : "2x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "size" : "29x29", 11 | "scale" : "3x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "size" : "40x40", 16 | "scale" : "2x" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "size" : "40x40", 21 | "scale" : "3x" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "size" : "60x60", 26 | "scale" : "2x" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "size" : "60x60", 31 | "scale" : "3x" 32 | } 33 | ], 34 | "info" : { 35 | "version" : 1, 36 | "author" : "xcode" 37 | } 38 | } -------------------------------------------------------------------------------- /example/ios/DragDropExample/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleDisplayName 8 | DragDropExample 9 | CFBundleExecutable 10 | $(EXECUTABLE_NAME) 11 | CFBundleIdentifier 12 | org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | $(PRODUCT_NAME) 17 | CFBundlePackageType 18 | APPL 19 | CFBundleShortVersionString 20 | 1.0 21 | CFBundleSignature 22 | ???? 23 | CFBundleVersion 24 | 1 25 | LSRequiresIPhoneOS 26 | 27 | NSAppTransportSecurity 28 | 29 | NSExceptionDomains 30 | 31 | localhost 32 | 33 | NSExceptionAllowsInsecureHTTPLoads 34 | 35 | 36 | 37 | 38 | NSLocationWhenInUseUsageDescription 39 | 40 | UILaunchStoryboardName 41 | LaunchScreen 42 | UIRequiredDeviceCapabilities 43 | 44 | armv7 45 | 46 | UISupportedInterfaceOrientations 47 | 48 | UIInterfaceOrientationPortrait 49 | 50 | UISupportedInterfaceOrientations~ipad 51 | 52 | UIInterfaceOrientationPortrait 53 | UIInterfaceOrientationPortraitUpsideDown 54 | UIInterfaceOrientationLandscapeLeft 55 | UIInterfaceOrientationLandscapeRight 56 | 57 | UIViewControllerBasedStatusBarAppearance 58 | 59 | 60 | 61 | -------------------------------------------------------------------------------- /example/ios/DragDropExample/main.m: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) 2015-present, Facebook, Inc. 3 | * All rights reserved. 4 | * 5 | * This source code is licensed under the BSD-style license found in the 6 | * LICENSE file in the root directory of this source tree. An additional grant 7 | * of patent rights can be found in the PATENTS file in the same directory. 8 | */ 9 | 10 | #import 11 | 12 | #import "AppDelegate.h" 13 | 14 | int main(int argc, char * argv[]) { 15 | @autoreleasepool { 16 | return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /images/draggable-custom-preview.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/matt-oakes/react-native-ios-drag-drop/99d92e34247c8712ee65b56fce8c705470615035/images/draggable-custom-preview.gif -------------------------------------------------------------------------------- /images/draggable-multiple-items.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/matt-oakes/react-native-ios-drag-drop/99d92e34247c8712ee65b56fce8c705470615035/images/draggable-multiple-items.gif -------------------------------------------------------------------------------- /images/draggable-single-item.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/matt-oakes/react-native-ios-drag-drop/99d92e34247c8712ee65b56fce8c705470615035/images/draggable-single-item.gif -------------------------------------------------------------------------------- /images/draggable-url.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/matt-oakes/react-native-ios-drag-drop/99d92e34247c8712ee65b56fce8c705470615035/images/draggable-url.gif -------------------------------------------------------------------------------- /ios/MODragItem.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | @interface MODragItem : NSObject 4 | 5 | @property (nonatomic, strong, nonnull) NSString *title; 6 | 7 | - (instancetype _Nonnull)initWithTitle:(NSString * _Nonnull)title; 8 | 9 | - (UIDragItem * _Nonnull)uiDragItem; 10 | 11 | @end 12 | -------------------------------------------------------------------------------- /ios/MODragItem.m: -------------------------------------------------------------------------------- 1 | #import 2 | #import "MODragItem.h" 3 | 4 | @implementation MODragItem 5 | 6 | - (instancetype _Nonnull)initWithTitle:(NSString * _Nonnull)title 7 | { 8 | self = [super init]; 9 | if (self) { 10 | self.title = title; 11 | } 12 | return self; 13 | } 14 | 15 | - (UIDragItem * _Nonnull)uiDragItem { 16 | NSItemProvider *itemProvider = [[NSItemProvider alloc] initWithObject:self.title]; 17 | return [[UIDragItem alloc] initWithItemProvider:itemProvider]; 18 | } 19 | 20 | @end 21 | -------------------------------------------------------------------------------- /ios/MODragPreviewView.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | @interface MODragPreviewView : UIView 4 | 5 | @end 6 | -------------------------------------------------------------------------------- /ios/MODragPreviewView.m: -------------------------------------------------------------------------------- 1 | #import "MODragPreviewView.h" 2 | #import "MODragView.h" 3 | 4 | @implementation MODragPreviewView 5 | 6 | - (void)didMoveToSuperview { 7 | if ([self.superview isKindOfClass:[MODragView class]]) { 8 | [self removeFromSuperview]; 9 | } 10 | } 11 | 12 | @end 13 | -------------------------------------------------------------------------------- /ios/MODragPreviewViewManager.h: -------------------------------------------------------------------------------- 1 | #if __has_include("RCTViewManager.h") 2 | #import "RCTViewManager.h" 3 | #else 4 | #import 5 | #endif 6 | 7 | @interface MODragPreviewViewManager : RCTViewManager 8 | 9 | @end 10 | -------------------------------------------------------------------------------- /ios/MODragPreviewViewManager.m: -------------------------------------------------------------------------------- 1 | #import "MODragPreviewViewManager.h" 2 | #import "MODragPreviewView.h" 3 | 4 | @implementation MODragPreviewViewManager 5 | 6 | RCT_EXPORT_MODULE() 7 | 8 | - (MODragPreviewView *)view { 9 | return [[MODragPreviewView alloc] init]; 10 | } 11 | 12 | @end 13 | -------------------------------------------------------------------------------- /ios/MODragView.h: -------------------------------------------------------------------------------- 1 | #import 2 | #import "MODragItem.h" 3 | 4 | @interface MODragView : UIView 5 | 6 | @property (nonatomic, strong) NSArray *dragItems; 7 | 8 | @end 9 | -------------------------------------------------------------------------------- /ios/MODragView.m: -------------------------------------------------------------------------------- 1 | #import 2 | #import "MODragView.h" 3 | #import "MODragPreviewView.h" 4 | 5 | @interface MODragView () 6 | @end 7 | 8 | @implementation MODragView 9 | { 10 | UIDragInteraction *_dragInteraction; 11 | NSArray *_dragItems; 12 | // We keep track of the preview view and the index it was added at if we are given one 13 | NSInteger _previewReactSubviewIndex; 14 | UIView *_previewReactSubview; 15 | // We keep track of the React subviews ourself so we can handle the preview view ourself 16 | NSMutableArray *_reactSubviews; 17 | } 18 | 19 | - (instancetype)init 20 | { 21 | self = [super init]; 22 | if (self) { 23 | _dragInteraction = [[UIDragInteraction alloc] initWithDelegate:self]; 24 | _dragItems = nil; 25 | _previewReactSubviewIndex = -1; 26 | _previewReactSubview = nil; 27 | _reactSubviews = [[NSMutableArray alloc] init]; 28 | 29 | [self addInteraction:_dragInteraction]; 30 | [self setUserInteractionEnabled:YES]; 31 | } 32 | return self; 33 | } 34 | 35 | #pragma mark - React subviews 36 | 37 | #pragma clang diagnostic push 38 | #pragma clang diagnostic ignored "-Wobjc-missing-super-calls" 39 | - (void)insertReactSubview:(id)subview atIndex:(NSInteger)atIndex { 40 | if ([subview isKindOfClass:[MODragPreviewView class]]) { 41 | // Keep track of the preview view and don't add it to the actual view subviews 42 | _previewReactSubviewIndex = atIndex; 43 | _previewReactSubview = (UIView *)subview; 44 | } else { 45 | // If it's not a preview view, just add it as normal, but take into accoun 46 | NSInteger index = (_previewReactSubviewIndex != -1 && atIndex > _previewReactSubviewIndex) ? atIndex - 1 : atIndex; 47 | [super insertSubview:(UIView *)subview atIndex:index]; 48 | } 49 | 50 | // Keep track of the subviews so we can return them when required 51 | [_reactSubviews insertObject:(UIView *)subview atIndex:(NSUInteger)atIndex]; 52 | } 53 | 54 | - (void)removeReactSubview:(id)subview { 55 | if ([subview isKindOfClass:[MODragPreviewView class]]) { 56 | // We no longer have a preview view, so remove the references to it 57 | _previewReactSubviewIndex = -1; 58 | _previewReactSubview = nil; 59 | } else { 60 | // Otherwise, just remove it as normal 61 | [(UIView *)subview removeFromSuperview]; 62 | } 63 | 64 | // Keep our array up-to-date so we can respond correctly 65 | [_reactSubviews removeObject:(UIView *)subview]; 66 | } 67 | 68 | - (NSArray> *)reactSubviews { 69 | return (NSArray> *)_reactSubviews; 70 | } 71 | #pragma clang diagnostic pop 72 | 73 | #pragma mark - UIDragInteractionDelegate 74 | 75 | - (NSArray *)dragInteraction:(UIDragInteraction *)interaction itemsForBeginningSession:(id)session { 76 | // Shortcut if there are no drag items set 77 | if (!_dragItems || _dragItems.count == 0) { 78 | return @[]; 79 | } 80 | 81 | // Map the MODragItems to UIDragItems 82 | // This allows us to store the drag items in our own format and only create the UIDragItems when needed 83 | NSMutableArray *uiDragItems = [[NSMutableArray alloc] initWithCapacity:_dragItems.count]; 84 | [_dragItems enumerateObjectsUsingBlock:^(MODragItem * _Nonnull dragItem, NSUInteger index, BOOL * _Nonnull stop) { 85 | UIDragItem *uiDragItem = dragItem.uiDragItem; 86 | if (_previewReactSubview) { 87 | uiDragItem.previewProvider = ^UIDragPreview * _Nullable{ 88 | return [[UIDragPreview alloc] initWithView:_previewReactSubview]; 89 | }; 90 | } 91 | [uiDragItems addObject:uiDragItem]; 92 | }]; 93 | return [[NSArray alloc] initWithArray:uiDragItems]; 94 | } 95 | 96 | @end 97 | -------------------------------------------------------------------------------- /ios/MODragViewManager.h: -------------------------------------------------------------------------------- 1 | #if __has_include("RCTViewManager.h") 2 | #import "RCTViewManager.h" 3 | #else 4 | #import 5 | #endif 6 | 7 | @interface MODragViewManager : RCTViewManager 8 | 9 | @end 10 | 11 | -------------------------------------------------------------------------------- /ios/MODragViewManager.m: -------------------------------------------------------------------------------- 1 | #import 2 | #import 3 | 4 | #import "MODragViewManager.h" 5 | #import "MODragView.h" 6 | 7 | @implementation MODragViewManager 8 | 9 | #pragma mark - Props 10 | 11 | RCT_CUSTOM_VIEW_PROPERTY(dragItems, NSArray, MODragView) 12 | { 13 | if ([json isKindOfClass:[NSArray class]]) { 14 | NSMutableArray *dragItems = [[NSMutableArray alloc] init]; 15 | [json enumerateObjectsUsingBlock:^(id _Nonnull possibleDragItem, NSUInteger index, BOOL * _Nonnull stop) { 16 | // TODO: This should be able to handle more complex drag items too 17 | if ([possibleDragItem isKindOfClass:[NSString class]] && ![possibleDragItem isEqualToString:@""]) { 18 | [dragItems addObject:[[MODragItem alloc] initWithTitle:possibleDragItem]]; 19 | } else { 20 | RCTLogWarn(@"RNDragViewManager was passed a dragItem that was not a string\n\n%@", possibleDragItem); 21 | } 22 | }]; 23 | 24 | [view setDragItems:[[NSArray alloc] initWithArray:dragItems]]; 25 | } else { 26 | RCTLogWarn(@"RNDragViewManager was passed a dragItems prop with the wrong format\n\n%@", json); 27 | [view setDragItems:nil]; 28 | } 29 | } 30 | 31 | RCT_CUSTOM_VIEW_PROPERTY(preview, RCTResponseSenderBlock, MODragView) 32 | { 33 | NSLog(@"Incoming preview: %@", json); 34 | } 35 | 36 | #pragma mark - Setup and view handling 37 | 38 | RCT_EXPORT_MODULE() 39 | 40 | - (MODragView *)view { 41 | return [[MODragView alloc] init]; 42 | } 43 | 44 | @end 45 | 46 | -------------------------------------------------------------------------------- /ios/MOReactNativeIosDragDrop.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | C9D53DBD1F8F772000505AEC /* MODragViewManager.m in Sources */ = {isa = PBXBuildFile; fileRef = C9D53DAD1F8F753100505AEC /* MODragViewManager.m */; }; 11 | C9D53DE41F8FB66D00505AEC /* MODragItem.m in Sources */ = {isa = PBXBuildFile; fileRef = C9D53DE31F8FB66D00505AEC /* MODragItem.m */; }; 12 | C9D53DE71F8FB9A000505AEC /* MODragView.m in Sources */ = {isa = PBXBuildFile; fileRef = C9D53DE61F8FB9A000505AEC /* MODragView.m */; }; 13 | C9D53DEA1F8FCD3700505AEC /* MODragPreviewView.m in Sources */ = {isa = PBXBuildFile; fileRef = C9D53DE91F8FCD3700505AEC /* MODragPreviewView.m */; }; 14 | C9D53DED1F8FCD4B00505AEC /* MODragPreviewViewManager.m in Sources */ = {isa = PBXBuildFile; fileRef = C9D53DEC1F8FCD4B00505AEC /* MODragPreviewViewManager.m */; }; 15 | /* End PBXBuildFile section */ 16 | 17 | /* Begin PBXFileReference section */ 18 | 134814201AA4EA6300B7C361 /* libMOReactNativeIosDragDrop.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libMOReactNativeIosDragDrop.a; sourceTree = BUILT_PRODUCTS_DIR; }; 19 | C9D53DAD1F8F753100505AEC /* MODragViewManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MODragViewManager.m; sourceTree = ""; }; 20 | C9D53DAE1F8F753100505AEC /* MODragViewManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MODragViewManager.h; sourceTree = ""; }; 21 | C9D53DE21F8FB66D00505AEC /* MODragItem.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MODragItem.h; sourceTree = ""; }; 22 | C9D53DE31F8FB66D00505AEC /* MODragItem.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MODragItem.m; sourceTree = ""; }; 23 | C9D53DE51F8FB9A000505AEC /* MODragView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MODragView.h; sourceTree = ""; }; 24 | C9D53DE61F8FB9A000505AEC /* MODragView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MODragView.m; sourceTree = ""; }; 25 | C9D53DE81F8FCD3700505AEC /* MODragPreviewView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MODragPreviewView.h; sourceTree = ""; }; 26 | C9D53DE91F8FCD3700505AEC /* MODragPreviewView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MODragPreviewView.m; sourceTree = ""; }; 27 | C9D53DEB1F8FCD4B00505AEC /* MODragPreviewViewManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MODragPreviewViewManager.h; sourceTree = ""; }; 28 | C9D53DEC1F8FCD4B00505AEC /* MODragPreviewViewManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MODragPreviewViewManager.m; sourceTree = ""; }; 29 | /* End PBXFileReference section */ 30 | 31 | /* Begin PBXGroup section */ 32 | 134814211AA4EA7D00B7C361 /* Products */ = { 33 | isa = PBXGroup; 34 | children = ( 35 | 134814201AA4EA6300B7C361 /* libMOReactNativeIosDragDrop.a */, 36 | ); 37 | name = Products; 38 | sourceTree = ""; 39 | }; 40 | 58B511D21A9E6C8500147676 = { 41 | isa = PBXGroup; 42 | children = ( 43 | C9D53DEE1F8FCD8F00505AEC /* Drag */, 44 | 134814211AA4EA7D00B7C361 /* Products */, 45 | ); 46 | sourceTree = ""; 47 | }; 48 | C9D53DEE1F8FCD8F00505AEC /* Drag */ = { 49 | isa = PBXGroup; 50 | children = ( 51 | C9D53DAE1F8F753100505AEC /* MODragViewManager.h */, 52 | C9D53DAD1F8F753100505AEC /* MODragViewManager.m */, 53 | C9D53DE51F8FB9A000505AEC /* MODragView.h */, 54 | C9D53DE61F8FB9A000505AEC /* MODragView.m */, 55 | C9D53DF01F8FCD9D00505AEC /* Data */, 56 | C9D53DEF1F8FCD9500505AEC /* Preview */, 57 | ); 58 | name = Drag; 59 | sourceTree = ""; 60 | }; 61 | C9D53DEF1F8FCD9500505AEC /* Preview */ = { 62 | isa = PBXGroup; 63 | children = ( 64 | C9D53DEB1F8FCD4B00505AEC /* MODragPreviewViewManager.h */, 65 | C9D53DEC1F8FCD4B00505AEC /* MODragPreviewViewManager.m */, 66 | C9D53DE81F8FCD3700505AEC /* MODragPreviewView.h */, 67 | C9D53DE91F8FCD3700505AEC /* MODragPreviewView.m */, 68 | ); 69 | name = Preview; 70 | sourceTree = ""; 71 | }; 72 | C9D53DF01F8FCD9D00505AEC /* Data */ = { 73 | isa = PBXGroup; 74 | children = ( 75 | C9D53DE21F8FB66D00505AEC /* MODragItem.h */, 76 | C9D53DE31F8FB66D00505AEC /* MODragItem.m */, 77 | ); 78 | name = Data; 79 | sourceTree = ""; 80 | }; 81 | /* End PBXGroup section */ 82 | 83 | /* Begin PBXNativeTarget section */ 84 | 58B511DA1A9E6C8500147676 /* MOReactNativeIosDragDrop */ = { 85 | isa = PBXNativeTarget; 86 | buildConfigurationList = 58B511EF1A9E6C8500147676 /* Build configuration list for PBXNativeTarget "MOReactNativeIosDragDrop" */; 87 | buildPhases = ( 88 | 58B511D71A9E6C8500147676 /* Sources */, 89 | ); 90 | buildRules = ( 91 | ); 92 | dependencies = ( 93 | ); 94 | name = MOReactNativeIosDragDrop; 95 | productName = RCTDataManager; 96 | productReference = 134814201AA4EA6300B7C361 /* libMOReactNativeIosDragDrop.a */; 97 | productType = "com.apple.product-type.library.static"; 98 | }; 99 | /* End PBXNativeTarget section */ 100 | 101 | /* Begin PBXProject section */ 102 | 58B511D31A9E6C8500147676 /* Project object */ = { 103 | isa = PBXProject; 104 | attributes = { 105 | LastUpgradeCheck = 0830; 106 | ORGANIZATIONNAME = Facebook; 107 | TargetAttributes = { 108 | 58B511DA1A9E6C8500147676 = { 109 | CreatedOnToolsVersion = 6.1.1; 110 | }; 111 | }; 112 | }; 113 | buildConfigurationList = 58B511D61A9E6C8500147676 /* Build configuration list for PBXProject "MOReactNativeIosDragDrop" */; 114 | compatibilityVersion = "Xcode 3.2"; 115 | developmentRegion = English; 116 | hasScannedForEncodings = 0; 117 | knownRegions = ( 118 | en, 119 | ); 120 | mainGroup = 58B511D21A9E6C8500147676; 121 | productRefGroup = 58B511D21A9E6C8500147676; 122 | projectDirPath = ""; 123 | projectRoot = ""; 124 | targets = ( 125 | 58B511DA1A9E6C8500147676 /* MOReactNativeIosDragDrop */, 126 | ); 127 | }; 128 | /* End PBXProject section */ 129 | 130 | /* Begin PBXSourcesBuildPhase section */ 131 | 58B511D71A9E6C8500147676 /* Sources */ = { 132 | isa = PBXSourcesBuildPhase; 133 | buildActionMask = 2147483647; 134 | files = ( 135 | C9D53DE41F8FB66D00505AEC /* MODragItem.m in Sources */, 136 | C9D53DEA1F8FCD3700505AEC /* MODragPreviewView.m in Sources */, 137 | C9D53DED1F8FCD4B00505AEC /* MODragPreviewViewManager.m in Sources */, 138 | C9D53DBD1F8F772000505AEC /* MODragViewManager.m in Sources */, 139 | C9D53DE71F8FB9A000505AEC /* MODragView.m in Sources */, 140 | ); 141 | runOnlyForDeploymentPostprocessing = 0; 142 | }; 143 | /* End PBXSourcesBuildPhase section */ 144 | 145 | /* Begin XCBuildConfiguration section */ 146 | 58B511ED1A9E6C8500147676 /* Debug */ = { 147 | isa = XCBuildConfiguration; 148 | buildSettings = { 149 | ALWAYS_SEARCH_USER_PATHS = NO; 150 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 151 | CLANG_CXX_LIBRARY = "libc++"; 152 | CLANG_ENABLE_MODULES = YES; 153 | CLANG_ENABLE_OBJC_ARC = YES; 154 | CLANG_WARN_BOOL_CONVERSION = YES; 155 | CLANG_WARN_CONSTANT_CONVERSION = YES; 156 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 157 | CLANG_WARN_EMPTY_BODY = YES; 158 | CLANG_WARN_ENUM_CONVERSION = YES; 159 | CLANG_WARN_INFINITE_RECURSION = YES; 160 | CLANG_WARN_INT_CONVERSION = YES; 161 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 162 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 163 | CLANG_WARN_UNREACHABLE_CODE = YES; 164 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 165 | COPY_PHASE_STRIP = NO; 166 | ENABLE_STRICT_OBJC_MSGSEND = YES; 167 | ENABLE_TESTABILITY = YES; 168 | GCC_C_LANGUAGE_STANDARD = gnu99; 169 | GCC_DYNAMIC_NO_PIC = NO; 170 | GCC_NO_COMMON_BLOCKS = YES; 171 | GCC_OPTIMIZATION_LEVEL = 0; 172 | GCC_PREPROCESSOR_DEFINITIONS = ( 173 | "DEBUG=1", 174 | "$(inherited)", 175 | ); 176 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 177 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 178 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 179 | GCC_WARN_UNDECLARED_SELECTOR = YES; 180 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 181 | GCC_WARN_UNUSED_FUNCTION = YES; 182 | GCC_WARN_UNUSED_VARIABLE = YES; 183 | IPHONEOS_DEPLOYMENT_TARGET = 11.0; 184 | MTL_ENABLE_DEBUG_INFO = YES; 185 | ONLY_ACTIVE_ARCH = YES; 186 | SDKROOT = iphoneos; 187 | }; 188 | name = Debug; 189 | }; 190 | 58B511EE1A9E6C8500147676 /* Release */ = { 191 | isa = XCBuildConfiguration; 192 | buildSettings = { 193 | ALWAYS_SEARCH_USER_PATHS = NO; 194 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 195 | CLANG_CXX_LIBRARY = "libc++"; 196 | CLANG_ENABLE_MODULES = YES; 197 | CLANG_ENABLE_OBJC_ARC = YES; 198 | CLANG_WARN_BOOL_CONVERSION = YES; 199 | CLANG_WARN_CONSTANT_CONVERSION = YES; 200 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 201 | CLANG_WARN_EMPTY_BODY = YES; 202 | CLANG_WARN_ENUM_CONVERSION = YES; 203 | CLANG_WARN_INFINITE_RECURSION = YES; 204 | CLANG_WARN_INT_CONVERSION = YES; 205 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 206 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 207 | CLANG_WARN_UNREACHABLE_CODE = YES; 208 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 209 | COPY_PHASE_STRIP = YES; 210 | ENABLE_NS_ASSERTIONS = NO; 211 | ENABLE_STRICT_OBJC_MSGSEND = YES; 212 | GCC_C_LANGUAGE_STANDARD = gnu99; 213 | GCC_NO_COMMON_BLOCKS = YES; 214 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 215 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 216 | GCC_WARN_UNDECLARED_SELECTOR = YES; 217 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 218 | GCC_WARN_UNUSED_FUNCTION = YES; 219 | GCC_WARN_UNUSED_VARIABLE = YES; 220 | IPHONEOS_DEPLOYMENT_TARGET = 11.0; 221 | MTL_ENABLE_DEBUG_INFO = NO; 222 | SDKROOT = iphoneos; 223 | VALIDATE_PRODUCT = YES; 224 | }; 225 | name = Release; 226 | }; 227 | 58B511F01A9E6C8500147676 /* Debug */ = { 228 | isa = XCBuildConfiguration; 229 | buildSettings = { 230 | HEADER_SEARCH_PATHS = ( 231 | "$(inherited)", 232 | /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, 233 | "$(SRCROOT)/../../../React/**", 234 | "$(SRCROOT)/../../react-native/React/**", 235 | ); 236 | LIBRARY_SEARCH_PATHS = "$(inherited)"; 237 | OTHER_LDFLAGS = "-ObjC"; 238 | PRODUCT_NAME = MOReactNativeIosDragDrop; 239 | SKIP_INSTALL = YES; 240 | }; 241 | name = Debug; 242 | }; 243 | 58B511F11A9E6C8500147676 /* Release */ = { 244 | isa = XCBuildConfiguration; 245 | buildSettings = { 246 | HEADER_SEARCH_PATHS = ( 247 | "$(inherited)", 248 | /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, 249 | "$(SRCROOT)/../../../React/**", 250 | "$(SRCROOT)/../../react-native/React/**", 251 | ); 252 | LIBRARY_SEARCH_PATHS = "$(inherited)"; 253 | OTHER_LDFLAGS = "-ObjC"; 254 | PRODUCT_NAME = MOReactNativeIosDragDrop; 255 | SKIP_INSTALL = YES; 256 | }; 257 | name = Release; 258 | }; 259 | /* End XCBuildConfiguration section */ 260 | 261 | /* Begin XCConfigurationList section */ 262 | 58B511D61A9E6C8500147676 /* Build configuration list for PBXProject "MOReactNativeIosDragDrop" */ = { 263 | isa = XCConfigurationList; 264 | buildConfigurations = ( 265 | 58B511ED1A9E6C8500147676 /* Debug */, 266 | 58B511EE1A9E6C8500147676 /* Release */, 267 | ); 268 | defaultConfigurationIsVisible = 0; 269 | defaultConfigurationName = Release; 270 | }; 271 | 58B511EF1A9E6C8500147676 /* Build configuration list for PBXNativeTarget "MOReactNativeIosDragDrop" */ = { 272 | isa = XCConfigurationList; 273 | buildConfigurations = ( 274 | 58B511F01A9E6C8500147676 /* Debug */, 275 | 58B511F11A9E6C8500147676 /* Release */, 276 | ); 277 | defaultConfigurationIsVisible = 0; 278 | defaultConfigurationName = Release; 279 | }; 280 | /* End XCConfigurationList section */ 281 | }; 282 | rootObject = 58B511D31A9E6C8500147676 /* Project object */; 283 | } 284 | -------------------------------------------------------------------------------- /ios/MOReactNativeIosDragDrop.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | 3 | 5 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "react-native-ios-drag-drop", 3 | "description": "Support for the iOS 11+ drag and drop API in React Native.", 4 | "version": "0.1.2", 5 | "homepage": "https://github.com/matt-oakes/react-native-ios-drag-drop", 6 | "repository": { 7 | "type": "git", 8 | "url": "https://github.com/matt-oakes/react-native-ios-drag-drop.git" 9 | }, 10 | "author": "Matt Oakes ", 11 | "license": "BSD-3-Clause", 12 | "keywords": [ 13 | "react-native", 14 | "drag-and-drop", 15 | "ios" 16 | ], 17 | "main": "lib/index.js", 18 | "scripts": { 19 | "start": "node node_modules/react-native/local-cli/cli.js start", 20 | "test": "yarn flow", 21 | "flow": "flow", 22 | "clean": "rimraf lib", 23 | "build": "yarn flow-copy && yarn build:es", 24 | "flow-copy": "flow-copy-source src lib", 25 | "build:es": "BABEL_ENV=es babel src --out-dir lib", 26 | "shipit": "np", 27 | "prepublishOnly": "yarn clean && yarn build" 28 | }, 29 | "peerDependencies": { 30 | "react": ">=15.4.0 || ^16.0.0-alpha || ^16.0.0-beta || ^16.0.0", 31 | "react-native": "^0.41.2" 32 | }, 33 | "devDependencies": { 34 | "babel-cli": "^6.26.0", 35 | "babel-plugin-module-resolver": "^2.7.1", 36 | "babel-preset-react-native": "^4.0.0", 37 | "flow-bin": "^0.53.0", 38 | "flow-copy-source": "^1.2.1", 39 | "np": "^2.16.0", 40 | "react": "16.0.0-beta.5", 41 | "react-native": "~0.49.0", 42 | "rimraf": "^2.6.2" 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /src/DragPreviewView.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | 3 | import * as React from "react"; 4 | import { requireNativeComponent } from "react-native"; 5 | 6 | const DragPreviewViewNative = requireNativeComponent("MODragPreviewView", null); 7 | 8 | export type Props = { 9 | children?: React.Node | React.Node[] 10 | }; 11 | 12 | export default function DragPreviewView(props: Props) { 13 | const { children, ...rest } = props; 14 | return ( 15 | 16 | {children} 17 | 18 | ); 19 | } 20 | -------------------------------------------------------------------------------- /src/DragView.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | 3 | import * as React from "react"; 4 | import { requireNativeComponent, Platform } from "react-native"; 5 | 6 | import DragPreviewView from "./DragPreviewView"; 7 | 8 | const DragViewNative = requireNativeComponent("MODragView", null); 9 | 10 | type _BaseProps = { 11 | children?: React.Node | React.Node[] 12 | }; 13 | type _DataProps = { dragItem: string } | { dragItems: string[] }; 14 | export type Props = _BaseProps & _DataProps; 15 | 16 | export default class DragView extends React.Component { 17 | static Preview = DragPreviewView; 18 | 19 | render() { 20 | // $FlowExpectedError Flow doesn't like that we are getting both the dragItem and dragItems, but we need to get both to handle both cases 21 | let { children, dragItem, dragItems, ...rest } = this.props; 22 | 23 | // Ensure that we are on iOS 11+ 24 | let validPlatform = false; 25 | if (Platform.OS === "ios") { 26 | const majorVersionIOS = parseInt(Platform.Version, 10); 27 | if (majorVersionIOS >= 11) { 28 | validPlatform = true; 29 | } 30 | } 31 | if (!validPlatform) { 32 | console.warn("RNDragDrop can only be used on iOS 11+"); 33 | return null; 34 | } 35 | 36 | // If we have a dragItem prop, convert that to an array and pass it to 37 | // the native view as dragItems. Otherwise, just use the dragItems we 38 | // were passed. Error if both of neither were passed 39 | if ((dragItem && dragItems) || (!dragItem && !dragItems)) { 40 | console.warn( 41 | "RNDragDrop must have either a dragItem or dragItems prop, but not both" 42 | ); 43 | return null; 44 | } 45 | if (dragItem) { 46 | dragItems = [dragItem]; 47 | } 48 | 49 | // Finally, return the view with the child inside it 50 | return ( 51 | 52 | {children} 53 | 54 | ); 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | 3 | export { default as DragView } from "./DragView"; 4 | --------------------------------------------------------------------------------