# Photos (camera)

> Module camera : Photo prise ou choisie (expo-image-picker), envoyée dans Supabase Storage (dossier par utilisateur), composant PhotoPicker.

Photo prise ou choisie (expo-image-picker), envoyée dans Supabase Storage (dossier par utilisateur), composant PhotoPicker.

:::note[Page générée]
Générée depuis `modules/camera/README.md`, `module.json`, `config.ts`, `index.ts` à chaque build du site : modifier la source, pas cette page.
:::

## Fiche technique

| | |
|---|---|
| Paquet | `@daroms/module-camera` |
| Activer | `bun daroms module add camera` |
| Requiert | `auth` |
| Dépendances natives | `expo-image-picker` |
| Routes ajoutées | aucune |
| Onglets | aucun |
| Migrations | `migrations/storage_images.sql` |
| Edge functions | aucune |
| Variables d'environnement | aucune |
| Gate de navigation | non |
| Section de réglages | non |

## Mise en place et usage

Photos prises ou choisies (expo-image-picker, fonctionne dans Expo Go), envoyées dans Supabase Storage. Requiert `auth`.

- Activer : `bun daroms module add camera` (migration : bucket `images` public en lecture par URL, écriture et suppression limitées au dossier `<user_id>/`).
- Configuration (`modules.camera`) : `bucket` (défaut `images` ; autre nom = adapter la migration), `quality` (0.7), `aspect` (ex. `[1, 1]` pour un avatar), `cameraPermission` et `photosPermission` (textes iOS, défaut selon `defaultLocale`).
- Écran : `<PhotoPicker value={photo?.uri ?? item.image_url} onChange={setPhoto} />` (feuille appareil photo, galerie, retirer).
- Envoi dans `api.ts`, au moment d'enregistrer :
  ```ts
  import { uploadPhoto, type Photo } from '@daroms/module-camera'
  mutationFn: async ({ photo, ...input }: PostInput & { photo: Photo | null }) => {
    const image = photo ? await uploadPhoto(photo) : null
    return insertPost({ ...input, image_url: image?.url ?? null })
  }
  ```
- `pickPhoto('camera' | 'library')` et `removePhoto(path)` pour un usage sans composant.
- Colonne d'image : `image_url:text?` dans `g table`.

## Configuration

Dans `app.manifest.ts > modules['camera']`, validée par `modules/camera/config.ts` au démarrage.

| Clé | Schéma zod | Rôle |
|---|---|---|
| `bucket` | `z.string().default('images')` | Bucket Supabase Storage (créé par la migration du module, lecture publique). |
| `quality` | `z.number().min(0).max(1).default(0.7)` | Compression JPEG, de 0 à 1. |
| `aspect` | `z.tuple([z.number().positive(), z.number().positive()]).optional()` | Recadrage imposé par défaut, ex. [1, 1] pour un avatar (sinon photo entière). |
| `cameraPermission` | `z.string().optional()` | Textes iOS des permissions (plugin) : défaut dans la langue par défaut de l'app. |
| `photosPermission` | `z.string().optional()` | - |

Valeurs écrites par `module add` :

```json
{
  "bucket": "images",
  "quality": 0.7
}
```

## Exports

```ts
import { PhotoPicker, pickPhoto, removePhoto } from '@daroms/module-camera'
```

- Valeurs : `PhotoPicker`, `pickPhoto`, `removePhoto`, `uploadPhoto`

- Types : `PhotoPickerProps`, `Photo`, `PhotoSource`, `UploadedPhoto`

---

Page HTML : https://daromsartof.github.io/daroms-speedapp/reference/modules/camera/
Index de la documentation : https://daromsartof.github.io/daroms-speedapp/llms.txt
