Skip to content

Commit

Permalink
Merge pull request #101 from edinstance/main
Browse files Browse the repository at this point in the history
  • Loading branch information
webdevcody authored Oct 19, 2024
2 parents 7a809ec + 8545ffd commit afce648
Show file tree
Hide file tree
Showing 10 changed files with 418 additions and 71 deletions.
11 changes: 8 additions & 3 deletions app/header.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ export default function Header() {
<span className="ml-2 text-xl font-bold">SurviveTheNight</span>
</Link>

<nav className="flex items-center space-x-4">
<nav className="flex items-center space-x-4 overflow-x-scroll">
<Link href="/">
<Button variant="ghost">Watch</Button>
</Link>
Expand All @@ -54,9 +54,14 @@ export default function Header() {
</Link>
)}
{isAdminQuery && (
<Link href="/maps/review">
<Button variant="ghost">Review Maps</Button>
<>
<Link href="/prompts">
<Button variant="ghost">Review Prompts</Button>
</Link>
<Link href="/maps/review">
<Button variant="ghost">Review Maps</Button>
</Link></>

)}
{flags?.showTestPage && (
<Link href="/test">
Expand Down
84 changes: 84 additions & 0 deletions app/prompts/[promptId]/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
"use client";

import { Button } from "@/components/ui/button";
import { Input } from "@/components/ui/input";
import { api } from "@/convex/_generated/api";
import { useMutation, useQuery } from "convex/react";
import Link from "next/link";
import { useRouter } from "next/navigation";
import { useEffect, useState } from "react";

export default function editPromtPage({
params,
}: {
params: { promptId: string };
}) {
const prompt = useQuery(api.prompts.getPromptById, {
promptId: params.promptId,
});
console.log(prompt);
const updatePrompt = useMutation(api.prompts.updatePrompt);
const isAdmin = useQuery(api.users.isAdmin);

const [promptName, setPromptName] = useState("");
const [promptText, setPromptText] = useState("");

useEffect(() => {
if (prompt) {
setPromptName(prompt.promptName);
setPromptText(prompt.prompt);
}
}, [prompt]);

const handlePromptNameChange = (e: React.ChangeEvent<HTMLInputElement>) => {
setPromptName(e.target.value);
};

const handlePromptTextChange = (
e: React.ChangeEvent<HTMLTextAreaElement>,
) => {
setPromptText(e.target.value);
};

const router = useRouter();
const handleSubmit = (e: React.FormEvent<HTMLFormElement>) => {
e.preventDefault();
if (!prompt) return;

updatePrompt({ promptId: prompt._id, promptName, prompt: promptText });
router.push("/prompts");
};

if (!isAdmin) {
redirect("/");
}

return (
<div className="container mx-auto min-h-screen pb-24 py-12 gap-8">
<form className="py-6 px-6 h-full" onSubmit={handleSubmit}>
<div className="flex justify-between mb-4">
<h1 className="font-semibold mb-4">Edit your prompt</h1>
<div className="flex space-x-4">
<Button variant="default">Save</Button>
<Link href="/prompts">
<Button variant="default">Return</Button>
</Link>
</div>
</div>
<div className="flex flex-col items-start space-y-4 min-h-screen h-screen">
<Input
placeholder="Prompt Name"
value={promptName}
onChange={handlePromptNameChange}
/>
<textarea
placeholder="Prompt"
className=" h-full w-full rounded-md border border-input bg-transparent px-3 py-1"
value={promptText}
onChange={handlePromptTextChange}
/>
</div>
</form>
</div>
);
}
96 changes: 96 additions & 0 deletions app/prompts/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
"use client";

import { Button } from "@/components/ui/button";
import {
Table,
TableBody,
TableCell,
TableHead,
TableHeader,
TableRow,
} from "@/components/ui/table";
import { api } from "@/convex/_generated/api";
import { useMutation, useQuery } from "convex/react";
import Link from "next/link";
import { useRouter, redirect } from "next/navigation";

const Page = () => {
const prompts = useQuery(api.prompts.getAllPrompts);
const enablePrompt = useMutation(api.prompts.enablePrompt);
const deletePrompt = useMutation(api.prompts.deletePrompt);
const createPrompt = useMutation(api.prompts.createPrompt);

const isAdmin = useQuery(api.users.isAdmin);

const router = useRouter();

const handleCreatePrompt = async () => {
const newPromptId = await createPrompt({
promptName: "",
prompt: "",
});
router.push(`/prompts/${newPromptId}`);
};

if (!isAdmin) {
redirect("/");
}

return (
<div className="container mx-auto min-h-screen py-12 pb-24 gap-8">
<div className="flex justify-between mb-4">
<h1 className="font-semibold mb-4">Review Prompts</h1>
<Button variant="default" onClick={handleCreatePrompt}>
Create Prompt
</Button>
</div>
<div className="flex items-center justify-around">
<Table>
<TableHeader>
<TableRow>
<TableHead>Prompt Name </TableHead>
<TableHead>ID</TableHead>
<TableHead>Active</TableHead>
<TableHead>Actions</TableHead>
</TableRow>
</TableHeader>
<TableBody>
{prompts?.map((row) => (
<TableRow key={row._id}>
<TableCell>{row.promptName}</TableCell>
<TableCell>{row._id}</TableCell>
<TableCell>{row.isActive ? "Yes" : "No"}</TableCell>
<TableCell className="space-x-4 flex">
<Button
variant="default"
onClick={async () => {
await enablePrompt({ promptId: row._id });
}}
>
Activate
</Button>
<Link
href={`/prompts/${row._id}`}
className="flex items-center"
>
<Button variant="secondary">Edit</Button>
</Link>
<Button
variant="destructive"
onClick={async () => {
await deletePrompt({ promptId: row._id });
}}
>
Delete
</Button>
</TableCell>
</TableRow>
))}
</TableBody>
</Table>
</div>
</div>
);
};

export default Page;
2 changes: 2 additions & 0 deletions convex/_generated/api.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ import type * as leaderboard from "../leaderboard.js";
import type * as maps from "../maps.js";
import type * as models from "../models.js";
import type * as playerresults from "../playerresults.js";
import type * as prompts from "../prompts.js";
import type * as results from "../results.js";
import type * as scores from "../scores.js";
import type * as users from "../users.js";
Expand All @@ -50,6 +51,7 @@ declare const fullApi: ApiFromModules<{
maps: typeof maps;
models: typeof models;
playerresults: typeof playerresults;
prompts: typeof prompts;
results: typeof results;
scores: typeof scores;
users: typeof users;
Expand Down
1 change: 1 addition & 0 deletions convex/init.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,6 @@ export default internalMutation({
handler: async (ctx) => {
await ctx.runMutation(internal.maps.seedMaps);
await ctx.runMutation(internal.models.seedModels);
await ctx.runMutation(internal.prompts.seedPrompts);
},
});
28 changes: 27 additions & 1 deletion convex/maps.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import { api, internal } from "./_generated/api";
import { runModel } from "../models";
import { getAuthUserId } from "@convex-dev/auth/server";
import { adminMutationBuilder } from "./users";
import { Prompt } from "./prompts";

const LEVELS = [
{
Expand Down Expand Up @@ -300,9 +301,17 @@ export const playMapAction = internalAction({
return;
}

const activePromptQuery = await ctx.runQuery(api.prompts.getActivePrompt);
const activePrompt = activePromptQuery && activePromptQuery.prompt;

if (!activePrompt) {
throw new Error("Active prompt not found");
}

const { solution, reasoning, error } = await runModel(
args.modelId,
map.grid,
activePrompt,
);

await ctx.runMutation(internal.results.updateResult, {
Expand All @@ -322,12 +331,22 @@ export const testMap = action({
},
handler: async (ctx, args) => {
const isAdmin = await ctx.runQuery(api.users.isAdmin);
const activePrompt: Prompt = await ctx.runQuery(api.prompts.getActivePrompt);


if (!isAdmin) {
throw new Error("Test map is available only for admin");
}

return await runModel(args.modelId, args.map);
if (!activePrompt) {
throw new Error("Active prompt not found");
}

return await runModel(
args.modelId,
args.map,
activePrompt.prompt,
);
},
});

Expand All @@ -350,9 +369,16 @@ export const testAIModel = action({
throw new Error("Map not found");
}

const activePrompt: Prompt = await ctx.runQuery(api.prompts.getActivePrompt);

if (!activePrompt) {
throw new Error("Active prompt not found");
}

const { solution, reasoning, error } = await runModel(
args.modelId,
map.grid,
activePrompt.prompt,
);

return {
Expand Down
Loading

0 comments on commit afce648

Please sign in to comment.