From cf06e91e30d311263c40f098a5e29889b5b3357c Mon Sep 17 00:00:00 2001 From: Alex van Andel Date: Wed, 26 May 2021 18:40:22 +0000 Subject: [PATCH] Implemented sticky time options based on localStorage --- pages/[user]/[type].tsx | 60 +++++++++++++++++++++++++---------------- pages/[user]/book.tsx | 14 +++++++++- 2 files changed, 50 insertions(+), 24 deletions(-) diff --git a/pages/[user]/[type].tsx b/pages/[user]/[type].tsx index b4e6f528..7c3acfff 100644 --- a/pages/[user]/[type].tsx +++ b/pages/[user]/[type].tsx @@ -40,15 +40,45 @@ export default function Type(props) { setIsTimeOptionsOpen(!isTimeOptionsOpen); } - useEffect(() => { - // Setting timezone only client-side - setSelectedTimeZone(dayjs.tz.guess()) - }, []) + function toggleClockSticky() { + localStorage.setItem('timeOption.is24hClock', (!is24h).toString()); + setIs24h(!is24h); + } + + function setPreferredTimeZoneSticky({ value }: string) { + localStorage.setItem('timeOption.preferredTimeZone', value); + setSelectedTimeZone(value); + } + + function initializeTimeOptions() { + setSelectedTimeZone(localStorage.getItem('timeOption.preferredTimeZone') || dayjs.tz.guess()); + setIs24h(!!localStorage.getItem('timeOption.is24hClock')); + } useEffect(() => { telemetry.withJitsu((jitsu) => jitsu.track(telemetryEventTypes.pageView, collectPageParameters())) - }) + }); + // Handle date change and timezone change + useEffect(() => { + + if ( ! selectedTimeZone ) { + initializeTimeOptions(); + } + + const changeDate = async () => { + if (!selectedDate) { + return + } + + setLoading(true); + const res = await fetch(`/api/availability/${user}?dateFrom=${lowerBound.utc().format()}&dateTo=${upperBound.utc().format()}`); + const busyTimes = await res.json(); + if (busyTimes.length > 0) setBusy(busyTimes); + setLoading(false); + } + changeDate(); + }, [selectedDate, selectedTimeZone]); // Get router variables const router = useRouter(); @@ -108,22 +138,6 @@ export default function Type(props) { )]; - // Handle date change and timezone change - useEffect(() => { - const changeDate = async () => { - if (!selectedDate) { - return - } - - setLoading(true); - const res = await fetch(`/api/availability/${user}?dateFrom=${lowerBound.utc().format()}&dateTo=${upperBound.utc().format()}`); - const busyTimes = await res.json(); - if (busyTimes.length > 0) setBusy(busyTimes); - setLoading(false); - } - changeDate(); - }, [selectedDate, selectedTimeZone]); - const times = useMemo(() => getSlots({ calendarTimeZone: props.user.timeZone, @@ -225,7 +239,7 @@ export default function Type(props) { setSelectedTimeZone(value)} + onChange={setPreferredTimeZoneSticky} className="mb-2 shadow-sm focus:ring-blue-500 focus:border-blue-500 mt-1 block w-full sm:text-sm border-gray-300 rounded-md" /> diff --git a/pages/[user]/book.tsx b/pages/[user]/book.tsx index 408a8980..c84d0ab2 100644 --- a/pages/[user]/book.tsx +++ b/pages/[user]/book.tsx @@ -6,20 +6,32 @@ import prisma from '../../lib/prisma'; import {collectPageParameters, telemetryEventTypes, useTelemetry} from "../../lib/telemetry"; import { useEffect, useState } from "react"; import dayjs from 'dayjs'; +import utc from 'dayjs/plugin/utc'; +import timezone from 'dayjs/plugin/timezone'; import 'react-phone-number-input/style.css'; import PhoneInput from 'react-phone-number-input'; import { LocationType } from '../../lib/location'; import Avatar from '../../components/Avatar'; +dayjs.extend(utc); +dayjs.extend(timezone); + export default function Book(props) { const router = useRouter(); const { date, user } = router.query; + const [ is24h, setIs24h ] = useState(false); + const [ preferredTimeZone, setPreferredTimeZone ] = useState(''); + const locations = props.eventType.locations || []; const [ selectedLocation, setSelectedLocation ] = useState(locations.length === 1 ? locations[0].type : ''); const telemetry = useTelemetry(); useEffect(() => { + + setPreferredTimeZone(localStorage.getItem('timeOption.preferredTimeZone') || dayjs.tz.guess()); + setIs24h(!!localStorage.getItem('timeOption.is24hClock')); + telemetry.withJitsu(jitsu => jitsu.track(telemetryEventTypes.timeSelected, collectPageParameters())); }); @@ -92,7 +104,7 @@ export default function Book(props) {

}

- {dayjs(date).format("hh:mma, dddd DD MMMM YYYY")} + {preferredTimeZone && dayjs(date).tz(preferredTimeZone).format( (is24h ? "H:mm" : "h:mma") + ", dddd DD MMMM YYYY")}

{props.eventType.description}