diff --git a/apps/api/package.json b/apps/api/package.json index 628886a5..0c6722ac 100644 --- a/apps/api/package.json +++ b/apps/api/package.json @@ -38,5 +38,8 @@ "superjson": "^2.2.5", "zeptomail": "^6.2.1", "zod": "^4.1.9" + }, + "prisma": { + "seed": "tsx prisma/seed.ts" } } diff --git a/apps/api/prisma/seed.ts b/apps/api/prisma/seed.ts new file mode 100644 index 00000000..1f6b186c --- /dev/null +++ b/apps/api/prisma/seed.ts @@ -0,0 +1,130 @@ +import { PrismaClient } from '@prisma/client'; + +const MILLIS_PER_YEAR = 365 * 24 * 60 * 60 * 1000; + +const prisma = new PrismaClient(); + +async function main() { + console.log('🌱 Starting database seed...'); + + // Clear existing data (optional - only if you want fresh data each time) + // Uncomment if you want to reset data on each seed + // await prisma.payment.deleteMany(); + // await prisma.subscription.deleteMany(); + // await prisma.account.deleteMany(); + // await prisma.user.deleteMany(); + // await prisma.plan.deleteMany(); + + // Create test plan (1 rupee test plan) + const testPlan = await prisma.plan.upsert({ + where: { id: '385b8215-d70f-473e-81c9-68a673c0d2fc-test' }, + update: {}, + create: { + id: '385b8215-d70f-473e-81c9-68a673c0d2fc-test', + name: 'Test Plan', + interval: 'yearly', + price: 100, // 1 rupee in paise + currency: 'INR', + }, + }); + console.log('✅ Created test plan:', testPlan.id); + + // Create test user + const testUser = await prisma.user.upsert({ + where: { email: 'test@example.com' }, + update: {}, + create: { + email: 'test@example.com', + firstName: 'Test User', + authMethod: 'google', + }, + }); + console.log('✅ Created test user:', testUser.email); + + // Create test user with premium subscription + const premiumUser = await prisma.user.upsert({ + where: { email: 'premium@example.com' }, + update: {}, + create: { + email: 'premium@example.com', + firstName: 'Premium User', + authMethod: 'github', + }, + }); + console.log('✅ Created premium user:', premiumUser.email); + + // Create premium subscription for premium user + const existingSubscription = await prisma.subscription.findFirst({ + where: { + userId: premiumUser.id, + }, + }); + + const premiumSubscription = existingSubscription + ? await prisma.subscription.update({ + where: { id: existingSubscription.id }, + data: { + planId: testPlan.id, + status: 'active', + startDate: new Date(), + endDate: new Date(Date.now() + MILLIS_PER_YEAR), // 1 year from now + autoRenew: true, + }, + }) + : await prisma.subscription.create({ + data: { + userId: premiumUser.id, + planId: testPlan.id, + status: 'active', + startDate: new Date(), + endDate: new Date(Date.now() + MILLIS_PER_YEAR), // 1 year from now + autoRenew: true, + }, + }); + console.log('✅ Created/updated premium subscription'); + + // Create test payment + const testPayment = await prisma.payment.upsert({ + where: { + razorpayPaymentId: 'pay_test_123456789', + }, + update: {}, + create: { + userId: premiumUser.id, + subscriptionId: premiumSubscription.id, + razorpayPaymentId: 'pay_test_123456789', + razorpayOrderId: 'order_test_123456789', + amount: 100, // 1 rupee in paise + currency: 'INR', + status: 'captured', + }, + }); + console.log('✅ Created test payment'); + + // Create QueryCount if it doesn't exist + try { + await prisma.queryCount.upsert({ + where: { id: 1 }, + update: {}, + create: { + id: 1, + total_queries: BigInt(2212), + }, + }); + console.log('✅ Created QueryCount'); + } catch (error) { + console.log('⚠️ QueryCount already exists or error:', error); + } + + console.log('✅ Database seed completed successfully!'); +} + +main() + .catch((e) => { + console.error('❌ Error seeding database:', e); + process.exit(1); + }) + .finally(async () => { + await prisma.$disconnect(); + }); + diff --git a/apps/api/tsconfig.json b/apps/api/tsconfig.json index 977def00..aa78dc6f 100644 --- a/apps/api/tsconfig.json +++ b/apps/api/tsconfig.json @@ -39,5 +39,13 @@ "noUncheckedSideEffectImports": true, "moduleDetection": "force", "skipLibCheck": true, - } + }, + "include": [ + "src/**/*" + ], + "exclude": [ + "prisma", + "node_modules", + "dist" + ] } diff --git a/apps/docs/package.json b/apps/docs/package.json index 6c96c0e9..85b96abd 100644 --- a/apps/docs/package.json +++ b/apps/docs/package.json @@ -10,7 +10,7 @@ }, "dependencies": { "@repo/ui": "workspace:*", - "next": "14.2.15", + "next": "14.2.35", "react": "18.3.1", "react-dom": "18.3.1" }, @@ -21,7 +21,7 @@ "@types/react": "^18", "@types/react-dom": "^18", "eslint": "^8", - "eslint-config-next": "14.2.6", + "eslint-config-next": "14.2.35", "typescript": "^5" } } diff --git a/apps/web/package.json b/apps/web/package.json index aaa18cbc..c302d2b6 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -30,7 +30,7 @@ "gray-matter": "^4.0.3", "lucide-react": "^0.456.0", "marked": "^17.0.0", - "next": "16.0.7", + "next": "16.0.10", "next-auth": "^4.24.11", "next-themes": "^0.4.3", "posthog-js": "^1.203.1", @@ -53,7 +53,7 @@ "@types/sanitize-html": "^2.16.0", "depcheck": "^1.4.7", "eslint": "^8", - "eslint-config-next": "16.0.7", + "eslint-config-next": "16.0.10", "postcss": "^8", "prettier": "^3.4.1", "tailwindcss": "^3.4.1", diff --git a/apps/web/src/app/(main)/(landing)/pitch/page.tsx b/apps/web/src/app/(main)/(landing)/pitch/page.tsx index 21b82b72..032949c5 100644 --- a/apps/web/src/app/(main)/(landing)/pitch/page.tsx +++ b/apps/web/src/app/(main)/(landing)/pitch/page.tsx @@ -106,7 +106,10 @@ const Pitch = () => { }} className="max-w-4xl mx-auto space-y-4" > -

+

mission statement

@@ -134,7 +137,10 @@ const Pitch = () => { }} className="max-w-4xl mx-auto space-y-6" > -

