diff --git a/package.json b/package.json
index eaa9e5fe..38cc654c 100644
--- a/package.json
+++ b/package.json
@@ -40,6 +40,7 @@
"encoding": "^0.1.13",
"mailgun-js": "^0.22.0",
"markdown-pdf": "^11.0.0",
+ "marked-react": "^2.0.0",
"mustache": "^4.2.0",
"next": "13",
"rate-limiter-flexible": "^2.4.1",
diff --git a/src/components/Markdown.tsx b/src/components/Markdown.tsx
new file mode 100644
index 00000000..251ada2c
--- /dev/null
+++ b/src/components/Markdown.tsx
@@ -0,0 +1,7 @@
+import type { ReactNode } from "react";
+
+export const SpanRenderer = {
+ paragraph(children: ReactNode) {
+ return {children};
+ },
+};
diff --git a/src/components/Nav.module.css b/src/components/Nav.module.css
index 3bb58986..6f77fab5 100644
--- a/src/components/Nav.module.css
+++ b/src/components/Nav.module.css
@@ -27,6 +27,7 @@
}
.link {
+ color: inherit !important;
margin-left: 16px;
margin-right: 16px;
}
diff --git a/src/components/Nav.tsx b/src/components/Nav.tsx
index b8dd01ce..99f7f5f6 100644
--- a/src/components/Nav.tsx
+++ b/src/components/Nav.tsx
@@ -1,6 +1,4 @@
-/* eslint-disable @typescript-eslint/no-unsafe-assignment */
-
-import { Button, Link as GLink, Select, Spacer, Text } from "@geist-ui/react";
+import { Button, Select, Spacer, Text } from "@geist-ui/react";
import Image from "next/image";
import { useRouter } from "next/router";
import React from "react";
@@ -45,15 +43,15 @@ export function Nav(): React.ReactElement {
-
{d.nav.pricing}
-
+
-
{d.nav.help}
-
+
- }
- features={features}
- footer={
-
-
-
-
-
- Want a free trial before committing?
- Feel free to try self-hosting with the{" "}
-
- open-source guide
-
- , and subscribe once you're ready.
-
-
- }
- header={
-
- 🏠 Self-Hosted
-
- }
- subtitle={
-
- Unlimited email verifications / mo
-
- }
- />
- );
-}
-
-const features = [
-
- Unlimited{" "}
-
- full-featured
- {" "}
- email verifications.
- ,
-
- 💪 Bulk email verifications.{" "}
-
- Read more.
-
- ,
- No data sent back to Reacher.,
-
-
- Customer support via email/chat.
- ,
-
- See{" "}
-
- full terms and details
-
- .
- ,
-];
diff --git a/src/components/ProductCard/SaaS100k.tsx b/src/components/ProductCard/SaaS100k.tsx
deleted file mode 100644
index 91dbaf39..00000000
--- a/src/components/ProductCard/SaaS100k.tsx
+++ /dev/null
@@ -1,37 +0,0 @@
-import React from "react";
-import { Text } from "@geist-ui/react";
-import { ProductCard } from "./ProductCard";
-import type { ProductCardProps } from "./ProductCard";
-
-export function SaaS100k(props: ProductCardProps): React.ReactElement {
- return (
-
- ✨ New ✨
-
- }
- subtitle={100,000 email verifications / mo}
- />
- );
-}
-
-const features = [
- "Use Reacher's servers with high IP reputation.",
-
-
- Full-featured
- {" "}
- email verifications.
- ,
-
- Customer support via email/chat.
- ,
- "Cancel anytime.",
-];
diff --git a/src/components/ProductCard/SaaS10k.tsx b/src/components/ProductCard/SaaS10k.tsx
deleted file mode 100644
index c10cce4c..00000000
--- a/src/components/ProductCard/SaaS10k.tsx
+++ /dev/null
@@ -1,37 +0,0 @@
-import React from "react";
-import { Text } from "@geist-ui/react";
-import { ProductCard } from "./ProductCard";
-import type { ProductCardProps } from "./ProductCard";
-
-export function SaaS10k(props: ProductCardProps): React.ReactElement {
- return (
-
- For individuals
-
- }
- features={features}
- subtitle={10,000 email verifications / mo}
- />
- );
-}
-
-const features = [
- "Use Reacher's servers with high IP reputation.",
-
-
- Full-featured
- {" "}
- email verifications.
- ,
-
- Customer support via email/chat.
- ,
- "Cancel anytime.",
-];
diff --git a/src/dictionaries/en.json b/src/dictionaries/en.json
index fbd6f82c..d166ae71 100644
--- a/src/dictionaries/en.json
+++ b/src/dictionaries/en.json
@@ -36,5 +36,61 @@
"login": "Login",
"signup": "Sign up",
"logout": "Logout"
+ },
+ "pricing": {
+ "title": "Pricing",
+ "30d_money_back": "All plans include a 30-day money back guarantee.",
+ "commercial": {
+ "title": "Commercial License Plan",
+ "overtitle": "🏠 Self-Hosted",
+ "subtitle": "**Unlimited email** verifications / mo",
+ "price": "/mo",
+ "select_plan_cta": "Select plan",
+ "what_need_to_do": "What you need to do:",
+ "purchase_server": "Purchase servers yourself to self-host Reacher. [Read how](https://help.reacher.email/self-host-guide).",
+ "what_you_get": "What you get:",
+ "unlimited_emails": "**Unlimited** [full-featured]((https://help.reacher.email/email-attributes-inside-json)) email verifications.",
+ "bulk": "💪 **Bulk** email verifications. [Read more](https://help.reacher.email/bulk-email-verification).",
+ "no_data_reacher": "No data sent back to Reacher.",
+ "support": "**Customer support** by email/chat.",
+ "cancel": "Cancel anytime.",
+ "terms": "See [full terms and details](https://help.reacher.email/reacher-licenses).",
+ "free_trial": "Want a free trial before committing? Feel free to try self-hosting with the [open-source guide](https://help.reacher.email/self-host-guide), and subscribe once you're ready."
+ },
+ "saas10k": {
+ "title": "SaaS 10K Emails Plan",
+ "overtitle": "For individuals",
+ "subtitle": "10,000 email verifications / mo",
+ "price": "/mo",
+ "select_plan_cta": "Select plan",
+ "what_you_get": "What you get:",
+ "reacher_ip": "Use Reacher's servers with high IP reputation.",
+ "full_feature": "[Full-featured](https://help.reacher.email/email-attributes-inside-json) email verifications.",
+ "support": "**Customer support** by email/chat.",
+ "cancel": "Cancel anytime."
+ },
+ "saas100k": {
+ "title": "SaaS 100K Emails Plan",
+ "overtitle": "✨ New ✨",
+ "subtitle": "100,000 email verifications / mo",
+ "price": "/mo",
+ "select_plan_cta": "Select plan",
+ "what_you_get": "What you get:",
+ "reacher_ip": "Use Reacher's servers with high IP reputation.",
+ "full_feature": "[Full-featured](https://help.reacher.email/email-attributes-inside-json) email verifications.",
+ "support": "**Customer support** by email/chat.",
+ "cancel": "Cancel anytime."
+ },
+ "faq": {
+ "title": "Frequently Asked Questions",
+ "verify_1m_emails_q": "Can I verify 1 million (or more) emails?",
+ "verify_1m_emails_a": "If you need to verify 200K, 500K, or 1+ million emails, please check the **Commercial License Plan**. You will need to purchase your own servers separately and self-host Reacher.",
+ "refund_q": "What is your refund policy?",
+ "refund_a": "Sure. If you use Reacher and find that the verifications are slow or incorrect, I'll refund you the full amount if you email me [✉️ amaury@reacher.email](mailto:amaury@reacher.email) within 30 days of your subscription.",
+ "free_trial_q": "Do you offer a free trial?",
+ "free_trial_a": "If you are interested in the SaaS 10K or 100K plans, then no, Reacher does not offer any free trial. There is however a 30-day money back guarantee.\n\nIf you are interested in the Commercial License, you can follow the [self-host guide](https://help.reacher.email/self-host-guide) for a free trial.",
+ "another_q": "Have another question?",
+ "another_a": "Feel free to email me [✉️ amaury@reacher.email](mailto:amaury@reacher.email), I reply pretty fast."
+ }
}
}
diff --git a/src/dictionaries/fr.json b/src/dictionaries/fr.json
index a5704701..95715cd8 100644
--- a/src/dictionaries/fr.json
+++ b/src/dictionaries/fr.json
@@ -36,5 +36,61 @@
"login": "Se connecter",
"signup": "Créer un compte",
"logout": "Se déconnecter"
+ },
+ "pricing": {
+ "title": "Tarifs",
+ "30d_money_back": "Tous les plans incluent une garantie de remboursement sous 30 jours.",
+ "commercial": {
+ "title": "Licence Commerciale",
+ "overtitle": "🏠 Auto-hébergé",
+ "subtitle": "Vérifications **illimitées** d'emails",
+ "price": "/mo HT",
+ "select_plan_cta": "Choisir le plan",
+ "what_need_to_do": "Ce que vous devez faire :",
+ "purchase_server": "Achetez vous-même des serveurs pour auto-héberger Reacher. [Lisez comment](https://help.reacher.email/self-host-guide).",
+ "what_you_get": "Ce que vous obtenez :",
+ "unlimited_emails": "Vérifications d'emails **illimitées** [complètes]((https://help.reacher.email/email-attributes-inside-json)).",
+ "bulk": "💪 Vérifications d'emails **en masse**. [En savoir plus](https://help.reacher.email/bulk-email-verification).",
+ "no_data_reacher": "Aucune donnée renvoyée à Reacher.",
+ "support": "**Support client** par email/chat.",
+ "cancel": "Annulez à tout moment.",
+ "terms": "Voir [les conditions et détails complets](https://help.reacher.email/reacher-licenses).",
+ "free_trial": "Vous voulez un essai gratuit avant de vous engager ? N'hésitez pas à essayer l'auto-hébergement avec le [guide open-source](https://help.reacher.email/self-host-guide), et abonnez-vous une fois que vous êtes prêt."
+ },
+ "saas10k": {
+ "title": "Plan SaaS 10K Emails",
+ "overtitle": "Pour les particuliers",
+ "subtitle": "10 000 vérifications d'emails / mois",
+ "price": "/mo HT",
+ "select_plan_cta": "Choisir le plan",
+ "what_you_get": "Ce que vous obtenez :",
+ "reacher_ip": "Utilisez les serveurs de Reacher avec une haute réputation IP.",
+ "full_feature": "Vérifications d'emails [complètes](https://help.reacher.email/email-attributes-inside-json).",
+ "support": "**Support client** par email/chat.",
+ "cancel": "Annulez à tout moment."
+ },
+ "saas100k": {
+ "title": "Plan SaaS 100K Emails",
+ "overtitle": "✨ Nouveau ✨",
+ "subtitle": "100 000 vérifications d'emails / mois",
+ "price": "/mo HT",
+ "select_plan_cta": "Choisir le plan",
+ "what_you_get": "Ce que vous obtenez :",
+ "reacher_ip": "Utilisez les serveurs de Reacher avec une haute réputation IP.",
+ "full_feature": "Vérifications d'emails [complètes](https://help.reacher.email/email-attributes-inside-json).",
+ "support": "**Support client** par email/chat.",
+ "cancel": "Annulez à tout moment."
+ },
+ "faq": {
+ "title": "Questions Fréquemment Posées",
+ "verify_1m_emails_q": "Puis-je vérifier 1 million (ou plus) d'emails ?",
+ "verify_1m_emails_a": "Si vous avez besoin de vérifier 200K, 500K ou plus d'1 million d'emails, veuillez consulter le **Plan de Licence Commerciale**. Vous devrez acheter vos propres serveurs séparément et auto-héberger Reacher.",
+ "refund_q": "Quelle est votre politique de remboursement ?",
+ "refund_a": "Bien sûr. Si vous utilisez Reacher et constatez que les vérifications sont lentes ou incorrectes, je vous rembourserai le montant total si vous m'envoyez un email [✉️ amaury@reacher.email](mailto:amaury@reacher.email) dans les 30 jours suivant votre abonnement.",
+ "free_trial_q": "Offrez-vous un essai gratuit ?",
+ "free_trial_a": "Si vous êtes intéressé par les plans SaaS 10K ou 100K, alors non, Reacher n'offre aucun essai gratuit. Il existe cependant une garantie de remboursement sous 30 jours.\n\nSi vous êtes intéressé par la Licence Commerciale, vous pouvez suivre le [guide d'auto-hébergement](https://help.reacher.email/self-host-guide) pour un essai gratuit.",
+ "another_q": "Vous avez une autre question ?",
+ "another_a": "N'hésitez pas à m'envoyer un email [✉️ amaury@reacher.email](mailto:amaury@reacher.email), je réponds assez rapidement."
+ }
}
}
diff --git a/src/pages/pricing.tsx b/src/pages/pricing.tsx
index b52e0215..966f57b4 100644
--- a/src/pages/pricing.tsx
+++ b/src/pages/pricing.tsx
@@ -1,8 +1,7 @@
import { Collapse, Grid, Page, Select, Spacer, Text } from "@geist-ui/react";
import { GetStaticProps } from "next";
import React, { useState } from "react";
-
-import { SaaS10k, SaaS100k, Commercial } from "../components/ProductCard";
+import { SaaS10k, SaaS100k, Commercial } from "../components/Pricing";
import {
COMMERCIAL_LICENSE_PRODUCT_ID,
SAAS_100K_PRODUCT_ID,
@@ -11,6 +10,9 @@ import {
import { getActiveProductWithPrices } from "@/util/supabaseClient";
import { useUser } from "@/util/useUser";
import { ProductWithPrice } from "@/supabase/domain.types";
+import { useRouter } from "next/router";
+import { dictionary } from "@/dictionaries";
+import Markdown from "marked-react";
export const getStaticProps: GetStaticProps = async () => {
const products = await getActiveProductWithPrices();
@@ -34,6 +36,8 @@ export default function Pricing({
const [currency, setCurrency] = useState(
subscriptionCurrency || "eur"
);
+ const router = useRouter();
+ const d = dictionary(router.locale).pricing;
const saas10kProduct = products.find(
({ id }) => id === SAAS_10K_PRODUCT_ID
@@ -52,10 +56,10 @@ export default function Pricing({
<>
- Pricing
+ {d.title}
- All plans include a 30-day money back guarantee.
+ {d["30d_money_back"]}
@@ -114,56 +118,24 @@ export default function Pricing({
- Frequently Asked Questions
+ {d.faq.title}
- If you need to verify 200K, 500K, or 1+ million
- emails, please check the{" "}
- Commercial License Plan. You will
- need to purchase your own servers separately and
- self-host Reacher.
+ {d.faq.verify_1m_emails_a}
-
- Sure. If you use Reacher and find that the
- verifications are slow or incorrect, I'll
- refund you the full amount if you email me ✉️{" "}
-
- amaury@reacher.email
- {" "}
- within 30 days of your subscription.
+
+ {d.faq.refund_a}
-
-
- If you are interested in the SaaS 10K or 100K
- plans, then no, Reacher does not offer any free
- trial. There is however a 30-day money back
- guarantee.
-
-
-
- If you are interested in the Commercial License,
- you can follow these steps in the{" "}
-
- self-host guide
- {" "}
- for a free trial .
-