feat: add demo data for emails, files, filters, identities, mailboxes, vacation responses, and JMAP client interface
- 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.
This commit is contained in:
@@ -0,0 +1,274 @@
|
||||
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,
|
||||
},
|
||||
];
|
||||
}
|
||||
Reference in New Issue
Block a user