Skip to content

Ant-Tech-Agency/react-native-noke

Repository files navigation

react-native-noke

npm version

Getting started

$ npm install react-native-noke --save

or

$ yarn add react-native-noke

or latest version

$ yarn add git+git+https://github.com/Ant-Tech-Agency/react-native-noke.git

Manual installation

iOS

  1. In XCode, in the project navigator, right click LibrariesAdd Files to [your project's name]
  2. Go to node_modulesreact-native-noke and add RNNoke.xcodeproj
  3. In XCode, in the project navigator, select your project. Add libRNNoke.a to your project's Build PhasesLink Binary With Libraries
  4. Run your project (Cmd+R)<
  5. Add empty file Test.swift in main project

Android

  1. Open up android/app/src/main/java/[...]/MainActivity.java
  • Add import com.lynkxyz.noke.RNNokePackage; to the imports at the top of the file
  • Add new RNNokePackage() to the list returned by the getPackages() method
  1. Append the following lines to android/settings.gradle:
    include ':react-native-noke'
    project(':react-native-noke').projectDir = new File(rootProject.projectDir,   '../node_modules/react-native-noke/android')
    
  2. Insert the following lines inside the dependencies block in android/app/build.gradle:
      compile project(':react-native-noke')
    
  3. After adding the dependency to your Android Manifest
<service android:name="com.noke.nokemobilelibrary.NokeDeviceManagerService" android:enabled="true"/>

Usage

import RNNoke from 'react-native-noke';
RNNoke.initiateNokeService()

interface NokeData {
  name?: string
  key?: string
  command?: string
  macAddress: string
}

interface NokeCommandsData {
  macAddress: string  
  commands: string[]
}

interface NokeResponse {
  name: string,
  mac: string,
  session: string,
  status: boolean,
}

interface NokeInfoResponse {
  name: string,
  battery: number,
  mac: string,
  offlineKey: string,
  offlineUnlockCmd: string,
  serial: string,
  session: string,
  trackingKey: string,
  lastSeen: number,
  version: string,
}

type EventName = 
  'onServiceConnected' | // only Android
  'onServiceDisconnected' | // only Android
  'onNokeDiscovered' |
  'onNokeConnecting' |
  'onNokeConnected' |
  'onNokeSyncing' |
  'onNokeUnlocked' |
  'onNokeDisconnected' |
  'onBluetoothStatusChanged' |
  'onError'
  
interface RNNoke {
  initiateNokeService: () => Promise<{status: boolean}>
  startScan: () => Promise<{status: boolean}>
  stopScan: () => Promise<{status: boolean}>
  addNokeDeviceOnce: (data: NokeData) => Promise<NokeResponse>
  sendCommands: (data: NokeCommandsData) => Promise<NokeResponse>
  removeAllNokes: () => Promise<null>
  removeNokeDevice: () => Promise<null>
  offlineUnlock: (data: NokeData) => Promise<NokeResponse>
  getDeviceInfo: () => Promise<NokeInfoResponse>
  disconnect: () => Promise<null>
  on: (eventName: EventName, callback: (response: NokeResponse) => void) => RNNoke
  fromNokeEvents: () => Observable<{name: EventName, data: NokeResponse}>
}

export class App extends Component {
  componentDidMount() {
    this.requestLocationPermission() // only Android

    RNNoke
    .on('onServiceConnected', data => console.log('onServiceConnected', data)) // only Android 
    .on('onServiceDisconnected', data => console.log('onServiceConnected', data)) // only Android
    .on('onNokeDiscovered', data => console.log('onNokeDiscovered', data)) 
    .on('onNokeConnecting', data => console.log('onNokeConnecting', data))
    .on('onNokeConnected', data => console.log('onNokeConnected', data))
    .on('onNokeSyncing', data => console.log('onNokeSyncing', data))
    .on('onNokeUnlocked', data => console.log('onNokeUnlocked', data))
    .on('onNokeDisconnected', data => console.log('onNokeDisconnected', data))
    .on('onBluetoothStatusChanged', data => console.log('onBluetoothStatusChanged', data))
    .on('onError', data => console.log('onError', data))
  }

  requestLocationPermission = () => {
    if(Platform.OS === 'ios') return

    return PermissionsAndroid.request(
      PermissionsAndroid.PERMISSIONS.ACCESS_FINE_LOCATION,
      {
        'title': 'Cool Location Permission',
        'message': 'Cool Location App needs access to your location '
      }
    )
    .then(console.log)
    .catch(console.error)
  }

  onUnlock = () => {
    RNNoke.offlineUnlock(data)
    .then(console.log)
    .catch(console.error)
  }

  onAddNoke = () => {
    RNNoke.addNokeDeviceOnce(data)
    .then(console.log)
    .catch(console.error)
  }

  onSendCommands = () => {
    RNNoke.sendCommands(data)
    .then(console.log)
    .catch(console.error)
  }

  onRemoveAllNokes = () => {
    RNNoke.removeAllNokes()
    .then(console.log)
    .catch(console.error)
  }
  
  getDeviceInfo = () => {
    RNNoke.getDeviceInfo()
    .then(console.log)
    .catch(console.error)
  }
  
  onStartScan = () => {
    RNNoke.startScan()
    .then(console.log)
    .catch(console.error)
  }
    
  onStopScan = () => {
    RNNoke.stopScan()
    .then(console.log)
    .catch(console.error)
  }

  render() {
    return (
      <View style={styles.container}>
        <Button
          onPress={this.onSendCommands}
          title="Unlock noke by commands"
        />

        <Button
          onPress={this.onUnlock}
          title="Unlock noke offline"
        />

        <Button
          onPress={this.onAddNoke}
          title="Add noke"
        />

        <Button
          onPress={this.onRemoveAllNokes}
          title="Remove noke"
        />
      </View>
    )
  }
}

License

react-native-noke is available under the Apache 2.0 license. See the LICENSE file for more info.

Copyright © 2018 Ant-Tech Ltd. All rights reserved.