15
16/**
17 * Fetches the Livestorm API OpenAPI definition
18 */
19export async function fetchOpenApiSpec(): Promise<OpenApiSchema> {
20 try {
21 // Check if the OpenAPI spec is cached in Blob storage
28 e instanceof ValTownBlobNotFoundError || e instanceof ValTownBlobError
29 ) {
30 console.log(`Fetching OpenAPI spec from ${LIVESTORM_API_SPEC_URL}...`);
31 response = await fetch(LIVESTORM_API_SPEC_URL);
32 if (!response.ok) {
33 const errorText = await response.text();
34 console.error(
35 `Failed to fetch OpenAPI spec: ${response.status} ${response.statusText}`,
36 );
37 console.error(`Response body: ${errorText}`);
38 throw new Error(
39 `Failed to fetch OpenAPI spec: ${response.status} ${response.statusText}`,
40 );
41 }
71 return parsedSpec;
72 } catch (error) {
73 console.error("Error fetching OpenAPI spec:", error);
74 throw error;
75 }
223 try {
224 // Make the request to Livestorm API
225 const response = await fetch(url, requestOptions);
226
227 // Return the response
18});
19
20export default app.fetch;
84
85// This is the entry point for HTTP vals
86export default app.fetch;
36
37// This is the entry point for HTTP vals
38export default app.fetch;
16 };
17
18 const fetchMessages = async () => {
19 try {
20 setLoading(true);
21 const response = await fetch('/api/chat/messages');
22 const result: ApiResponse<ChatMessage[]> = await response.json();
23
26 setError(null);
27 } else {
28 setError(result.error || 'Failed to fetch messages');
29 }
30 } catch (err) {
31 setError('Network error while fetching messages');
32 } finally {
33 setLoading(false);
46
47 try {
48 const response = await fetch('/api/chat/messages', {
49 method: 'POST',
50 headers: {
112
113 useEffect(() => {
114 fetchMessages();
115 // Load saved username
116 const savedUsername = localStorage.getItem('chatUsername');
126 // Auto-refresh messages every 10 seconds
127 useEffect(() => {
128 const interval = setInterval(fetchMessages, 10000);
129 return () => clearInterval(interval);
130 }, []);
150 </div>
151 <button
152 onClick={fetchMessages}
153 className="text-gray-500 hover:text-gray-700 transition-colors"
154 title="Refresh messages"
25
26 try {
27 const response = await fetch('/api/jobs', {
28 method: 'POST',
29 headers: {
10 const [error, setError] = useState<string | null>(null);
11
12 const fetchJobs = async () => {
13 try {
14 setLoading(true);
15 const response = await fetch('/api/jobs');
16 const result: ApiResponse<Job[]> = await response.json();
17
20 setError(null);
21 } else {
22 setError(result.error || 'Failed to fetch jobs');
23 }
24 } catch (err) {
25 setError('Network error while fetching jobs');
26 } finally {
27 setLoading(false);
40
41 try {
42 const response = await fetch(`/api/jobs/${jobId}`, {
43 method: 'DELETE'
44 });
64
65 useEffect(() => {
66 fetchJobs();
67 }, []);
68
97 <p className="text-red-800">⚠️ {error}</p>
98 <button
99 onClick={fetchJobs}
100 className="text-red-600 hover:text-red-800 underline mt-2"
101 >
17 const response: ApiResponse<ChatMessage[]> = {
18 success: false,
19 error: "Failed to fetch messages"
20 };
21 return c.json(response, 500);
17 const response: ApiResponse<Job[]> = {
18 success: false,
19 error: "Failed to fetch jobs"
20 };
21 return c.json(response, 500);
15
16 useEffect(() => {
17 fetchOrders();
18 }, []);
19
20 const fetchOrders = async () => {
21 try {
22 const response = await fetch('/api/orders');
23 const result = await response.json();
24 if (result.success) {
26 }
27 } catch (error) {
28 console.error('Error fetching orders:', error);
29 } finally {
30 setLoading(false);