diff --git a/packages/web/src/app/[domain]/onboard/components/connectCodeHost.tsx b/packages/web/src/app/[domain]/onboard/components/connectCodeHost.tsx index b1598917..fb1bde50 100644 --- a/packages/web/src/app/[domain]/onboard/components/connectCodeHost.tsx +++ b/packages/web/src/app/[domain]/onboard/components/connectCodeHost.tsx @@ -17,6 +17,7 @@ import { CodeHostIconButton } from "../../components/codeHostIconButton"; import useCaptureEvent from "@/hooks/useCaptureEvent"; import { useSession } from "next-auth/react"; import posthog from "posthog-js"; +import SecurityCard from "@/app/components/securityCard"; interface ConnectCodeHostProps { nextStep: OnboardingSteps; @@ -48,7 +49,10 @@ export const ConnectCodeHost = ({ nextStep }: ConnectCodeHostProps) => { if (!selectedCodeHost) { return ( - + <> + + + ) } diff --git a/packages/web/src/app/[domain]/onboard/components/demoCard.tsx b/packages/web/src/app/[domain]/onboard/components/demoCard.tsx new file mode 100644 index 00000000..981f7bf4 --- /dev/null +++ b/packages/web/src/app/[domain]/onboard/components/demoCard.tsx @@ -0,0 +1,39 @@ +"use client" + +import { ExternalLink } from "lucide-react" +import Link from "next/link" + +import { Button } from "@/components/ui/button" +import { Card, CardContent } from "@/components/ui/card" +import useCaptureEvent from "@/hooks/useCaptureEvent" + +export default function DemoCard() { + const captureEvent = useCaptureEvent(); + + return ( + + +
+
+
+

New to Sourcebot?

+

Try our public demo before creating an account

+
+ + +
+
+
+
+ ) +} diff --git a/packages/web/src/app/[domain]/onboard/page.tsx b/packages/web/src/app/[domain]/onboard/page.tsx index 806dcfad..989a4220 100644 --- a/packages/web/src/app/[domain]/onboard/page.tsx +++ b/packages/web/src/app/[domain]/onboard/page.tsx @@ -7,6 +7,8 @@ import { InviteTeam } from "./components/inviteTeam"; import { CompleteOnboarding } from "./components/completeOnboarding"; import { Checkout } from "./components/checkout"; import { LogoutEscapeHatch } from "@/app/components/logoutEscapeHatch"; +import SecurityCard from "@/app/components/securityCard"; + interface OnboardProps { params: { domain: string diff --git a/packages/web/src/app/[domain]/page.tsx b/packages/web/src/app/[domain]/page.tsx index 5b374b1c..02a37787 100644 --- a/packages/web/src/app/[domain]/page.tsx +++ b/packages/web/src/app/[domain]/page.tsx @@ -5,7 +5,7 @@ import { UpgradeToast } from "./components/upgradeToast"; import Link from "next/link"; import { getOrgFromDomain } from "@/data/org"; import { PageNotFound } from "./components/pageNotFound"; -import { Footer } from "./components/footer"; +import { Footer } from "@/app/components/footer"; import { SourcebotLogo } from "../components/sourcebotLogo"; import { RepositorySnapshot } from "./components/repositorySnapshot"; import { KeyboardShortcutHint } from "./components/keyboardShortcutHint"; diff --git a/packages/web/src/app/[domain]/repos/page.tsx b/packages/web/src/app/[domain]/repos/page.tsx index 81b68a28..20da1248 100644 --- a/packages/web/src/app/[domain]/repos/page.tsx +++ b/packages/web/src/app/[domain]/repos/page.tsx @@ -13,7 +13,7 @@ export default async function ReposPage({ params: { domain } }: { params: { doma

Repositories

-
+
diff --git a/packages/web/src/app/[domain]/components/footer.tsx b/packages/web/src/app/components/footer.tsx similarity index 66% rename from packages/web/src/app/[domain]/components/footer.tsx rename to packages/web/src/app/components/footer.tsx index 8f084150..324fc9c8 100644 --- a/packages/web/src/app/[domain]/components/footer.tsx +++ b/packages/web/src/app/components/footer.tsx @@ -6,7 +6,9 @@ export function Footer() {
About - Support + Terms + + Security Contact Us
diff --git a/packages/web/src/app/components/securityCard.tsx b/packages/web/src/app/components/securityCard.tsx new file mode 100644 index 00000000..453573f5 --- /dev/null +++ b/packages/web/src/app/components/securityCard.tsx @@ -0,0 +1,86 @@ +"use client" + +import Link from "next/link" +import { Shield, Lock, CheckCircle, ExternalLink, Mail } from "lucide-react" +import useCaptureEvent from "@/hooks/useCaptureEvent" + +export default function SecurityCard() { + const captureEvent = useCaptureEvent(); + + return ( +
+
+
+ +
+

Multi-Layered Security

+

+ We take the security and privacy of your data seriously. All code and secret tokens you provide are protected + using multiple layers of security. +

+ +
+
+ + + All data is stored on Google Cloud Platform in the United States (us-west-1) + +
+ +
+ + + All data is encrypted in transit using TLS 1.2+, and at rest using AES-256 + +
+ +
+ +
+
+ Sourcebot is open-source and trusted by thousands of developers + + + + + + +
+
+
+
+ +
+ Have questions? + + + Get in touch + +
+ + captureEvent('wa_security_page_click', {})} + > + + Learn about our security measures + +
+
+ ) +} + diff --git a/packages/web/src/app/login/components/loginForm.tsx b/packages/web/src/app/login/components/loginForm.tsx index 3af17085..8f479d7a 100644 --- a/packages/web/src/app/login/components/loginForm.tsx +++ b/packages/web/src/app/login/components/loginForm.tsx @@ -12,7 +12,7 @@ import { CredentialsForm } from "./credentialsForm"; import { SourcebotLogo } from "@/app/components/sourcebotLogo"; import { TextSeparator } from "@/app/components/textSeparator"; import useCaptureEvent from "@/hooks/useCaptureEvent"; - +import DemoCard from "@/app/[domain]/onboard/components/demoCard"; interface LoginFormProps { callbackUrl?: string; error?: string; @@ -52,6 +52,9 @@ export const LoginForm = ({ callbackUrl, error, enabledMethods }: LoginFormProps />

Sign in to your account

+
+ +
{error && (
diff --git a/packages/web/src/app/login/page.tsx b/packages/web/src/app/login/page.tsx index 8723ea1a..f8b8b010 100644 --- a/packages/web/src/app/login/page.tsx +++ b/packages/web/src/app/login/page.tsx @@ -2,6 +2,8 @@ import { auth } from "@/auth"; import { LoginForm } from "./components/loginForm"; import { redirect } from "next/navigation"; import { getProviders } from "@/auth"; +import { Footer } from "@/app/components/footer"; + interface LoginProps { searchParams: { callbackUrl?: string; @@ -18,26 +20,29 @@ export default async function Login({ searchParams }: LoginProps) { const providers = getProviders(); const providerMap = providers .map((provider) => { - if (typeof provider === "function") { - const providerData = provider() - return { id: providerData.id, name: providerData.name } - } else { - return { id: provider.id, name: provider.name } - } - }); + if (typeof provider === "function") { + const providerData = provider() + return { id: providerData.id, name: providerData.name } + } else { + return { id: provider.id, name: provider.name } + } + }); return ( -
- provider.id === "github"), - google: providerMap.some(provider => provider.id === "google"), - magicLink: providerMap.some(provider => provider.id === "nodemailer"), - credentials: providerMap.some(provider => provider.id === "credentials"), - }} - /> +
+
+ provider.id === "github"), + google: providerMap.some(provider => provider.id === "google"), + magicLink: providerMap.some(provider => provider.id === "nodemailer"), + credentials: providerMap.some(provider => provider.id === "credentials"), + }} + /> +
+
) } diff --git a/packages/web/src/app/login/verify/page.tsx b/packages/web/src/app/login/verify/page.tsx index 2f1f59d2..8b1c3bc0 100644 --- a/packages/web/src/app/login/verify/page.tsx +++ b/packages/web/src/app/login/verify/page.tsx @@ -12,6 +12,7 @@ import { useCallback, useState, Suspense } from "react" import VerificationFailed from "./verificationFailed" import { SourcebotLogo } from "@/app/components/sourcebotLogo" import useCaptureEvent from "@/hooks/useCaptureEvent" +import { Footer } from "@/app/components/footer" function VerifyPageContent() { const [value, setValue] = useState("") @@ -41,58 +42,61 @@ function VerifyPageContent() { } return ( -
-
-
- -
- - - Verify your email - - Enter the 6-digit code we sent to {email} - - +
+
+
+
+ +
+ + + Verify your email + + Enter the 6-digit code we sent to {email} + + - -
{ - e.preventDefault() - handleSubmit() - }} className="space-y-6"> -
- - - - - - - - - - - - - -
-
-
+ +
{ + e.preventDefault() + handleSubmit() + }} className="space-y-6"> +
+ + + + + + + + + + + + + +
+
+
- - - -
-
-

- Having trouble?{" "} - - Contact support - -

+ + + + +
+

+ Having trouble?{" "} + + Contact support + +

+
+
) } diff --git a/packages/web/src/lib/posthogEvents.ts b/packages/web/src/lib/posthogEvents.ts index b71d460a..596c0d0d 100644 --- a/packages/web/src/lib/posthogEvents.ts +++ b/packages/web/src/lib/posthogEvents.ts @@ -238,6 +238,10 @@ export type PosthogEventMap = { wa_onboard_gitlab_selected: {}, wa_onboard_gitea_selected: {}, wa_onboard_gerrit_selected: {}, + ////////////////////////////////////////////////////////////////// + wa_security_page_click: {}, + ////////////////////////////////////////////////////////////////// + wa_demo_card_click: {}, } export type PosthogEvent = keyof PosthogEventMap; \ No newline at end of file