diff --git a/src/components/BinaryClock.tsx b/src/components/BinaryClock.tsx index 24078e9..ffc0d26 100644 --- a/src/components/BinaryClock.tsx +++ b/src/components/BinaryClock.tsx @@ -4,13 +4,13 @@ // License, v. 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at http://mozilla.org/MPL/2.0/. -import {BinaryTimeMode, asBinaryTime} from '../utils/binaryTime'; +import {BinaryTimeMode} from '../utils/binaryTime'; import {StyleSheet, View} from 'react-native'; import BinaryDigit from './BinaryDigit'; import Orientation from '../utils/orientation'; import React from 'react'; -import {useTime} from '../utils/useTime'; +import { useBinaryTime } from '../utils/useBinaryTime'; interface BinaryClockProps { orientation?: Orientation; @@ -28,17 +28,10 @@ const DEFAULTS = { const BinaryClock: React.FC = args => { const props = {...DEFAULTS, ...args}; - const time = useTime(); - const digits = asBinaryTime( - { - hours: time.getHours(), - minutes: time.getMinutes(), - seconds: time.getSeconds(), - }, - { - [Orientation.Portrait]: BinaryTimeMode.SINGLE_DIGITS, - [Orientation.Landscape]: BinaryTimeMode.DOUBLE_DIGITS, - }[props.orientation], + const digits = useBinaryTime( + props.orientation === Orientation.Landscape + ? BinaryTimeMode.DOUBLE_DIGITS + : BinaryTimeMode.SINGLE_DIGITS, ); return ( diff --git a/src/utils/binaryTime.ts b/src/utils/binaryTime.ts index 3847f0b..00185c4 100644 --- a/src/utils/binaryTime.ts +++ b/src/utils/binaryTime.ts @@ -41,9 +41,16 @@ export enum BinaryTimeMode { } export function asBinaryTime( - time: Time, + time: Time | Date, mode: BinaryTimeMode = BinaryTimeMode.SINGLE_DIGITS, ): BinaryTime { + if (time instanceof Date) { + time = { + hours: time.getHours(), + minutes: time.getMinutes(), + seconds: time.getSeconds(), + }; + } switch (mode) { case BinaryTimeMode.SINGLE_DIGITS: return [ diff --git a/src/utils/useBinaryTime.ts b/src/utils/useBinaryTime.ts new file mode 100644 index 0000000..3a930d8 --- /dev/null +++ b/src/utils/useBinaryTime.ts @@ -0,0 +1,23 @@ +import { useState, useEffect } from "react"; +import { BinaryTimeMode, asBinaryTime } from "./binaryTime"; +import { useTime } from "./useTime"; + +export function useBinaryTime( + mode: BinaryTimeMode = BinaryTimeMode.SINGLE_DIGITS, +): ReturnType { + const time = useTime(); + const [digits, setDigits] = useState(() => asBinaryTime(time, mode)); + useEffect(() => { + const newDigits = asBinaryTime(time, mode); + setDigits(prev => + // Where possible, preserve object references on a per-digit basis. + prev.map((digit, idx) => { + if (digit.value === newDigits[idx].value) { + return digit; + } + return newDigits[idx]; + }), + ); + }, [time, mode]); + return digits; +}