1516// Mount routes
17app.route("/api/itinerary", itineraryRoutes);
18app.route("/", staticRoutes);
19
tourguideTourGuide.tsx2 matches
205<div className="flex gap-2 mt-2">
206<button
207onClick={() => window.open(`https://www.google.com/maps/search/?api=1&query=${encodeURIComponent(currentStop.location.address)}`, '_blank')}
208className="bg-blue-600 text-white px-3 py-1 rounded text-sm font-medium hover:bg-blue-700 transition-colors"
209>
310</div>
311<button
312onClick={() => window.open(`https://www.google.com/maps/search/?api=1&query=${encodeURIComponent(currentStop.location.address)}`, '_blank')}
313className="mt-3 bg-white bg-opacity-20 text-white px-4 py-2 rounded-lg hover:bg-opacity-30 transition-colors"
314>
tourguideItineraryView.tsx1 match
226
227<button
228onClick={() => window.open(`https://www.google.com/maps/search/?api=1&query=${encodeURIComponent(stop.location.address)}`, '_blank')}
229className="text-green-600 hover:text-green-800 text-sm font-medium"
230>
tourguideSearchForm.tsx1 match
5354try {
55const response = await fetch('/api/itinerary/generate', {
56method: 'POST',
57headers: { 'Content-Type': 'application/json' },
51try {
52setState(prev => ({ ...prev, isLoading: true }));
53const response = await fetch('/api/itinerary');
54const result = await response.json();
55
87try {
88// Check for existing progress
89const response = await fetch(`/api/itinerary/${itinerary.id}/progress`);
90const result = await response.json();
91
119
120try {
121await fetch(`/api/itinerary/${progress.itineraryId}/progress`, {
122method: 'POST',
123headers: { 'Content-Type': 'application/json' },
131const handleDeleteItinerary = async (id: string) => {
132try {
133const response = await fetch(`/api/itinerary/${id}`, {
134method: 'DELETE'
135});
47const url = new URL(request.url);
4849// Handle API requests
50if (url.pathname.startsWith('/api/')) {
51event.respondWith(
52fetch(request)
53.then(response => {
54// Cache successful API responses
55if (response.ok && request.method === 'GET') {
56const responseClone = response.clone();
67return cachedResponse;
68}
69// Return offline message for failed API calls
70return new Response(
71JSON.stringify({
tourguideitinerary.ts16 matches
9getTourProgress
10} from "../database/queries.ts";
11import type { Itinerary, ItineraryRequest, TourProgress, ApiResponse } from "../../shared/types.ts";
1213const app = new Hono();
23
24if (!request.destination) {
25return c.json<ApiResponse<null>>({
26success: false,
27error: 'Destination is required'
105await saveItinerary(itinerary);
106107return c.json<ApiResponse<Itinerary>>({
108success: true,
109data: itinerary
112} catch (error) {
113console.error('Error generating itinerary:', error);
114return c.json<ApiResponse<null>>({
115success: false,
116error: 'Failed to generate itinerary'
125
126if (!itinerary) {
127return c.json<ApiResponse<null>>({
128success: false,
129error: 'Itinerary not found'
131}
132133return c.json<ApiResponse<Itinerary>>({
134success: true,
135data: itinerary
137} catch (error) {
138console.error('Error fetching itinerary:', error);
139return c.json<ApiResponse<null>>({
140success: false,
141error: 'Failed to fetch itinerary'
147try {
148const itineraries = await getAllItineraries();
149return c.json<ApiResponse<Itinerary[]>>({
150success: true,
151data: itineraries
153} catch (error) {
154console.error('Error fetching itineraries:', error);
155return c.json<ApiResponse<null>>({
156success: false,
157error: 'Failed to fetch itineraries'
166
167if (!deleted) {
168return c.json<ApiResponse<null>>({
169success: false,
170error: 'Itinerary not found'
172}
173174return c.json<ApiResponse<null>>({
175success: true
176});
177} catch (error) {
178console.error('Error deleting itinerary:', error);
179return c.json<ApiResponse<null>>({
180success: false,
181error: 'Failed to delete itinerary'
191await saveTourProgress({ ...progress, itineraryId });
192
193return c.json<ApiResponse<null>>({
194success: true
195});
196} catch (error) {
197console.error('Error saving progress:', error);
198return c.json<ApiResponse<null>>({
199success: false,
200error: 'Failed to save progress'
208const progress = await getTourProgress(itineraryId);
209
210return c.json<ApiResponse<TourProgress | null>>({
211success: true,
212data: progress
214} catch (error) {
215console.error('Error fetching progress:', error);
216return c.json<ApiResponse<null>>({
217success: false,
218error: 'Failed to fetch progress'
37```
3839## API Endpoints
4041- `GET /` - Main application
42- `POST /api/itinerary/generate` - Generate new itinerary
43- `GET /api/itinerary/:id` - Get specific itinerary
44- `GET /api/itinerary` - List all itineraries
45- `DELETE /api/itinerary/:id` - Delete itinerary
4647## Technology Stack
49- **Backend**: Hono + SQLite + OpenAI
50- **Frontend**: React + TypeScript + TailwindCSS
51- **Offline**: Service Workers + Cache API
52- **Storage**: SQLite for persistence, localStorage for offline data
charmaineValSearchstyles.tsx4 matches
782}
783784.api-info {
785margin-top: 10px;
786}
787788.api-info summary {
789cursor: pointer;
790color: var(--primary-color);
792}
793794.api-docs {
795background-color: var(--code-bg);
796padding: 10px 15px;
801}
802803.api-docs code {
804display: inline-block;
805background-color: white;