{ "name": "app-01", "type": "registry:block", "description": "A simple task app.", "dependencies": [ "swr" ], "registryDependencies": [ "card", "input", "button", "skeleton", "label" ], "files": [ { "path": "blocks/app-01/page.tsx", "content": "import { AddTaskForm } from \"@/registry/new-york/blocks/app-01/components/add-task-form\"\nimport { TasksList } from \"@/registry/new-york/blocks/app-01/components/tasks-list\"\nimport {\n Card,\n CardContent,\n CardFooter,\n CardHeader,\n CardTitle,\n} from \"@/registry/new-york/ui/card\"\n\nexport default function AppPage() {\n return (\n
\n \n \n Add Task\n \n \n \n \n \n \n \n \n
\n )\n}\n", "type": "registry:page", "target": "app/page.tsx" }, { "path": "blocks/app-01/api/tasks/route.ts", "content": "import { NextResponse } from \"next/server\"\n\nimport { API_URL } from \"@/registry/new-york/blocks/app-01/lib/constants\"\n\nexport async function GET() {\n const response = await fetch(API_URL)\n const data = await response.json()\n return NextResponse.json(data)\n}\n", "type": "registry:page", "target": "app/api/tasks/route.ts" }, { "path": "blocks/app-01/components/add-task-form.tsx", "content": "\"use client\"\n\nimport * as React from \"react\"\n\nimport { Label } from \"@/registry/default/ui/label\"\nimport { SubmitButton } from \"@/registry/new-york/blocks/app-01/components/submit-button\"\nimport { useTasks } from \"@/registry/new-york/blocks/app-01/hooks/use-tasks\"\nimport { saveTask } from \"@/registry/new-york/blocks/app-01/lib/actions\"\nimport { Input } from \"@/registry/new-york/ui/input\"\n\nexport function AddTaskForm() {\n const { mutate } = useTasks()\n const formRef = React.useRef(null)\n\n return (\n {\n await saveTask(formData)\n void mutate()\n formRef.current?.reset()\n }}\n className=\"w-full\"\n ref={formRef}\n >\n
\n \n \n Add Task\n
\n \n )\n}\n", "type": "registry:component", "target": "" }, { "path": "blocks/app-01/components/submit-button.tsx", "content": "\"use client\"\n\nimport { Loader2 } from \"lucide-react\"\nimport { useFormStatus } from \"react-dom\"\n\nimport { Button } from \"@/registry/new-york/ui/button\"\n\nexport function SubmitButton({\n children,\n ...props\n}: React.ComponentProps) {\n const { pending } = useFormStatus()\n\n return (\n \n )\n}\n", "type": "registry:component", "target": "" }, { "path": "blocks/app-01/components/tasks-list.tsx", "content": "\"use client\"\n\nimport { useTasks } from \"@/registry/new-york/blocks/app-01/hooks/use-tasks\"\nimport { Skeleton } from \"@/registry/new-york/ui/skeleton\"\n\nexport function TasksList() {\n const { tasks, isLoading } = useTasks()\n\n if (isLoading)\n return (\n
\n {Array.from({ length: 5 }).map((_, index) => (\n \n ))}\n
\n )\n\n return (\n
\n {tasks.map((task, index) => (\n
\n {task}\n
\n ))}\n
\n )\n}\n", "type": "registry:component", "target": "" }, { "path": "blocks/app-01/hooks/use-tasks.ts", "content": "\"use client\"\n\nimport useSWR from \"swr\"\n\nimport { API_URL } from \"@/registry/new-york/blocks/app-01/lib/constants\"\n\nexport function useTasks() {\n const { data, isLoading, mutate } = useSWR<{ tasks: string[] }>(\n \"/api/tasks\",\n async () => {\n const response = await fetch(API_URL)\n return response.json()\n }\n )\n\n return { tasks: data?.tasks || [], isLoading, mutate }\n}\n", "type": "registry:hook", "target": "" }, { "path": "blocks/app-01/lib/constants.ts", "content": "export const API_URL = \"https://api.npoint.io/40ac2c2a67c912fa2120\"\n", "type": "registry:lib", "target": "" }, { "path": "blocks/app-01/lib/actions.ts", "content": "\"use server\"\n\nimport { API_URL } from \"@/registry/new-york/blocks/app-01/lib/constants\"\n\nexport async function saveTask(formData: FormData) {\n const name = formData.get(\"name\")\n\n // Get current tasks\n const response = await fetch(API_URL)\n const data = await response.json()\n const tasks = data.tasks || []\n\n // Add new task to array\n tasks.push(name)\n\n // Save updated tasks array\n await fetch(API_URL, {\n method: \"POST\",\n body: JSON.stringify({ tasks }),\n })\n\n return { success: true }\n}\n", "type": "registry:lib", "target": "" } ], "cssVars": { "light": { "primary": "224.3 76.3% 48%", "primary-foreground": "0 0% 100%" } }, "categories": [ "apps" ] }