TelegramPWA/src/hooks/useSchedule.tsx
2024-04-19 13:37:34 +04:00

67 lines
2.2 KiB
TypeScript

import React, { useState } from '../lib/teact/teact';
import { SCHEDULED_WHEN_ONLINE } from '../config';
import { getDayStartAt } from '../util/date/dateFormat';
import { getServerTimeOffset } from '../util/serverTime';
import useLang from './useLang';
import useLastCallback from './useLastCallback';
import CalendarModal from '../components/common/CalendarModal.async';
type OnScheduledCallback = (scheduledAt: number) => void;
const useSchedule = (
canScheduleUntilOnline?: boolean,
onCancel?: () => void,
openAt?: number,
) => {
const lang = useLang();
const [onScheduled, setOnScheduled] = useState<OnScheduledCallback | undefined>();
const handleMessageSchedule = useLastCallback((date: Date, isWhenOnline = false) => {
// Scheduled time can not be less than 10 seconds in future
const scheduledAt = Math.round(Math.max(date.getTime(), Date.now() + 60 * 1000) / 1000)
+ (isWhenOnline ? 0 : getServerTimeOffset());
onScheduled?.(scheduledAt);
setOnScheduled(undefined);
});
const handleMessageScheduleUntilOnline = useLastCallback(() => {
handleMessageSchedule(new Date(SCHEDULED_WHEN_ONLINE * 1000), true);
});
const handleCloseCalendar = useLastCallback(() => {
setOnScheduled(undefined);
onCancel?.();
});
const requestCalendar = useLastCallback((whenScheduled: OnScheduledCallback) => {
setOnScheduled(() => whenScheduled);
});
const scheduledDefaultDate = openAt ? new Date(openAt * 1000) : new Date();
scheduledDefaultDate.setSeconds(0);
scheduledDefaultDate.setMilliseconds(0);
const scheduledMaxDate = new Date();
scheduledMaxDate.setFullYear(scheduledMaxDate.getFullYear() + 1);
const calendar = (
<CalendarModal
isOpen={Boolean(onScheduled)}
withTimePicker
selectedAt={scheduledDefaultDate.getTime()}
maxAt={getDayStartAt(scheduledMaxDate)}
isFutureMode
secondButtonLabel={canScheduleUntilOnline ? lang('Schedule.SendWhenOnline') : undefined}
onClose={handleCloseCalendar}
onSubmit={handleMessageSchedule}
onSecondButtonClick={canScheduleUntilOnline ? handleMessageScheduleUntilOnline : undefined}
/>
);
return [requestCalendar, calendar] as const;
};
export default useSchedule;