summaryrefslogtreecommitdiffhomepage
path: root/app/packages/web
diff options
context:
space:
mode:
authorFrank <[email protected]>2025-05-23 14:17:45 -0400
committerDax Raad <[email protected]>2025-05-26 12:40:17 -0400
commit83974e0c95d65c72d12e7d58a287514c39f3768f (patch)
tree274625aa4693b0d71b50eae3cfedb5d6245f99f9 /app/packages/web
parent59d43fa5da0619655c7ba3360e969bcbda1716ea (diff)
downloadopencode-83974e0c95d65c72d12e7d58a287514c39f3768f.tar.gz
opencode-83974e0c95d65c72d12e7d58a287514c39f3768f.zip
Share: sync
Diffstat (limited to 'app/packages/web')
-rw-r--r--app/packages/web/.gitignore28
-rw-r--r--app/packages/web/README.md32
-rw-r--r--app/packages/web/app.config.ts3
-rw-r--r--app/packages/web/package.json20
-rw-r--r--app/packages/web/public/favicon.icobin0 -> 664 bytes
-rw-r--r--app/packages/web/src/app.css39
-rw-r--r--app/packages/web/src/app.tsx20
-rw-r--r--app/packages/web/src/entry-client.tsx4
-rw-r--r--app/packages/web/src/entry-server.tsx21
-rw-r--r--app/packages/web/src/global.d.ts1
-rw-r--r--app/packages/web/src/routes/[...404].tsx19
-rw-r--r--app/packages/web/src/routes/index.tsx14
-rw-r--r--app/packages/web/src/routes/share/[id].tsx150
-rw-r--r--app/packages/web/sst-env.d.ts9
-rw-r--r--app/packages/web/tsconfig.json19
15 files changed, 379 insertions, 0 deletions
diff --git a/app/packages/web/.gitignore b/app/packages/web/.gitignore
new file mode 100644
index 000000000..751513ce1
--- /dev/null
+++ b/app/packages/web/.gitignore
@@ -0,0 +1,28 @@
+dist
+.wrangler
+.output
+.vercel
+.netlify
+.vinxi
+app.config.timestamp_*.js
+
+# Environment
+.env
+.env*.local
+
+# dependencies
+/node_modules
+
+# IDEs and editors
+/.idea
+.project
+.classpath
+*.launch
+.settings/
+
+# Temp
+gitignore
+
+# System Files
+.DS_Store
+Thumbs.db
diff --git a/app/packages/web/README.md b/app/packages/web/README.md
new file mode 100644
index 000000000..a84af3943
--- /dev/null
+++ b/app/packages/web/README.md
@@ -0,0 +1,32 @@
+# SolidStart
+
+Everything you need to build a Solid project, powered by [`solid-start`](https://start.solidjs.com);
+
+## Creating a project
+
+```bash
+# create a new project in the current directory
+npm init solid@latest
+
+# create a new project in my-app
+npm init solid@latest my-app
+```
+
+## Developing
+
+Once you've created a project and installed dependencies with `npm install` (or `pnpm install` or `yarn`), start a development server:
+
+```bash
+npm run dev
+
+# or start the server and open the app in a new browser tab
+npm run dev -- --open
+```
+
+## Building
+
+Solid apps are built with _presets_, which optimise your project for deployment to different environments.
+
+By default, `npm run build` will generate a Node app that you can run with `npm start`. To use a different preset, add it to the `devDependencies` in `package.json` and specify in your `app.config.js`.
+
+## This project was created with the [Solid CLI](https://solid-cli.netlify.app)
diff --git a/app/packages/web/app.config.ts b/app/packages/web/app.config.ts
new file mode 100644
index 000000000..de7f83103
--- /dev/null
+++ b/app/packages/web/app.config.ts
@@ -0,0 +1,3 @@
+import { defineConfig } from "@solidjs/start/config";
+
+export default defineConfig({});
diff --git a/app/packages/web/package.json b/app/packages/web/package.json
new file mode 100644
index 000000000..19834e120
--- /dev/null
+++ b/app/packages/web/package.json
@@ -0,0 +1,20 @@
+{
+ "name": "example-basic",
+ "type": "module",
+ "scripts": {
+ "dev": "vinxi dev",
+ "build": "vinxi build",
+ "start": "vinxi start",
+ "version": "vinxi version"
+ },
+ "dependencies": {
+ "@solidjs/meta": "^0.29.4",
+ "@solidjs/router": "^0.15.0",
+ "@solidjs/start": "^1.1.0",
+ "solid-js": "^1.9.5",
+ "vinxi": "^0.5.3"
+ },
+ "engines": {
+ "node": ">=22"
+ }
+}
diff --git a/app/packages/web/public/favicon.ico b/app/packages/web/public/favicon.ico
new file mode 100644
index 000000000..fb282da07
--- /dev/null
+++ b/app/packages/web/public/favicon.ico
Binary files differ
diff --git a/app/packages/web/src/app.css b/app/packages/web/src/app.css
new file mode 100644
index 000000000..8596998a4
--- /dev/null
+++ b/app/packages/web/src/app.css
@@ -0,0 +1,39 @@
+body {
+ font-family: Gordita, Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif;
+}
+
+a {
+ margin-right: 1rem;
+}
+
+main {
+ text-align: center;
+ padding: 1em;
+ margin: 0 auto;
+}
+
+h1 {
+ color: #335d92;
+ text-transform: uppercase;
+ font-size: 4rem;
+ font-weight: 100;
+ line-height: 1.1;
+ margin: 4rem auto;
+ max-width: 14rem;
+}
+
+p {
+ max-width: 14rem;
+ margin: 2rem auto;
+ line-height: 1.35;
+}
+
+@media (min-width: 480px) {
+ h1 {
+ max-width: none;
+ }
+
+ p {
+ max-width: none;
+ }
+}
diff --git a/app/packages/web/src/app.tsx b/app/packages/web/src/app.tsx
new file mode 100644
index 000000000..e6ad8f9df
--- /dev/null
+++ b/app/packages/web/src/app.tsx
@@ -0,0 +1,20 @@
+import { MetaProvider, Title } from "@solidjs/meta"
+import { Router } from "@solidjs/router"
+import { FileRoutes } from "@solidjs/start/router"
+import { Suspense } from "solid-js"
+import "./app.css"
+
+export default function App() {
+ return (
+ <Router
+ root={(props) => (
+ <MetaProvider>
+ <Title>SolidStart - Basic</Title>
+ <Suspense>{props.children}</Suspense>
+ </MetaProvider>
+ )}
+ >
+ <FileRoutes />
+ </Router>
+ )
+}
diff --git a/app/packages/web/src/entry-client.tsx b/app/packages/web/src/entry-client.tsx
new file mode 100644
index 000000000..0ca4e3c30
--- /dev/null
+++ b/app/packages/web/src/entry-client.tsx
@@ -0,0 +1,4 @@
+// @refresh reload
+import { mount, StartClient } from "@solidjs/start/client";
+
+mount(() => <StartClient />, document.getElementById("app")!);
diff --git a/app/packages/web/src/entry-server.tsx b/app/packages/web/src/entry-server.tsx
new file mode 100644
index 000000000..401eff83f
--- /dev/null
+++ b/app/packages/web/src/entry-server.tsx
@@ -0,0 +1,21 @@
+// @refresh reload
+import { createHandler, StartServer } from "@solidjs/start/server";
+
+export default createHandler(() => (
+ <StartServer
+ document={({ assets, children, scripts }) => (
+ <html lang="en">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
+ <link rel="icon" href="/favicon.ico" />
+ {assets}
+ </head>
+ <body>
+ <div id="app">{children}</div>
+ {scripts}
+ </body>
+ </html>
+ )}
+ />
+));
diff --git a/app/packages/web/src/global.d.ts b/app/packages/web/src/global.d.ts
new file mode 100644
index 000000000..dc6f10c22
--- /dev/null
+++ b/app/packages/web/src/global.d.ts
@@ -0,0 +1 @@
+/// <reference types="@solidjs/start/env" />
diff --git a/app/packages/web/src/routes/[...404].tsx b/app/packages/web/src/routes/[...404].tsx
new file mode 100644
index 000000000..4ea71ec7f
--- /dev/null
+++ b/app/packages/web/src/routes/[...404].tsx
@@ -0,0 +1,19 @@
+import { Title } from "@solidjs/meta";
+import { HttpStatusCode } from "@solidjs/start";
+
+export default function NotFound() {
+ return (
+ <main>
+ <Title>Not Found</Title>
+ <HttpStatusCode code={404} />
+ <h1>Page Not Found</h1>
+ <p>
+ Visit{" "}
+ <a href="https://start.solidjs.com" target="_blank">
+ start.solidjs.com
+ </a>{" "}
+ to learn how to build SolidStart apps.
+ </p>
+ </main>
+ );
+}
diff --git a/app/packages/web/src/routes/index.tsx b/app/packages/web/src/routes/index.tsx
new file mode 100644
index 000000000..415b32744
--- /dev/null
+++ b/app/packages/web/src/routes/index.tsx
@@ -0,0 +1,14 @@
+import { Title } from "@solidjs/meta"
+import { A } from "@solidjs/router"
+
+export default function Home() {
+ return (
+ <main>
+ <Title>Share Demo</Title>
+ <h1>Share Demo</h1>
+ <p>
+ <A href="/share/test-share-id">Go to test share</A>
+ </p>
+ </main>
+ )
+}
diff --git a/app/packages/web/src/routes/share/[id].tsx b/app/packages/web/src/routes/share/[id].tsx
new file mode 100644
index 000000000..d7f80e06a
--- /dev/null
+++ b/app/packages/web/src/routes/share/[id].tsx
@@ -0,0 +1,150 @@
+import { Title } from "@solidjs/meta"
+import { createSignal, onCleanup, onMount, Show, For } from "solid-js"
+import { useParams } from "@solidjs/router"
+
+type Message = {
+ filename: string
+ content: string
+}
+
+export default function SharePage() {
+ const params = useParams<{ id: string }>()
+ const [messages, setMessages] = createSignal<Message[]>([])
+ const [connectionStatus, setConnectionStatus] = createSignal("Disconnected")
+
+ onMount(() => {
+ // Get the API URL from environment
+ const apiUrl = import.meta.env.VITE_API_URL
+ const shareId = params.id
+
+ console.log("Mounting Share component with ID:", shareId)
+ console.log("API URL:", apiUrl)
+
+ if (!apiUrl) {
+ console.error("API URL not found in environment variables")
+ setConnectionStatus("Error: API URL not found")
+ return
+ }
+
+ let reconnectTimer: number | undefined
+ let socket: WebSocket | null = null
+
+ // Function to create and set up WebSocket with auto-reconnect
+ const setupWebSocket = () => {
+ // Close any existing connection
+ if (socket) {
+ socket.close()
+ }
+
+ setConnectionStatus("Connecting...")
+
+ // Always use secure WebSocket protocol (wss)
+ const wsBaseUrl = apiUrl.replace(/^https?:\/\//, 'wss://')
+ const wsUrl = `${wsBaseUrl}/share_poll?share_id=${shareId}`
+ console.log("Connecting to WebSocket URL:", wsUrl)
+
+ // Create WebSocket connection
+ socket = new WebSocket(wsUrl)
+
+ // Handle connection opening
+ socket.onopen = () => {
+ setConnectionStatus("Connected")
+ console.log("WebSocket connection established")
+ }
+
+ // Handle incoming messages
+ socket.onmessage = (event) => {
+ console.log("WebSocket message received")
+ try {
+ const data = JSON.parse(event.data) as Message
+ setMessages((prev) => [...prev, data])
+ } catch (error) {
+ console.error("Error parsing WebSocket message:", error)
+ }
+ }
+
+ // Handle errors
+ socket.onerror = (error) => {
+ console.error("WebSocket error:", error)
+ setConnectionStatus("Error: Connection failed")
+ }
+
+ // Handle connection close and reconnection
+ socket.onclose = (event) => {
+ console.log(`WebSocket closed: ${event.code} ${event.reason}`)
+ setConnectionStatus("Disconnected, reconnecting...")
+
+ // Try to reconnect after 2 seconds
+ clearTimeout(reconnectTimer)
+ reconnectTimer = window.setTimeout(
+ setupWebSocket,
+ 2000
+ ) as unknown as number
+ }
+ }
+
+ // Initial connection
+ setupWebSocket()
+
+ // Clean up on component unmount
+ onCleanup(() => {
+ console.log("Cleaning up WebSocket connection")
+ if (socket) {
+ socket.close()
+ }
+ clearTimeout(reconnectTimer)
+ })
+ })
+
+ return (
+ <main>
+ <Title>Share: {params.id}</Title>
+ <h1>Share: {params.id}</h1>
+
+ <div style={{ margin: "2rem 0" }}>
+ <h2>WebSocket Connection</h2>
+ <p>
+ Status: <strong>{connectionStatus()}</strong>
+ </p>
+
+ <h3>Live Updates</h3>
+ <div
+ style={{
+ border: "1px solid #ccc",
+ padding: "1rem",
+ borderRadius: "0.5rem",
+ maxHeight: "500px",
+ overflowY: "auto",
+ }}
+ >
+ <Show
+ when={messages().length > 0}
+ fallback={<p>Waiting for messages...</p>}
+ >
+ <ul style={{ listStyleType: "none", padding: 0 }}>
+ <For each={messages()}>
+ {(msg) => (
+ <li
+ style={{
+ padding: "0.5rem",
+ margin: "0.5rem 0",
+ backgroundColor: "#f5f5f5",
+ borderRadius: "0.25rem",
+ }}
+ >
+ <div>
+ <strong>Filename:</strong> {msg.filename}
+ </div>
+ <div>
+ <strong>Content:</strong> {msg.content}
+ </div>
+ </li>
+ )}
+ </For>
+ </ul>
+ </Show>
+ </div>
+ </div>
+ </main>
+ )
+}
diff --git a/app/packages/web/sst-env.d.ts b/app/packages/web/sst-env.d.ts
new file mode 100644
index 000000000..b6a7e9066
--- /dev/null
+++ b/app/packages/web/sst-env.d.ts
@@ -0,0 +1,9 @@
+/* This file is auto-generated by SST. Do not edit. */
+/* tslint:disable */
+/* eslint-disable */
+/* deno-fmt-ignore-file */
+
+/// <reference path="../../sst-env.d.ts" />
+
+import "sst"
+export {} \ No newline at end of file
diff --git a/app/packages/web/tsconfig.json b/app/packages/web/tsconfig.json
new file mode 100644
index 000000000..7d5871a07
--- /dev/null
+++ b/app/packages/web/tsconfig.json
@@ -0,0 +1,19 @@
+{
+ "compilerOptions": {
+ "target": "ESNext",
+ "module": "ESNext",
+ "moduleResolution": "bundler",
+ "allowSyntheticDefaultImports": true,
+ "esModuleInterop": true,
+ "jsx": "preserve",
+ "jsxImportSource": "solid-js",
+ "allowJs": true,
+ "strict": true,
+ "noEmit": true,
+ "types": ["vinxi/types/client"],
+ "isolatedModules": true,
+ "paths": {
+ "~/*": ["./src/*"]
+ }
+ }
+}