- Created demo emails with various states (inbox, sent, drafts, trash, etc.) in `emails.ts`. - Added demo file nodes representing directories and files in `files.ts`. - Implemented demo Sieve capabilities and scripts in `filters.ts`. - Defined demo identities for users in `identities.ts`. - Established demo mailboxes with permissions and counts in `mailboxes.ts`. - Created a demo vacation response in `vacation.ts`. - Introduced a comprehensive JMAP client interface in `client-interface.ts` to standardize interactions with the JMAP API.
275 lines
9.7 KiB
TypeScript
275 lines
9.7 KiB
TypeScript
import type { Calendar, CalendarEvent } from '@/lib/jmap/types';
|
|
import { demoDate, demoISODate } from '../demo-utils';
|
|
|
|
export function createDemoCalendars(): Calendar[] {
|
|
return [
|
|
{
|
|
id: 'demo-calendar-personal',
|
|
name: 'Personal',
|
|
description: null,
|
|
color: '#3b82f6',
|
|
sortOrder: 1,
|
|
isSubscribed: true,
|
|
isVisible: true,
|
|
isDefault: true,
|
|
includeInAvailability: 'all',
|
|
defaultAlertsWithTime: null,
|
|
defaultAlertsWithoutTime: null,
|
|
timeZone: null,
|
|
shareWith: null,
|
|
myRights: { mayReadFreeBusy: true, mayReadItems: true, mayWriteAll: true, mayWriteOwn: true, mayUpdatePrivate: true, mayRSVP: true, mayAdmin: true, mayDelete: false },
|
|
},
|
|
{
|
|
id: 'demo-calendar-work',
|
|
name: 'Work',
|
|
description: null,
|
|
color: '#22c55e',
|
|
sortOrder: 2,
|
|
isSubscribed: true,
|
|
isVisible: true,
|
|
isDefault: false,
|
|
includeInAvailability: 'all',
|
|
defaultAlertsWithTime: null,
|
|
defaultAlertsWithoutTime: null,
|
|
timeZone: null,
|
|
shareWith: null,
|
|
myRights: { mayReadFreeBusy: true, mayReadItems: true, mayWriteAll: true, mayWriteOwn: true, mayUpdatePrivate: true, mayRSVP: true, mayAdmin: true, mayDelete: true },
|
|
},
|
|
{
|
|
id: 'demo-calendar-birthdays',
|
|
name: 'Birthdays',
|
|
description: null,
|
|
color: '#eab308',
|
|
sortOrder: 3,
|
|
isSubscribed: true,
|
|
isVisible: true,
|
|
isDefault: false,
|
|
includeInAvailability: 'none',
|
|
defaultAlertsWithTime: null,
|
|
defaultAlertsWithoutTime: null,
|
|
timeZone: null,
|
|
shareWith: null,
|
|
myRights: { mayReadFreeBusy: true, mayReadItems: true, mayWriteAll: true, mayWriteOwn: true, mayUpdatePrivate: true, mayRSVP: true, mayAdmin: true, mayDelete: true },
|
|
},
|
|
];
|
|
}
|
|
|
|
export function createDemoCalendarEvents(): CalendarEvent[] {
|
|
const baseEvent = {
|
|
'@type': 'Event' as const,
|
|
descriptionContentType: 'text/plain',
|
|
isDraft: false,
|
|
isOrigin: true,
|
|
sequence: 0,
|
|
status: 'confirmed' as const,
|
|
freeBusyStatus: 'busy' as const,
|
|
privacy: 'public' as const,
|
|
color: null,
|
|
keywords: null,
|
|
categories: null,
|
|
locale: null,
|
|
replyTo: null,
|
|
organizerCalendarAddress: null,
|
|
participants: null,
|
|
mayInviteSelf: false,
|
|
mayInviteOthers: false,
|
|
hideAttendees: false,
|
|
recurrenceId: null,
|
|
recurrenceIdTimeZone: null,
|
|
recurrenceRules: null,
|
|
recurrenceOverrides: null,
|
|
excludedRecurrenceRules: null,
|
|
useDefaultAlerts: true,
|
|
alerts: null,
|
|
locations: null,
|
|
virtualLocations: null,
|
|
links: null,
|
|
relatedTo: null,
|
|
};
|
|
|
|
return [
|
|
// ── Personal calendar ──────────────────────────────────────
|
|
{
|
|
...baseEvent,
|
|
id: 'demo-event-1',
|
|
calendarIds: { 'demo-calendar-personal': true },
|
|
uid: 'demo-event-1@example.com',
|
|
title: 'Dentist Appointment',
|
|
description: 'Regular checkup at Dr. Smith\'s office',
|
|
created: demoDate(-7),
|
|
updated: demoDate(-7),
|
|
start: demoISODate(2, 10, 0),
|
|
utcStart: demoDate(2, 10),
|
|
utcEnd: demoDate(2, 11),
|
|
duration: 'PT1H',
|
|
timeZone: Intl.DateTimeFormat().resolvedOptions().timeZone,
|
|
showWithoutTime: false,
|
|
locations: { loc1: { '@type': 'Location', name: 'Dr. Smith Dental Clinic', description: '123 Medical Plaza', locationTypes: null, coordinates: null, timeZone: null, links: null, relativeTo: null } },
|
|
},
|
|
{
|
|
...baseEvent,
|
|
id: 'demo-event-2',
|
|
calendarIds: { 'demo-calendar-personal': true },
|
|
uid: 'demo-event-2@example.com',
|
|
title: 'Birthday Party',
|
|
description: 'Emma\'s birthday celebration',
|
|
created: demoDate(-10),
|
|
updated: demoDate(-10),
|
|
start: demoISODate(5),
|
|
utcStart: demoDate(5),
|
|
utcEnd: demoDate(6),
|
|
duration: 'P1D',
|
|
timeZone: null,
|
|
showWithoutTime: true,
|
|
freeBusyStatus: 'free' as const,
|
|
},
|
|
{
|
|
...baseEvent,
|
|
id: 'demo-event-3',
|
|
calendarIds: { 'demo-calendar-personal': true },
|
|
uid: 'demo-event-3@example.com',
|
|
title: 'Weekend Trip',
|
|
description: 'Road trip to the mountains',
|
|
created: demoDate(-5),
|
|
updated: demoDate(-5),
|
|
start: demoISODate(8),
|
|
utcStart: demoDate(8),
|
|
utcEnd: demoDate(10),
|
|
duration: 'P2D',
|
|
timeZone: null,
|
|
showWithoutTime: true,
|
|
freeBusyStatus: 'busy' as const,
|
|
},
|
|
|
|
// ── Work calendar ──────────────────────────────────────────
|
|
{
|
|
...baseEvent,
|
|
id: 'demo-event-4',
|
|
calendarIds: { 'demo-calendar-work': true },
|
|
uid: 'demo-event-4@example.com',
|
|
title: 'Weekly Standup',
|
|
description: 'Team sync-up meeting',
|
|
created: demoDate(-30),
|
|
updated: demoDate(-1),
|
|
start: demoISODate(1, 9, 30),
|
|
utcStart: demoDate(1, 9, 30),
|
|
utcEnd: demoDate(1, 10, 0),
|
|
duration: 'PT30M',
|
|
timeZone: Intl.DateTimeFormat().resolvedOptions().timeZone,
|
|
showWithoutTime: false,
|
|
recurrenceRules: [{
|
|
'@type': 'RecurrenceRule',
|
|
frequency: 'weekly',
|
|
interval: 1,
|
|
rscale: 'gregorian',
|
|
skip: 'omit',
|
|
firstDayOfWeek: 'mo',
|
|
byDay: [{ day: 'mo' }],
|
|
byMonthDay: null,
|
|
byMonth: null,
|
|
byYearDay: null,
|
|
byWeekNo: null,
|
|
byHour: null,
|
|
byMinute: null,
|
|
bySecond: null,
|
|
bySetPosition: null,
|
|
count: null,
|
|
until: null,
|
|
}],
|
|
virtualLocations: { vl1: { '@type': 'VirtualLocation', name: 'Zoom', uri: 'https://zoom.example/123456', description: 'Weekly standup room', features: null } },
|
|
},
|
|
{
|
|
...baseEvent,
|
|
id: 'demo-event-5',
|
|
calendarIds: { 'demo-calendar-work': true },
|
|
uid: 'demo-event-5@example.com',
|
|
title: 'Quarterly Review',
|
|
description: 'Q4 performance review and planning session',
|
|
created: demoDate(-14),
|
|
updated: demoDate(-3),
|
|
start: demoISODate(4, 14, 0),
|
|
utcStart: demoDate(4, 14),
|
|
utcEnd: demoDate(4, 16),
|
|
duration: 'PT2H',
|
|
timeZone: Intl.DateTimeFormat().resolvedOptions().timeZone,
|
|
showWithoutTime: false,
|
|
participants: {
|
|
p1: {
|
|
'@type': 'Participant', name: 'Demo User', email: 'demo@example.com', calendarAddress: null, description: null, sendTo: null,
|
|
kind: 'individual', roles: { attendee: true }, participationStatus: 'accepted', participationComment: null,
|
|
expectReply: false, scheduleAgent: 'server', scheduleForceSend: false, scheduleId: null, scheduleSequence: 0,
|
|
scheduleStatus: null, scheduleUpdated: null, invitedBy: null, delegatedTo: null, delegatedFrom: null, memberOf: null,
|
|
locationId: null, language: null, links: null,
|
|
},
|
|
p2: {
|
|
'@type': 'Participant', name: 'Alice Johnson', email: 'alice.johnson@example.com', calendarAddress: null, description: null, sendTo: null,
|
|
kind: 'individual', roles: { owner: true }, participationStatus: 'accepted', participationComment: null,
|
|
expectReply: false, scheduleAgent: 'server', scheduleForceSend: false, scheduleId: null, scheduleSequence: 0,
|
|
scheduleStatus: null, scheduleUpdated: null, invitedBy: null, delegatedTo: null, delegatedFrom: null, memberOf: null,
|
|
locationId: null, language: null, links: null,
|
|
},
|
|
p3: {
|
|
'@type': 'Participant', name: 'Bob Chen', email: 'bob.chen@example.com', calendarAddress: null, description: null, sendTo: null,
|
|
kind: 'individual', roles: { attendee: true }, participationStatus: 'tentative', participationComment: null,
|
|
expectReply: true, scheduleAgent: 'server', scheduleForceSend: false, scheduleId: null, scheduleSequence: 0,
|
|
scheduleStatus: null, scheduleUpdated: null, invitedBy: null, delegatedTo: null, delegatedFrom: null, memberOf: null,
|
|
locationId: null, language: null, links: null,
|
|
},
|
|
},
|
|
},
|
|
{
|
|
...baseEvent,
|
|
id: 'demo-event-6',
|
|
calendarIds: { 'demo-calendar-work': true },
|
|
uid: 'demo-event-6@example.com',
|
|
title: 'Lunch Meeting with Sarah',
|
|
description: 'Design review over lunch',
|
|
created: demoDate(-3),
|
|
updated: demoDate(-3),
|
|
start: demoISODate(3, 12, 0),
|
|
utcStart: demoDate(3, 12),
|
|
utcEnd: demoDate(3, 13),
|
|
duration: 'PT1H',
|
|
timeZone: Intl.DateTimeFormat().resolvedOptions().timeZone,
|
|
showWithoutTime: false,
|
|
locations: { loc1: { '@type': 'Location', name: 'The Garden Bistro', description: '123 Oak Street', locationTypes: null, coordinates: null, timeZone: null, links: null, relativeTo: null } },
|
|
},
|
|
|
|
// ── Birthdays calendar ─────────────────────────────────────
|
|
{
|
|
...baseEvent,
|
|
id: 'demo-event-7',
|
|
calendarIds: { 'demo-calendar-birthdays': true },
|
|
uid: 'demo-event-7@example.com',
|
|
title: 'Alice Johnson\'s Birthday',
|
|
description: '',
|
|
created: demoDate(-30),
|
|
updated: demoDate(-30),
|
|
start: demoISODate(12),
|
|
utcStart: demoDate(12),
|
|
utcEnd: demoDate(13),
|
|
duration: 'P1D',
|
|
timeZone: null,
|
|
showWithoutTime: true,
|
|
freeBusyStatus: 'free' as const,
|
|
},
|
|
{
|
|
...baseEvent,
|
|
id: 'demo-event-8',
|
|
calendarIds: { 'demo-calendar-birthdays': true },
|
|
uid: 'demo-event-8@example.com',
|
|
title: 'Carlos Rivera\'s Birthday',
|
|
description: '',
|
|
created: demoDate(-30),
|
|
updated: demoDate(-30),
|
|
start: demoISODate(-3),
|
|
utcStart: demoDate(-3),
|
|
utcEnd: demoDate(-2),
|
|
duration: 'P1D',
|
|
timeZone: null,
|
|
showWithoutTime: true,
|
|
freeBusyStatus: 'free' as const,
|
|
},
|
|
];
|
|
}
|