import {
PreferencesGroup,
PreferencesSegment,
Text,
Title,
} from '@/preferences/components';
import { Button } from '@/components/Button';
import { observer } from '@node_modules/mobx-react-lite';
import { WebApplication } from '@/ui_models/application';
import { useEffect, useState } from 'preact/hooks';
import {
GetSubscriptionResponse,
GetSubscriptionsResponse,
} from '@standardnotes/snjs/dist/@types/services/api/responses';
type Props = {
application: WebApplication;
};
type Subscription = {
planName: string;
cancelled: boolean;
endsAt: number;
};
type AvailableSubscriptions = {
[key: string]: {
name: string;
};
};
type SubscriptionInformationProps = {
subscription?: Subscription;
availableSubscriptions: AvailableSubscriptions;
};
type ValidSubscriptionProps = {
subscription: Subscription;
availableSubscriptions: AvailableSubscriptions;
};
const NoSubscription = () => (
<>
You don't have a Standard Notes subscription yet.
>
);
const ActiveSubscription = ({
subscription,
availableSubscriptions,
}: ValidSubscriptionProps) => (
<>
Your{' '}
Standard Notes {availableSubscriptions[subscription.planName]}
{' '}
subscription will be{' '}
renewed on {new Date(subscription.endsAt).toLocaleString()}
.
null}
/>
null}
/>
null}
/>
>
);
const CancelledSubscription = ({
subscription,
availableSubscriptions,
}: ValidSubscriptionProps) => (
<>
Your{' '}
Standard Notes {availableSubscriptions[subscription.planName]}
{' '}
subscription has been{' '}
canceled but will remain valid until{' '}
{new Date(subscription.endsAt).toLocaleString()}
. You may resubscribe below if you wish.
null}
/>
null}
/>
null}
/>
>
);
const SubscriptionInformation = ({
subscription,
availableSubscriptions,
}: SubscriptionInformationProps) => {
const now = new Date().getTime();
if (subscription && subscription.endsAt > now) {
return subscription.cancelled ? (
) : (
);
}
return ;
};
const Subscription = observer(({ application }: Props) => {
const [subscription, setSubscription] =
useState(undefined);
const [availableSubscriptions, setAvailableSubscriptions] =
useState({});
const [error, setError] = useState(false);
useEffect(() => {
const getSubscriptions = async () => {
try {
const result = await application.getSubscriptions();
if (result.data) {
const data = (result as GetSubscriptionsResponse).data;
setAvailableSubscriptions(data!);
} else {
setError(true);
}
} catch (e) {
setError(true);
}
};
const getSubscription = async () => {
try {
const result = await application.getUserSubscription();
if (!result.error && result.data) {
const data = (result as GetSubscriptionResponse).data;
const subscription = data!.subscription;
setSubscription(subscription);
} else {
setError(true);
}
} catch (e) {
setError(true);
}
};
getSubscriptions();
getSubscription();
}, [application]);
return (
Subscription
{error ? (
'No subscription information available.'
) : (
)}
);
});
export default Subscription;