- Added 'onDelete' and 'onNotes' support to TaskItem. - Implemented hover actions (Delete and Notes icons) for tasks. - Added Notes Modal for editing task markdown content. - Simplified navigation animation to remove blank flash (single-phase slide-in). - Fixed syntax error in updateTask function. - Updated styles for modal and task actions.
125 lines
3.2 KiB
TypeScript
125 lines
3.2 KiB
TypeScript
// Apple Calendar OAuth wrapper
|
|
import { fetch } from 'undici'; // Using undici for HTTP requests
|
|
|
|
export interface AppleCalendarEvent {
|
|
id: string;
|
|
title: string;
|
|
description?: string;
|
|
startDate: string;
|
|
endDate: string;
|
|
location?: string;
|
|
attendees?: Array<{
|
|
email: string;
|
|
name?: string;
|
|
}>;
|
|
}
|
|
|
|
export interface AppleCalendar {
|
|
id: string;
|
|
title: string;
|
|
isPrimary?: boolean;
|
|
}
|
|
|
|
/**
|
|
* Initialize Apple Calendar OAuth client
|
|
*/
|
|
export const initializeOAuth = (clientId: string, clientSecret: string, redirectUri: string) => {
|
|
// This would typically configure the OAuth client for Apple
|
|
// For now, we'll just return the configuration data
|
|
return {
|
|
clientId,
|
|
clientSecret,
|
|
redirectUri,
|
|
authorizationUrl: 'https://appleid.apple.com/auth/authorize',
|
|
tokenUrl: 'https://appleid.apple.com/auth/token',
|
|
};
|
|
};
|
|
|
|
/**
|
|
* Get user calendar list using OAuth token
|
|
*/
|
|
export const getUserCalendars = async (
|
|
clientConfig: any,
|
|
accessToken: string
|
|
): Promise<AppleCalendar[]> => {
|
|
try {
|
|
// In a real implementation, this would make a request to Apple's calendar API
|
|
// using the access token
|
|
|
|
// Simulate real API call
|
|
const response = await fetch(
|
|
'https://api.apple.com/calendar/v1/calendars',
|
|
{
|
|
method: 'GET',
|
|
headers: {
|
|
'Authorization': `Bearer ${accessToken}`,
|
|
'Content-Type': 'application/json',
|
|
}
|
|
}
|
|
);
|
|
|
|
if (!response.ok) {
|
|
throw new Error(`HTTP error! status: ${response.status}`);
|
|
}
|
|
|
|
const data = await response.json() as { calendars?: any[] };
|
|
|
|
// Map to expected format
|
|
return data.calendars?.map((item: any) => ({
|
|
id: item.id,
|
|
title: item.title,
|
|
isPrimary: item.isPrimary
|
|
})) || [];
|
|
} catch (error) {
|
|
console.error('Error fetching user calendars:', error);
|
|
throw new Error('Failed to fetch user calendars');
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Get upcoming events for a specified time period
|
|
*/
|
|
export const getUpcomingEvents = async (
|
|
clientConfig: any,
|
|
accessToken: string,
|
|
calendarId: string,
|
|
timeMin: string,
|
|
timeMax: string
|
|
): Promise<AppleCalendarEvent[]> => {
|
|
try {
|
|
// In a real implementation, this would make a request to Apple's calendar API
|
|
// using the access token and specified parameters
|
|
|
|
// Simulate real API call
|
|
const response = await fetch(
|
|
`https://api.apple.com/calendar/v1/calendars/${calendarId}/events?start=${timeMin}&end=${timeMax}`,
|
|
{
|
|
method: 'GET',
|
|
headers: {
|
|
'Authorization': `Bearer ${accessToken}`,
|
|
'Content-Type': 'application/json',
|
|
}
|
|
}
|
|
);
|
|
|
|
if (!response.ok) {
|
|
throw new Error(`HTTP error! status: ${response.status}`);
|
|
}
|
|
|
|
const data = await response.json() as { events?: any[] };
|
|
|
|
// Map to expected format
|
|
return data.events?.map((item: any) => ({
|
|
id: item.id,
|
|
title: item.title,
|
|
description: item.description,
|
|
startDate: item.startDate,
|
|
endDate: item.endDate,
|
|
location: item.location,
|
|
attendees: item.attendees,
|
|
})) || [];
|
|
} catch (error) {
|
|
console.error('Error fetching upcoming events:', error);
|
|
throw new Error('Failed to fetch upcoming events');
|
|
}
|
|
}; |