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}