Spaces:
Sleeping
Sleeping
| export interface PlaceFormData { | |
| name: string | |
| description: string | |
| address: string | |
| lat: string | |
| lng: string | |
| category_id: string | |
| place_time: string | |
| end_time: string | |
| notes: string | |
| transport_mode: string | |
| website: string | |
| // Populated from a maps-search pick (not part of the initial blank form). | |
| phone?: string | |
| google_place_id?: string | |
| osm_id?: string | |
| } | |
| export function isGoogleMapsUrl(input: string): boolean { | |
| try { | |
| const { hostname, pathname } = new URL(input.trim()) | |
| const h = hostname.toLowerCase() | |
| // maps.app.goo.gl, goo.gl/maps | |
| if (h === 'maps.app.goo.gl') return true | |
| if (h === 'goo.gl' && pathname.startsWith('/maps')) return true | |
| // maps.google.* (e.g. maps.google.com, maps.google.co.uk) | |
| // Must be maps.google.<tld> or maps.google.<sld>.<tld> — reject maps.google.evil.com | |
| if (/^maps\.google\.[a-z]{2,3}(\.[a-z]{2})?$/.test(h)) return true | |
| // google.*/maps (e.g. google.com/maps, www.google.co.uk/maps) | |
| const bare = h.startsWith('www.') ? h.slice(4) : h | |
| if (/^google\.[a-z]{2,3}(\.[a-z]{2})?$/.test(bare) && pathname.startsWith('/maps')) return true | |
| return false | |
| } catch { | |
| return false | |
| } | |
| } | |
| export const DEFAULT_FORM: PlaceFormData = { | |
| name: '', | |
| description: '', | |
| address: '', | |
| lat: '', | |
| lng: '', | |
| category_id: '', | |
| place_time: '', | |
| end_time: '', | |
| notes: '', | |
| transport_mode: 'walking', | |
| website: '', | |
| } | |