fix: fix state and add loading state

This commit is contained in:
Antonella Sgarlatta
2021-09-07 13:14:12 -03:00
parent 99ef854ae8
commit 41257977a7
3 changed files with 52 additions and 34 deletions

View File

@@ -15,7 +15,7 @@ export const CancelledSubscription = observer(
<Text> <Text>
Your{' '} Your{' '}
<span className="font-bold"> <span className="font-bold">
Standard NotesStandard Notes{userSubscriptionName ? " " : ""}{userSubscriptionName} Standard Notes{userSubscriptionName ? " " : ""}{userSubscriptionName}
</span>{' '} </span>{' '}
subscription has been{' '} subscription has been{' '}
<span className="font-bold"> <span className="font-bold">

View File

@@ -5,7 +5,7 @@ import {
} from '@/preferences/components'; } from '@/preferences/components';
import { observer } from '@node_modules/mobx-react-lite'; import { observer } from '@node_modules/mobx-react-lite';
import { WebApplication } from '@/ui_models/application'; import { WebApplication } from '@/ui_models/application';
import { useEffect, useState } from 'preact/hooks'; import { useCallback, useEffect, useState } from 'preact/hooks';
import { import {
GetSubscriptionResponse, GetSubscriptionResponse,
GetSubscriptionsResponse, GetSubscriptionsResponse,
@@ -14,6 +14,8 @@ import { SubscriptionState } from './subscription_state';
import { CancelledSubscription } from './CancelledSubscription'; import { CancelledSubscription } from './CancelledSubscription';
import { ActiveSubscription } from './ActiveSubscription'; import { ActiveSubscription } from './ActiveSubscription';
import { NoSubscription } from './NoSubscription'; import { NoSubscription } from './NoSubscription';
import { Text } from '@/preferences/components';
import { FunctionalComponent } from 'preact';
type Props = { type Props = {
application: WebApplication; application: WebApplication;
@@ -24,7 +26,7 @@ type SubscriptionInformationProps = {
subscriptionState: SubscriptionState; subscriptionState: SubscriptionState;
}; };
const SubscriptionInformation = ({ const SubscriptionInformation = observer(({
subscriptionState, subscriptionState,
}: SubscriptionInformationProps) => { }: SubscriptionInformationProps) => {
const now = new Date().getTime(); const now = new Date().getTime();
@@ -38,41 +40,53 @@ const SubscriptionInformation = ({
); );
} }
return <NoSubscription />; return <NoSubscription />;
}; });
export const Subscription = observer(({ application, subscriptionState }: Props) => { export const Subscription: FunctionalComponent<Props> = ({ application, subscriptionState }) => {
const [loading, setLoading] = useState(true);
const [error, setError] = useState(false); const [error, setError] = useState(false);
useEffect(() => { const getSubscriptions = useCallback(async () => {
const getSubscriptions = async () => { try {
try { const result = await application.getSubscriptions();
const result = await application.getSubscriptions(); if (result.data) {
if (result.data) { const data = (result as GetSubscriptionsResponse).data;
const data = (result as GetSubscriptionsResponse).data; subscriptionState.setAvailableSubscriptions(data!);
subscriptionState.setAvailableSubscriptions(data!);
}
} catch (e) {
// Error in this call will only prevent the plan name from showing
} }
}; } catch (e) {
const getSubscription = async () => { // Error in this call will only prevent the plan name from showing
try { }
const result = await application.getUserSubscription(); }, [application, subscriptionState]);
if (!result.error && result.data) {
const data = (result as GetSubscriptionResponse).data; const getSubscription = useCallback(async () => {
const subscription = data!.subscription; try {
subscriptionState.setUserSubscription(subscription); const result = await application.getUserSubscription();
} else { if (!result.error && result.data) {
setError(true); const data = (result as GetSubscriptionResponse).data;
} const subscription = data!.subscription;
} catch (e) { subscriptionState.setUserSubscription(subscription);
} else {
setError(true); setError(true);
} }
}; } catch (e) {
getSubscriptions(); setError(true);
getSubscription(); }
}, [application, subscriptionState]); }, [application, subscriptionState]);
const getSubscriptionInfo = useCallback(async () => {
setLoading(true);
try {
await getSubscription();
await getSubscriptions();
} finally {
setLoading(false);
}
}, [getSubscription, getSubscriptions]);
useEffect(() => {
getSubscriptionInfo();
}, [getSubscriptionInfo]);
return ( return (
<PreferencesGroup> <PreferencesGroup>
<PreferencesSegment> <PreferencesSegment>
@@ -80,7 +94,9 @@ export const Subscription = observer(({ application, subscriptionState }: Props)
<div className="flex-grow flex flex-col"> <div className="flex-grow flex flex-col">
<Title>Subscription</Title> <Title>Subscription</Title>
{error ? ( {error ? (
'No subscription information available.' <Text>No subscription information available.</Text>
) : loading ? (
<Text>Loading subscription information...</Text>
) : ( ) : (
<SubscriptionInformation subscriptionState={subscriptionState} /> <SubscriptionInformation subscriptionState={subscriptionState} />
)} )}
@@ -89,4 +105,4 @@ export const Subscription = observer(({ application, subscriptionState }: Props)
</PreferencesSegment> </PreferencesSegment>
</PreferencesGroup> </PreferencesGroup>
); );
}); };

View File

@@ -13,8 +13,8 @@ type AvailableSubscriptions = {
}; };
export class SubscriptionState { export class SubscriptionState {
userSubscription: Subscription | undefined; userSubscription: Subscription | undefined = undefined;
availableSubscriptions: AvailableSubscriptions | undefined; availableSubscriptions: AvailableSubscriptions | undefined = undefined;
constructor() { constructor() {
makeObservable(this, { makeObservable(this, {
@@ -40,7 +40,9 @@ export class SubscriptionState {
} }
public setUserSubscription(subscription: Subscription): void { public setUserSubscription(subscription: Subscription): void {
console.log('set subscription in state', subscription);
this.userSubscription = subscription; this.userSubscription = subscription;
console.log(this.userSubscription);
} }
public setAvailableSubscriptions( public setAvailableSubscriptions(