import { Ionicons } from "@expo/vector-icons"; import { useRouter } from "expo-router"; import { useCallback, useEffect, useState } from "react"; import { ActivityIndicator, Image, Platform, Text, TouchableOpacity, View } from "react-native"; import { useSafeAreaInsets } from "react-native-safe-area-context"; import { CalComAPIService, type UserProfile } from "@/services/calcom"; import { getAvatarUrl } from "@/utils/getAvatarUrl"; import { CalComLogo } from "./CalComLogo"; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, } from "@/components/ui/dropdown-menu"; import { AppPressable } from "@/components/AppPressable"; import type { EventTypeFilters, EventTypeSortOption } from "@/hooks/useEventTypeFilter"; interface FilterOption { key: string; label: string; } interface EventTypeFilterConfig { sortBy: EventTypeSortOption; filters: EventTypeFilters; onSortChange: (sort: EventTypeSortOption) => void; onToggleFilter: (filterKey: keyof EventTypeFilters) => void; onResetFilters: () => void; activeFilterCount: number; } interface HeaderProps { /** Optional: Filter options for dropdown menu (e.g., booking status filter) */ filterOptions?: FilterOption[]; /** Optional: Currently active filter key */ activeFilter?: string; /** Optional: Callback when filter changes */ onFilterChange?: (filterKey: string) => void; /** Optional: Event type filter/sort config for Android */ eventTypeFilterConfig?: EventTypeFilterConfig; } export function Header({ filterOptions, activeFilter, onFilterChange, eventTypeFilterConfig, }: HeaderProps) { const router = useRouter(); const insets = useSafeAreaInsets(); const [userProfile, setUserProfile] = useState(null); const [loading, setLoading] = useState(true); const fetchUserProfile = useCallback(async () => { try { const profile = await CalComAPIService.getUserProfile(); setUserProfile(profile); setLoading(false); } catch (err) { console.error("Failed to fetch user profile"); if (__DEV__) { const message = err instanceof Error ? err.message : String(err); const stack = err instanceof Error ? err.stack : undefined; console.debug("[Header] fetchUserProfile failed", { message, stack }); } setLoading(false); } }, []); useEffect(() => { fetchUserProfile(); }, [fetchUserProfile]); const handleProfile = () => { // Navigate to profile sheet on all platforms (Android, Web, Extension) router.push("/profile-sheet"); }; const activeFilterLabel = filterOptions?.find((opt) => opt.key === activeFilter)?.label ?? "Filter"; return ( {/* Left: Cal.com Logo */} {/* Right: Filter Dropdown + Profile */} {/* Booking status filter dropdown (for bookings page) */} {filterOptions && filterOptions.length > 0 && onFilterChange && ( {activeFilterLabel} {filterOptions.map((option) => { const isSelected = activeFilter === option.key; // Map filter keys to appropriate icons const getFilterIcon = (key: string) => { switch (key) { case "upcoming": return "calendar-outline"; case "unconfirmed": return "help-circle-outline"; case "recurring": return "repeat-outline"; case "past": return "checkmark-circle-outline"; case "cancelled": return "close-circle-outline"; default: return "calendar-outline"; } }; return ( onFilterChange(option.key)}> {option.label} ); })} )} {/* Event type filter/sort menu (for event types page - Android and Web/Extension) */} {eventTypeFilterConfig && (Platform.OS === "android" || Platform.OS === "web") && ( {/* Badge for active filters */} {eventTypeFilterConfig.activeFilterCount > 0 && ( {eventTypeFilterConfig.activeFilterCount} )} {/* Sort by Submenu */} Sort by eventTypeFilterConfig.onSortChange("alphabetical")} > Alphabetical eventTypeFilterConfig.onSortChange("newest")}> Newest First eventTypeFilterConfig.onSortChange("duration")}> By Duration {/* Filter Label */} Filters {/* Filter Toggles (multi-select) */} eventTypeFilterConfig.onToggleFilter("hiddenOnly")}> Hidden Only eventTypeFilterConfig.onToggleFilter("paidOnly")}> Paid Events eventTypeFilterConfig.onToggleFilter("seatedOnly")}> Seated Events eventTypeFilterConfig.onToggleFilter("requiresConfirmationOnly")} > Requires Confirmation eventTypeFilterConfig.onToggleFilter("recurringOnly")} > Recurring {/* Clear All - only show when filters are active */} {eventTypeFilterConfig.activeFilterCount > 0 && ( <> Clear All Filters )} )} {/* Profile Picture */} {loading ? ( ) : userProfile?.avatarUrl ? ( ) : ( )} ); }