boxons/app/(tabs)/index.tsx

241 lines
8.0 KiB
TypeScript
Raw Permalink Normal View History

import React, { useEffect, useState } from 'react';
2024-10-13 11:29:36 +00:00
import { Text } from '@/components/shared/Themed';
import Card from '@/components/shared/Card';
import styled from '@emotion/native';
import { formatTime } from '@/components/shared/business/timeHelpers';
import { useNavigation } from '@react-navigation/native';
import { NativeStackNavigationProp } from '@react-navigation/native-stack';
import { RootStackParamList } from '@/app/RootStackParamList';
2025-04-10 08:01:27 +00:00
import { HorizontalSpacer, VerticalSpacer } from '@/components/shared/Spacers';
2024-10-13 11:29:36 +00:00
import { TimerPickerModal } from 'react-native-timer-picker';
import Button from '@/components/shared/Button';
import NumberSelector from '@/components/shared/NumberSelector';
import { i18n } from '@/app/i18n/i18n';
import { useTimerContext } from '@/app/store/TimerContext';
import { ActivityIndicator } from 'react-native';
2024-10-13 11:29:36 +00:00
2024-10-13 21:18:08 +00:00
type NavigationProp = NativeStackNavigationProp<RootStackParamList, 'Timer'>;
2024-10-13 11:29:36 +00:00
const t = i18n.scoped('dashboard');
2024-10-13 11:29:36 +00:00
export default function Dashboard() {
const navigation = useNavigation<NavigationProp>();
2025-04-08 20:53:40 +00:00
const { timerState, isLoading, updateReps, updateWorkTime, updateRestTime, updatePreparationTime } = useTimerContext();
2024-10-13 11:29:36 +00:00
const [showWorkTimePicker, setShowWorkTimePicker] = useState<boolean>(false);
2025-04-08 20:53:40 +00:00
const [showPreparationTimePicker, setShowPreparationTimePicker] = useState<boolean>(false);
2024-10-13 11:29:36 +00:00
const [showRestTimePicker, setShowRestTimePicker] = useState<boolean>(false);
// Local variables for UI changes
2025-04-08 20:53:40 +00:00
const [localPreparationTime, setLocalPreparationTime] = useState<number>(timerState.preparationTime);
const [localReps, setLocalReps] = useState<number>(timerState.reps);
const [localWorkTime, setLocalWorkTime] = useState<number>(timerState.workTime);
const [localRestTime, setLocalRestTime] = useState<number>(timerState.restTime);
// Update local states when store data is loaded
useEffect(() => {
2025-04-08 20:53:40 +00:00
console.log('timerState', timerState);
if (!isLoading) {
setLocalReps(timerState.reps);
setLocalWorkTime(timerState.workTime);
setLocalRestTime(timerState.restTime);
2025-04-08 20:53:40 +00:00
setLocalPreparationTime(timerState.preparationTime);
}
}, [isLoading, timerState]);
// Handle repetition changes
const handleRepsChange = (value: number) => {
setLocalReps(value);
updateReps(value);
};
const totalWorkTime: string = formatTime((localWorkTime + localRestTime) * localReps);
if (isLoading) {
return (
<LoadingContainer>
<ActivityIndicator size="large" />
<Text>Chargement...</Text>
</LoadingContainer>
);
}
2024-10-13 11:29:36 +00:00
return (
<Container>
<CardContainer>
2025-04-10 08:01:27 +00:00
<Card backgroundColor="darkGrey" color="black" borderColor="darkGrey" onPress={() => setShowPreparationTimePicker(true)}>
2024-10-13 11:29:36 +00:00
<CardTextContainer>
2025-04-08 20:53:40 +00:00
<BlackCustomText>{t('preparation')}</BlackCustomText>
2025-04-10 08:01:27 +00:00
<VerticalSpacer heightUnits={3} />
2025-04-08 20:53:40 +00:00
<BlackCustomText>{formatTime(localPreparationTime)}</BlackCustomText>
2024-10-13 11:29:36 +00:00
</CardTextContainer>
</Card>
2025-04-08 20:53:40 +00:00
<TimerPickerModal
hideHours
visible={showPreparationTimePicker}
setIsVisible={setShowPreparationTimePicker}
onConfirm={(pickedDuration: any) => {
const newPreparationTime = pickedDuration.minutes * 60 + pickedDuration.seconds;
setLocalPreparationTime(newPreparationTime);
updatePreparationTime(newPreparationTime);
setShowPreparationTimePicker(false);
}}
modalTitle={t('setPreparationTime')}
onCancel={() => setShowPreparationTimePicker(false)}
closeOnOverlayPress
styles={{
theme: "dark",
}}
initialValue={{ minutes: Math.floor(timerState.preparationTime / 60), seconds: timerState.preparationTime % 60 }}
modalProps={{
overlayOpacity: 0.2,
}}
/>
2025-04-10 08:01:27 +00:00
<Card backgroundColor="white" borderColor="pink" color="black" onPress={() => setShowWorkTimePicker(true)}>
2024-10-13 11:29:36 +00:00
<CardTextContainer>
<CustomText>{t('fight')}</CustomText>
2025-04-10 08:01:27 +00:00
<VerticalSpacer heightUnits={3} />
<CustomText>{formatTime(localWorkTime)}</CustomText>
2024-10-13 11:29:36 +00:00
</CardTextContainer>
</Card>
<TimerPickerModal
hideHours
visible={showWorkTimePicker}
setIsVisible={setShowWorkTimePicker}
onConfirm={(pickedDuration: any) => {
const newWorkTime = pickedDuration.minutes * 60 + pickedDuration.seconds;
setLocalWorkTime(newWorkTime);
updateWorkTime(newWorkTime);
2024-10-13 11:29:36 +00:00
setShowWorkTimePicker(false);
}}
modalTitle={t('setWorkTime')}
2024-10-13 11:29:36 +00:00
onCancel={() => setShowWorkTimePicker(false)}
closeOnOverlayPress
styles={{
theme: "dark",
}}
initialValue={{ minutes: Math.floor(timerState.workTime / 60), seconds: timerState.workTime % 60 }}
2024-10-13 11:29:36 +00:00
modalProps={{
overlayOpacity: 0.2,
}}
/>
2025-04-10 08:01:27 +00:00
<Card backgroundColor="white" borderColor="blue" color='black' onPress={() => setShowRestTimePicker(true)}>
2024-10-13 11:29:36 +00:00
<CardTextContainer>
<CustomText>{t('rest')}</CustomText>
2025-04-10 08:01:27 +00:00
<VerticalSpacer heightUnits={3} />
<CustomText>{formatTime(localRestTime)}</CustomText>
2024-10-13 11:29:36 +00:00
</CardTextContainer>
</Card>
<TimerPickerModal
hideHours
visible={showRestTimePicker}
setIsVisible={setShowRestTimePicker}
onConfirm={(pickedDuration: any) => {
const newRestTime = pickedDuration.minutes * 60 + pickedDuration.seconds;
setLocalRestTime(newRestTime);
updateRestTime(newRestTime);
2024-10-13 11:29:36 +00:00
setShowRestTimePicker(false);
}}
modalTitle={t('setRestTime')}
2024-10-13 11:29:36 +00:00
onCancel={() => setShowRestTimePicker(false)}
closeOnOverlayPress
initialValue={{ minutes: Math.floor(timerState.restTime / 60), seconds: timerState.restTime % 60 }}
2024-10-13 11:29:36 +00:00
styles={{
theme: "dark",
}}
modalProps={{
overlayOpacity: 0.2,
}}
/>
2025-04-08 20:53:40 +00:00
2025-04-10 08:01:27 +00:00
<Card backgroundColor="black" color="white" borderColor="black">
2025-04-08 20:53:40 +00:00
<CardTextContainer>
2025-04-10 08:01:27 +00:00
<WhiteCustomText>{t('repetition')}</WhiteCustomText>
<VerticalSpacer heightUnits={3} />
2025-04-08 20:53:40 +00:00
<NumberSelector reps={localReps} setReps={handleRepsChange} />
</CardTextContainer>
</Card>
2024-10-13 11:29:36 +00:00
</CardContainer>
<VerticalSpacer heightUnits={5} />
2025-04-10 08:01:27 +00:00
<CenterText>{t('totalTime')}: {totalWorkTime}</CenterText>
2024-10-13 21:18:08 +00:00
<VerticalSpacer heightUnits={5} />
2025-04-10 08:01:27 +00:00
<Row>
<SmallButton color="blue" labelColor="white" label={t('settings')} onPress={() => navigation.navigate('Settings')} />
<LargeButton color="pink" labelColor="white" label={t('begin')} onPress={() => navigation.navigate('Timer')} />
</Row>
2024-10-13 11:29:36 +00:00
</Container>
);
}
2025-04-10 08:01:27 +00:00
const Row = styled.View({
flexDirection: 'row',
justifyContent: 'space-between',
alignItems: 'center',
width: '100%'
})
const SmallButton = styled(Button)({
width: '30%'
})
const LargeButton = styled(Button)({
width: '65%'
})
const LoadingContainer = styled.View({
flex: 1,
justifyContent: 'center',
alignItems: 'center',
padding: 20
});
2024-10-13 11:29:36 +00:00
const Title = styled(Text)(({ theme }) => ({
textAlign: 'center',
fontSize: 40,
fontWeight: 'bold',
color: theme.colors.fixed.black
2024-10-13 11:29:36 +00:00
}));
const Container = styled.View({
padding: 20
})
const CardTextContainer = styled.View({
2025-04-10 08:01:27 +00:00
flexDirection: 'column',
2024-10-13 11:29:36 +00:00
justifyContent: 'space-between',
alignItems: 'center'
})
const CardContainer = styled.View({
flexDirection: 'column',
gap: 10
})
const CustomText = styled(Text)(({ theme }) => ({
2025-04-10 08:01:27 +00:00
fontSize: 23,
2024-10-13 11:29:36 +00:00
fontWeight: 'bold',
textAlign: 'center',
2025-04-10 08:01:27 +00:00
}))
const WhiteCustomText = styled(CustomText)(({ theme }) => ({
color: theme.colors.fixed.white
2024-10-13 11:29:36 +00:00
}))
2025-04-08 20:53:40 +00:00
const BlackCustomText = styled(CustomText)(({ theme }) => ({
color: theme.colors.fixed.black
}))
2025-04-10 08:01:27 +00:00
const CenterText = styled(Text)(({ theme }) => ({
textAlign: 'center',
fontSize: 22,
color: theme.colors.fixed.black
}))