diff --git a/surfsense_web/.env.example b/surfsense_web/.env.example index cff9031be..157bfaa37 100644 --- a/surfsense_web/.env.example +++ b/surfsense_web/.env.example @@ -1,3 +1,5 @@ NEXT_PUBLIC_FASTAPI_BACKEND_URL=http://localhost:8000 NEXT_PUBLIC_FASTAPI_BACKEND_AUTH_TYPE=LOCAL or GOOGLE -NEXT_PUBLIC_ETL_SERVICE=UNSTRUCTURED or LLAMACLOUD or DOCLING \ No newline at end of file +NEXT_PUBLIC_ETL_SERVICE=UNSTRUCTURED or LLAMACLOUD or DOCLING +# Contact Form Vars - OPTIONAL +DATABASE_URL=postgresql://postgres:[YOUR-PASSWORD]@db.sdsf.supabase.co:5432/postgres \ No newline at end of file diff --git a/surfsense_web/app/api/contact/route.ts b/surfsense_web/app/api/contact/route.ts new file mode 100644 index 000000000..0af47dfe3 --- /dev/null +++ b/surfsense_web/app/api/contact/route.ts @@ -0,0 +1,61 @@ +import { type NextRequest, NextResponse } from "next/server"; +import { z } from "zod"; +import { db } from "@/app/db"; +import { usersTable } from "@/app/db/schema"; + +// Define validation schema matching the database schema +const contactSchema = z.object({ + name: z.string().min(1, "Name is required").max(255, "Name is too long"), + email: z.string().email("Invalid email address").max(255, "Email is too long"), + company: z.string().min(1, "Company is required").max(255, "Company name is too long"), + message: z.string().optional().default(""), +}); + +export async function POST(request: NextRequest) { + try { + const body = await request.json(); + + // Validate the request body + const validatedData = contactSchema.parse(body); + + // Insert into database + const result = await db + .insert(usersTable) + .values({ + name: validatedData.name, + email: validatedData.email, + company: validatedData.company, + message: validatedData.message, + }) + .returning(); + + return NextResponse.json( + { + success: true, + message: "Contact form submitted successfully", + data: result[0], + }, + { status: 201 } + ); + } catch (error) { + if (error instanceof z.ZodError) { + return NextResponse.json( + { + success: false, + message: "Validation error", + errors: error.errors, + }, + { status: 400 } + ); + } + + console.error("Error submitting contact form:", error); + return NextResponse.json( + { + success: false, + message: "Failed to submit contact form", + }, + { status: 500 } + ); + } +} diff --git a/surfsense_web/app/contact/page.tsx b/surfsense_web/app/contact/page.tsx new file mode 100644 index 000000000..cb722ff77 --- /dev/null +++ b/surfsense_web/app/contact/page.tsx @@ -0,0 +1,12 @@ +import React from 'react' +import { ContactFormGridWithDetails } from '@/components/contact/contact-form' + +const page = () => { + return ( +
+ +
+ ) +} + +export default page \ No newline at end of file diff --git a/surfsense_web/app/dashboard/[search_space_id]/chats/chats-client.tsx b/surfsense_web/app/dashboard/[search_space_id]/chats/chats-client.tsx index 1222733d0..4177b451a 100644 --- a/surfsense_web/app/dashboard/[search_space_id]/chats/chats-client.tsx +++ b/surfsense_web/app/dashboard/[search_space_id]/chats/chats-client.tsx @@ -1,7 +1,7 @@ "use client"; import { format } from "date-fns"; -import { AnimatePresence, motion, type Variants } from "framer-motion"; +import { AnimatePresence, motion, type Variants } from "motion/react"; import { Calendar, CheckCircle, diff --git a/surfsense_web/app/dashboard/[search_space_id]/connectors/(manage)/page.tsx b/surfsense_web/app/dashboard/[search_space_id]/connectors/(manage)/page.tsx index fb803790b..2520307b7 100644 --- a/surfsense_web/app/dashboard/[search_space_id]/connectors/(manage)/page.tsx +++ b/surfsense_web/app/dashboard/[search_space_id]/connectors/(manage)/page.tsx @@ -1,7 +1,7 @@ "use client"; import { format } from "date-fns"; -import { motion } from "framer-motion"; +import { motion } from "motion/react"; import { Calendar as CalendarIcon, Edit, Plus, RefreshCw, Trash2 } from "lucide-react"; import { useParams, useRouter } from "next/navigation"; import { useEffect, useState } from "react"; diff --git a/surfsense_web/app/dashboard/[search_space_id]/connectors/[connector_id]/edit/page.tsx b/surfsense_web/app/dashboard/[search_space_id]/connectors/[connector_id]/edit/page.tsx index 83736ff71..b697acdc1 100644 --- a/surfsense_web/app/dashboard/[search_space_id]/connectors/[connector_id]/edit/page.tsx +++ b/surfsense_web/app/dashboard/[search_space_id]/connectors/[connector_id]/edit/page.tsx @@ -1,6 +1,6 @@ "use client"; -import { motion } from "framer-motion"; +import { motion } from "motion/react"; import { ArrowLeft, Check, Loader2 } from "lucide-react"; import { useParams, useRouter } from "next/navigation"; import { useEffect } from "react"; diff --git a/surfsense_web/app/dashboard/[search_space_id]/connectors/[connector_id]/page.tsx b/surfsense_web/app/dashboard/[search_space_id]/connectors/[connector_id]/page.tsx index 4152ff786..bf0362464 100644 --- a/surfsense_web/app/dashboard/[search_space_id]/connectors/[connector_id]/page.tsx +++ b/surfsense_web/app/dashboard/[search_space_id]/connectors/[connector_id]/page.tsx @@ -1,7 +1,7 @@ "use client"; import { zodResolver } from "@hookform/resolvers/zod"; -import { motion } from "framer-motion"; +import { motion } from "motion/react"; import { ArrowLeft, Check, Info, Loader2 } from "lucide-react"; import { useParams, useRouter } from "next/navigation"; import { useEffect, useState } from "react"; diff --git a/surfsense_web/app/dashboard/[search_space_id]/connectors/add/airtable-connector/page.tsx b/surfsense_web/app/dashboard/[search_space_id]/connectors/add/airtable-connector/page.tsx index b787374ef..4455d0189 100644 --- a/surfsense_web/app/dashboard/[search_space_id]/connectors/add/airtable-connector/page.tsx +++ b/surfsense_web/app/dashboard/[search_space_id]/connectors/add/airtable-connector/page.tsx @@ -1,6 +1,6 @@ "use client"; -import { motion } from "framer-motion"; +import { motion } from "motion/react"; import { ArrowLeft, Check, ExternalLink, Loader2 } from "lucide-react"; import Link from "next/link"; import { useParams, useRouter } from "next/navigation"; diff --git a/surfsense_web/app/dashboard/[search_space_id]/connectors/add/confluence-connector/page.tsx b/surfsense_web/app/dashboard/[search_space_id]/connectors/add/confluence-connector/page.tsx index 2eb767bf4..0da10f547 100644 --- a/surfsense_web/app/dashboard/[search_space_id]/connectors/add/confluence-connector/page.tsx +++ b/surfsense_web/app/dashboard/[search_space_id]/connectors/add/confluence-connector/page.tsx @@ -1,7 +1,7 @@ "use client"; import { zodResolver } from "@hookform/resolvers/zod"; -import { motion } from "framer-motion"; +import { motion } from "motion/react"; import { ArrowLeft, Check, Info, Loader2 } from "lucide-react"; import { useParams, useRouter } from "next/navigation"; import { useState } from "react"; diff --git a/surfsense_web/app/dashboard/[search_space_id]/connectors/add/discord-connector/page.tsx b/surfsense_web/app/dashboard/[search_space_id]/connectors/add/discord-connector/page.tsx index 12ff1c790..8913c069a 100644 --- a/surfsense_web/app/dashboard/[search_space_id]/connectors/add/discord-connector/page.tsx +++ b/surfsense_web/app/dashboard/[search_space_id]/connectors/add/discord-connector/page.tsx @@ -1,7 +1,7 @@ "use client"; import { zodResolver } from "@hookform/resolvers/zod"; -import { motion } from "framer-motion"; +import { motion } from "motion/react"; import { ArrowLeft, Check, Info, Loader2 } from "lucide-react"; import { useParams, useRouter } from "next/navigation"; import { useState } from "react"; diff --git a/surfsense_web/app/dashboard/[search_space_id]/connectors/add/github-connector/page.tsx b/surfsense_web/app/dashboard/[search_space_id]/connectors/add/github-connector/page.tsx index 4fc8e1f41..c0467baa9 100644 --- a/surfsense_web/app/dashboard/[search_space_id]/connectors/add/github-connector/page.tsx +++ b/surfsense_web/app/dashboard/[search_space_id]/connectors/add/github-connector/page.tsx @@ -1,7 +1,7 @@ "use client"; import { zodResolver } from "@hookform/resolvers/zod"; -import { motion } from "framer-motion"; +import { motion } from "motion/react"; import { ArrowLeft, Check, CircleAlert, Github, Info, ListChecks, Loader2 } from "lucide-react"; import { useParams, useRouter } from "next/navigation"; import { useState } from "react"; diff --git a/surfsense_web/app/dashboard/[search_space_id]/connectors/add/google-calendar-connector/page.tsx b/surfsense_web/app/dashboard/[search_space_id]/connectors/add/google-calendar-connector/page.tsx index b04a5eddc..6c4dbbf81 100644 --- a/surfsense_web/app/dashboard/[search_space_id]/connectors/add/google-calendar-connector/page.tsx +++ b/surfsense_web/app/dashboard/[search_space_id]/connectors/add/google-calendar-connector/page.tsx @@ -1,7 +1,7 @@ "use client"; import { zodResolver } from "@hookform/resolvers/zod"; -import { motion } from "framer-motion"; +import { motion } from "motion/react"; import { ArrowLeft, Check, ExternalLink, Loader2 } from "lucide-react"; import Link from "next/link"; import { useParams, useRouter, useSearchParams } from "next/navigation"; diff --git a/surfsense_web/app/dashboard/[search_space_id]/connectors/add/google-gmail-connector/page.tsx b/surfsense_web/app/dashboard/[search_space_id]/connectors/add/google-gmail-connector/page.tsx index 43123ec4b..b62f564c2 100644 --- a/surfsense_web/app/dashboard/[search_space_id]/connectors/add/google-gmail-connector/page.tsx +++ b/surfsense_web/app/dashboard/[search_space_id]/connectors/add/google-gmail-connector/page.tsx @@ -1,7 +1,7 @@ "use client"; import { zodResolver } from "@hookform/resolvers/zod"; -import { motion } from "framer-motion"; +import { motion } from "motion/react"; import { ArrowLeft, Check, ExternalLink, Loader2 } from "lucide-react"; import Link from "next/link"; import { useParams, useRouter, useSearchParams } from "next/navigation"; diff --git a/surfsense_web/app/dashboard/[search_space_id]/connectors/add/jira-connector/page.tsx b/surfsense_web/app/dashboard/[search_space_id]/connectors/add/jira-connector/page.tsx index c7d4466b8..cfb812cfd 100644 --- a/surfsense_web/app/dashboard/[search_space_id]/connectors/add/jira-connector/page.tsx +++ b/surfsense_web/app/dashboard/[search_space_id]/connectors/add/jira-connector/page.tsx @@ -1,7 +1,7 @@ "use client"; import { zodResolver } from "@hookform/resolvers/zod"; -import { motion } from "framer-motion"; +import { motion } from "motion/react"; import { ArrowLeft, Check, Info, Loader2 } from "lucide-react"; import { useParams, useRouter } from "next/navigation"; import { useState } from "react"; diff --git a/surfsense_web/app/dashboard/[search_space_id]/connectors/add/linear-connector/page.tsx b/surfsense_web/app/dashboard/[search_space_id]/connectors/add/linear-connector/page.tsx index 9e1581405..602585e5c 100644 --- a/surfsense_web/app/dashboard/[search_space_id]/connectors/add/linear-connector/page.tsx +++ b/surfsense_web/app/dashboard/[search_space_id]/connectors/add/linear-connector/page.tsx @@ -1,7 +1,7 @@ "use client"; import { zodResolver } from "@hookform/resolvers/zod"; -import { motion } from "framer-motion"; +import { motion } from "motion/react"; import { ArrowLeft, Check, Info, Loader2 } from "lucide-react"; import { useParams, useRouter } from "next/navigation"; import { useState } from "react"; diff --git a/surfsense_web/app/dashboard/[search_space_id]/connectors/add/linkup-api/page.tsx b/surfsense_web/app/dashboard/[search_space_id]/connectors/add/linkup-api/page.tsx index 582898e0a..b033d2baa 100644 --- a/surfsense_web/app/dashboard/[search_space_id]/connectors/add/linkup-api/page.tsx +++ b/surfsense_web/app/dashboard/[search_space_id]/connectors/add/linkup-api/page.tsx @@ -1,7 +1,7 @@ "use client"; import { zodResolver } from "@hookform/resolvers/zod"; -import { motion } from "framer-motion"; +import { motion } from "motion/react"; import { ArrowLeft, Check, Info, Loader2 } from "lucide-react"; import { useParams, useRouter } from "next/navigation"; import { useState } from "react"; diff --git a/surfsense_web/app/dashboard/[search_space_id]/connectors/add/luma-connector/page.tsx b/surfsense_web/app/dashboard/[search_space_id]/connectors/add/luma-connector/page.tsx index cc5bde60b..67af12347 100644 --- a/surfsense_web/app/dashboard/[search_space_id]/connectors/add/luma-connector/page.tsx +++ b/surfsense_web/app/dashboard/[search_space_id]/connectors/add/luma-connector/page.tsx @@ -1,7 +1,7 @@ "use client"; import { zodResolver } from "@hookform/resolvers/zod"; -import { motion } from "framer-motion"; +import { motion } from "motion/react"; import { ArrowLeft, Check, Key, Loader2 } from "lucide-react"; import Link from "next/link"; import { useParams, useRouter } from "next/navigation"; diff --git a/surfsense_web/app/dashboard/[search_space_id]/connectors/add/notion-connector/page.tsx b/surfsense_web/app/dashboard/[search_space_id]/connectors/add/notion-connector/page.tsx index dfb66fe9f..6fc383042 100644 --- a/surfsense_web/app/dashboard/[search_space_id]/connectors/add/notion-connector/page.tsx +++ b/surfsense_web/app/dashboard/[search_space_id]/connectors/add/notion-connector/page.tsx @@ -1,7 +1,7 @@ "use client"; import { zodResolver } from "@hookform/resolvers/zod"; -import { motion } from "framer-motion"; +import { motion } from "motion/react"; import { ArrowLeft, Check, Info, Loader2 } from "lucide-react"; import { useParams, useRouter } from "next/navigation"; import { useState } from "react"; diff --git a/surfsense_web/app/dashboard/[search_space_id]/connectors/add/page.tsx b/surfsense_web/app/dashboard/[search_space_id]/connectors/add/page.tsx index d3cee106e..a8bb9cfe8 100644 --- a/surfsense_web/app/dashboard/[search_space_id]/connectors/add/page.tsx +++ b/surfsense_web/app/dashboard/[search_space_id]/connectors/add/page.tsx @@ -6,7 +6,7 @@ import { IconChevronDown, IconChevronRight, } from "@tabler/icons-react"; -import { AnimatePresence, motion, type Variants } from "framer-motion"; +import { AnimatePresence, motion, type Variants } from "motion/react"; import Link from "next/link"; import { useParams } from "next/navigation"; import { useState } from "react"; diff --git a/surfsense_web/app/dashboard/[search_space_id]/connectors/add/serper-api/page.tsx b/surfsense_web/app/dashboard/[search_space_id]/connectors/add/serper-api/page.tsx index 667126e8e..79afeddeb 100644 --- a/surfsense_web/app/dashboard/[search_space_id]/connectors/add/serper-api/page.tsx +++ b/surfsense_web/app/dashboard/[search_space_id]/connectors/add/serper-api/page.tsx @@ -1,7 +1,7 @@ "use client"; import { zodResolver } from "@hookform/resolvers/zod"; -import { motion } from "framer-motion"; +import { motion } from "motion/react"; import { ArrowLeft, Check, Info, Loader2 } from "lucide-react"; import { useParams, useRouter } from "next/navigation"; import { useState } from "react"; diff --git a/surfsense_web/app/dashboard/[search_space_id]/connectors/add/slack-connector/page.tsx b/surfsense_web/app/dashboard/[search_space_id]/connectors/add/slack-connector/page.tsx index 6e9802003..4f5e607e7 100644 --- a/surfsense_web/app/dashboard/[search_space_id]/connectors/add/slack-connector/page.tsx +++ b/surfsense_web/app/dashboard/[search_space_id]/connectors/add/slack-connector/page.tsx @@ -1,7 +1,7 @@ "use client"; import { zodResolver } from "@hookform/resolvers/zod"; -import { motion } from "framer-motion"; +import { motion } from "motion/react"; import { ArrowLeft, Check, Info, Loader2 } from "lucide-react"; import { useParams, useRouter } from "next/navigation"; import { useState } from "react"; diff --git a/surfsense_web/app/dashboard/[search_space_id]/connectors/add/tavily-api/page.tsx b/surfsense_web/app/dashboard/[search_space_id]/connectors/add/tavily-api/page.tsx index e2321abcb..d312d46a5 100644 --- a/surfsense_web/app/dashboard/[search_space_id]/connectors/add/tavily-api/page.tsx +++ b/surfsense_web/app/dashboard/[search_space_id]/connectors/add/tavily-api/page.tsx @@ -1,7 +1,7 @@ "use client"; import { zodResolver } from "@hookform/resolvers/zod"; -import { motion } from "framer-motion"; +import { motion } from "motion/react"; import { ArrowLeft, Check, Info, Loader2 } from "lucide-react"; import { useParams, useRouter } from "next/navigation"; import { useState } from "react"; diff --git a/surfsense_web/app/dashboard/[search_space_id]/documents/(manage)/components/DocumentsFilters.tsx b/surfsense_web/app/dashboard/[search_space_id]/documents/(manage)/components/DocumentsFilters.tsx index dd8791223..7b3d7beaf 100644 --- a/surfsense_web/app/dashboard/[search_space_id]/documents/(manage)/components/DocumentsFilters.tsx +++ b/surfsense_web/app/dashboard/[search_space_id]/documents/(manage)/components/DocumentsFilters.tsx @@ -1,6 +1,6 @@ "use client"; -import { AnimatePresence, motion, type Variants } from "framer-motion"; +import { AnimatePresence, motion, type Variants } from "motion/react"; import { CircleAlert, CircleX, Columns3, Filter, ListFilter, Trash } from "lucide-react"; import React, { useMemo, useRef } from "react"; import { diff --git a/surfsense_web/app/dashboard/[search_space_id]/documents/(manage)/components/DocumentsTableShell.tsx b/surfsense_web/app/dashboard/[search_space_id]/documents/(manage)/components/DocumentsTableShell.tsx index d9f9bb251..1317944b7 100644 --- a/surfsense_web/app/dashboard/[search_space_id]/documents/(manage)/components/DocumentsTableShell.tsx +++ b/surfsense_web/app/dashboard/[search_space_id]/documents/(manage)/components/DocumentsTableShell.tsx @@ -1,6 +1,6 @@ "use client"; -import { motion } from "framer-motion"; +import { motion } from "motion/react"; import { ChevronDown, ChevronUp, FileX } from "lucide-react"; import React from "react"; import { DocumentViewer } from "@/components/document-viewer"; diff --git a/surfsense_web/app/dashboard/[search_space_id]/documents/(manage)/components/PaginationControls.tsx b/surfsense_web/app/dashboard/[search_space_id]/documents/(manage)/components/PaginationControls.tsx index 2e6f8f314..33d2f017a 100644 --- a/surfsense_web/app/dashboard/[search_space_id]/documents/(manage)/components/PaginationControls.tsx +++ b/surfsense_web/app/dashboard/[search_space_id]/documents/(manage)/components/PaginationControls.tsx @@ -1,6 +1,6 @@ "use client"; -import { motion } from "framer-motion"; +import { motion } from "motion/react"; import { ChevronFirst, ChevronLast, ChevronLeft, ChevronRight } from "lucide-react"; import { Button } from "@/components/ui/button"; import { Label } from "@/components/ui/label"; diff --git a/surfsense_web/app/dashboard/[search_space_id]/documents/(manage)/page.tsx b/surfsense_web/app/dashboard/[search_space_id]/documents/(manage)/page.tsx index 4a69a7533..dfaee38a8 100644 --- a/surfsense_web/app/dashboard/[search_space_id]/documents/(manage)/page.tsx +++ b/surfsense_web/app/dashboard/[search_space_id]/documents/(manage)/page.tsx @@ -1,6 +1,6 @@ "use client"; -import { motion } from "framer-motion"; +import { motion } from "motion/react"; import { useParams } from "next/navigation"; import { useEffect, useId, useMemo, useState } from "react"; import { toast } from "sonner"; diff --git a/surfsense_web/app/dashboard/[search_space_id]/documents/upload/page.tsx b/surfsense_web/app/dashboard/[search_space_id]/documents/upload/page.tsx index efea74b49..438e10980 100644 --- a/surfsense_web/app/dashboard/[search_space_id]/documents/upload/page.tsx +++ b/surfsense_web/app/dashboard/[search_space_id]/documents/upload/page.tsx @@ -1,6 +1,6 @@ "use client"; -import { AnimatePresence, motion } from "framer-motion"; +import { AnimatePresence, motion } from "motion/react"; import { CheckCircle2, FileType, Info, Tag, Upload, X } from "lucide-react"; import { useParams, useRouter } from "next/navigation"; import { useCallback, useState } from "react"; diff --git a/surfsense_web/app/dashboard/[search_space_id]/documents/youtube/page.tsx b/surfsense_web/app/dashboard/[search_space_id]/documents/youtube/page.tsx index 494420585..af1b702b7 100644 --- a/surfsense_web/app/dashboard/[search_space_id]/documents/youtube/page.tsx +++ b/surfsense_web/app/dashboard/[search_space_id]/documents/youtube/page.tsx @@ -2,7 +2,7 @@ import { IconBrandYoutube } from "@tabler/icons-react"; import { type Tag, TagInput } from "emblor"; -import { motion, type Variants } from "framer-motion"; +import { motion, type Variants } from "motion/react"; import { Loader2 } from "lucide-react"; import { useParams, useRouter } from "next/navigation"; import { useState } from "react"; diff --git a/surfsense_web/app/dashboard/[search_space_id]/logs/(manage)/page.tsx b/surfsense_web/app/dashboard/[search_space_id]/logs/(manage)/page.tsx index c1c8fd132..e5c4351bf 100644 --- a/surfsense_web/app/dashboard/[search_space_id]/logs/(manage)/page.tsx +++ b/surfsense_web/app/dashboard/[search_space_id]/logs/(manage)/page.tsx @@ -15,7 +15,7 @@ import { useReactTable, type VisibilityState, } from "@tanstack/react-table"; -import { AnimatePresence, motion, type Variants } from "framer-motion"; +import { AnimatePresence, motion, type Variants } from "motion/react"; import { Activity, AlertCircle, diff --git a/surfsense_web/app/dashboard/api-key/api-key-client.tsx b/surfsense_web/app/dashboard/api-key/api-key-client.tsx index 97a36d8e6..97b478dc0 100644 --- a/surfsense_web/app/dashboard/api-key/api-key-client.tsx +++ b/surfsense_web/app/dashboard/api-key/api-key-client.tsx @@ -1,7 +1,7 @@ "use client"; import { IconCheck, IconCopy, IconKey } from "@tabler/icons-react"; -import { AnimatePresence, motion } from "framer-motion"; +import { AnimatePresence, motion } from "motion/react"; import { ArrowLeft } from "lucide-react"; import { useRouter } from "next/navigation"; import { Alert, AlertDescription, AlertTitle } from "@/components/ui/alert"; diff --git a/surfsense_web/app/dashboard/page.tsx b/surfsense_web/app/dashboard/page.tsx index 484b95929..e0ac6b6cf 100644 --- a/surfsense_web/app/dashboard/page.tsx +++ b/surfsense_web/app/dashboard/page.tsx @@ -1,6 +1,6 @@ "use client"; -import { motion, type Variants } from "framer-motion"; +import { motion, type Variants } from "motion/react"; import { AlertCircle, Loader2, Plus, Search, Trash2 } from "lucide-react"; import Image from "next/image"; import Link from "next/link"; diff --git a/surfsense_web/app/dashboard/searchspaces/page.tsx b/surfsense_web/app/dashboard/searchspaces/page.tsx index b1f2f390e..598536c1b 100644 --- a/surfsense_web/app/dashboard/searchspaces/page.tsx +++ b/surfsense_web/app/dashboard/searchspaces/page.tsx @@ -1,6 +1,6 @@ "use client"; -import { motion } from "framer-motion"; +import { motion } from "motion/react"; import { useRouter } from "next/navigation"; import { toast } from "sonner"; import { SearchSpaceForm } from "@/components/search-space-form"; diff --git a/surfsense_web/app/db/index.ts b/surfsense_web/app/db/index.ts new file mode 100644 index 000000000..277848bb5 --- /dev/null +++ b/surfsense_web/app/db/index.ts @@ -0,0 +1,6 @@ +import { drizzle } from "drizzle-orm/postgres-js"; +import postgres from "postgres"; +import * as schema from "./schema"; + +const client = postgres(process.env.DATABASE_URL!); +export const db = drizzle({ client, schema }); diff --git a/surfsense_web/app/db/schema.ts b/surfsense_web/app/db/schema.ts new file mode 100644 index 000000000..d8b941ba5 --- /dev/null +++ b/surfsense_web/app/db/schema.ts @@ -0,0 +1,9 @@ +import { integer, pgTable, text, varchar } from "drizzle-orm/pg-core"; + +export const usersTable = pgTable("users", { + id: integer().primaryKey().generatedAlwaysAsIdentity(), + name: varchar({ length: 255 }).notNull(), + email: varchar({ length: 255 }).notNull().unique(), + company: varchar({ length: 255 }).notNull(), + message: text().default(""), +}); diff --git a/surfsense_web/app/login/GoogleLoginButton.tsx b/surfsense_web/app/login/GoogleLoginButton.tsx index ab0e0ddf8..545f279e7 100644 --- a/surfsense_web/app/login/GoogleLoginButton.tsx +++ b/surfsense_web/app/login/GoogleLoginButton.tsx @@ -1,6 +1,6 @@ "use client"; import { IconBrandGoogleFilled } from "@tabler/icons-react"; -import { motion } from "framer-motion"; +import { motion } from "motion/react"; import { Logo } from "@/components/Logo"; import { AmbientBackground } from "./AmbientBackground"; diff --git a/surfsense_web/app/login/LocalLoginForm.tsx b/surfsense_web/app/login/LocalLoginForm.tsx index b464bea98..a81b9d793 100644 --- a/surfsense_web/app/login/LocalLoginForm.tsx +++ b/surfsense_web/app/login/LocalLoginForm.tsx @@ -1,5 +1,5 @@ "use client"; -import { AnimatePresence, motion } from "framer-motion"; +import { AnimatePresence, motion } from "motion/react"; import Link from "next/link"; import { useRouter } from "next/navigation"; import { useEffect, useState } from "react"; diff --git a/surfsense_web/app/login/page.tsx b/surfsense_web/app/login/page.tsx index c9e9d9090..59ff16ee3 100644 --- a/surfsense_web/app/login/page.tsx +++ b/surfsense_web/app/login/page.tsx @@ -1,6 +1,6 @@ "use client"; -import { AnimatePresence, motion } from "framer-motion"; +import { AnimatePresence, motion } from "motion/react"; import { Loader2 } from "lucide-react"; import { useSearchParams } from "next/navigation"; import { Suspense, useEffect, useState } from "react"; diff --git a/surfsense_web/app/onboard/page.tsx b/surfsense_web/app/onboard/page.tsx index 997b7e4c8..983b240c1 100644 --- a/surfsense_web/app/onboard/page.tsx +++ b/surfsense_web/app/onboard/page.tsx @@ -1,6 +1,6 @@ "use client"; -import { AnimatePresence, motion } from "framer-motion"; +import { AnimatePresence, motion } from "motion/react"; import { ArrowLeft, ArrowRight, Bot, CheckCircle, Sparkles } from "lucide-react"; import { useRouter } from "next/navigation"; import { useEffect, useState } from "react"; diff --git a/surfsense_web/app/pricing/page.tsx b/surfsense_web/app/pricing/page.tsx new file mode 100644 index 000000000..6d71d6ff4 --- /dev/null +++ b/surfsense_web/app/pricing/page.tsx @@ -0,0 +1,12 @@ +import React from 'react' +import PricingBasic from '@/components/pricing/pricing-section' + +const page = () => { + return ( +
+ +
+ ) +} + +export default page \ No newline at end of file diff --git a/surfsense_web/app/register/page.tsx b/surfsense_web/app/register/page.tsx index f046e5cff..303d9a378 100644 --- a/surfsense_web/app/register/page.tsx +++ b/surfsense_web/app/register/page.tsx @@ -1,6 +1,6 @@ "use client"; -import { AnimatePresence, motion } from "framer-motion"; +import { AnimatePresence, motion } from "motion/react"; import Link from "next/link"; import { useRouter } from "next/navigation"; import { useEffect, useState } from "react"; diff --git a/surfsense_web/components/ModernHeroWithGradients.tsx b/surfsense_web/components/ModernHeroWithGradients.tsx index 5c81cf54b..543e1b4eb 100644 --- a/surfsense_web/components/ModernHeroWithGradients.tsx +++ b/surfsense_web/components/ModernHeroWithGradients.tsx @@ -1,5 +1,5 @@ "use client"; -import { IconBrandDiscord, IconBrandGithub, IconFileTypeDoc } from "@tabler/icons-react"; +import { IconBrandDiscord, IconBrandGithub, IconFileTypeDoc, IconMail } from "@tabler/icons-react"; import Link from "next/link"; import { cn } from "@/lib/utils"; import { Logo } from "./Logo"; @@ -54,6 +54,13 @@ export function ModernHeroWithGradients() { Notion, YouTube, GitHub, Discord and more.

+ + + Contact Us + { duration: 0.2, }, }} + className="flex items-center gap-2" > + + + +