mirror of https://github.com/zulip/zulip.git
215 lines
6.8 KiB
JavaScript
215 lines
6.8 KiB
JavaScript
import * as channel from "./channel";
|
|
import {$t} from "./i18n";
|
|
import * as timerender from "./timerender";
|
|
|
|
export const MINIMUM_SCHEDULED_MESSAGE_DELAY_SECONDS = 5 * 60;
|
|
|
|
// scheduled_messages_data is a dictionary where key=scheduled_message_id and value=scheduled_messages
|
|
export const scheduled_messages_data = {};
|
|
|
|
let selected_send_later_timestamp;
|
|
|
|
function compute_send_times(now = new Date()) {
|
|
const send_times = {};
|
|
|
|
const today = new Date(now);
|
|
const tomorrow = new Date(new Date(now).setDate(now.getDate() + 1));
|
|
// Find the next Monday by subtracting the current day (0-6) from 8
|
|
const monday = new Date(new Date(now).setDate(now.getDate() + 8 - now.getDay()));
|
|
|
|
// Since setHours returns a timestamp, it's safe to mutate the
|
|
// original date objects here.
|
|
//
|
|
// today at 9am
|
|
send_times.today_nine_am = today.setHours(9, 0, 0, 0);
|
|
// today at 4pm
|
|
send_times.today_four_pm = today.setHours(16, 0, 0, 0);
|
|
// tomorrow at 9am
|
|
send_times.tomorrow_nine_am = tomorrow.setHours(9, 0, 0, 0);
|
|
// tomorrow at 4pm
|
|
send_times.tomorrow_four_pm = tomorrow.setHours(16, 0, 0, 0);
|
|
// next Monday at 9am
|
|
send_times.monday_nine_am = monday.setHours(9, 0, 0, 0);
|
|
return send_times;
|
|
}
|
|
|
|
export function is_send_later_timestamp_missing_or_expired(
|
|
timestamp_in_seconds,
|
|
current_time_in_seconds,
|
|
) {
|
|
if (!timestamp_in_seconds) {
|
|
return true;
|
|
}
|
|
// Determine if the selected timestamp is less than the minimum
|
|
// scheduled message delay
|
|
if (timestamp_in_seconds - current_time_in_seconds < MINIMUM_SCHEDULED_MESSAGE_DELAY_SECONDS) {
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
export function add_scheduled_messages(scheduled_messages) {
|
|
for (const scheduled_message of scheduled_messages) {
|
|
scheduled_messages_data[scheduled_message.scheduled_message_id] = scheduled_message;
|
|
}
|
|
}
|
|
|
|
export function remove_scheduled_message(scheduled_message_id) {
|
|
if (scheduled_messages_data[scheduled_message_id] !== undefined) {
|
|
delete scheduled_messages_data[scheduled_message_id];
|
|
}
|
|
}
|
|
|
|
export function update_scheduled_message(scheduled_message) {
|
|
if (scheduled_messages_data[scheduled_message.scheduled_message_id] === undefined) {
|
|
return;
|
|
}
|
|
|
|
scheduled_messages_data[scheduled_message.scheduled_message_id] = scheduled_message;
|
|
}
|
|
|
|
export function delete_scheduled_message(scheduled_msg_id, success = () => {}) {
|
|
channel.del({
|
|
url: "/json/scheduled_messages/" + scheduled_msg_id,
|
|
success,
|
|
});
|
|
}
|
|
|
|
export function get_count() {
|
|
return Object.keys(scheduled_messages_data).length;
|
|
}
|
|
|
|
export function get_filtered_send_opts(date) {
|
|
const send_times = compute_send_times(date);
|
|
|
|
const day = date.getDay(); // Starts with 0 for Sunday.
|
|
|
|
const send_later_today = {
|
|
today_nine_am: {
|
|
text: $t(
|
|
{defaultMessage: "Today at {time}"},
|
|
{
|
|
time: timerender.get_localized_date_or_time_for_format(
|
|
send_times.today_nine_am,
|
|
"time",
|
|
),
|
|
},
|
|
),
|
|
stamp: send_times.today_nine_am,
|
|
},
|
|
today_four_pm: {
|
|
text: $t(
|
|
{defaultMessage: "Today at {time}"},
|
|
{
|
|
time: timerender.get_localized_date_or_time_for_format(
|
|
send_times.today_four_pm,
|
|
"time",
|
|
),
|
|
},
|
|
),
|
|
stamp: send_times.today_four_pm,
|
|
},
|
|
};
|
|
|
|
const send_later_tomorrow = {
|
|
tomorrow_nine_am: {
|
|
text: $t(
|
|
{defaultMessage: "Tomorrow at {time}"},
|
|
{
|
|
time: timerender.get_localized_date_or_time_for_format(
|
|
send_times.tomorrow_nine_am,
|
|
"time",
|
|
),
|
|
},
|
|
),
|
|
stamp: send_times.tomorrow_nine_am,
|
|
},
|
|
tomorrow_four_pm: {
|
|
text: $t(
|
|
{defaultMessage: "Tomorrow at {time}"},
|
|
{
|
|
time: timerender.get_localized_date_or_time_for_format(
|
|
send_times.tomorrow_four_pm,
|
|
"time",
|
|
),
|
|
},
|
|
),
|
|
stamp: send_times.tomorrow_four_pm,
|
|
},
|
|
};
|
|
|
|
const send_later_monday = {
|
|
monday_nine_am: {
|
|
text: $t(
|
|
{defaultMessage: "Monday at {time}"},
|
|
{
|
|
time: timerender.get_localized_date_or_time_for_format(
|
|
send_times.monday_nine_am,
|
|
"time",
|
|
),
|
|
},
|
|
),
|
|
stamp: send_times.monday_nine_am,
|
|
},
|
|
};
|
|
|
|
const send_later_custom = {
|
|
text: $t({defaultMessage: "Custom"}),
|
|
};
|
|
|
|
let possible_send_later_today = {};
|
|
let possible_send_later_monday = {};
|
|
|
|
const minutes_into_day = date.getHours() * 60 + date.getMinutes();
|
|
// Show Today send options based on time of day
|
|
if (minutes_into_day < 9 * 60 - MINIMUM_SCHEDULED_MESSAGE_DELAY_SECONDS / 60) {
|
|
// Allow Today at 9:00am only up to minimum scheduled message delay
|
|
possible_send_later_today = send_later_today;
|
|
} else if (minutes_into_day < (12 + 4) * 60 - MINIMUM_SCHEDULED_MESSAGE_DELAY_SECONDS / 60) {
|
|
// Allow Today at 4:00pm only up to minimum scheduled message delay
|
|
possible_send_later_today.today_four_pm = send_later_today.today_four_pm;
|
|
} else {
|
|
possible_send_later_today = false;
|
|
}
|
|
// Show send_later_monday options only on Fridays and Saturdays.
|
|
if (day >= 5) {
|
|
possible_send_later_monday = send_later_monday;
|
|
} else {
|
|
possible_send_later_monday = false;
|
|
}
|
|
|
|
return {
|
|
possible_send_later_today,
|
|
send_later_tomorrow,
|
|
possible_send_later_monday,
|
|
send_later_custom,
|
|
};
|
|
}
|
|
|
|
export function get_selected_send_later_timestamp() {
|
|
if (!selected_send_later_timestamp) {
|
|
return undefined;
|
|
}
|
|
return selected_send_later_timestamp;
|
|
}
|
|
|
|
export function get_formatted_selected_send_later_time() {
|
|
const current_time = Date.now() / 1000; // seconds, like selected_send_later_timestamp
|
|
if (is_send_later_timestamp_missing_or_expired(selected_send_later_timestamp, current_time)) {
|
|
return undefined;
|
|
}
|
|
return timerender.get_full_datetime(new Date(selected_send_later_timestamp * 1000), "time");
|
|
}
|
|
|
|
export function set_selected_schedule_timestamp(timestamp) {
|
|
selected_send_later_timestamp = timestamp;
|
|
}
|
|
|
|
export function reset_selected_schedule_timestamp() {
|
|
selected_send_later_timestamp = undefined;
|
|
}
|
|
|
|
export function initialize(scheduled_messages_params) {
|
|
add_scheduled_messages(scheduled_messages_params.scheduled_messages);
|
|
}
|