Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion surfsense_web/.env.example
Original file line number Diff line number Diff line change
@@ -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
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
61 changes: 61 additions & 0 deletions surfsense_web/app/api/contact/route.ts
Original file line number Diff line number Diff line change
@@ -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 }
);
}
}
12 changes: 12 additions & 0 deletions surfsense_web/app/contact/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import React from 'react'
import { ContactFormGridWithDetails } from '@/components/contact/contact-form'

const page = () => {
return (
<div>
<ContactFormGridWithDetails />
</div>
)
}

export default page
Comment on lines +1 to +12
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

Fix formatting and consider adding page metadata.

The pipeline indicates a Prettier formatting issue that must be resolved.

Run Prettier to fix:

npx prettier --write app/contact/page.tsx

Additionally, consider adding page metadata for SEO:

 import React from 'react'
 import { ContactFormGridWithDetails } from '@/components/contact/contact-form'
+import { Metadata } from 'next'
+
+export const metadata: Metadata = {
+  title: 'Contact Us | SurfSense',
+  description: 'Get in touch with the SurfSense team',
+}

 const page = () => {
   return (
-    <div>
-        <ContactFormGridWithDetails />
-    </div>
+    <ContactFormGridWithDetails />
   )
 }

 export default page
🧰 Tools
🪛 GitHub Actions: Code Quality Checks

[error] 1-1: Prettier formatting check failed. The formatter would rewrite content in this file. Run the formatter (e.g., 'prettier --write') to fix code style issues.

