Skip to content

Commit b8ce1c3

Browse files
Frontend: More dayjs -> Temporal migration (#9282)
1 parent 5d49355 commit b8ce1c3

10 files changed

Lines changed: 353 additions & 234 deletions

File tree

app/web/features/dashboard/UpcomingStayCard.tsx

Lines changed: 14 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ import { Box, Skeleton, styled, Typography } from "@mui/material";
33
import { alpha } from "@mui/material/styles";
44
import Avatar from "components/Avatar";
55
import { useAuthContext } from "features/auth/AuthProvider";
6-
import useCurrentUser from "features/userQueries/useCurrentUser";
76
import { useLiteUser } from "features/userQueries/useLiteUsers";
87
import { useTranslation } from "i18n";
98
import { DASHBOARD } from "i18n/namespaces";
@@ -12,11 +11,10 @@ import { HostRequest } from "proto/requests_pb";
1211
import { routeToHostRequest } from "routes";
1312
import { Temporal } from "temporal-polyfill";
1413
import {
14+
daysBetween,
1515
localizeDateTimeRange,
1616
localizeRelativeTimeUnit,
17-
UTC_TIMEZONE,
1817
} from "utils/date";
19-
import dayjs from "utils/dayjs";
2018

2119
const StyledCard = styled(Box)(({ theme }) => ({
2220
display: "flex",
@@ -131,8 +129,6 @@ export default function UpcomingStayCard({
131129
hostRequest,
132130
}: UpcomingStayCardProps) {
133131
const { authState } = useAuthContext();
134-
const { data: currentUser } = useCurrentUser();
135-
const timezone = currentUser?.timezone ?? UTC_TIMEZONE;
136132
const {
137133
t,
138134
i18n: { language: locale },
@@ -144,31 +140,29 @@ export default function UpcomingStayCard({
144140
: hostRequest.hostUserId;
145141
const { data: otherUser, isLoading } = useLiteUser(otherUserId);
146142

147-
const fromDate = dayjs.tz(hostRequest.fromDate, UTC_TIMEZONE);
148-
const toDate = dayjs.tz(hostRequest.toDate, UTC_TIMEZONE);
149-
const nights = toDate.diff(fromDate, "day");
150-
const today = dayjs().tz(timezone).startOf("day");
151-
const daysUntil = fromDate.diff(today, "day");
152-
const daysUntilEnd = toDate.diff(today, "day");
143+
const fromDate = Temporal.PlainDate.from(hostRequest.fromDate);
144+
const toDate = Temporal.PlainDate.from(hostRequest.toDate);
145+
const today = Temporal.Now.plainDateISO();
146+
const nights = daysBetween(fromDate, toDate);
147+
const daysUntil = daysBetween(today, fromDate);
148+
const daysUntilEnd = daysBetween(today, toDate);
153149
const isOngoing = daysUntil <= 0 && daysUntilEnd >= 0;
154150
const isImminent = daysUntil <= 3;
155151
const relativeDaysLabel = localizeRelativeTimeUnit(
156152
daysUntil,
157153
"days",
158154
locale,
159-
{ capitalize: true },
160-
);
161-
162-
const dateRange = localizeDateTimeRange(
163-
Temporal.PlainDateTime.from(hostRequest.fromDate),
164-
Temporal.PlainDateTime.from(hostRequest.toDate),
165155
{
166-
locale,
167-
includeTime: false,
168-
abbreviate: true,
156+
capitalize: true,
169157
},
170158
);
171159

160+
const dateRange = localizeDateTimeRange(fromDate, toDate, {
161+
locale,
162+
includeTime: false,
163+
abbreviate: true,
164+
});
165+
172166
const primary = isLoading ? (
173167
<Skeleton width={80} />
174168
) : (

app/web/features/messages/groupchats/MuteDialog.tsx

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,8 @@ import { useTranslation } from "i18n";
2020
import { GLOBAL, MESSAGES } from "i18n/namespaces";
2121
import React, { useState } from "react";
2222
import { service } from "service";
23-
import dayjs from "utils/dayjs";
23+
import { Temporal } from "temporal-polyfill";
24+
import { approxTimeDuration } from "utils/date";
2425

2526
type DurationChoice = "1h" | "8h" | "1d" | "1w" | "1m" | "forever";
2627

@@ -33,14 +34,14 @@ export default function MuteDialog({
3334
const muteMutation = useMutation<void, RpcError, DurationChoice>({
3435
mutationFn: async (duration) => {
3536
let d;
36-
if (duration === "1h") d = dayjs.duration({ hours: 1 });
37-
else if (duration === "8h") d = dayjs.duration({ hours: 8 });
38-
else if (duration === "1d") d = dayjs.duration({ days: 1 });
39-
else if (duration === "1w") d = dayjs.duration({ weeks: 1 });
40-
else if (duration === "1m") d = dayjs.duration({ months: 1 });
37+
if (duration === "1h") d = Temporal.Duration.from({ hours: 1 });
38+
else if (duration === "8h") d = Temporal.Duration.from({ hours: 8 });
39+
else if (duration === "1d") d = Temporal.Duration.from({ days: 1 });
40+
else if (duration === "1w") d = Temporal.Duration.from({ weeks: 1 });
41+
else if (duration === "1m") d = Temporal.Duration.from({ months: 1 });
4142
await service.conversations.muteChat({
4243
groupChatId,
43-
forDuration: d,
44+
forDuration: d ? approxTimeDuration(d) : undefined,
4445
forever: !d,
4546
});
4647
},

app/web/features/messages/requests/HostRequestListItem.tsx

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@ import { service } from "service";
3333
import { Temporal } from "temporal-polyfill";
3434
import { theme } from "theme";
3535
import { localizeDateTimeRange } from "utils/date";
36-
import dayjs from "utils/dayjs";
3736
import { firstName } from "utils/names";
3837

3938
import HostRequestStatusText from "./HostRequestStatusText";
@@ -141,7 +140,12 @@ export default function HostRequestListItem({
141140
}`
142141
: "";
143142

144-
const isPast = dayjs(hostRequest?.toDate).isBefore(dayjs(), "day");
143+
const isPast =
144+
hostRequest &&
145+
Temporal.PlainDate.compare(
146+
Temporal.PlainDate.from(hostRequest.toDate),
147+
Temporal.Now.plainDateISO(),
148+
) < 0;
145149

146150
const queryClient = useQueryClient();
147151

app/web/features/messages/requests/HostRequestUserSummarySection.tsx

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import { LiteUser } from "proto/api_pb";
1313
import { HostRequest } from "proto/requests_pb";
1414
import { Temporal } from "temporal-polyfill";
1515
import { theme } from "theme";
16-
import { localizeDateTimeRange, numNights } from "utils/date";
16+
import { daysBetween, localizeDateTimeRange } from "utils/date";
1717
import truncateTextEllipsis from "utils/truncateTextEllipsis";
1818

1919
const StyledRequestedDatesWrapper = styled("div")(({ theme }) => ({
@@ -136,7 +136,10 @@ const HostRequestUserSummarySection = ({
136136
>
137137
(
138138
{t("host_request_view.request_duration", {
139-
count: numNights(hostRequest.toDate, hostRequest.fromDate),
139+
count: daysBetween(
140+
Temporal.PlainDate.from(hostRequest.fromDate),
141+
Temporal.PlainDate.from(hostRequest.toDate),
142+
),
140143
})}
141144
)
142145
</Typography>

app/web/features/messages/requests/HostRequestView.tsx

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,8 @@ import {
3535
import { useRef, useState } from "react";
3636
import { messagesRoute } from "routes";
3737
import { service } from "service";
38+
import { Temporal } from "temporal-polyfill";
3839
import { theme } from "theme";
39-
import dayjs from "utils/dayjs";
4040
import { firstName } from "utils/names";
4141
import { useIsNativeEmbed } from "utils/nativeLink";
4242

@@ -154,7 +154,12 @@ export default function HostRequestView({
154154
const currentUserId = useAuthContext().authState.userId;
155155
const isHost = hostRequest?.hostUserId === currentUserId;
156156
const otherUser = isHost ? surfer : host;
157-
const isRequestPast = dayjs(hostRequest?.toDate).isBefore(dayjs(), "day");
157+
const isRequestPast =
158+
hostRequest &&
159+
Temporal.PlainDate.compare(
160+
Temporal.PlainDate.from(hostRequest.toDate),
161+
Temporal.Now.plainDateISO(),
162+
) < 0;
158163

159164
let title =
160165
otherUser && hostRequest

app/web/features/profile/view/userLabels.tsx

Lines changed: 33 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,11 @@ import { Temporal } from "temporal-polyfill";
1313
import { theme } from "theme";
1414
import {
1515
localizeDateTime,
16+
localizeDuration,
1617
localizeRelativeTime,
1718
localizeYearMonth,
1819
timestampToPlainDateTime,
19-
UTC_TIMEZONE,
2020
} from "utils/date";
21-
import dayjs, { i18nToDayjsLocale } from "utils/dayjs";
2221

2322
interface Props {
2423
user: User.AsObject;
@@ -80,11 +79,8 @@ export const ResponseRateText = ({
8079
export const ResponseRateLabel = ({ user }: Props) => {
8180
const {
8281
t,
83-
i18n: { language },
82+
i18n: { language: locale },
8483
} = useTranslation(PROFILE);
85-
// Localize the humanized durations at the call site (no global dayjs locale).
86-
const dayjsLocale = i18nToDayjsLocale(language);
87-
8884
let rateText = undefined;
8985
let timeText = undefined;
9086

@@ -95,34 +91,38 @@ export const ResponseRateLabel = ({ user }: Props) => {
9591
} else if (user.some) {
9692
rateText = t("response_rate_text_some");
9793
timeText = t("response_time_text_some", {
98-
p33: dayjs
99-
.duration(user.some.responseTimeP33!.seconds, "second")
100-
.locale(dayjsLocale)
101-
.humanize(),
94+
p33: localizeDuration(
95+
Temporal.Duration.from({ seconds: user.some.responseTimeP33!.seconds }),
96+
locale,
97+
),
10298
});
10399
} else if (user.most) {
104100
rateText = t("response_rate_text_most");
105101
timeText = t("response_time_text_most", {
106-
p33: dayjs
107-
.duration(user.most.responseTimeP33!.seconds, "second")
108-
.locale(dayjsLocale)
109-
.humanize(),
110-
p66: dayjs
111-
.duration(user.most.responseTimeP66!.seconds, "second")
112-
.locale(dayjsLocale)
113-
.humanize(),
102+
p33: localizeDuration(
103+
Temporal.Duration.from({ seconds: user.most.responseTimeP33!.seconds }),
104+
locale,
105+
),
106+
p66: localizeDuration(
107+
Temporal.Duration.from({ seconds: user.most.responseTimeP66!.seconds }),
108+
locale,
109+
),
114110
});
115111
} else if (user.almostAll) {
116112
rateText = t("response_rate_text_almost_all");
117113
timeText = t("response_time_text_almost_all", {
118-
p33: dayjs
119-
.duration(user.almostAll.responseTimeP33!.seconds, "second")
120-
.locale(dayjsLocale)
121-
.humanize(),
122-
p66: dayjs
123-
.duration(user.almostAll.responseTimeP66!.seconds, "second")
124-
.locale(dayjsLocale)
125-
.humanize(),
114+
p33: localizeDuration(
115+
Temporal.Duration.from({
116+
seconds: user.almostAll.responseTimeP33!.seconds,
117+
}),
118+
locale,
119+
),
120+
p66: localizeDuration(
121+
Temporal.Duration.from({
122+
seconds: user.almostAll.responseTimeP66!.seconds,
123+
}),
124+
locale,
125+
),
126126
});
127127
}
128128

@@ -288,16 +288,15 @@ export const RemainingAboutLabels = ({ user }: Props) => {
288288
: ""
289289
}
290290
/>
291-
<LabelAndText
292-
label={t("profile:heading.local_time")}
293-
text={localizeDateTime(
294-
Temporal.Now.plainDateTimeISO(user.timezone || UTC_TIMEZONE),
295-
{
291+
{user.timezone ? (
292+
<LabelAndText
293+
label={t("profile:heading.local_time")}
294+
text={localizeDateTime(Temporal.Now.plainDateTimeISO(user.timezone), {
296295
locale,
297296
includeDate: false,
298-
},
299-
)}
300-
/>
297+
})}
298+
/>
299+
) : undefined}
301300
</>
302301
);
303302
};

app/web/service/conversations.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,10 @@ import {
2121
SendMessageReq,
2222
SetGroupChatArchiveStatusReq,
2323
} from "proto/conversations_pb";
24+
import { Temporal } from "temporal-polyfill";
25+
import { durationToProtobuf } from "utils/date";
2426

2527
import client from "./client";
26-
import { Duration, duration2pb } from "./utils/date";
2728
import isGrpcError from "./utils/isGrpcError";
2829

2930
export async function listGroupChats(
@@ -172,14 +173,15 @@ export async function getDirectMessage(userId: number) {
172173

173174
export type MuteChatOptions = Pick<MuteGroupChatReq.AsObject, "groupChatId"> &
174175
Partial<Omit<MuteGroupChatReq.AsObject, "groupChatId" | "forDuration">> & {
175-
forDuration?: Duration;
176+
forDuration?: Temporal.Duration;
176177
};
177178
export async function muteChat(options: MuteChatOptions) {
178179
const req = new MuteGroupChatReq();
179180
req.setGroupChatId(options.groupChatId);
180181
if (options.unmute) req.setUnmute(true);
181182
if (options.forever) req.setForever(true);
182-
if (options.forDuration) req.setForDuration(duration2pb(options.forDuration));
183+
if (options.forDuration)
184+
req.setForDuration(durationToProtobuf(options.forDuration));
183185
return client.conversations.muteGroupChat(req);
184186
}
185187

app/web/service/utils/date.ts

Lines changed: 0 additions & 10 deletions
This file was deleted.

0 commit comments

Comments
 (0)