diff --git a/src/components/ChilledMusic.vue b/src/components/ChilledMusic.vue new file mode 100644 index 0000000..5183cf7 --- /dev/null +++ b/src/components/ChilledMusic.vue @@ -0,0 +1,34 @@ + + + + + + + diff --git a/src/hooks/useTimer.ts b/src/hooks/useTimer.ts new file mode 100644 index 0000000..b86ba17 --- /dev/null +++ b/src/hooks/useTimer.ts @@ -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('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 + } +} diff --git a/src/styles/app.scss b/src/styles/app.scss index a4de590..716d0a5 100644 --- a/src/styles/app.scss +++ b/src/styles/app.scss @@ -33,4 +33,6 @@ button:active { input { padding: 0.5rem; + text-align: center; + border-radius: 0.5rem; } diff --git a/src/types/StopwatchState.ts b/src/types/StopwatchState.ts new file mode 100644 index 0000000..8a4e23b --- /dev/null +++ b/src/types/StopwatchState.ts @@ -0,0 +1 @@ +export type StopwatchState = 'started' | 'stopped' diff --git a/src/views/Home.vue b/src/views/Home.vue index 7a5d749..efc7aa6 100644 --- a/src/views/Home.vue +++ b/src/views/Home.vue @@ -1,11 +1,24 @@ - + + + intervale : + + minutes + {{ time }} - - Interval: - - - play - stop + commencer + arrĂȘter - +