diff --git a/Cargo.lock b/Cargo.lock index e21ba4b7c1..30d251b3d6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -14703,6 +14703,7 @@ dependencies = [ "itertools 0.14.0", "objc2 0.6.3", "objc2-contacts", + "objc2-core-graphics", "objc2-event-kit", "objc2-foundation 0.3.2", "serde", @@ -15282,6 +15283,7 @@ dependencies = [ "tauri-specta", "tcc", "thiserror 2.0.17", + "tokio", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 2f39b6e8bb..181234072c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -240,6 +240,7 @@ objc2-application-services = "0.3" objc2-av-foundation = "0.3" objc2-contacts = "0.3" objc2-core-foundation = "0.3" +objc2-core-graphics = "0.3" objc2-event-kit = "0.3" objc2-foundation = "0.3" objc2-user-notifications = "0.3" diff --git a/apps/desktop/src/components/devtool/seed/shared/calendar.ts b/apps/desktop/src/components/devtool/seed/shared/calendar.ts index 842cd565df..034d05199d 100644 --- a/apps/desktop/src/components/devtool/seed/shared/calendar.ts +++ b/apps/desktop/src/components/devtool/seed/shared/calendar.ts @@ -18,11 +18,23 @@ export const createCalendar = () => { "Shared Calendar", ]); + const source = faker.helpers.arrayElement([ + "iCloud", + "Exchange", + "Google", + "Local", + "Subscribed", + ]); + return { id: id(), data: { user_id: DEFAULT_USER_ID, + tracking_id: id(), name: template, + source, + provider: "apple", + enabled: 1, created_at: faker.date.past({ years: 1 }).toISOString(), } satisfies Calendar, }; diff --git a/apps/desktop/src/components/main/sidebar/timeline/index.tsx b/apps/desktop/src/components/main/sidebar/timeline/index.tsx index e29307f885..5d7dc9ce9e 100644 --- a/apps/desktop/src/components/main/sidebar/timeline/index.tsx +++ b/apps/desktop/src/components/main/sidebar/timeline/index.tsx @@ -1,6 +1,7 @@ import { startOfDay } from "date-fns"; -import { ChevronDownIcon, ChevronUpIcon } from "lucide-react"; +import { ChevronDownIcon, ChevronUpIcon, RefreshCwIcon } from "lucide-react"; import { type ReactNode, useMemo } from "react"; +import { useScheduleTaskRunCallback } from "tinytick/ui-react"; import { Button } from "@hypr/ui/components/ui/button"; import { cn } from "@hypr/utils"; @@ -18,6 +19,8 @@ import { useAnchor, useAutoScrollToAnchor } from "./anchor"; import { TimelineItemComponent } from "./item"; import { CurrentTimeIndicator, useCurrentTimeMs } from "./realtime"; +const CALENDAR_FETCH_TASK_ID = "fetchAppleCalendarChunk"; + export function TimelineView() { const buckets = useTimelineData(); const hasToday = useMemo( @@ -27,6 +30,15 @@ export function TimelineView() { const currentTab = useTabs((state) => state.currentTab); const store = main.UI.useStore(main.STORE_ID); + const calendars = main.UI.useTable("calendars", main.STORE_ID); + + const hasEnabledCalendar = useMemo(() => { + return Object.values(calendars).some((cal) => cal.enabled === 1); + }, [calendars]); + + const triggerCalendarSync = useScheduleTaskRunCallback( + CALENDAR_FETCH_TASK_ID, + ); const selectedSessionId = useMemo(() => { return currentTab?.type === "sessions" ? currentTab.id : undefined; @@ -85,13 +97,10 @@ export function TimelineView() { }, [buckets, hasToday, todayTimestamp]); return ( -