zulip/web/src/deprecated_feature_notice.ts

74 lines
2.3 KiB
TypeScript

import {z} from "zod";
import * as blueslip from "./blueslip.ts";
import * as dialog_widget from "./dialog_widget.ts";
import {$t_html} from "./i18n.ts";
import {localstorage} from "./localstorage.ts";
export function get_hotkey_deprecation_notice(
originalHotkey: string,
replacementHotkey: string,
): string {
return $t_html(
{
defaultMessage:
'We\'ve replaced the "{originalHotkey}" hotkey with "{replacementHotkey}" to make this common shortcut easier to trigger.',
},
{originalHotkey, replacementHotkey},
);
}
let shown_deprecation_notices: string[] = [];
export function maybe_show_deprecation_notice(key: string): void {
let message;
switch (key) {
case "Shift + C":
message = get_hotkey_deprecation_notice("Shift + C", "X");
break;
case "Shift + S":
message = get_hotkey_deprecation_notice("Shift + S", "S");
break;
default:
blueslip.error("Unexpected deprecation notice for hotkey:", {key});
return;
}
// Here we handle the tracking for showing deprecation notices,
// whether or not local storage is available.
if (localstorage.supported()) {
const notices_from_storage = localStorage.getItem("shown_deprecation_notices");
if (notices_from_storage !== null) {
const parsed_notices_from_storage = z
.array(z.string())
.parse(JSON.parse(notices_from_storage));
shown_deprecation_notices = parsed_notices_from_storage;
} else {
shown_deprecation_notices = [];
}
}
if (!shown_deprecation_notices.includes(key)) {
dialog_widget.launch({
html_heading: $t_html({defaultMessage: "Deprecation notice"}),
html_body: message,
html_submit_button: $t_html({defaultMessage: "Got it"}),
on_click() {
return;
},
close_on_submit: true,
focus_submit_on_open: true,
single_footer_button: true,
});
shown_deprecation_notices.push(key);
if (localstorage.supported()) {
localStorage.setItem(
"shown_deprecation_notices",
JSON.stringify(shown_deprecation_notices),
);
}
}
}