summaryrefslogtreecommitdiff
path: root/extension/react-app/src/hooks
diff options
context:
space:
mode:
authorNate Sesti <sestinj@gmail.com>2023-05-23 23:45:12 -0400
committerNate Sesti <sestinj@gmail.com>2023-05-23 23:45:12 -0400
commit27ecedb02ef79ce53bf533e016b00462c44541be (patch)
tree402305113b6f04c3e3b3563b68d32de5ff1c69c8 /extension/react-app/src/hooks
downloadsncontinue-27ecedb02ef79ce53bf533e016b00462c44541be.tar.gz
sncontinue-27ecedb02ef79ce53bf533e016b00462c44541be.tar.bz2
sncontinue-27ecedb02ef79ce53bf533e016b00462c44541be.zip
copying from old repo
Diffstat (limited to 'extension/react-app/src/hooks')
-rw-r--r--extension/react-app/src/hooks/useArrayState.ts29
-rw-r--r--extension/react-app/src/hooks/useWebsocket.ts67
2 files changed, 96 insertions, 0 deletions
diff --git a/extension/react-app/src/hooks/useArrayState.ts b/extension/react-app/src/hooks/useArrayState.ts
new file mode 100644
index 00000000..d379e720
--- /dev/null
+++ b/extension/react-app/src/hooks/useArrayState.ts
@@ -0,0 +1,29 @@
+import { useState } from "react";
+
+function useArrayState<T>(initialValue: T[]) {
+ const [value, setValue] = useState(initialValue);
+
+ function add(item: any) {
+ setValue((prev) => [...prev, item]);
+ }
+
+ function remove(index: number) {
+ setValue((prev) => prev.filter((_, i) => i !== index));
+ }
+
+ function edit(editFn: (prev: T[]) => T[]) {
+ setValue((prev) => editFn(prev));
+ }
+
+ function replace(atIndex: number, withItem: T) {
+ setValue((prev) => {
+ let updated = [...prev];
+ updated[atIndex] = withItem;
+ return updated;
+ });
+ }
+
+ return { value, add, remove, edit, replace };
+}
+
+export default useArrayState;
diff --git a/extension/react-app/src/hooks/useWebsocket.ts b/extension/react-app/src/hooks/useWebsocket.ts
new file mode 100644
index 00000000..147172bd
--- /dev/null
+++ b/extension/react-app/src/hooks/useWebsocket.ts
@@ -0,0 +1,67 @@
+import React, { useEffect, useState } from "react";
+import { RootStore } from "../redux/store";
+import { useSelector } from "react-redux";
+
+function useContinueWebsocket(
+ serverUrl: string,
+ onMessage: (message: { data: any }) => void
+) {
+ const sessionId = useSelector((state: RootStore) => state.config.sessionId);
+ const [websocket, setWebsocket] = useState<WebSocket | undefined>(undefined);
+
+ async function connect() {
+ while (!sessionId) {
+ await new Promise((resolve) => setTimeout(resolve, 300));
+ }
+
+ console.log("Creating websocket", sessionId);
+
+ const wsUrl =
+ serverUrl.replace("http", "ws") +
+ "/notebook/ws?session_id=" +
+ encodeURIComponent(sessionId);
+
+ const ws = new WebSocket(wsUrl);
+ setWebsocket(ws);
+
+ // Set up callbacks
+ ws.onopen = () => {
+ console.log("Websocket opened");
+ ws.send(JSON.stringify({ sessionId }));
+ };
+
+ ws.onmessage = (msg) => {
+ onMessage(msg);
+ console.log("Got message", msg);
+ };
+
+ ws.onclose = (msg) => {
+ console.log("Websocket closed");
+ setWebsocket(undefined);
+ };
+
+ return ws;
+ }
+
+ async function getConnection() {
+ if (!websocket) {
+ return await connect();
+ }
+ return websocket;
+ }
+
+ async function send(message: object) {
+ let ws = await getConnection();
+ ws.send(JSON.stringify(message));
+ }
+
+ useEffect(() => {
+ if (!sessionId) {
+ return;
+ }
+ connect();
+ }, [sessionId]);
+
+ return { send };
+}
+export default useContinueWebsocket;