3import { usePostMessage } from "../lib/queries.ts";
4
5export function MessageInput() {
6 const [message, setMessage] = React.useState("");
7 const postMessage = usePostMessage();
1
2export default async function(req) {
3 return new Response(`undefined`, {
4 headers: { 'Content-Type': 'text/html' }
1export default async function (req: Request): Promise<Response> {
2 return Response.json({ ok: true })
3}
65### Query
66```tsx
67export function usePostMessage() {
68 return useMutation({
69 mutationFn: (content: string) => postMessage(content),
16In a normal server environment, you would likely use a middleware [like this one](https://hono.dev/docs/getting-started/nodejs#serve-static-files) to serve static files. Some frameworks or deployment platforms automatically make any content inside a `public/` folder public.
17
18However in Val Town you need to handle this yourself, and it can be suprisingly difficult to read and serve files in a Val Town Project. This template uses helper functions from [stevekrouse/utils/serve-public](https://www.val.town/x/stevekrouse/utils/branch/main/code/serve-public/README.md), which handle reading project files in a way that will work across branches and forks, automatically transpiles typescript to javascript, and assigns content-types based on the file's extension.
19
20### `index.html`
26## CRUD API Routes
27
28This app has two CRUD API routes: for reading and inserting into the messages table. They both speak JSON, which is standard. They import their functions from `/backend/database/queries.ts`. These routes are called from the React app to refresh and update data.
29
30## Errors
4
5* `migrations.ts` - code to set up the database tables the app needs
6* `queries.ts` - functions to run queries against those tables, which are imported and used in the main Hono server in `/backend/index.ts`
7
8## Migrations
18The queries file is where running the migrations happen in this app. It'd also be reasonable for that to happen in index.ts, or as is said above, for that line to be commented out, and only run when actual changes are made to your database schema.
19
20The queries file exports functions to get and write data. It relies on shared types and data imported from the `/shared` directory.
3
4// Fetch messages query
5export function useMessages(initialData?: Message[]) {
6 return useQuery({
7 queryKey: ["messages"],
20
21// Post message mutation
22export function usePostMessage() {
23 const queryClient = useQueryClient();
24
11await createTables();
12
13export async function getMessages(limit = MESSAGE_LIMIT) {
14 const messages = await db
15 .select()
22}
23
24export async function insertMessage(content: string) {
25 await db
26 .insert(schema.messages)
2import { db } from "./db.ts";
3
4export async function createTables() {
5 // Create messages table
6 await db.run(sql`
14 * @returns Promise resolving to whether the project exists
15 */
16export async function valExists(valId: string): Promise<boolean> {
17 try {
18 await sdk.vals.retrieve(valId);
33 * @returns Promise resolving to the Val ID
34 */
35export async function resolveValId(identifier: string): Promise<string> {
36 // If it looks like a direct ID, return as-is
37 if (!identifier.startsWith("@")) {
71 * Determine the type of a Val file.
72 *
73 * This function attempts to determine the type of a file within a val
74 * based on its existing state on the server or its filename. The process...
75 * 1. Check if the file already exists in the Val at the specified path.
93 * @returns The val file type
94 */
95export async function getValItemType(
96 valId: string,
97 branchId: string,
Simple functional CSS library for Val Town
A helper function to build a file's email
import { OpenAI } from "https://esm.town/v/std/openai";
export default async function(req: Request): Promise<Response> {
if (req.method === "OPTIONS") {
return new Response(null, {
headers: {
"Access-Control-Allow-Origin": "*",
LangChain (https://langchain.com) Ambassador, KubeSphere (https://kubesphere.io) Ambassador, CNCF OpenFunction (https://openfunction.dev) TOC Member.