# BreathingExerciseProvider

Canonical page: https://docs.ovok.com/native-sdk/guide/components/breathing-exercise/breathing-exercise-provider

`BreathingExerciseProvider` owns the Reanimated timeline and exposes it through `useBreathingExercise`. It accepts the same `methods`, `repeat`, and `onFinish` configuration as `BreathingExercise`, plus optional children.

```tsx
import { BreathingExerciseProvider, useBreathingExercise } from "@ovok/native/breathing-exercise";

function CustomControls() {
  const { methodType, remainingTime } = useBreathingExercise();
  return <Text>{methodType}: {Math.ceil(remainingTime)}</Text>;
}

<BreathingExerciseProvider
  methods={[
    { type: "inhale", duration: 4 },
    { type: "hold", duration: 4 },
    { type: "exhale", duration: 4 },
  ]}
  repeat={5}
  onFinish={handleFinish}
>
  <CustomControls />
</BreathingExerciseProvider>;
```

The provider calculates the round duration, animates overall progress from `0` to `1` with linear timing, derives the current phase and remaining time, and calls `onFinish` when complete. It does not pause, seek, restart, persist, or expose a ref-based control API. Mounting a new provider starts a new timeline.

`methods` must be the fixed inhale/hold/exhale tuple. `onFinish` is invoked from a
Reanimated worklet when progress reaches `1`; it is not automatically marshalled to
the JavaScript thread. Wrap JavaScript-only work such as navigation in `runOnJS`, and
make the callback safe to invoke once per completed mount.
