From 9400a1b2eede87a2d953b0c754f9c2c96cfb34f8 Mon Sep 17 00:00:00 2001
From: Wojciech Kwolek <wojciech@kwolek.io>
Date: Sat, 8 Jun 2024 05:29:15 +0200
Subject: initial commit

---
 src/index.tsx | 62 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 62 insertions(+)
 create mode 100644 src/index.tsx

(limited to 'src/index.tsx')

diff --git a/src/index.tsx b/src/index.tsx
new file mode 100644
index 0000000..b300f20
--- /dev/null
+++ b/src/index.tsx
@@ -0,0 +1,62 @@
+import { ActionPanel, List, Action, closeMainWindow } from "@raycast/api";
+import { connect, Socket } from "net";
+import { showFailureToast } from "@raycast/utils";
+import { useState, useEffect, useRef } from "react";
+
+export default function Command({ arguments: { host, port } }: { arguments: { host: string, port: string } }) {
+  const [elements, setElements] = useState<string[]>();
+  const socket = useRef<Socket>();
+
+  useEffect(() => {
+    const showErr = (err: ErrorEvent) => {
+      showFailureToast(err.message, { title: "Couldn't connect to the script" });
+      setElements([]);
+    };
+
+    const s = connect({ host, port: parseInt(port) })
+    socket.current = s
+    s.on('error', showErr);
+
+    let buf: string = '';
+
+    s.on('data', data => {
+      buf += data;
+
+      const firstLineEnding = buf.indexOf('\n');
+      if (firstLineEnding == -1) return;
+
+      const amount = parseInt(buf.slice(0, firstLineEnding));
+
+      const lines = buf.slice(firstLineEnding + 1).trim().split("\n");
+      if (lines.length != amount) return;
+
+      setElements(lines.map(s => s.trim()).filter(s => s.length != 0));
+    })
+
+    s.on('close', () => closeMainWindow());
+
+    return () => {
+      if (socket.current != null) socket.current.end();
+    }
+  }, [host, port])
+
+
+  return (
+    <List isLoading={elements === undefined}>
+      {elements?.map((item, idx) => <List.Item title={item} key={idx} actions={
+        <ActionPanel>
+          <Action title="Select" onAction={() => {
+            const s = socket.current;
+            if (s == null) {
+              showFailureToast('Socket disconnected')
+              closeMainWindow();
+              return;
+            }
+            s.write(item + '\n')
+            s.end()
+          }} />
+        </ActionPanel>
+      } />)}
+    </List>
+  );
+}
-- 
cgit v1.2.3

