import {
$,
component$,
useOnWindow,
useSignal,
useStore,
} from "@builder.io/qwik";
import { io } from "socket.io-client";
const socket = io("ws://localhost:12133");
export const connectSocket = () => {
socket.connected ? 0 : socket.connect();
};
export const disconnectSocket = () => {
socket.disconnected ? 0 : socket.disconnect();
};
export const getSocket = () => {
return socket;
};
export default component$((props) => {
const {
resource,
resourceArgs,
onError: OnError,
onPending: OnPending,
onSuccess: OnSuccess,
} = props;
const apiState = useSignal({
state: "pending",
error: null,
data: null,
});
useOnWindow(
"load",
$(() => {
const formattedArgs = {};
for (let arg of Object.keys(resource.args)) {
const argv = resource.args[arg];
if (typeof argv === "function") {
formattedArgs[arg] = argv(resourceArgs[arg]);
} else {
formattedArgs[arg] = argv;
}
}
socket.emit(resource.path, formattedArgs);
socket.on(`/response/${resource.path}`, (response) => {
if (response.status !== 200) apiState.value.state = "error";
const clientResponse = resource.run(response);
clientResponse
.then((clientResp) => {
apiState.value.data = clientResp;
})
.catch((error) => {
clientResponse.error = error;
});
apiState.value.state = "success";
});
})
);
return (
<>
{apiState.value.state === "pending" && OnPending ? (
) : apiState.value.state === "error" && OnError ? (
) : apiState.value === "success" && OnSuccess ? (
) : null}
>
);
});