Merge branch 'feat/inda-383-daily-stat' into 'main'
[ProtonMail-WebClient.git] / packages / shared / lib / desktop / heartbeat.ts
blob90048520063f716c929b32d2959b8da5d91de34d
1 import { useEffect } from 'react';
3 import { differenceInDays, getUnixTime } from 'date-fns';
5 import { useApi } from '@proton/components';
7 import type { IPCInboxHostUpdateListenerRemover } from './desktopTypes';
8 import { addIPCHostUpdateListener, emptyListener, hasInboxDesktopFeature } from './ipcHelpers';
9 import {
10     checkDailyStats,
11     checkDefaultMailto,
12     getDailyStats,
13     getDefaultMailto,
14     sendDailyTelemetry,
15     sendMailtoTelemetry,
16 } from './telemetry';
18 const HOUR_INTERVAL = 3600000;
20 const getUnixTimeNow = () => {
21     return getUnixTime(new Date());
24 const isAtLeastDayAgo = (lastUnixTime: number) => {
25     const nowMs = getUnixTimeNow() * 1000;
26     const lastMs = lastUnixTime * 1000;
27     return differenceInDays(nowMs, lastMs) > 0;
30 const checkMailtoTelemetryIsNeeded = () => {
31     if (!hasInboxDesktopFeature('MailtoTelemetry')) {
32         return;
33     }
35     const data = getDefaultMailto();
36     if (!isAtLeastDayAgo(data.lastReport.timestamp)) {
37         return;
38     }
40     void checkDefaultMailto();
43 const checkDailyStatIsNeeded = () => {
44     if (!hasInboxDesktopFeature('StatsTelemetry')) {
45         return;
46     }
48     const data = getDailyStats();
49     if (!isAtLeastDayAgo(data.lastReport)) {
50         return;
51     }
53     void checkDailyStats();
56 // useInboxDesktopHeartbeat is for sending desktop app statistics once per day.
57 export const useInboxDesktopHeartbeat = () => {
58     const api = useApi();
60     useEffect(() => {
61         // This won't be needed eventually. During transition we don't want to
62         // use default mailto telemetry, so we disable the flag in electron.
63         const defaultMailtoChecked: IPCInboxHostUpdateListenerRemover = hasInboxDesktopFeature('MailtoTelemetry')
64             ? addIPCHostUpdateListener('defaultMailtoChecked', (payload) =>
65                   sendMailtoTelemetry(api, payload, getUnixTimeNow())
66               )
67             : emptyListener;
69         const statsTelemetryChecked: IPCInboxHostUpdateListenerRemover = hasInboxDesktopFeature('StatsTelemetry')
70             ? addIPCHostUpdateListener('dailyStatsChecked', (payload) =>
71                   sendDailyTelemetry(api, payload, getUnixTimeNow())
72               )
73             : emptyListener;
75         checkDailyStatIsNeeded();
76         checkMailtoTelemetryIsNeeded();
77         const intervalFunction = setInterval(() => {
78             checkDailyStatIsNeeded();
79             checkMailtoTelemetryIsNeeded();
80         }, HOUR_INTERVAL);
82         return () => {
83             statsTelemetryChecked.removeListener();
84             defaultMailtoChecked.removeListener();
85             clearInterval(intervalFunction);
86         };
87     }, [api]);
90 export const getUnixTimeNowTestOnly = getUnixTimeNow;
91 export const isAtLeastDayAgoTestOnly = isAtLeastDayAgo;