feat(active-workout): require paired Watch to start workout

This commit is contained in:
2026-08-08 12:30:07 +02:00
parent 20e6e73c81
commit 262d7d7fe4
10 changed files with 30 additions and 35 deletions
@@ -40,12 +40,7 @@ export function PreSwimScreen() {
};
const handleStartSwim = async () => {
if (!workout) return;
if (!isReady) {
navigation.navigate("PostSwim", { workoutId: route.params.workoutId });
return;
}
if (!workout || !isReady) return;
const result = await sendWorkoutToWatch(
workout.id,
@@ -101,10 +96,10 @@ export function PreSwimScreen() {
</Text>
</View>
<Pressable
onPress={() => navigation.navigate("PostSwim", { workoutId: route.params.workoutId })}
onPress={() => setSyncResult(null)}
className="bg-sky-500 rounded-2xl py-4 items-center w-full"
>
<Text className="text-white font-bold text-lg">{t("startWithoutWatch")}</Text>
<Text className="text-white font-bold text-lg">{tc("retry")}</Text>
</Pressable>
</View>
);
@@ -172,25 +167,25 @@ export function PreSwimScreen() {
<Pressable
onPress={handleStartSwim}
disabled={isSyncing}
disabled={isSyncing || !isReady}
className={`rounded-2xl py-4 items-center ${
isSyncing ? "bg-sky-300" : "bg-sky-500"
isSyncing || !isReady ? "bg-slate-300" : "bg-sky-500"
}`}
>
{isSyncing ? (
<ActivityIndicator color="#fff" />
) : (
<Text className="text-white font-bold text-lg">
{isReady ? t("sendToWatchAndStart") : t("startWithoutWatch")}
<Text className={`font-bold text-lg ${!isReady ? "text-slate-500" : "text-white"}`}>
{t("sendToWatchAndStart")}
</Text>
)}
</Pressable>
<Text className="text-slate-400 text-xs text-center mt-3">
{isReady
? t("syncToWatch")
: t("trackedOnDevice")}
{!isReady && (
<Text className="text-red-500 text-xs text-center mt-3">
{t("watchRequired")}
</Text>
)}
</View>
);
}
+2 -2
View File
@@ -3,10 +3,10 @@
"openWatchApp": "Öffne die SwimBuddy-App auf deiner Watch, um mit der Verfolgung zu beginnen.",
"failedToSend": "Senden fehlgeschlagen",
"couldNotSend": "Workout konnte nicht an Watch gesendet werden. Starte ohne Watch.",
"startWithoutWatch": "Ohne Watch starten",
"watchRequired": "Eine gekoppelte Watch wird benötigt, um ein Workout zu starten",
"retry": "Erneut",
"sendToWatchAndStart": "An Watch senden & starten",
"syncToWatch": "Workout wird mit deiner Watch synchronisiert",
"trackedOnDevice": "Workout wird auf diesem Gerät verfolgt",
"rest": "Pause",
"betweenSets": "{{duration}}s Pause zwischen Sets",
"swimComplete": "Schwimmen abgeschlossen!",
+2 -2
View File
@@ -3,10 +3,10 @@
"openWatchApp": "Åbn SwimBuddy-appen på din Watch for at begynde sporing.",
"failedToSend": "Sendning mislykkedes",
"couldNotSend": "Kunne ikke sende træning til Watch. Starter uden Watch.",
"startWithoutWatch": "Start uden Watch",
"watchRequired": "En parret Watch er påkrævet for at starte en træning",
"retry": "Prøv igen",
"sendToWatchAndStart": "Send til Watch & start",
"syncToWatch": "Træningen synkroniseres med din Watch",
"trackedOnDevice": "Træningen spores på denne enhed",
"rest": "Hvile",
"betweenSets": "{{duration}}s hvile mellem sæt",
"swimComplete": "Svømning fuldført!",
+2 -2
View File
@@ -3,10 +3,10 @@
"openWatchApp": "Open the SwimBuddy app on your watch to start tracking.",
"failedToSend": "Failed to send",
"couldNotSend": "Could not send workout to Watch. Starting without Watch instead.",
"startWithoutWatch": "Start Without Watch",
"watchRequired": "A paired Watch is required to start a workout",
"retry": "Retry",
"sendToWatchAndStart": "Send to Watch & Start",
"syncToWatch": "Workout will be synced to your watch",
"trackedOnDevice": "Workout will be tracked on this device",
"rest": "Rest",
"betweenSets": "{{duration}}s between sets",
"swimComplete": "Swim Complete!",
+2 -2
View File
@@ -3,10 +3,10 @@
"openWatchApp": "Abre la app SwimBuddy en tu Watch para empezar el seguimiento.",
"failedToSend": "Error al enviar",
"couldNotSend": "No se pudo enviar el entrenamiento al Watch. Iniciando sin Watch.",
"startWithoutWatch": "Iniciar sin Watch",
"watchRequired": "Se necesita una Watch emparejada para iniciar un entrenamiento",
"retry": "Reintentar",
"sendToWatchAndStart": "Enviar al Watch e iniciar",
"syncToWatch": "El entrenamiento se sincronizará con tu Watch",
"trackedOnDevice": "El entrenamiento se rastreará en este dispositivo",
"rest": "Descanso",
"betweenSets": "{{duration}}s de descanso entre series",
"swimComplete": "¡Natación completada!",
+2 -2
View File
@@ -3,10 +3,10 @@
"openWatchApp": "Ouvrez l'application SwimBuddy sur votre Watch pour commencer le suivi.",
"failedToSend": "Échec de l'envoi",
"couldNotSend": "Impossible d'envoyer l'entraînement à la Watch. Démarrage sans Watch.",
"startWithoutWatch": "Démarrer sans Watch",
"watchRequired": "Une Watch appariée est nécessaire pour commencer un entraînement",
"retry": "Réessayez",
"sendToWatchAndStart": "Envoyer à la Watch et commencer",
"syncToWatch": "L'entraînement sera synchronisé avec votre Watch",
"trackedOnDevice": "L'entraînement sera suivi sur cet appareil",
"rest": "Repos",
"betweenSets": "{{duration}}s de repos entre les séries",
"swimComplete": "Nage terminée !",
+2 -2
View File
@@ -3,10 +3,10 @@
"openWatchApp": "Apri l'app SwimBuddy sulla tua Watch per iniziare il monitoraggio.",
"failedToSend": "Invio fallito",
"couldNotSend": "Impossibile inviare l'allenamento alla Watch. Avvio senza Watch.",
"startWithoutWatch": "Avvia senza Watch",
"watchRequired": "È necessaria una Watch associata per iniziare un allenamento",
"retry": "Riprova",
"sendToWatchAndStart": "Invia alla Watch e avvia",
"syncToWatch": "L'allenamento verrà sincronizzato con la tua Watch",
"trackedOnDevice": "L'allenamento verrà monitorato su questo dispositivo",
"rest": "Recupero",
"betweenSets": "{{duration}}s di recupero tra le serie",
"swimComplete": "Nuoto completato!",
+2 -2
View File
@@ -3,10 +3,10 @@
"openWatchApp": "Open de SwimBuddy-app op je Watch om te beginnen met bijhouden.",
"failedToSend": "Verzenden mislukt",
"couldNotSend": "Kon workout niet naar Watch verzenden. Start zonder Watch.",
"startWithoutWatch": "Start zonder Watch",
"watchRequired": "Een gekoppelde Watch is vereist om een workout te starten",
"retry": "Opnieuw",
"sendToWatchAndStart": "Verzenden naar Watch & Start",
"syncToWatch": "Workout wordt gesynchroniseerd naar je Watch",
"trackedOnDevice": "Workout wordt op dit apparaat bijgehouden",
"rest": "Rust",
"betweenSets": "{{duration}}s rust tussen sets",
"swimComplete": "Zwemmen voltooid!",
+2 -2
View File
@@ -3,10 +3,10 @@
"openWatchApp": "Otwórz aplikację SwimBuddy na swojej Watch, aby rozpocząć śledzenie.",
"failedToSend": "Nie udało się wysłać",
"couldNotSend": "Nie udało się wysłać treningu do Watch. Uruchamianie bez Watch.",
"startWithoutWatch": "Uruchom bez Watch",
"watchRequired": "Sparowana Watch jest wymagana do rozpoczęcia treningu",
"retry": "Ponów",
"sendToWatchAndStart": "Wyślij do Watch i rozpocznij",
"syncToWatch": "Trening zostanie zsynchronizowany z Watch",
"trackedOnDevice": "Trening będzie śledzony na tym urządzeniu",
"rest": "Odpoczynek",
"betweenSets": "{{duration}}s odpoczynku między seriami",
"swimComplete": "Pływanie zakończone!",
+2 -2
View File
@@ -3,10 +3,10 @@
"openWatchApp": "Abra a aplicação SwimBuddy na sua Watch para iniciar o registo.",
"failedToSend": "Falha no envio",
"couldNotSend": "Não foi possível enviar o treino para a Watch. Iniciando sem Watch.",
"startWithoutWatch": "Iniciar sem Watch",
"watchRequired": "É necessária uma Watch associada para iniciar um treino",
"retry": "Tentar novamente",
"sendToWatchAndStart": "Enviar para a Watch e iniciar",
"syncToWatch": "O treino será sincronizado com a sua Watch",
"trackedOnDevice": "O treino será registado neste dispositivo",
"rest": "Descanso",
"betweenSets": "{{duration}}s de descanso entre séries",
"swimComplete": "Natação concluída!",