boxons/components/useCases/timer/view/TimerContent.tsx

105 lines
2.6 KiB
TypeScript

import { Text, View } from '@/components/shared/Themed';
import styled from '@emotion/native';
import { formatTime } from '@/components/shared/business/timeHelpers';
import Button from '@/components/shared/Button';
import { ElasticSpacer, HorizontalSpacer, VerticalSpacer } from '@/components/shared/Spacers';
import { TimerBgColor } from '@/components/useCases/timer/business/type';
import { useNavigation } from 'expo-router';
import { NativeStackNavigationProp } from 'react-native-screens/lib/typescript/native-stack/types';
import { RootStackParamList } from '@/app/RootStackParamList';
import { i18n } from '@/app/i18n/i18n';
interface TimerContentProps {
isWorkPhase: boolean;
timeLeft: number;
reps: number;
currentRep: number;
isRunning: boolean;
handleStop: () => void;
handleContine: () => void;
nextRep: () => void;
previousRep: () => void;
bgColor: TimerBgColor;
}
type NavigationProp = NativeStackNavigationProp<RootStackParamList, 'Dashboard'>;
const t = i18n.scoped('timer.timerContent');
export default function TimerContent({
isWorkPhase,
timeLeft,
reps,
currentRep,
isRunning,
handleStop,
handleContine,
nextRep,
previousRep,
bgColor,
}: TimerContentProps ) {
const navigation = useNavigation<NavigationProp>();
return (
<>
<Title>{isWorkPhase ? t('fight') : t('rest')}</Title>
<VerticalSpacer heightUnits={8} />
<Time>
{formatTime(timeLeft)}
</Time>
<VerticalSpacer heightUnits={8} />
<Reps>{currentRep} / {reps}</Reps>
<VerticalSpacer heightUnits={8} />
<ButtonContainer bgColor={bgColor}>
<Button label={t('prev')} onPress={previousRep} />
<ElasticSpacer />
{isRunning ? (
<Button label={t('stop')} onPress={handleStop} />
) : (
<Button label={t('start')} onPress={handleContine} />
)}
<ElasticSpacer />
<Button label={t('next')} onPress={nextRep} />
</ButtonContainer>
<VerticalSpacer heightUnits={4} />
<Button label={i18n.t('back')} onPress={() => navigation.navigate('Dashboard')} />
</>
);
}
const ButtonContainer = styled(View)<{ bgColor: TimerBgColor }>(({ theme, bgColor }) => ({
backgroundColor: theme.colors[bgColor],
flexDirection: 'row',
justifyContent: 'space-between',
}));
const Title = styled(Text)(({ theme }) => ({
fontSize: 50,
fontWeight: 'bold',
color: theme.colors.white
}));
const Time = styled(Text)(({ theme }) => ({
fontSize: 100,
fontWeight: 'bold',
color: theme.colors.white
}));
const Reps = styled(Text)(({ theme }) => ({
fontSize: 30,
fontWeight: 'bold',
color: theme.colors.white
}));