/ index.js
index.js
 1  // @flow
 2  
 3  'use strict';
 4  
 5  // $FlowFixMe
 6  import { NativeModules, NativeEventEmitter, Platform } from 'react-native';
 7  const { RNLanguages } = NativeModules;
 8  
 9  type EventType = 'change';
10  
11  type EventData = {
12    language: string,
13    languages: Array<string>
14  };
15  
16  type EventHandler = (eventData: EventData) => any;
17  
18  type RNLanguagesModule = {
19    _eventHandlers?: Set<EventHandler>,
20    _eventEmitter?: NativeEventEmitter,
21    language: string,
22    languages: Array<string>,
23    addEventListener: (type: EventType, handler: EventHandler) => void,
24    removeEventListener: (type: EventType, handler: EventHandler) => void
25  };
26  
27  export const language: string = RNLanguages.language;
28  export const languages: string[] = RNLanguages.languages;
29  
30  let Module: RNLanguagesModule = {
31    language: RNLanguages.language,
32    languages: RNLanguages.languages,
33  
34    addEventListener(type, handler) {
35      if (type !== 'change') {
36        console.error(`Trying to subscribe to unknown event: "${type}"`);
37      } else if (this._eventHandlers && !this._eventHandlers.has(handler)) {
38        this._eventHandlers.add(handler);
39      }
40    },
41  
42    removeEventListener(type, handler) {
43      if (type !== 'change') {
44        console.error(`Trying to remove listener for unknown event: "${type}"`);
45      } else if (this._eventHandlers && this._eventHandlers.has(handler)) {
46        this._eventHandlers.delete(handler);
47      }
48    }
49  };
50  
51  if (Platform.OS === 'android') {
52    Module._eventHandlers = new Set();
53    Module._eventEmitter = new NativeEventEmitter(RNLanguages);
54  
55    const onLanguagesChange = (eventData: EventData) => {
56      Module.language = eventData.language;
57      Module.languages = eventData.languages;
58  
59      if (Module._eventHandlers) {
60        Module._eventHandlers.forEach(handler => handler(eventData));
61      }
62    };
63  
64    Module._eventEmitter.addListener('languagesDidChange', onLanguagesChange);
65  }
66  
67  export default Module;