🤖 Prompt for AI Agents
In surfsense_web/app/contact/page.tsx lines 1-12, Prettier formatting errors
must be fixed and page metadata should be added; run the formatter (npx prettier
--write app/contact/page.tsx) to correct whitespace/formatting, then export
Next.js page metadata (e.g., export const metadata = { title: 'Contact —
YourSite', description: 'Short description for SEO' }) above the component and
ensure the component is a default export; save and re-run lint/CI.

Original file line number Diff line number Diff line change
@@ -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";
Comment on lines 3 to +4
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Fix import order to resolve pipeline failure.

The pipeline reports an import/export sorting issue. The Biome linter requires imports to be organized in a specific order.

Please run your code formatter/linter to fix the import order:

# Fix import order with Biome
npx biome check --apply .
🧰 Tools
🪛 GitHub Actions: Code Quality Checks

[error] 3-3: The imports and exports are not sorted. Organize imports (Biome) to fix order.

🤖 Prompt for AI Agents
In surfsense_web/app/dashboard/[search_space_id]/chats/chats-client.tsx around
lines 3 to 4, the import statements are not ordered according to the Biome
linter rules which causes the pipeline failure; run the Biome fixer and reorder
imports to match the project's import-sort convention (external packages,
grouped/aliased imports, then local imports), e.g. run `npx biome check --apply
.` to automatically fix the import order and then commit the formatted file.

import {
Calendar,
CheckCircle,
Expand Down
Original file line number Diff line number Diff line change
@@ -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";
Expand Down
Original file line number Diff line number Diff line change
@@ -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";
Expand Down
Original file line number Diff line number Diff line change
@@ -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";
Expand Down
Original file line number Diff line number Diff line change
@@ -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";
Expand Down
Original file line number Diff line number Diff line change
@@ -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";
Expand Down
Original file line number Diff line number Diff line change
@@ -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";
Expand Down
Original file line number Diff line number Diff line change
@@ -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";
Expand Down
Original file line number Diff line number Diff line change
@@ -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";
Expand Down
Original file line number Diff line number Diff line change
@@ -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";
Expand Down
Original file line number Diff line number Diff line change
@@ -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";
Expand Down
Original file line number Diff line number Diff line change
@@ -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";
Expand Down
Original file line number Diff line number Diff line change
@@ -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";
Expand Down
Original file line number Diff line number Diff line change
@@ -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";
Expand Down
Original file line number Diff line number Diff line change
@@ -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";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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";
Expand Down
Original file line number Diff line number Diff line change
@@ -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";
Expand Down
Original file line number Diff line number Diff line change
@@ -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";
Expand Down
Original file line number Diff line number Diff line change
@@ -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";
Expand Down
Original file line number Diff line number Diff line change
@@ -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 {
Expand Down
Original file line number Diff line number Diff line change
@@ -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";
Expand Down
Original file line number Diff line number Diff line change
@@ -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";
Expand Down
Original file line number Diff line number Diff line change
@@ -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";
Expand Down
Original file line number Diff line number Diff line change
@@ -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";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
2 changes: 1 addition & 1 deletion surfsense_web/app/dashboard/api-key/api-key-client.tsx
Original file line number Diff line number Diff line change
@@ -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";
Expand Down
2 changes: 1 addition & 1 deletion surfsense_web/app/dashboard/page.tsx
Original file line number Diff line number Diff line change
@@ -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";
Expand Down
2 changes: 1 addition & 1 deletion surfsense_web/app/dashboard/searchspaces/page.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
"use client";

import { motion } from "framer-motion";
import { motion } from "motion/react";
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion | 🟠 Major

🧩 Analysis chain

Verify the motion/react import path.

The import has been changed from framer-motion to motion/react. According to the retrieved learnings, framer-motion is the official animation library for React, and "motion" as a standalone package is not a widely-adopted separate package. This import path may be incorrect or may reference an unofficial fork.

Please verify this import path change by checking:

  1. Whether motion/react is a valid export from an installed package
  2. If this is part of an intentional migration to a different package

🏁 Script executed:

#!/bin/bash
# Verify the motion/react import and package installation

echo "=== Checking package.json for motion-related dependencies ==="
cat package.json | jq '.dependencies, .devDependencies' | grep -i motion

echo -e "\n=== Checking if motion is a separate package or export from framer-motion ==="
# Check package-lock or yarn.lock for motion package
if [ -f package-lock.json ]; then
  cat package-lock.json | jq '.packages | keys[]' | grep motion || echo "No motion package found in package-lock.json"
elif [ -f yarn.lock ]; then
  grep '"motion@' yarn.lock || echo "No motion package found in yarn.lock"
fi

echo -e "\n=== Searching for other files using motion/react ==="
rg -l "from ['\"]motion/react['\"]" --type ts --type tsx || echo "No other files found"

echo -e "\n=== Searching for files still using framer-motion ==="
rg -l "from ['\"]framer-motion['\"]" --type ts --type tsx | head -5 || echo "No files using framer-motion found"

Length of output: 371


🏁 Script executed:

#!/bin/bash
# Locate all package.json and lock files within 4 directory levels
echo "=== Found package.json files ==="
fd --max-depth 4 package.json -t f

echo -e "\n=== Found lock files ==="
fd --max-depth 4 package-lock.json -t f
fd --max-depth 4 yarn.lock -t f
fd --max-depth 4 pnpm-lock.yaml -t f

# For each package.json found, print the dependencies section
for f in $(fd --max-depth 4 package.json -t f); do
  echo -e "\n=== Dependencies in $f ==="
  jq '.dependencies, .devDependencies' "$f"
done

Length of output: 3875


🏁 Script executed:

#!/bin/bash
# Search for framer-motion imports in surfsense_web
rg -g '*.tsx' -n "from ['\"]framer-motion['\"]" surfsense_web || echo "No framer-motion imports found"
rg -g '*.ts'  -n "from ['\"]framer-motion['\"]" surfsense_web || echo "No framer-motion imports found"

echo "------"

# Search for motion/react imports in surfsense_web
rg -g '*.tsx' -n "from ['\"]motion/react['\"]" surfsense_web || echo "No motion/react imports found"
rg -g '*.ts'  -n "from ['\"]motion/react['\"]" surfsense_web || echo "No motion/react imports found"

Length of output: 5516


Unify animation imports: Replace the lone import { motion } from "framer-motion" in surfsense_web/components/pricing.tsx with import { motion } from "motion/react", and remove the framer-motion dependency if it’s no longer used.

🤖 Prompt for AI Agents
In surfsense_web/app/dashboard/searchspaces/page.tsx around line 3, the project
is standardizing on the "motion" package; update any remaining imports of motion
from "framer-motion" (specifically in surfsense_web/components/pricing.tsx) to
use import { motion } from "motion/react" instead, then run a project-wide
search to confirm no other files import from "framer-motion" and if none remain
remove the framer-motion dependency from package.json and lockfile and run
npm/yarn install to update dependencies.

import { useRouter } from "next/navigation";
import { toast } from "sonner";
import { SearchSpaceForm } from "@/components/search-space-form";
Expand Down
6 changes: 6 additions & 0 deletions surfsense_web/app/db/index.ts
Original file line number Diff line number Diff line change
@@ -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 });
Comment on lines +5 to +6
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

Add validation for DATABASE_URL to prevent runtime crashes.

The non-null assertion on process.env.DATABASE_URL! will cause a runtime error if the environment variable is missing. Since the contact form is marked as OPTIONAL in the .env.example, the database setup should gracefully handle missing configuration.

Apply this diff to add proper validation:

+if (!process.env.DATABASE_URL) {
+  throw new Error(
+    'DATABASE_URL is not defined. Please set it in your .env file or disable the contact form feature.'
+  );
+}
+
 const client = postgres(process.env.DATABASE_URL);
 export const db = drizzle({ client, schema });

Additionally, consider connection pool configuration for production:

-const client = postgres(process.env.DATABASE_URL);
+const client = postgres(process.env.DATABASE_URL, {
+  max: 10, // Maximum pool size
+  idle_timeout: 20, // Close idle connections after 20s
+  connect_timeout: 10, // Connection timeout in seconds
+});

Committable suggestion skipped: line range outside the PR's diff.

🤖 Prompt for AI Agents
In surfsense_web/app/db/index.ts around lines 5-6, the code uses a non-null
assertion on process.env.DATABASE_URL which will throw at runtime if the
variable is missing; update the file to validate DATABASE_URL before creating
the client: check if process.env.DATABASE_URL is present and either (a) throw a
clear, descriptive error with guidance when the app requires a DB, or (b) export
a no-op/mock db or undefined so the rest of the app can run when the database is
optional; if creating a client, pass configuration options instead of the raw
string and include connection pool settings (max connections, idle timeout)
suitable for production, and ensure exported db is typed to reflect the possible
undefined/no-op state so callers handle it safely.

9 changes: 9 additions & 0 deletions surfsense_web/app/db/schema.ts
Original file line number Diff line number Diff line change
@@ -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(),
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Remove the unique constraint on contact emails

Line [6]: Marking email as .unique() means a second submission from the same address will violate the constraint and your /api/contact handler will fail with a duplicate key error instead of accepting the new message. Contact forms usually allow repeat outreach, so please drop the uniqueness constraint (or model submissions in a separate table keyed by their own id). Apply this diff to unblock repeat submissions:

-	email: varchar({ length: 255 }).notNull().unique(),
+	email: varchar({ length: 255 }).notNull(),
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
email: varchar({ length: 255 }).notNull().unique(),
email: varchar({ length: 255 }).notNull(),
🤖 Prompt for AI Agents
In surfsense_web/app/db/schema.ts around line 6, the email column is marked
.unique() which prevents repeat submissions; remove the .unique() call from the
email field definition (or alternatively model contact submissions in their own
table with a separate primary id) so multiple messages from the same address are
allowed and duplicate-key errors are avoided by the /api/contact handler.

company: varchar({ length: 255 }).notNull(),
message: text().default(""),
});
2 changes: 1 addition & 1 deletion surfsense_web/app/login/GoogleLoginButton.tsx
Original file line number Diff line number Diff line change
@@ -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";

Expand Down
2 changes: 1 addition & 1 deletion surfsense_web/app/login/LocalLoginForm.tsx
Original file line number Diff line number Diff line change
@@ -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";
Expand Down
2 changes: 1 addition & 1 deletion surfsense_web/app/login/page.tsx
Original file line number Diff line number Diff line change
@@ -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";
Expand Down
2 changes: 1 addition & 1 deletion surfsense_web/app/onboard/page.tsx
Original file line number Diff line number Diff line change
@@ -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";
Expand Down
12 changes: 12 additions & 0 deletions surfsense_web/app/pricing/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import React from 'react'
import PricingBasic from '@/components/pricing/pricing-section'

const page = () => {
return (
<div>
<PricingBasic />
</div>
)
}

export default page
Loading
Loading