+

my goal

@@ -190,7 +196,10 @@ const Pitch = () => { }} className="max-w-4xl mx-auto space-y-6" > -

+

the plan

@@ -258,13 +267,19 @@ const Pitch = () => { }} className="max-w-4xl mx-auto space-y-8" > -

+

philosophies i follow

{/* Philosophy #1 */}
-

+

#1 stay small. stay effective.

@@ -303,9 +318,9 @@ const Pitch = () => {

- if i go with this approach, i'll have to sacrifice those - fancy dreams of raising millions, being on the front - page of magazines, having millions of users, etc. + if i go with this approach, i'll have to sacrifice + those fancy dreams of raising millions, being on the + front page of magazines, having millions of users, etc.



but the good part is i'll be able to stay genuine @@ -341,7 +356,10 @@ const Pitch = () => { {/* Philosophy #2 */}

-

+

#2 go beyond what you promise.

@@ -374,7 +392,10 @@ const Pitch = () => { }} className="max-w-4xl mx-auto space-y-6" > -

+

so how small?

@@ -425,7 +446,10 @@ const Pitch = () => { }} className="max-w-4xl mx-auto space-y-6" > -

+

what existing investors said about me?

@@ -458,13 +482,19 @@ const Pitch = () => { }} className="max-w-4xl mx-auto space-y-8" > -

+

questions you may have

-

+

i'm not an absolute beginner, so how does subscribing to opensox.ai make sense to me?

