2023-09-26 09:48:11 +03:00
|
|
|
import React, { useCallback, useEffect, useState } from 'react';
|
2023-08-01 01:00:16 +03:00
|
|
|
import DateTimePickerModal from 'react-native-modal-datetime-picker';
|
|
|
|
|
import styled from 'styled-components/native';
|
|
|
|
|
import { THEME_COLOR } from '@/CONSTANTS';
|
|
|
|
|
import { useDispatch } from 'react-redux';
|
|
|
|
|
import { useTypedSelector } from '@/store';
|
|
|
|
|
import TimerIcon from '@/assets/icons/timer-icon.svg';
|
2023-09-26 09:48:11 +03:00
|
|
|
import { Text } from '@/components/Typography';
|
|
|
|
|
import { setTimerDate } from '@/store/music/actions';
|
2023-08-01 01:00:16 +03:00
|
|
|
|
|
|
|
|
const Container = styled.View`
|
2023-09-26 09:48:11 +03:00
|
|
|
align-items: flex-start;
|
2023-08-01 01:00:16 +03:00
|
|
|
margin-top: 60px;
|
|
|
|
|
`;
|
|
|
|
|
|
|
|
|
|
const View = styled.View`
|
|
|
|
|
display: flex;
|
|
|
|
|
flex-direction: row;
|
2023-09-26 09:48:11 +03:00
|
|
|
align-items: center;
|
2023-08-01 01:00:16 +03:00
|
|
|
gap: 4px;
|
|
|
|
|
`;
|
|
|
|
|
|
|
|
|
|
export default function Timer() {
|
|
|
|
|
const [showPicker, setShowPicker] = useState<boolean>(false);
|
2023-09-26 09:48:11 +03:00
|
|
|
const [remainingTime, setRemainingTime] = useState<String|null>();
|
|
|
|
|
const { timerDate } = useTypedSelector(state => state.music);
|
2023-08-01 01:00:16 +03:00
|
|
|
|
|
|
|
|
const dispatch = useDispatch();
|
|
|
|
|
|
2023-09-26 09:48:11 +03:00
|
|
|
const handleConfirm = useCallback((date: Date) => {
|
2023-08-01 01:00:16 +03:00
|
|
|
date.setSeconds(0);
|
2023-09-26 09:48:11 +03:00
|
|
|
dispatch(setTimerDate(date));
|
|
|
|
|
setShowPicker(false);
|
|
|
|
|
}, [dispatch]);
|
|
|
|
|
|
|
|
|
|
const handleCancelDatePicker = useCallback(() => {
|
2023-08-01 01:00:16 +03:00
|
|
|
setShowPicker(false);
|
2023-09-26 09:48:11 +03:00
|
|
|
}, []);
|
|
|
|
|
|
|
|
|
|
const showDatePicker = useCallback(() => {
|
|
|
|
|
setShowPicker(!showPicker);
|
|
|
|
|
}, [showPicker]);
|
|
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
|
if (!timerDate) {
|
|
|
|
|
setRemainingTime(null);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const interval = setInterval(() => {
|
|
|
|
|
const dateSet = timerDate ? timerDate : new Date();
|
|
|
|
|
const millisecondsDiff = dateSet.valueOf() - new Date().valueOf();
|
|
|
|
|
let sec = Math.floor(millisecondsDiff / 1000);
|
|
|
|
|
let min = Math.floor(sec/60);
|
|
|
|
|
sec = sec%60;
|
|
|
|
|
const hours = Math.floor(min/60);
|
|
|
|
|
min = min%60;
|
|
|
|
|
const ticks = `${hours.toString().length === 1 ? '0' + hours : hours}:${min.toString().length === 1 ? '0' + min : min}:${sec.toString().length === 1 ? '0' + sec : sec}`;
|
|
|
|
|
setRemainingTime(ticks);
|
|
|
|
|
}, 1000);
|
2023-08-01 01:00:16 +03:00
|
|
|
|
2023-09-26 09:48:11 +03:00
|
|
|
return () => clearInterval(interval);
|
|
|
|
|
}, [setRemainingTime, timerDate]);
|
2023-08-01 01:00:16 +03:00
|
|
|
|
|
|
|
|
return (
|
|
|
|
|
<Container>
|
|
|
|
|
<View>
|
2023-09-26 09:48:11 +03:00
|
|
|
<TimerIcon fill={showPicker || timerDate ? THEME_COLOR : undefined} />
|
2023-08-01 01:00:16 +03:00
|
|
|
<Text
|
2023-09-26 09:48:11 +03:00
|
|
|
style={showPicker || timerDate ? {color: THEME_COLOR} : {}}
|
2023-08-01 01:00:16 +03:00
|
|
|
onPress={showDatePicker}
|
2023-09-26 09:48:11 +03:00
|
|
|
>{!timerDate ? 'Sleep Timer' : remainingTime}</Text>
|
2023-08-01 01:00:16 +03:00
|
|
|
<DateTimePickerModal
|
|
|
|
|
isVisible={showPicker}
|
|
|
|
|
mode='time'
|
|
|
|
|
onConfirm={handleConfirm}
|
|
|
|
|
onCancel={handleCancelDatePicker}
|
|
|
|
|
/>
|
|
|
|
|
</View>
|
|
|
|
|
</Container>
|
|
|
|
|
);
|
|
|
|
|
}
|