mirror of https://github.com/zulip/zulip.git
people: Remove final use of date-fns-tz.
date-fns-tz does not handle daylight saving time correctly, and can be replaced with modern browser APIs. Signed-off-by: Anders Kaseorg <anders@zulip.com>
This commit is contained in:
parent
b897be76b4
commit
8a875b119f
|
@ -30,7 +30,6 @@
|
||||||
"css-loader": "^6.2.0",
|
"css-loader": "^6.2.0",
|
||||||
"css-minimizer-webpack-plugin": "^5.0.0",
|
"css-minimizer-webpack-plugin": "^5.0.0",
|
||||||
"date-fns": "^2.16.1",
|
"date-fns": "^2.16.1",
|
||||||
"date-fns-tz": "^2.0.0",
|
|
||||||
"email-addresses": "^5.0.0",
|
"email-addresses": "^5.0.0",
|
||||||
"emoji-datasource-google": "^15.0.1",
|
"emoji-datasource-google": "^15.0.1",
|
||||||
"emoji-datasource-google-blob": "npm:emoji-datasource-google@^3.0.0",
|
"emoji-datasource-google-blob": "npm:emoji-datasource-google@^3.0.0",
|
||||||
|
|
|
@ -97,9 +97,6 @@ dependencies:
|
||||||
date-fns:
|
date-fns:
|
||||||
specifier: ^2.16.1
|
specifier: ^2.16.1
|
||||||
version: 2.30.0
|
version: 2.30.0
|
||||||
date-fns-tz:
|
|
||||||
specifier: ^2.0.0
|
|
||||||
version: 2.0.0(date-fns@2.30.0)
|
|
||||||
email-addresses:
|
email-addresses:
|
||||||
specifier: ^5.0.0
|
specifier: ^5.0.0
|
||||||
version: 5.0.0
|
version: 5.0.0
|
||||||
|
@ -5082,14 +5079,6 @@ packages:
|
||||||
whatwg-url: 12.0.1
|
whatwg-url: 12.0.1
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/date-fns-tz@2.0.0(date-fns@2.30.0):
|
|
||||||
resolution: {integrity: sha512-OAtcLdB9vxSXTWHdT8b398ARImVwQMyjfYGkKD2zaGpHseG2UPHbHjXELReErZFxWdSLph3c2zOaaTyHfOhERQ==}
|
|
||||||
peerDependencies:
|
|
||||||
date-fns: '>=2.0.0'
|
|
||||||
dependencies:
|
|
||||||
date-fns: 2.30.0
|
|
||||||
dev: false
|
|
||||||
|
|
||||||
/date-fns@2.30.0:
|
/date-fns@2.30.0:
|
||||||
resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==}
|
resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==}
|
||||||
engines: {node: '>=0.11'}
|
engines: {node: '>=0.11'}
|
||||||
|
|
|
@ -48,4 +48,4 @@ API_FEATURE_LEVEL = 227
|
||||||
# historical commits sharing the same major version, in which case a
|
# historical commits sharing the same major version, in which case a
|
||||||
# minor version bump suffices.
|
# minor version bump suffices.
|
||||||
|
|
||||||
PROVISION_VERSION = (253, 1)
|
PROVISION_VERSION = (254, 0)
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
import md5 from "blueimp-md5";
|
import md5 from "blueimp-md5";
|
||||||
import {format, utcToZonedTime} from "date-fns-tz";
|
|
||||||
import assert from "minimalistic-assert";
|
import assert from "minimalistic-assert";
|
||||||
|
|
||||||
import * as typeahead from "../shared/src/typeahead";
|
import * as typeahead from "../shared/src/typeahead";
|
||||||
|
@ -12,8 +11,9 @@ import * as muted_users from "./muted_users";
|
||||||
import {page_params} from "./page_params";
|
import {page_params} from "./page_params";
|
||||||
import * as reload_state from "./reload_state";
|
import * as reload_state from "./reload_state";
|
||||||
import * as settings_config from "./settings_config";
|
import * as settings_config from "./settings_config";
|
||||||
import * as settings_data from "./settings_data";
|
import * as timerender from "./timerender";
|
||||||
import type {DisplayRecipientUser, Message, MessageWithBooleans} from "./types";
|
import type {DisplayRecipientUser, Message, MessageWithBooleans} from "./types";
|
||||||
|
import {user_settings} from "./user_settings";
|
||||||
import * as util from "./util";
|
import * as util from "./util";
|
||||||
|
|
||||||
export type ProfileData = {
|
export type ProfileData = {
|
||||||
|
@ -364,26 +364,17 @@ export function emails_to_full_names_string(emails: string[]): string {
|
||||||
.join(", ");
|
.join(", ");
|
||||||
}
|
}
|
||||||
|
|
||||||
export function get_user_time_preferences(
|
export function get_user_time(user_id: number): string | undefined {
|
||||||
user_id: number,
|
|
||||||
): settings_data.TimePreferences | undefined {
|
|
||||||
const user_timezone = get_by_user_id(user_id)!.timezone;
|
const user_timezone = get_by_user_id(user_id)!.timezone;
|
||||||
if (user_timezone) {
|
if (user_timezone) {
|
||||||
return settings_data.get_time_preferences(user_timezone);
|
try {
|
||||||
}
|
return new Date().toLocaleTimeString(user_settings.default_language, {
|
||||||
return undefined;
|
...timerender.get_format_options_for_type("time"),
|
||||||
}
|
timeZone: user_timezone,
|
||||||
|
});
|
||||||
export function get_user_time(user_id: number): string | undefined {
|
} catch (error) {
|
||||||
const user_pref = get_user_time_preferences(user_id);
|
blueslip.error(`Error formatting time in ${user_timezone}`, undefined, error);
|
||||||
if (user_pref) {
|
|
||||||
const current_date = utcToZonedTime(new Date(), user_pref.timezone);
|
|
||||||
// This could happen if the timezone is invalid.
|
|
||||||
if (Number.isNaN(current_date.getTime())) {
|
|
||||||
blueslip.error("Got invalid date for timezone", {timezone: user_pref.timezone});
|
|
||||||
return undefined;
|
|
||||||
}
|
}
|
||||||
return format(current_date, user_pref.format, {timeZone: user_pref.timezone});
|
|
||||||
}
|
}
|
||||||
return undefined;
|
return undefined;
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,24 +19,6 @@ export function initialize(current_user_join_date: Date): void {
|
||||||
about page_params and settings_config details.
|
about page_params and settings_config details.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
export type TimePreferences = {
|
|
||||||
timezone: string;
|
|
||||||
format: string;
|
|
||||||
};
|
|
||||||
|
|
||||||
export function get_time_preferences(user_timezone: string): TimePreferences {
|
|
||||||
if (user_settings.twenty_four_hour_time) {
|
|
||||||
return {
|
|
||||||
timezone: user_timezone,
|
|
||||||
format: "H:mm",
|
|
||||||
};
|
|
||||||
}
|
|
||||||
return {
|
|
||||||
timezone: user_timezone,
|
|
||||||
format: "h:mm a",
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
export function user_can_change_name(): boolean {
|
export function user_can_change_name(): boolean {
|
||||||
if (page_params.is_admin) {
|
if (page_params.is_admin) {
|
||||||
return true;
|
return true;
|
||||||
|
|
|
@ -43,7 +43,7 @@ type DateOrTimeFormat = DateFormat | TimeFormat | DateWithTimeFormat;
|
||||||
// for any formats that display the name for a month/weekday, but
|
// for any formats that display the name for a month/weekday, but
|
||||||
// possibly in more subtle ways for languages with different
|
// possibly in more subtle ways for languages with different
|
||||||
// punctuation schemes for date and times.
|
// punctuation schemes for date and times.
|
||||||
function get_format_options_for_type(type: DateOrTimeFormat): Intl.DateTimeFormatOptions {
|
export function get_format_options_for_type(type: DateOrTimeFormat): Intl.DateTimeFormatOptions {
|
||||||
const is_twenty_four_hour_time = user_settings.twenty_four_hour_time;
|
const is_twenty_four_hour_time = user_settings.twenty_four_hour_time;
|
||||||
|
|
||||||
const time_format_options: Intl.DateTimeFormatOptions = is_twenty_four_hour_time
|
const time_format_options: Intl.DateTimeFormatOptions = is_twenty_four_hour_time
|
||||||
|
|
|
@ -586,25 +586,11 @@ test_people("bot_custom_profile_data", () => {
|
||||||
test_people("user_timezone", () => {
|
test_people("user_timezone", () => {
|
||||||
MockDate.set(parseISO("20130208T080910").getTime());
|
MockDate.set(parseISO("20130208T080910").getTime());
|
||||||
|
|
||||||
const expected_pref = {
|
|
||||||
timezone: "America/Los_Angeles",
|
|
||||||
format: "H:mm",
|
|
||||||
};
|
|
||||||
|
|
||||||
user_settings.twenty_four_hour_time = true;
|
user_settings.twenty_four_hour_time = true;
|
||||||
assert.deepEqual(people.get_user_time_preferences(me.user_id), expected_pref);
|
assert.equal(people.get_user_time(me.user_id), "00:09");
|
||||||
|
|
||||||
expected_pref.format = "h:mm a";
|
|
||||||
user_settings.twenty_four_hour_time = false;
|
|
||||||
assert.deepEqual(people.get_user_time_preferences(me.user_id), expected_pref);
|
|
||||||
|
|
||||||
user_settings.twenty_four_hour_time = true;
|
|
||||||
assert.equal(people.get_user_time(me.user_id), "0:09");
|
|
||||||
|
|
||||||
user_settings.twenty_four_hour_time = false;
|
user_settings.twenty_four_hour_time = false;
|
||||||
assert.equal(people.get_user_time(me.user_id), "12:09 AM");
|
assert.equal(people.get_user_time(me.user_id), "12:09 AM");
|
||||||
|
|
||||||
assert.deepEqual(people.get_user_time_preferences(unknown_user.user_id), undefined);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
test_people("utcToZonedTime", ({override}) => {
|
test_people("utcToZonedTime", ({override}) => {
|
||||||
|
@ -612,10 +598,10 @@ test_people("utcToZonedTime", ({override}) => {
|
||||||
user_settings.twenty_four_hour_time = true;
|
user_settings.twenty_four_hour_time = true;
|
||||||
|
|
||||||
assert.deepEqual(people.get_user_time(unknown_user.user_id), undefined);
|
assert.deepEqual(people.get_user_time(unknown_user.user_id), undefined);
|
||||||
assert.equal(people.get_user_time(me.user_id), "0:09");
|
assert.equal(people.get_user_time(me.user_id), "00:09");
|
||||||
|
|
||||||
override(people.get_by_user_id(me.user_id), "timezone", "Eriador/Rivendell");
|
override(people.get_by_user_id(me.user_id), "timezone", "Eriador/Rivendell");
|
||||||
blueslip.expect("error", "Got invalid date for timezone");
|
blueslip.expect("error", "Error formatting time in Eriador/Rivendell");
|
||||||
people.get_user_time(me.user_id);
|
people.get_user_time(me.user_id);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue