11import { BackHandler } from 'react-native' ;
2- import { fromEventPattern , Observable } from 'rxjs' ;
3- import { share } from 'rxjs/operators' ;
2+ import { fromEventPattern , Observable , Subject } from 'rxjs' ;
3+ import { share , map , merge , tap } from 'rxjs/operators' ;
44
55export interface BackEvent {
66 target : string | null ;
@@ -16,21 +16,31 @@ export class BackHandlerDelegate {
1616 * See https://facebook.github.io/react-native/docs/backhandler.html.
1717 * @param handler
1818 */
19- private addEventListener = ( handler : ( event : BackEvent ) => void ) => {
19+ private addEventListener = ( handler : ( ) => void ) => {
2020 BackHandler . addEventListener ( 'hardwareBackPress' , ( ) => {
21- handler ( {
22- target : null ,
23- } ) ;
24- if ( this . onBackCallback ) {
25- this . onBackCallback ( ) ;
26- this . onBackCallback = undefined ;
27- return true ;
28- }
29- return false ;
21+ handler ( ) ;
22+ return true ;
3023 } ) ;
3124 } ;
3225
33- private back$ : Observable < BackEvent > = fromEventPattern < BackEvent > ( this . addEventListener ) . pipe (
26+ private softwareBack$ = new Subject < undefined > ( ) ;
27+
28+ private back$ : Observable < BackEvent > = fromEventPattern < undefined > ( this . addEventListener ) . pipe (
29+ merge ( this . softwareBack$ ) ,
30+ tap ( ( ) => {
31+ // After the event has spread, we fire onBacks callbacks.
32+ setTimeout ( ( ) => {
33+ if ( this . onBackCallback ) {
34+ this . onBackCallback ( ) ;
35+ this . onBackCallback = undefined ;
36+ } else {
37+ BackHandler . exitApp ( ) ;
38+ }
39+ } , 0 ) ;
40+ } ) ,
41+ map ( ( ) => ( {
42+ target : null ,
43+ } ) ) ,
3444 share ( )
3545 ) ;
3646
@@ -39,5 +49,9 @@ export class BackHandlerDelegate {
3949 this . onBackCallback = cb ;
4050 } ;
4151
52+ back = ( ) => {
53+ this . softwareBack$ . next ( ) ;
54+ } ;
55+
4256 defaultBackContext = { back$ : this . back$ } ;
4357}
0 commit comments