♻️ (timer) break into more pieces the hook useTimer

This commit is contained in:
2020-07-04 10:50:58 +02:00
parent b0e28ae209
commit fe674c73df
5 changed files with 150 additions and 110 deletions

79
src/hooks/useTimer.ts Normal file
View File

@@ -0,0 +1,79 @@
import { ref, computed, watch } from '@vue/composition-api'
import { StopwatchState } from '@/types/StopwatchState'
import { notify } from '@/utils/notification'
const format = (num: number) => {
return num.toString().padStart(2, '0')
}
const formatSeconds = (seconds: number) => {
const minutes = Math.floor(seconds / 60)
const secs = seconds % 60
return `${format(minutes)}:${format(secs)}`
}
export const useTimer = () => {
const timeState = ref<StopwatchState>('stopped')
const seconds = ref(0)
const interval = ref(5)
const sessionSeconds = ref(interval.value * 60)
const isProgrammer1Turn = ref(true)
const time = computed(() => formatSeconds(seconds.value))
const session = computed(() => formatSeconds(sessionSeconds.value))
const intervalSeconds = computed(() => interval.value * 60)
let stopwatchId: number | null = null
let stopWatchSessionId: number | null = null
watch(interval, () => {
sessionSeconds.value = interval.value * 60
})
const start = () => {
timeState.value = 'started'
notify('Session started!')
stopwatchId = setInterval(() => {
seconds.value++
if (seconds.value % intervalSeconds.value === 0) {
sessionSeconds.value = intervalSeconds.value
isProgrammer1Turn.value = !isProgrammer1Turn.value
const programmer = isProgrammer1Turn.value
? 'Programmer 1'
: 'Programmer 2'
notify('Time to change', { body: `${programmer}, your turn!` })
}
}, 1000)
stopWatchSessionId = setInterval(() => {
sessionSeconds.value--
}, 1000)
}
const clear = () => {
timeState.value = 'stopped'
if (stopwatchId) {
clearInterval(stopwatchId)
}
if (stopWatchSessionId) {
clearInterval(stopWatchSessionId)
}
seconds.value = 0
sessionSeconds.value = intervalSeconds.value
isProgrammer1Turn.value = true
}
return {
interval,
start,
clear,
timeState,
time,
session,
isProgrammer1Turn
}
}