98 lines
2.7 KiB
TypeScript
98 lines
2.7 KiB
TypeScript
import { useEffect } from 'react';
|
|
const API_BASE_BP = "http://localhost:8000/button_pressed"; // Change depending on Pims interup agent/ correct endpoint
|
|
const API_BASE = "http://localhost:8000";
|
|
|
|
|
|
/**
|
|
* HELPER: Unified sender function
|
|
* In a real app, you might move this to a /services or /hooks folder
|
|
*/
|
|
const sendAPICall = async (type: string, context: string, endpoint?: string) => {
|
|
try {
|
|
const response = await fetch(`${API_BASE_BP}${endpoint ?? ""}`, {
|
|
method: "POST",
|
|
headers: { "Content-Type": "application/json" },
|
|
body: JSON.stringify({ type, context }),
|
|
});
|
|
if (!response.ok) throw new Error("Backend response error");
|
|
console.log(`API Call send - Type: ${type}, Context: ${context} ${endpoint ? `, Endpoint: ${endpoint}` : ""}`);
|
|
} catch (err) {
|
|
console.error(`Failed to send api call:`, err);
|
|
}
|
|
};
|
|
|
|
|
|
/**
|
|
* Sends an API call to the CB for going to the next phase.
|
|
* In case we can't go to the next phase, the function will throw an error.
|
|
*/
|
|
export async function nextPhase(): Promise<void> {
|
|
const type = "next_phase"
|
|
const context = ""
|
|
sendAPICall(type, context)
|
|
}
|
|
|
|
|
|
/**
|
|
* Sends an API call to the CB for going to reset the currect phase
|
|
* In case we can't go to the next phase, the function will throw an error.
|
|
*/
|
|
export async function resetPhase(): Promise<void> {
|
|
const type = "reset_phase"
|
|
const context = ""
|
|
sendAPICall(type, context)
|
|
}
|
|
|
|
/**
|
|
* Sends an API call to the CB for going to reset the experiment
|
|
* In case we can't go to the next phase, the function will throw an error.
|
|
*/
|
|
export async function resetExperiment(): Promise<void> {
|
|
const type = "reset_experiment"
|
|
const context = ""
|
|
sendAPICall(type, context)
|
|
}
|
|
|
|
export async function pauseExperiment(): Promise<void> {
|
|
const type = "pause"
|
|
const context = "true"
|
|
sendAPICall(type, context)
|
|
}
|
|
|
|
export async function playExperiment(): Promise<void> {
|
|
const type = "pause"
|
|
const context = "false"
|
|
sendAPICall(type, context)
|
|
}
|
|
|
|
|
|
/**
|
|
* A hook that listens to the experiment stream and logs data to the console.
|
|
* It does not render anything.
|
|
*/
|
|
export function useExperimentLogger(onUpdate?: (data: any) => void) {
|
|
useEffect(() => {
|
|
const eventSource = new EventSource(`${API_BASE}/experiment_stream`);
|
|
|
|
eventSource.onmessage = (event) => {
|
|
try {
|
|
const parsedData = JSON.parse(event.data);
|
|
if (onUpdate) {
|
|
console.log(event.data);
|
|
onUpdate(parsedData);
|
|
}
|
|
} catch (err) {
|
|
console.warn("Stream parse error:", err);
|
|
}
|
|
};
|
|
|
|
eventSource.onerror = (err) => {
|
|
console.error("SSE Connection Error:", err);
|
|
eventSource.close();
|
|
};
|
|
|
|
return () => {
|
|
eventSource.close();
|
|
};
|
|
}, [onUpdate]);
|
|
} |