@@ -485,7 +515,10 @@ const Pitch = () => {
-

+

will the quality of your service reduce as you grow?

@@ -496,7 +529,10 @@ const Pitch = () => {

-

+

how does opensox.ai pro help me?

    @@ -555,7 +591,10 @@ const Pitch = () => {
-

+

how much time does it take to get the results?

@@ -572,7 +611,10 @@ const Pitch = () => {

-

+

why should i trust you?

@@ -599,7 +641,10 @@ const Pitch = () => {

-

+

are there any alternatives to what you provide?

@@ -611,7 +656,10 @@ const Pitch = () => {

-

+

what's the difference between opensox pro and a course?

@@ -624,7 +672,10 @@ const Pitch = () => {
-

+

is it for an absolute beginner?

@@ -633,7 +684,10 @@ const Pitch = () => {

-

+

in what cases shouldn't i invest in opensox pro?

@@ -649,7 +703,7 @@ const Pitch = () => {

  • - you don't wanna do it fast + you don't wanna do it fast
  • @@ -663,7 +717,10 @@ const Pitch = () => {
  • -

    +

    are you the best in the market?

    @@ -715,6 +772,7 @@ const Pitch = () => { buttonText="Invest" buttonClassName="w-full max-w-md" callbackUrl={callbackUrl} + buttonLocation="pitch_page" /> ) : ( diff --git a/apps/web/src/app/(main)/(landing)/pricing/_components/AnimatedFeaturesSection.tsx b/apps/web/src/app/(main)/(landing)/pricing/_components/AnimatedFeaturesSection.tsx new file mode 100644 index 00000000..c67e7a46 --- /dev/null +++ b/apps/web/src/app/(main)/(landing)/pricing/_components/AnimatedFeaturesSection.tsx @@ -0,0 +1,92 @@ +"use client"; +import { motion } from "framer-motion"; +import { CornerDownRightIcon } from "./icons"; +import { ActiveTag } from "@/components/ui/ActiveTag"; +import { Feature } from "./types"; +import { useInViewAnimation } from "@/hooks/useInViewAnimation"; + +interface AnimatedFeaturesSectionProps { + features: Feature[]; +} + +export function AnimatedFeaturesSection({ + features, +}: AnimatedFeaturesSectionProps) { + const [containerRef, inView] = useInViewAnimation({ threshold: 0.1 }); + + return ( +

    +
    + + What is Opensox 2.0? + +
    + +
    +
      + {features.map((feature, index) => ( + +
      +
      + + {index + 1} + +
      +

      {feature.title}

      + {feature.title === "OX Newsletter" && ( + + )} +
      +
      + + {Array.isArray(feature.description) ? ( +
      + {feature.description.map((sentence, sentenceIndex) => ( +

      + {sentence} +

      + ))} +
      + ) : ( +

      {feature.description}

      + )} + +
        + {feature.features.map((f, i) => ( +
      • + + {f} +
      • + ))} +
      +
      +
      + ))} +
    +
    +
    + ); +} diff --git a/apps/web/src/app/(main)/(landing)/pricing/_components/components.tsx b/apps/web/src/app/(main)/(landing)/pricing/_components/components.tsx new file mode 100644 index 00000000..fd022abc --- /dev/null +++ b/apps/web/src/app/(main)/(landing)/pricing/_components/components.tsx @@ -0,0 +1,356 @@ +"use client"; +import { motion } from "framer-motion"; +import { TargetIcon, CheckIcon, TerminalIcon } from "./icons"; +import Image from "next/image"; +import Link from "next/link"; +import { useInViewAnimation } from "@/hooks/useInViewAnimation"; +import { HeaderStatic } from "@/components/ui/HeaderStatic"; +import { CustomButtonStatic } from "@/components/ui/CustomButtonStatic"; +import { ActiveTag } from "@/components/ui/ActiveTag"; +import { LazyPaymentFlow } from "@/components/payment/LazyPaymentFlow"; +import { freePlanCard, premiumPlanCard, testimonials } from "./data"; + +interface PremiumTestimonialCardProps { + username?: string; + showPremium?: boolean; +} + +const PremiumTestimonialCard = ({ + username = "Username", + showPremium = true, +}: PremiumTestimonialCardProps) => { + return ( +
    +

    {username}

    + {showPremium && ( +
    +

    Opensox Pro

    +
    + )} +
    + ); +}; + +interface WhySubItem { + content: string; +} + +interface AnimatedWhySectionProps { + whySub: WhySubItem[]; +} + +export function AnimatedWhySection({ whySub }: AnimatedWhySectionProps) { + const [containerRef, inView] = useInViewAnimation({ threshold: 0.2 }); + + return ( +
    +
    + + Why should you subscribe to Opensox Pro now? + +
    +
    +
    + {whySub.map((sub, index) => ( + + + {sub.content} + + ))} +
    +
    +
    + ); +} + +interface PricingCardsSectionProps { + planIdOk: boolean; + premiumPlanId?: string; +} + +export const PricingCardsSection = ({ + planIdOk, + premiumPlanId, +}: PricingCardsSectionProps) => { + return ( +
    +
    + {/* Background image - concentrated glow */} +
    + background +
    + +
    + + +
    +
    +
    + ); +}; + +export const FreePlanCard = () => { + return ( +
    +
    +
    +
    + +
    +
    + Opensox logo +
    +
    + +
    +

    + Free +

    +
    + +
    + + + Get Started + +
    + +
    +

    + What you get immediately: +

    +
    + {freePlanCard.whatYouGetImmediately.map((item, index) => ( +

    + {" "} + {item} +

    + ))} +
    +
    + +
    +

    + What you get after the launch: +

    +
    + {freePlanCard.whatYouGetAfterLaunch.map((item, index) => ( +

    + {" "} + {item} +

    + ))} +
    +
    +
    +
    +
    +
    +
    + ); +}; + +interface ProPlanCardProps { + planIdOk: boolean; + premiumPlanId?: string; +} + +export const ProPlanCard = ({ planIdOk, premiumPlanId }: ProPlanCardProps) => { + const callbackUrl = "/pricing#pro-price-card"; + + return ( +
    +
    +
    +
    + +
    +
    + Opensox logo +
    +
    + +
    +
    +

    + $49{" "} + + $69 + {" "} + / year +

    +
    +
    +

    (~ ₹4,410 INR)

    + + Discounted till 10 December + +
    +
    + +
    + {/* Lazy-loaded payment flow */} + + +
    + + still not sure? read my pitch to you. + +
    +
    + +
    +

    + What you get immediately: +

    +
    + {premiumPlanCard.whatYouGetImmediately.map((item, index) => ( +

    + {" "} + {item} +

    + ))} +
    +
    + +
    +

    + What you get after the launch: +

    +
    + {premiumPlanCard.whatYouGetAfterLaunch.map((item, index) => ( +

    + {" "} + {item} + {item === "Pro newsletter" && } +

    + ))} +
    +
    +
    +
    +
    +
    +
    + ); +}; + +// Testimonials Section +export const TestimonialsSection = () => { + const groupedTestimonials = { + 1: testimonials.filter((t) => t.column === 1), + 2: testimonials.filter((t) => t.column === 2), + 3: testimonials.filter((t) => t.column === 3), + }; + + return ( +
    + +
    +
    + {groupedTestimonials[1].map((testimonial) => ( +
    + +
    + {testimonial.content} +
    +
    + ))} +
    + +
    + {groupedTestimonials[2].map((testimonial) => ( +
    + +
    + {testimonial.content} +
    +
    + ))} +
    + +
    + {groupedTestimonials[3].map((testimonial) => ( +
    + +
    + {testimonial.content} +
    +
    + ))} +
    +
    +
    + ); +}; diff --git a/apps/web/src/app/(main)/(landing)/pricing/_components/data.tsx b/apps/web/src/app/(main)/(landing)/pricing/_components/data.tsx new file mode 100644 index 00000000..9af69afd --- /dev/null +++ b/apps/web/src/app/(main)/(landing)/pricing/_components/data.tsx @@ -0,0 +1,185 @@ +import { Feature } from "./types"; + +export const opensoxFeatures: Feature[] = [ + { + id: 1, + title: "Opensox Advanced search tool", + description: + "One and only tool in the market that let you find open source with blizzing speed and scary accuracy. It will have:", + features: [ + "Faster and accurate search of projects", + "Higher accuracy (so that you exactly land on your dream open source project)", + "Advanced filters like, GSOC, YC, funding, hire contributors, trending, niche (like AI, Core ML, Web3, MERN), bounties, and many more.", + ], + }, + { + id: 2, + title: "OX Newsletter", + description: + "A newsletter that keeps you ahead in open source world. It will cover:", + features: [ + "Jobs/internships in opensource projects/companies", + "Funding news", + "What's trending in open source ecosystem", + "Upcoming trends", + "Tips to ace in open source", + "What's happening in open source companies?", + ], + }, + { + id: 3, + title: "30 days Opensox challenge sheet", + description: [ + "A comprehensive sheet of 30+ modules along with detailed videos to give you a clear path to start rocking in open source.", + "It will contain videos, resouces and hand made docs.", + <> + In each of the 30 steps, you will learn, then apply, If stuck, + we & apos; ll help and then we& apos;ll do an accountability check.{" "} + + Check here. + + , + ], + features: [], + }, +]; + +export const whySub = [ + { + content: + "Currently, Opensox 2.0 is in progress (70% done) so till the launch, we are offering Pro plan at a discounted price - $49 for the whole year", + }, + { + content: + "This offer is only available for the first 1000 (64 slots booked) users", + }, + { + content: + "After the launch, this $49 offer be removed and Opensox Pro will be around ~ $120 for whole year ($10/mo.)", + }, + { + content: "The price of the dollar is constantly increasing.", + }, +]; + +export const freePlanCard = { + whatYouGetImmediately: [ + "Free filters to search projects (tech stack, competition, activity, etc)", + "Access to the general community", + ], + whatYouGetAfterLaunch: [ + "Everything mentioned above", + "30 days opensox challenge sheet", + ], +}; + +export const premiumPlanCard = { + whatYouGetImmediately: [ + "Everything in free plan +", + "1:1 session on finding remote jobs and internships in open-source companies.", + "Quick doubts resolution.", + "Personalized guidance for GSoC, LFX, Outreachy, etc", + "Access to Pro Slack where you can ask anything anytime.", + "Support to enhance skills for open source", + "GSOC proposal, resume reviews, etc.", + "Upcoming Pro features", + ], + whatYouGetAfterLaunch: [ + "Everything mentioned above", + "Advanced tool with Pro filters to find open source projects", + "Pro newsletter", + "30 days opensox challenge sheet", + "Upcoming Pro features.", + ], +}; + +export const testimonials = [ + { + id: 1, + username: "Tarun Parmar", + content: + "Getting the Opensox Pro Subscription has been such a game-changer for me. I really like the personal touch in the way the team guides you-it feels like someone is genuinely there to help you navigate. It gave me the initial push I needed and made it so much easier to cut through all the chaos and focus on the right and simple steps. The best part is, it helps you start your open source journey quickly and I know I can reach out to the team anytime. Honestly, it's been an awesome experience so far!", + column: 1, + }, + { + id: 2, + username: "Daksh Yadav", + content: + "My experience with your guidance and opensox has been great. Your tips have really helped in doing my tasks quicker and better. And I would definitely recommend others to opt for opensox Pro.", + column: 1, + }, + { + id: 3, + username: "Rishabh R Pathak", + content: ( +
    +

    + Okay so there are a few things I genuinely value about OpenSox Pro, + and I& apos;ll focus on the core points because everything else is + just a natural extension of these. +

    + < ul className="list-disc space-y-3 pl-6" > +
  • + First, the pricing.To me, it & apos;s more than fair for the kind + of value on the table.In fact, I see it as something that can + yield long - term returns if you & apos;re serious about putting in + the work. +
  • +
  • + The onboarding call was one of the best parts.Spending 30 + + minutes just to understand where I stand, whether I & apos; m + starting out or already experienced and aligning the guidance with + my goals.That level of personalization is rare and it set the + tone right from the start. +
  • +
  • + Another thing l & apos;ve appreciated is the transparency.No + sugarcoating, no vague talk, you share real experiences, honest + opinions and advice that actually holds weight.That alone builds + credibility and trust. +
  • +
  • + And yeah, the support also goes beyond the program itself.Getting + advice on personal doubts and extra tips outside the set + curriculum(of course, sometimes, not always lol!). +
  • +
  • + The regular check - ins are also a huge plus.They help track + progress, keep me accountable, and ensure l & apos;m moving in the + right direction. +
  • +
  • + Overall, I & apos;d absolutely recommend OpenSox Pro to anyone + serious about open source.The personalized guidance is exactly + what most of us hope for, since everyone is at a different stage + of their journey. +
  • +
  • + A personal opinion btw:) My only hope is that the same quality + continues even as more people join and judging from what l & apos; ve + seen so far, I & apos;m confident it will. +
  • + +
    + ), + column: 2, + }, + { + id: 4, + username: "Mahadev Keshari", + content: "This is really awesome 👍🏼", + column: 3, + }, + { + id: 5, + username: "Satya Narayan", + content: + "Yes I would totally recommend it for anyone who is serious about getting into open source. We have discussed very insightful key methods that are very helpful for a beginner who has no prior experience to start contributing. You as an experienced open source developer and contributor have shared your learnings which come from experience to us which not only makes us understand the complexity of large codebases but gives us a kickstart over other candidates. Your personal guidance is precious and invaluable for us", + column: 3, + }, +]; diff --git a/apps/web/src/app/(main)/(landing)/pricing/_components/icons.tsx b/apps/web/src/app/(main)/(landing)/pricing/_components/icons.tsx new file mode 100644 index 00000000..f6d01a77 --- /dev/null +++ b/apps/web/src/app/(main)/(landing)/pricing/_components/icons.tsx @@ -0,0 +1,74 @@ +// Optimized inline SVG icons to replace lucide-react imports +// This eliminates the lucide-react bundle for these specific icons + +export const TargetIcon = ({ className }: { className?: string }) => ( + + + + + +); + +export const CheckIcon = ({ className, strokeWidth = 2 }: { className?: string; strokeWidth?: number }) => ( + + + +); + +export const TerminalIcon = ({ className }: { className?: string }) => ( + + + + +); + +export const CornerDownRightIcon = ({ className }: { className?: string }) => ( + + + + +); diff --git a/apps/web/src/app/(main)/(landing)/pricing/_components/types.ts b/apps/web/src/app/(main)/(landing)/pricing/_components/types.ts new file mode 100644 index 00000000..c7c11082 --- /dev/null +++ b/apps/web/src/app/(main)/(landing)/pricing/_components/types.ts @@ -0,0 +1,6 @@ +export interface Feature { + id: number; + title: string; + description: string | React.ReactNode[]; + features: string[]; +} diff --git a/apps/web/src/app/(main)/(landing)/pricing/page.tsx b/apps/web/src/app/(main)/(landing)/pricing/page.tsx index ac4feb70..ec8a4297 100644 --- a/apps/web/src/app/(main)/(landing)/pricing/page.tsx +++ b/apps/web/src/app/(main)/(landing)/pricing/page.tsx @@ -1,640 +1,53 @@ -"use client"; +import { HeaderStatic } from "@/components/ui/HeaderStatic"; import Footer from "@/components/landing-sections/footer"; -import Header from "@/components/ui/header"; -import { ShineBorder } from "@/components/ui/shine-borders"; -import { motion } from "framer-motion"; -import { Check, CornerDownRight, Target, Terminal } from "lucide-react"; -import Image from "next/image"; -import Link from "next/link"; -import React, { useEffect } from "react"; -import PrimaryButton from "@/components/ui/custom-button"; -import PaymentFlow from "@/components/payment/PaymentFlow"; -import { ActiveTag } from "@/components/ui/ActiveTag"; -import { usePathname } from "next/navigation"; -const opensoxFeatures = [ +import { HashScrollHandler } from "@/components/utils/HashScrollHandler"; +import { AnimatedFeaturesSection } from "./_components/AnimatedFeaturesSection"; +import { + AnimatedWhySection, + PricingCardsSection, +} from "./_components/components"; +import { opensoxFeatures, whySub } from "./_components/data"; +import dynamic from "next/dynamic"; + +// Lazy-load testimonials section (far below-the-fold) +const TestimonialsSection = dynamic( + () => import("./_components/components").then(mod => ({ default: mod.TestimonialsSection })), { - id: 1, - title: "Opensox Advanced search tool", - description: - "One and only tool in the market that let you find open source with blizzing speed and scary accuracy. It will have:", - features: [ - "Faster and accurate search of projects", - "Higher accuracy (so that you exactly land on your dream open source project)", - "Advanced filters like, GSOC, YC, funding, hire contributors, trending, niche (like AI, Core ML, Web3, MERN), bounties, and many more.", - ], - }, - { - id: 2, - title: "OX Newsletter", - description: - "A newsletter that keeps you ahead in open source world. It will cover:", - features: [ - "Jobs/internships in opensource projects/companies", - "Funding news", - "What's trending in open source ecosystem", - "Upcoming trends", - "Tips to ace in open source", - "What's happening in open source companies?", - ], - }, - { - id: 3, - title: "30 days Opensox challenge sheet", - description: [ - "A comprehensive sheet of 30+ modules along with detailed videos to give you a clear path to start rocking in open source.", - "It will contain videos, resouces and hand made docs.", - <> - In each of the 30 steps, you will learn, then apply, If stuck, - we'll help and then we'll do an accountability check.{" "} - - Check here. - - , - ], - features: [], - }, -]; + ssr: true, + loading: () =>
    + } +); -const whySub = [ - { - content: - "Currently, Opensox 2.0 is in progress (70% done) so till the launch, we are offering Pro plan at a discounted price - $49 for the whole year", - }, - { - content: - "This offer is only available for the first 1000 (64 slots booked) users", - }, - { - content: - "After the launch, this $49 offer be removed and Opensox Pro will be around ~ $120 for whole year ($10/mo.)", - }, - { - content: "The price of the dollar is constantly increasing.", - }, -]; - -const freePlanCard = { - whatYouGetImmediately: [ - "Free filters to search projects (tech stack, competition, activity, etc)", - "Access to the general community", - ], - whatYouGetAfterLaunch: [ - "Everything mentioned above", - "30 days opensox challenge sheet", - ], -}; - -const premiumPlanCard = { - whatYouGetImmediately: [ - "Everything in free plan +", - "1:1 session on finding remote jobs and internships in open-source companies.", - "Quick doubts resolution.", - "Personalized guidance for GSoC, LFX, Outreachy, etc", - "Access to Pro Slack where you can ask anything anytime.", - "Support to enhance skills for open source", - "GSOC proposal, resume reviews, etc.", - "Upcoming Pro features", - ], - whatYouGetAfterLaunch: [ - "Everything mentioned above", - "Advanced tool with Pro filters to find open source projects", - "Pro newsletter", - "30 days opensox challenge sheet", - "Upcoming Pro features.", - ], -}; - -const Pricing = () => { - const pathname = usePathname(); - const callbackUrl = `${pathname}#pro-price-card`; - - useEffect(() => { - if (window.location.hash === "#pro-price-card") { - const element = document.getElementById("pro-price-card"); - if (element) { - setTimeout(() => { - element.scrollIntoView({ behavior: "smooth", block: "start" }); - }, 100); - } - } - if (window.location.hash === "#testimonials") { - const element = document.getElementById("testimonials"); - if (element) { - setTimeout(() => { - element.scrollIntoView({ behavior: "smooth", block: "start" }); - }, 100); - } - } - }, []); +export default function PricingPage() { + const premiumPlanId = process.env.NEXT_PUBLIC_YEARLY_PREMIUM_PLAN_ID; + const planIdOk = + typeof premiumPlanId === "string" && premiumPlanId.length > 0; return ( <> -
    -
    -
    -
    -
    - - What is Opensox 2.0? - -
    -
    -
      - {opensoxFeatures.map((feature, index) => { - return ( - -
      -
      -
      - {index + 1} -
      -
      -

      - {feature.title} -

      - {feature.title === "OX Newsletter" && ( - - )} -
      -
      - {Array.isArray(feature.description) ? ( -
      - {feature.description.map( - (sentence, sentenceIndex) => ( -

      - {sentence} -

      - ) - )} -
      - ) : ( -

      {feature.description}

      - )} -
      -
      -
        - {feature.features.map((feature, index) => { - return ( -
      • - - {feature} -
      • - ); - })} -
      -
      -
      - ); - })} -
    -
    -
    -
    -
    - - Why should you subscribe to Opensox Pro now? - -
    -
    -
    - {whySub.map((sub, index) => { - return ( - - - {sub.content} - - ); - })} -
    -
    -
    -
    -
    -
    - background -
    -
    - - -
    -
    -
    + + + +
    + + +
    + + + -
    - For any doubts or queries, feel free to ping us at{" "} - - hi@opensox.ai - -