/ 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;