Skip to main content

Avoid using promises in UI

Do not use promises in the UI. If you using apollo-client, we can use an in-built upgrade to perform necessary action.

Wrong-Way

import * as React from 'react';
import {
IOrganizationListSlotProps,
} from '@adminide-stack/react-shared-components';
import { useGetUserOrganizationsListLazyQuery,
} from '@adminide-stack/account-api-client';
import { useChangeOrganizationMutation } from '@adminide-stack/platform-browser/lib/components';
import {IOrganization} from '@adminide-stack/core';

const {useLayoutEffect} = React;

export interface IOrganizationListProps extends IOrganizationListSlotProps {
active: boolean;
}

export const OrganizationsList = (props: IOrganizationListProps): React.ReactElement => {
const [fetchOrganizations, {data, loading}] = useGetUserOrganizationsListLazyQuery({
fetchPolicy:'cache-and-network',
});
const [changeOrganization] = useChangeOrganizationMutation();
const changeOrg = async (orgId: string) => {
await changeOrganization({
variables: {
orgId,
},
});
};
const {active, render} = props;

useLayoutEffect(() => {
if (active) {
fetchOrganizations();
}
}, [active]);

return render({organizations: data?.getUserOrganizations as IOrganization[], changeOrg, loading});
};

OrganizationsList.defaultProps = {
active: false,
};

Right Way

import * as React from 'react';
import {
IOrganizationListSlotProps,
} from '@adminide-stack/react-shared-components';
import {
useGetUserOrganizationsListLazyQuery,
} from '@adminide-stack/account-api-client';
import { useChangeOrganizationMutation } from '@adminide-stack/platform-browser/lib/ant-module';
import { IOrganization } from '@adminide-stack/core';

const { useLayoutEffect } = React;

export interface IOrganizationListProps extends IOrganizationListSlotProps {
active: boolean;
}

export const OrganizationsList = (props: IOrganizationListProps): React.ReactElement => {
const [fetchOrganizations, { data, loading }] = useGetUserOrganizationsListLazyQuery();
const [changeOrganization] = useChangeOrganizationMutation();
const changeOrg = (orgName: string) => {
changeOrganization({
variables: {
orgName: orgName,
},
update: (cache, { data, errors }) => {
if (data) {
cache.modify({
fields: {
getUserOrganizations() {}
}
})
}
}
});
};
const { active, render } = props;

useLayoutEffect(() => {
if (active) {
fetchOrganizations();
}
}, [active]);

return render({ organizations: data?.getUserOrganizations as IOrganization[], changeOrg, loading });
};

OrganizationsList.defaultProps = {
active: false,
};

Incase if have nonapollo client that requires promises then use packages like react-hook.