diff --git a/src/assets/lang/en/metatags-descriptions.json b/src/assets/lang/en/metatags-descriptions.json index a4a997e7d..71552211e 100644 --- a/src/assets/lang/en/metatags-descriptions.json +++ b/src/assets/lang/en/metatags-descriptions.json @@ -31,7 +31,7 @@ }, { "id": "free-cloud-storage", - "title": "Free Secure & Encrypted Cloud Storage — Intenxt Drive", + "title": "Free Secure & Encrypted Cloud Storage — Internxt Drive", "description": "Get free secure cloud storage with Internxt Drive. Easily store, share, and back up your files and photos using our open-source, end-to-end encrypted platform for guaranteed privacy." }, { diff --git a/src/assets/lang/es/coupons.json b/src/assets/lang/es/coupons.json index 9c28e1ffa..f9c22da85 100644 --- a/src/assets/lang/es/coupons.json +++ b/src/assets/lang/es/coupons.json @@ -6,7 +6,8 @@ "cleaner": "Limpiador", "vpn": "VPN", "meet": "Meet", - "mail": "Mail" + "mail": "Mail", + "ai":"AI" }, "title": "**Descuentos** y **promociones** de Internxt", "subtitle": "¡Has desbloqueado un {{discount}}% de descuento! Obtén tu código de cupón de Internxt aquí", diff --git a/src/components/cloud-object-storage/HeroSection.tsx b/src/components/cloud-object-storage/HeroSection.tsx index 6c3567a20..39e2b0c12 100644 --- a/src/components/cloud-object-storage/HeroSection.tsx +++ b/src/components/cloud-object-storage/HeroSection.tsx @@ -6,7 +6,7 @@ import { getImage } from '@/lib/getImage'; export const HeroSection = ({ textContent }) => { return (
{ const certifications = [ - { src: '/images/datacenters-and-certifications/ISO.webp', width: 40, alt: 'ISO Certification' }, - { src: '/images/datacenters-and-certifications/HipaaCompilance.webp', width: 85, alt: 'HIPAA Compliance' }, - { src: '/images/datacenters-and-certifications/AICPA.webp', width: 100, alt: 'AICPA Certification' }, - { src: '/images/datacenters-and-certifications/GDPR.webp', width: 122, alt: 'GDPR Compliance' }, - { src: '/images/datacenters-and-certifications/ENS.webp', width: 115, alt: 'ENS Certification' }, - { src: '/images/datacenters-and-certifications/CSA.webp', width: 40, alt: 'CSA Certification' }, + { src: '/images/datacenters-and-certifications/ISO.webp', width: 48, alt: 'ISO Certification' }, + { src: '/images/datacenters-and-certifications/HipaaCompilance.webp', width: 102, alt: 'HIPAA Compliance' }, + { src: '/images/datacenters-and-certifications/AICPA.webp', width: 120, alt: 'AICPA Certification' }, + { src: '/images/datacenters-and-certifications/GDPR.webp', width: 146, alt: 'GDPR Compliance' }, + { src: '/images/datacenters-and-certifications/ENS.webp', width: 138, alt: 'ENS Certification' }, + { src: '/images/datacenters-and-certifications/CSA.webp', width: 48, alt: 'CSA Certification' }, ]; return (
{certifications.map((cert, index) => ( diff --git a/src/components/coupons/HeroSection.tsx b/src/components/coupons/HeroSection.tsx index 046ee8123..cf3a95cf9 100644 --- a/src/components/coupons/HeroSection.tsx +++ b/src/components/coupons/HeroSection.tsx @@ -90,8 +90,8 @@ export default function HeroSection({ className={`flex h-min w-full flex-row items-center justify-center overflow-hidden py-10 pt-28 lg:h-[705px] lg:justify-between lg:pl-10 lg:pt-36 xl:pl-32 3xl:pl-80`} style={{ background: 'linear-gradient(180deg, #E5EFFF 0%, #FFFFFF 100%)' }} > -
-
+
+
{products.map((feature, index) => (

{ctaText}

@@ -330,7 +330,7 @@ export const PriceCard = ({ return ( <> -
+
{Icon && }

{ +}: HorizontalPriceCardProps): JSX.Element | null => { + if (!storage) { + return null; + } + const contentText = require(`@/assets/lang/en/priceCard.json`); const priceNow = decimalDiscountValue @@ -56,21 +60,22 @@ export const HorizontalPriceCard = ({ }[storage] || null; const iconsFeatures = [ - Database, + Database, Key, - Gauge, - ShieldPlus, + LockSimple, + Fingerprint, ArrowsClockwise, Password, CirclesThreePlus, - LockSimple, - Fingerprint, + Files, + Image, CodeBlock, - Broom, - Detective, - VideoConference, + Code, + CellTower, + Shield, + Sparkle, + VideoCamera, Envelope, - CreditCard, ]; function onCheckoutButtonClicked() { @@ -84,16 +89,13 @@ export const HorizontalPriceCard = ({ } return (

-
+

{cardLabel}

-

- {percentOff} - {contentText.discount} -

+

@@ -109,52 +111,36 @@ export const HorizontalPriceCard = ({

-
-
-
- {contentText.productFeatures.individuals[storage].slice(0, 7).map((feature: string, index: number) => { - const Icon = iconsFeatures[index % iconsFeatures.length]; - return ( -
- - - {feature} - {index > 9 && ( - - {contentText.commingSoon} - - )} - -
- ); - })} -
+
+
+ {contentText.productFeatures.individualPlans[storage].map((feature: {name: string, status: string}, index: number) => { + const Icon = iconsFeatures[index] || iconsFeatures[iconsFeatures.length - 1]; + const isComingSoon = feature.status === 'Coming soon'; + const formattedName = feature.name.replace(/\*\*(.*?)\*\*/g, '$1'); -
- {contentText.productFeatures.individuals[storage].slice(7, 14).map((feature: string, index: number) => { - const adjustedIndex = index + 7; - const Icon = iconsFeatures[adjustedIndex % iconsFeatures.length]; return ( -
- - - {feature} - {adjustedIndex > 9 && ( - - {contentText.commingSoon} +
+ {Icon && } +
+

+ {isComingSoon && ( + + {contentText.productFeatures.comingSoonLabel || contentText.commingSoon} )} - +

); })} -
diff --git a/src/hooks/useSpecialOfferConfig.ts b/src/hooks/useSpecialOfferConfig.ts index 694cad71f..a8a7bf3f6 100644 --- a/src/hooks/useSpecialOfferConfig.ts +++ b/src/hooks/useSpecialOfferConfig.ts @@ -40,14 +40,16 @@ export const ALLOWED_PATHS = [ 'genius', 'letosa', 'cninternxtl', - 'cooltechzone' + 'cooltechzone', + 'lifetime' ]; export const ALTERNATE_RECOMENDATED_PLAN_PATHS = new Set([]); export const DARK_MODE_PATHS = new Set(['baity', 'xavier', 'oscar', 'rimembah', 'believemy', 'ghareeb']); export const ALTERNATIVE_IMAGES_PATHS = new Set(['baity']); export const ONLY_ULTIMATE_PLANS_PATHS = new Set(['ultimate']); -export const ULTIMATE_PREMIUM_PLANS_PATHS = new Set(['annual']); +export const ULTIMATE_PREMIUM_PLANS_PATHS = new Set([]); export const ANNUAL_PLANS_PATHS = new Set(['annual', 'ultimate']); +export const LIFETIME_PLANS_PATHS = new Set(['lifetime']); export const COUPON_CODES = { baity: PromoCodeName.BaityBait, @@ -87,7 +89,8 @@ export const COUPON_CODES = { genius: PromoCodeName.genius, letosa: PromoCodeName.letosa, cninternxtl: PromoCodeName.cninternxtl, - cooltechzone: PromoCodeName.CTZ + cooltechzone: PromoCodeName.CTZ, + lifetime: PromoCodeName.lifetime }; interface OfferConfig { @@ -99,6 +102,7 @@ interface OfferConfig { onlyUltimatePlan: boolean; ultimateAndPremiumPlans: boolean; annualPlans: boolean; + lifetimePlans: boolean; } export const useOfferConfig = (pathname: string): OfferConfig => { @@ -115,6 +119,7 @@ export const useOfferConfig = (pathname: string): OfferConfig => { onlyUltimatePlan: false, ultimateAndPremiumPlans: false, annualPlans: false, + lifetimePlans: false, }; } @@ -124,6 +129,7 @@ export const useOfferConfig = (pathname: string): OfferConfig => { const onlyUltimatePlan = ONLY_ULTIMATE_PLANS_PATHS.has(selectedPathname); const ultimateAndPremiumPlans = ULTIMATE_PREMIUM_PLANS_PATHS.has(selectedPathname); const annualPlans = ANNUAL_PLANS_PATHS.has(selectedPathname); + const lifetimePlans = LIFETIME_PLANS_PATHS.has(selectedPathname); const alternativeImages = ALTERNATIVE_IMAGES_PATHS.has(selectedPathname) ? selectedPathname @@ -138,6 +144,7 @@ export const useOfferConfig = (pathname: string): OfferConfig => { onlyUltimatePlan, ultimateAndPremiumPlans, annualPlans, + lifetimePlans, }; }, [pathname]); }; diff --git a/src/lib/types/index.ts b/src/lib/types/index.ts index a21984090..5741fc67d 100644 --- a/src/lib/types/index.ts +++ b/src/lib/types/index.ts @@ -230,6 +230,7 @@ export enum PromoCodeName { whereby='WHEREBY87', CLOUDWARDS='CLOUDWARDS', CTZ='CTZ', + lifetime='LIFETIME' } export interface PromoCodeProps { diff --git a/src/pages/[filename].tsx b/src/pages/[filename].tsx index b04ccf0b4..b82cc80c9 100644 --- a/src/pages/[filename].tsx +++ b/src/pages/[filename].tsx @@ -14,6 +14,7 @@ import { Interval, stripeService } from '@/services/stripe.service'; import { SpecialOfferText } from '@/assets/types/specialOfferTemplate'; import { useOfferConfig, usePathRedirect } from '@/hooks/useSpecialOfferConfig'; import FeaturesSection from '@/components/drive/FeaturesSection'; +import { HorizontalPriceCard } from '@/components/shared/pricing/PriceCard/HorizontalPriceCard'; interface CombinedSpecialOfferProps { metatagsDescriptions: MetatagsDescription[]; @@ -86,7 +87,8 @@ const LANG_MAP = { letosa: 'es', genius: 'es', cninternxtl:'en', - cooltechzone:'en' + cooltechzone:'en', + lifetime:'en', }; function CombinedSpecialOffer({ @@ -106,10 +108,12 @@ function CombinedSpecialOffer({ onlyUltimatePlan, ultimateAndPremiumPlans, annualPlans, + lifetimePlans } = useOfferConfig(pathname); const { products, loadingCards, + currency, currencyValue, coupon: individualCoupon, lifetimeCoupon: lifetimeCoupon, @@ -119,6 +123,8 @@ function CombinedSpecialOffer({ couponCodeForLifetime: couponCode, }); + const ultimatePlan = products?.individuals?.[Interval.Year]?.find((plan: any) => plan.storage === '5TB'); + usePathRedirect(selectedPathname); if (!selectedPathname) { @@ -179,29 +185,47 @@ function CombinedSpecialOffer({ - + {onlyUltimatePlan ? ( +
+ {ultimatePlan && ( + + )} +
+ ) : ( + + )}