diff --git a/src/hooks/useRandomNumbers.js b/src/hooks/useRandomNumbers.js index e731f02..bc7300c 100644 --- a/src/hooks/useRandomNumbers.js +++ b/src/hooks/useRandomNumbers.js @@ -1,18 +1,15 @@ import { useCallback, useState } from 'react' import { BOUNDS, MAX_QUANTITY, MIN_QUANTITY } from '@constants/numbers' -import { numberGenerator } from '@utils/numberGenerator' -import { randomNumber } from '@utils/randomNumber' +import { getRandomNumbersFactory } from '@utils/randomNumbers' -const generator = numberGenerator(...BOUNDS) -const quantity = { min: MIN_QUANTITY, max: MAX_QUANTITY } -const getNextNumbers = () => [...Array(randomNumber(quantity))].map(() => generator.next().value) +const getRandomNumbers = getRandomNumbersFactory(MIN_QUANTITY, MAX_QUANTITY, BOUNDS) const useRandomNumbers = () => { - const [numbers, setNumbers] = useState(getNextNumbers) + const [numbers, setNumbers] = useState(getRandomNumbers) const nextNumbers = useCallback(() => { - setNumbers(getNextNumbers()) + setNumbers(getRandomNumbers()) }, []) return [numbers, nextNumbers] diff --git a/src/services/storage.js b/src/services/storage.js index aac6035..b3090ac 100644 --- a/src/services/storage.js +++ b/src/services/storage.js @@ -1,8 +1,32 @@ import { firestore } from '@utils/firebase' -import { normalizeAttempts } from '@utils/normalizeAttempts' +import { twoDigits } from '@utils/twoDigits' const attemptsRef = firestore.collection('attempts') +const parseDate = (fetchedDate) => { + const date = fetchedDate.toDate() + const year = date.getFullYear() + const month = twoDigits(date.getMonth() + 1) + const day = twoDigits(date.getDate()) + return `${year}-${month}-${day}` +} + +const normalizeAttempts = (snapshot) => { + const attempts = {} + snapshot.forEach(document => { + const data = document.data() + if (!data.end) return + + const date = parseDate(data.end) + if (!attempts[date]) attempts[date] = [0, 0] + + attempts[date][0]++ + if (data.success === true) attempts[date][1]++ + }) + + return attempts +} + export const fetchAttempts = async (uid, initDate, finishDate) => { const snapshot = await attemptsRef .where('uid', '==', uid) diff --git a/src/utils/normalizeAttempts.js b/src/utils/normalizeAttempts.js deleted file mode 100644 index ed48d4f..0000000 --- a/src/utils/normalizeAttempts.js +++ /dev/null @@ -1,25 +0,0 @@ -import { twoDigits } from '@utils/twoDigits' - -const parseDate = (fetchedDate) => { - const date = fetchedDate.toDate() - const year = date.getFullYear() - const month = twoDigits(date.getMonth() + 1) - const day = twoDigits(date.getDate()) - return `${year}-${month}-${day}` -} - -export const normalizeAttempts = (snapshot) => { - const attempts = {} - snapshot.forEach(document => { - const data = document.data() - if (!data.end) return - - const date = parseDate(data.end) - if (!attempts[date]) attempts[date] = [0, 0] - - attempts[date][0]++ - if (data.success === true) attempts[date][1]++ - }) - - return attempts -} diff --git a/src/utils/numberGenerator.js b/src/utils/numberGenerator.js deleted file mode 100644 index 7d1e193..0000000 --- a/src/utils/numberGenerator.js +++ /dev/null @@ -1,7 +0,0 @@ -import { randomNumber } from '@utils/randomNumber' -import { runOneOf } from '@utils/runOneOf' - -export function * numberGenerator (...bounds) { - const callbacks = bounds.map(([min, max]) => () => randomNumber({ min, max })) - while (true) yield runOneOf(...callbacks) -} diff --git a/src/utils/randomNumber.js b/src/utils/randomNumber.js deleted file mode 100644 index 2d4df9e..0000000 --- a/src/utils/randomNumber.js +++ /dev/null @@ -1,4 +0,0 @@ -const RANDOM_NUMBER_MAX = 1_000 - -export const randomNumber = ({ min = 0, max = RANDOM_NUMBER_MAX }) => - min + Math.floor(Math.random() * (max - min + 1)) diff --git a/src/utils/randomNumbers.js b/src/utils/randomNumbers.js new file mode 100644 index 0000000..43ac4a6 --- /dev/null +++ b/src/utils/randomNumbers.js @@ -0,0 +1,16 @@ +const getRandomNumber = (min, max) => + min + Math.floor(Math.random() * (max - min + 1)) + +const runOneOf = (callbacks) => { + const index = getRandomNumber(0, callbacks.length - 1) + return callbacks[index]() +} + +export const getRandomNumbersFactory = (minQuantity, maxQuantity, bounds) => { + const callbacks = bounds.map(([min, max]) => () => getRandomNumber(min, max)) + + return () => { + const quantity = getRandomNumber(minQuantity, maxQuantity) + return [...Array(quantity)].map(() => runOneOf(callbacks)) + } +} diff --git a/src/utils/runOneOf.js b/src/utils/runOneOf.js deleted file mode 100644 index 61f34a2..0000000 --- a/src/utils/runOneOf.js +++ /dev/null @@ -1,7 +0,0 @@ -import { randomNumber } from '@utils/randomNumber' - -export const runOneOf = (...callbacks) => { - const index = randomNumber({ max: callbacks.length - 1 }) - if (typeof callbacks[index] !== 'function') throw new Error('Invalid callback') - return callbacks[index]() -}