/** * Converts a File object to a base64 encoded string for Gemini API. * @param file - The file to convert. * @returns A promise that resolves to a Gemini-compatible `inlineData` object. */ export const fileToGenerativePart = async (file: File) => { const base64EncodedDataPromise = new Promise((resolve) => { const reader = new FileReader(); reader.onloadend = () => resolve((reader.result as string).split(',')[1]); reader.readAsDataURL(file); }); return { inlineData: { data: await base64EncodedDataPromise, mimeType: file.type, }, }; }; /** * Calculates the distance between two geographical points in meters using the Haversine formula. * @param coords1 - The first set of coordinates { lat, lng }. * @param coords2 - The second set of coordinates { lat, lng }. * @returns The distance in meters. */ export const getDistance = ( coords1: { lat: number; lng: number }, coords2: { lat: number; lng: number } ): number => { const R = 6371e3; // Earth's radius in metres const φ1 = (coords1.lat * Math.PI) / 180; const φ2 = (coords2.lat * Math.PI) / 180; const Δφ = ((coords2.lat - coords1.lat) * Math.PI) / 180; const Δλ = ((coords2.lng - coords1.lng) * Math.PI) / 180; const a = Math.sin(Δφ / 2) * Math.sin(Δφ / 2) + Math.cos(φ1) * Math.cos(φ2) * Math.sin(Δλ / 2) * Math.sin(Δλ / 2); const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); return R * c; }; /** * Converts a File object to a data URL string. * @param file The file to convert. * @returns A promise that resolves with the data URL. */ export const fileToDataUrl = (file: File): Promise => { return new Promise((resolve, reject) => { const reader = new FileReader(); reader.onload = () => resolve(reader.result as string); reader.onerror = reject; reader.readAsDataURL(file); }); }; /** * Parses a data URL into its base64 content and MIME type. * @param dataUrl The data URL string. * @returns An object with base64 and mimeType, or null if parsing fails. */ export const dataUrlToParts = (dataUrl: string): { base64: string; mimeType: string } | null => { const match = dataUrl.match(/^data:(.+);base64,(.+)$/); if (!match) return null; return { mimeType: match[1], base64: match[2], }; };