Merge branch 'feat/inda-383-daily-stat' into 'main'
[ProtonMail-WebClient.git] / packages / shared / lib / interfaces / calendar / Event.ts
blob6b242e5fba5a0eaa7138844487f4e68e618d3bf4
1 import type { CalendarNotificationSettings } from '@proton/shared/lib/interfaces/calendar/Calendar';
3 import type {
4     ATTENDEE_STATUS_API,
5     CALENDAR_CARD_TYPE,
6     DAILY_TYPE,
7     END_TYPE,
8     EVENT_VERIFICATION_STATUS,
9     FREQUENCY,
10     ICAL_ATTENDEE_ROLE,
11     ICAL_ATTENDEE_RSVP,
12     ICAL_ATTENDEE_STATUS,
13     ICAL_EVENT_STATUS,
14     MONTHLY_TYPE,
15     WEEKLY_TYPE,
16     YEARLY_TYPE,
17 } from '../../calendar/constants';
18 import { SHARED_SIGNED_FIELDS } from '../../calendar/constants';
19 import type { API_CODES } from '../../constants';
20 import { pick } from '../../helpers/object';
21 import type { Address } from '../Address';
22 import type { Nullable } from '../utils';
23 import type { NotificationModel } from './Notification';
24 import type { VcalRrulePropertyValue, VcalVeventComponent } from './VcalModel';
26 export interface CalendarEventData {
27     Type: CALENDAR_CARD_TYPE;
28     Data: string;
29     Signature: string | null;
30     Author: string;
33 export interface CalendarPersonalEventData extends CalendarEventData {
34     MemberID: string;
37 export interface Attendee {
38     ID: string;
39     Token: string;
40     Status: ATTENDEE_STATUS_API;
41     UpdateTime: Nullable<number>;
44 export interface CalendarEventBlobData {
45     CalendarKeyPacket: Nullable<string>;
46     CalendarEvents: CalendarEventData[];
47     SharedKeyPacket: Nullable<string>;
48     AddressKeyPacket: Nullable<string>;
49     AddressID: Nullable<string>;
50     SharedEvents: CalendarEventData[];
51     Notifications?: Nullable<CalendarNotificationSettings[]>;
52     AttendeesEvents: CalendarEventData[];
53     Attendees: Attendee[];
56 export type CalendarEventBlobDataWithNotifications = Required<CalendarEventBlobData>;
58 export interface CalendarEventSharedData {
59     ID: string;
60     SharedEventID: string;
61     CalendarID: string;
62     CreateTime: number;
63     ModifyTime: number;
64     Permissions: number;
65     IsOrganizer: 1 | 0;
66     IsProtonProtonInvite: 1 | 0;
67     IsPersonalSingleEdit: boolean;
68     Author: string;
69     Color: Nullable<string> | undefined;
72 export interface CalendarEventMetadata {
73     StartTime: number;
74     StartTimezone: string;
75     EndTime: number;
76     EndTimezone: string;
77     FullDay: number;
78     RRule: Nullable<string>;
79     UID: string;
80     RecurrenceID: Nullable<number>;
81     Exdates: number[];
84 export interface CalendarEvent extends CalendarEventSharedData, CalendarEventBlobData, CalendarEventMetadata {}
86 export interface CalendarEventWithoutBlob extends CalendarEventSharedData, CalendarEventMetadata {}
88 export interface SyncMultipleApiSuccessResponses {
89     Index: number;
90     Response: {
91         Code: API_CODES.SINGLE_SUCCESS;
92         Event: CalendarEvent;
93     };
96 export interface FrequencyModel {
97     type: FREQUENCY;
98     frequency: FREQUENCY;
99     interval?: number;
100     daily: {
101         type: DAILY_TYPE;
102     };
103     weekly: {
104         type: WEEKLY_TYPE;
105         days: number[];
106     };
107     monthly: {
108         type: MONTHLY_TYPE;
109     };
110     yearly: {
111         type: YEARLY_TYPE;
112     };
113     ends: {
114         type: END_TYPE;
115         count?: number;
116         until?: Date;
117     };
118     vcalRruleValue?: VcalRrulePropertyValue;
121 export interface DateTimeModel {
122     date: Date;
123     time: Date;
124     tzid: string;
127 export interface OrganizerModel {
128     email: string;
129     cn: string;
132 export interface AttendeeModel {
133     email: string;
134     cn: string;
135     rsvp: ICAL_ATTENDEE_RSVP;
136     role: ICAL_ATTENDEE_ROLE;
137     partstat: ICAL_ATTENDEE_STATUS;
138     token?: string;
141 export interface CalendarViewModel {
142     id: string;
143     color: string;
144     permissions: number;
145     isSubscribed: boolean;
146     isOwned: boolean;
147     isWritable: boolean;
148     isUnknown: boolean;
151 export interface CalendarsModel {
152     text: string;
153     value: string;
154     color: string;
155     permissions: number;
156     isSubscribed: boolean;
157     isOwned: boolean;
158     isWritable: boolean;
159     isUnknown: boolean;
162 export interface EventModelView {
163     uid?: string;
164     frequencyModel: FrequencyModel;
165     title: string;
166     location: string;
167     description: string;
168     color?: string;
169     sequence?: number;
170     start: DateTimeModel;
171     end: DateTimeModel;
172     attendees: AttendeeModel[];
173     organizer?: OrganizerModel;
174     isOrganizer: boolean; // this property only takes into account the event ICS content. It does not care if the event is in a shared or subscribed calendar
175     isAttendee: boolean; // this property only takes into account the event ICS content. It does not care if the event is in a shared or subscribed calendar
176     isProtonProtonInvite: boolean;
177     hasDefaultNotifications: boolean;
178     selfAttendeeIndex?: number;
179     selfAddress?: Address;
180     status: ICAL_EVENT_STATUS;
181     verificationStatus: EVENT_VERIFICATION_STATUS;
182     conferenceId?: string;
183     conferenceUrl?: string;
184     conferencePassword?: string;
185     conferenceHost?: string;
186     isConferenceTmpDeleted?: boolean;
187     rest?: any;
190 export interface EventModel extends EventModelView {
191     // these types will be used in the future, for now only event is used
192     type: 'event' | 'alarm' | 'task';
193     calendar: CalendarViewModel;
194     calendars: CalendarsModel[];
195     member: {
196         memberID: string;
197         addressID: string;
198     };
199     isAllDay: boolean;
200     defaultPartDayNotification: NotificationModel;
201     defaultFullDayNotification: NotificationModel;
202     fullDayNotifications: NotificationModel[];
203     partDayNotifications: NotificationModel[];
204     initialDate: Date;
205     initialTzid: string;
206     defaultEventDuration: number;
207     hasTouchedRrule: boolean;
208     hasPartDayDefaultNotifications: boolean;
209     hasFullDayDefaultNotifications: boolean;
212 export interface EventModelErrors {
213     title?: string;
214     end?: string;
215     interval?: string;
216     until?: string;
217     count?: string;
218     notifications?: {
219         fields: number[];
220         text: string;
221     };
222     participantError?: boolean;
225 export interface EventModelReadView extends EventModelView {
226     notifications?: NotificationModel[];
227     isAllDay: boolean;
230 const sharedPick = (x: VcalVeventComponent) => pick(x, [...SHARED_SIGNED_FIELDS, 'component']);
231 export type SharedVcalVeventComponent = ReturnType<typeof sharedPick>;