![platforms](https://img.shields.io/badge/platforms-Android%20%7C%20iOS-brightgreen.svg?style=flat-square&colorB=191A17)
[![npm](https://img.shields.io/npm/v/@sekizlipenguen/react-native-app-exit.svg?style=flat-square)](https://www.npmjs.com/package/@sekizlipenguen/react-native-app-exit)
[![npm](https://img.shields.io/npm/dm/@sekizlipenguen/react-native-app-exit.svg?style=flat-square&colorB=007ec6)](https://www.npmjs.com/package/@sekizlipenguen/react-native-app-exit)

# @sekizlipenguen/react-native-app-exit

A lightweight React Native module to programmatically exit or restart the application. Compatible with React Native 0.60 and above.

---

## Example app

A local playground lives in [`example/`](./example) (same pattern as our other modules).
It tracks the latest stable React Native (currently **0.86.2**) for development / device
tests, but is **not published to npm**.

```bash
cd example
npm install
bundle install
bundle exec pod install --project-directory=ios
npm start
# other terminal
npm run ios:sim
# or
npm run android:emu
```

## Installation

Using npm:

```bash
npm install @sekizlipenguen/react-native-app-exit
```

Using yarn:

```bash
yarn add @sekizlipenguen/react-native-app-exit
```

### iOS Setup

After installing the package, run:

```bash
npx pod-install
```

### Android Setup

No additional setup is required. Autolinking registers the native module when you build the app.

---

## Compatibility

- **React Native**: `>=0.60`
- **iOS**: Supported
- **Android**: Supported
- **TypeScript**: Type definitions included (`src/index.d.ts`)

---

## Usage

### Default import

```javascript
import ReactNativeAppExit from '@sekizlipenguen/react-native-app-exit';

ReactNativeAppExit.exitApp();
ReactNativeAppExit.restartApp();
```

### Named imports

```javascript
import {exitApp, restartApp} from '@sekizlipenguen/react-native-app-exit';

exitApp();
restartApp();
```

### Example

```javascript
import React from 'react';
import {Button, View, Alert} from 'react-native';
import ReactNativeAppExit from '@sekizlipenguen/react-native-app-exit';

const App = () => {
  const handleExitApp = () => {
    Alert.alert(
      'Exit App',
      'Are you sure you want to close the application?',
      [
        {text: 'Cancel', style: 'cancel'},
        {text: 'Yes', onPress: () => ReactNativeAppExit.exitApp()},
      ],
    );
  };

  const handleRestartApp = () => {
    Alert.alert(
      'Restart App',
      'Are you sure you want to restart the application?',
      [
        {text: 'Cancel', style: 'cancel'},
        {text: 'Yes', onPress: () => ReactNativeAppExit.restartApp()},
      ],
    );
  };

  return (
    <View style={{flex: 1, justifyContent: 'center', alignItems: 'center'}}>
      <Button title="Exit App" onPress={handleExitApp} />
      <Button title="Restart App" onPress={handleRestartApp} />
    </View>
  );
};

export default App;
```

---

## Platform-Specific Details

### Android

- `exitApp` finishes the task affinity and kills the process.
- `restartApp` relaunches the app's launch intent, clears the task stack, then kills the current process.

### iOS

- Apple discourages force-closing apps in production. Prefer a confirmation alert before calling `exitApp`.
- `restartApp` triggers a React Native reload (`RCTTriggerReloadCommandListeners`). A full OS-level process restart is not possible on iOS App Store builds.

---

## API

| Method | Description |
| --- | --- |
| `exitApp()` | Closes the application. |
| `restartApp()` | Restarts the app (process relaunch on Android, JS/runtime reload on iOS). |

---

## Contribution

Contributions are welcome! Please feel free to submit a pull request or file an issue in the [GitHub repository](https://github.com/sekizlipenguen/react-native-app-exit).

---

## License

This project is licensed under the [MIT License](LICENSE).
