# Schnappix

Schnappix is a tablet-optimized Photobooth application built with React Native and Expo. It provides a full-featured, interactive photo capturing experience, complete with external hardware support and an administrative interface.

## Features

- **Photobooth Experience**: Intuitive flow from start screen to countdown, photo capture, and final preview.
- **Multiple Photos & Collages**: Capture single or multiple photos and review them in a generated collage.
- **Direct Printing**: Built-in support for IPP (Internet Printing Protocol) network printers to instantly print captured moments.
- **Kiosk Mode**: Custom native Android implementation to lock the tablet down to the Schnappix app, preventing users from exiting the photobooth.
- **USB Camera Support**: Extends standard camera capabilities to support external USB cameras for higher quality photos.
- **Admin Dashboard**: Secure administrative screen (protected by an admin password) to configure settings on the fly:
  - Countdown duration
  - Printer IP address
  - Kiosk mode toggle
  - Admin password changes
- **Offline Storage**: Saves captured photos directly to the device's local storage and gallery.

## Tech Stack

- **Framework**: [React Native](https://reactnative.dev/) (v0.85.3) & [Expo](https://expo.dev/) (SDK 56)
- **Language**: TypeScript
- **Key Libraries**:
  - `expo-camera`: Camera interface
  - `expo-media-library` & `expo-file-system`: Photo storage
  - `ipp-encoder`: Network printing integration
  - `react-native-view-shot`: Capturing collages as images
  - Custom native Expo plugins (`withKioskAdmin`, `withUsbCamera`, `withSettingsRepositories`) for extended Android capabilities.

## Getting Started

### Prerequisites

- Node.js (v18+)
- npm or yarn
- Expo CLI
- Android Studio / Android SDK (for building the native Android app, as it uses custom native modules)

### Installation

1. Clone the repository:
   ```bash
   git clone <repository-url>
   cd Schnappix
   ```

2. Install dependencies:
   ```bash
   npm install
   ```

3. Prebuild the native Android project (required due to custom native plugins):
   ```bash
   npx expo prebuild --platform android
   ```

4. Run the app on an Android device or emulator:
   ```bash
   npm run android
   ```

## Project Structure

```text
Schnappix/
├── App.tsx                  # Main entry point and navigation logic
├── app.json                 # Expo configuration and plugin registration
├── plugins/                 # Custom Expo config plugins for Android features
├── modules/                 # Custom native modules (e.g., kiosk-mode)
└── src/
    ├── screens/             # UI Screens (Home, Camera, Preview, Admin)
    ├── services/            # Core logic (printer.ts, settings.ts, storage.ts)
    └── styles/              # Global styles and theme configurations
```

## Configuration

When the app is first launched, you can access the **Admin Dashboard** from the Home screen. From here, you can define your hardware settings like the Printer's local IP address and adjust the capture countdown timer.

## License

See the [LICENSE](LICENSE) file for more information.
