import * as React from "react"; import styled from "styled-components"; import { useStripe } from "@stripe/react-stripe-js"; import cn from "classnames"; import { useUser } from "../contexts/user"; import { PlansProvider } from "../contexts/plans/PlansProvider"; import useActivePlan from "../hooks/useActivePlan"; import DashboardLayout from "../layouts/DashboardLayout"; import { Panel } from "../components/Panel"; import Slider from "../components/Slider/Slider"; import { CheckmarkIcon } from "../components/Icons"; import { Button } from "../components/Button"; import { usePortalSettings } from "../contexts/portal-settings"; import { Alert } from "../components/Alert"; import HighlightedLink from "../components/HighlightedLink"; import { Metadata } from "../components/Metadata"; import accountsService from "../services/accountsService"; import humanBytes from "../lib/humanBytes"; import { Modal } from "../components/Modal"; const PAID_PORTAL_BREAKPOINTS = [ { name: "lg", scrollable: true, visibleSlides: 3, }, { name: "sm", scrollable: true, visibleSlides: 2, }, { scrollable: true, visibleSlides: 1, }, ]; const FREE_PORTAL_BREAKPOINTS = [ { name: "xl", scrollable: true, visibleSlides: 4, }, ...PAID_PORTAL_BREAKPOINTS, ]; const PlanSummaryItem = ({ children }) => (
  • {children}
  • ); const Description = styled.div` display: -webkit-box; -webkit-line-clamp: 4; -webkit-box-orient: vertical; overflow: hidden; flex-shrink: 0; height: 6rem; `; const Price = ({ price }) => (

    $ {price}

    per month

    ); const bandwidth = (value) => `${humanBytes(value, { bits: true })}/s`; const storage = (value) => humanBytes(value, { binary: true }); const localizedNumber = (value) => value.toLocaleString(); const PlansSlider = () => { const { user, error: userError } = useUser(); const { plans, loading, activePlan, error: plansError } = useActivePlan(user); const { settings } = usePortalSettings(); const [showPaymentError, setShowPaymentError] = React.useState(false); const stripe = useStripe(); // This will be the base plan that we compare upload/download speeds against. // On will either be the user's active plan or lowest of available tiers. const basePlan = activePlan || plans[0]; if (userError || plansError) { return (

    Oooops!

    Something went wrong, please try again later.

    ); } const handleSubscribe = async (selectedPlan) => { try { const { sessionId } = await accountsService .post("stripe/checkout", { json: { price: selectedPlan.stripe, }, }) .json(); await stripe.redirectToCheckout({ sessionId }); } catch (error) { setShowPaymentError(true); console.error(error); } }; return (
    Payments {settings.isSubscriptionRequired && !activePlan && (

    This Skynet portal requires a paid subscription.

    If you're not ready for that yet, you can use your account on{" "} SkynetFree.net {" "} to store up to 100GB for free.

    )} {!loading && ( { const isHigherThanCurrent = plan.tier > activePlan?.tier; const isCurrentPlanPaid = activePlan?.tier > 1; const isCurrent = plan.tier === activePlan?.tier; const isLower = plan.tier < activePlan?.tier; const speed = plan.limits.uploadBandwidth; const currentSpeed = basePlan?.limits?.uploadBandwidth; const speedChange = speed > currentSpeed ? speed / currentSpeed : currentSpeed / speed; const hasActivePlan = Boolean(activePlan); return ( {isCurrent && (
    Current plan
    )}

    {plan.name}

    {plan.description}
    {(!hasActivePlan || isHigherThanCurrent) && (isCurrentPlanPaid ? ( ) : ( ))} {isCurrent && } {isLower && ( )}
    {plan.limits && (
      Pin up to {storage(plan.limits.storageLimit)} on decentralized storage Support for up to {localizedNumber(plan.limits.maxNumberUploads)} files {speed === currentSpeed ? `${bandwidth(plan.limits.uploadBandwidth)} upload and ${bandwidth( plan.limits.downloadBandwidth )} download` : `${speedChange}X ${ speed > currentSpeed ? "faster" : "slower" } upload and download speeds (${bandwidth(plan.limits.uploadBandwidth)} and ${bandwidth( plan.limits.downloadBandwidth )})`} {plan.limits.maxUploadSize === plan.limits.storageLimit ? "No limit to file upload size" : `Upload files up to ${storage(plan.limits.maxUploadSize)}`}
    )}
    ); })} breakpoints={settings.isSubscriptionRequired ? PAID_PORTAL_BREAKPOINTS : FREE_PORTAL_BREAKPOINTS} className="px-8 sm:px-4 md:px-0 lg:px-0 mt-10" /> )} {showPaymentError && ( setShowPaymentError(false)}>

    Oops! 😔

    There was an error contacting our payments provider

    Please try again later

    )}
    ); }; const PaymentsPage = () => ( ); PaymentsPage.Layout = DashboardLayout; export default PaymentsPage;