From e92b0fdd97c1cb531d7054c02d8ed898f5510c48 Mon Sep 17 00:00:00 2001 From: msukkari Date: Tue, 4 Mar 2025 13:59:48 -0800 Subject: [PATCH 1/4] add terms and security to footer --- packages/web/src/app/[domain]/page.tsx | 2 +- packages/web/src/app/[domain]/repos/page.tsx | 2 +- .../app/{[domain] => }/components/footer.tsx | 4 +- packages/web/src/app/login/page.tsx | 41 +++---- packages/web/src/app/login/verify/page.tsx | 100 +++++++++--------- 5 files changed, 80 insertions(+), 69 deletions(-) rename packages/web/src/app/{[domain] => }/components/footer.tsx (66%) 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/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 + +

+
+
) } From e7036e65c5fa84a3dfa4857e86eeed06e5c3b46c Mon Sep 17 00:00:00 2001 From: msukkari Date: Tue, 4 Mar 2025 14:47:59 -0800 Subject: [PATCH 2/4] add security card --- .../web/src/app/[domain]/onboard/page.tsx | 3 + .../web/src/app/components/securityCard.tsx | 82 +++++++++++++++++++ 2 files changed, 85 insertions(+) create mode 100644 packages/web/src/app/components/securityCard.tsx diff --git a/packages/web/src/app/[domain]/onboard/page.tsx b/packages/web/src/app/[domain]/onboard/page.tsx index 806dcfad..3651ffb1 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 @@ -55,6 +57,7 @@ export default async function Onboard({ params, searchParams }: OnboardProps) { + )} {step === OnboardingSteps.InviteTeam && ( diff --git a/packages/web/src/app/components/securityCard.tsx b/packages/web/src/app/components/securityCard.tsx new file mode 100644 index 00000000..1cf9b2a7 --- /dev/null +++ b/packages/web/src/app/components/securityCard.tsx @@ -0,0 +1,82 @@ +"use client" + +import Link from "next/link" +import { Shield, Lock, CheckCircle, ExternalLink, Mail } from "lucide-react" + +export default function SecurityCard() { + return ( +
+
+
+ +
+

Multi-Layered Security

+

+ Your code and secrets are protected through comprehensive security measures. We implement robust encryption, + secure storage, and strict access controls to safeguard your data at every step. +

+ +
+
+ + + 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 fully open-source, and is trusted by thousands of developers + + + + + + +
+
+
+
+ +
+ Have questions? + + + Get in touch + +
+ + + + Learn about our security measures + +
+
+ ) +} + From 9f4c293a2c99dcc8daf0afb2f9fffa0ae5e197d5 Mon Sep 17 00:00:00 2001 From: msukkari Date: Tue, 4 Mar 2025 15:09:24 -0800 Subject: [PATCH 3/4] add demo card --- .../[domain]/onboard/components/demoCard.tsx | 39 +++++++++++++++++++ .../web/src/app/components/securityCard.tsx | 4 ++ .../src/app/login/components/loginForm.tsx | 5 ++- packages/web/src/lib/posthogEvents.ts | 4 ++ 4 files changed, 51 insertions(+), 1 deletion(-) create mode 100644 packages/web/src/app/[domain]/onboard/components/demoCard.tsx 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/components/securityCard.tsx b/packages/web/src/app/components/securityCard.tsx index 1cf9b2a7..d9f1bb18 100644 --- a/packages/web/src/app/components/securityCard.tsx +++ b/packages/web/src/app/components/securityCard.tsx @@ -2,8 +2,11 @@ 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 (
@@ -71,6 +74,7 @@ export default function SecurityCard() { href="https://sourcebot.dev/security" target="_blank" className="inline-flex items-center justify-center px-5 py-2.5 rounded-md bg-backgroundSecondary border border-[#1E2A3A] text-foreground hover:bg-backgroundSecondary/80 transition-colors" + onClick={() => 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/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 From a88bce9cc366fafe10d7115048a1a28b26276576 Mon Sep 17 00:00:00 2001 From: msukkari Date: Tue, 4 Mar 2025 15:19:40 -0800 Subject: [PATCH 4/4] fix copy and nits --- .../src/app/[domain]/onboard/components/connectCodeHost.tsx | 6 +++++- packages/web/src/app/[domain]/onboard/page.tsx | 1 - packages/web/src/app/components/securityCard.tsx | 6 +++--- 3 files changed, 8 insertions(+), 5 deletions(-) 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/page.tsx b/packages/web/src/app/[domain]/onboard/page.tsx index 3651ffb1..989a4220 100644 --- a/packages/web/src/app/[domain]/onboard/page.tsx +++ b/packages/web/src/app/[domain]/onboard/page.tsx @@ -57,7 +57,6 @@ export default async function Onboard({ params, searchParams }: OnboardProps) { - )} {step === OnboardingSteps.InviteTeam && ( diff --git a/packages/web/src/app/components/securityCard.tsx b/packages/web/src/app/components/securityCard.tsx index d9f1bb18..453573f5 100644 --- a/packages/web/src/app/components/securityCard.tsx +++ b/packages/web/src/app/components/securityCard.tsx @@ -15,8 +15,8 @@ export default function SecurityCard() {

Multi-Layered Security

- Your code and secrets are protected through comprehensive security measures. We implement robust encryption, - secure storage, and strict access controls to safeguard your data at every step. + We take the security and privacy of your data seriously. All code and secret tokens you provide are protected + using multiple layers of security.

@@ -38,7 +38,7 @@ export default function SecurityCard() {
- Sourcebot is fully open-source, and is trusted by thousands of developers + Sourcebot is open-source and trusted by thousands of developers