♻️ (timer) break into more pieces the hook useTimer
This commit is contained in:
79
src/hooks/useTimer.ts
Normal file
79
src/hooks/useTimer.ts
Normal 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
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user