Refactor personal account components for data fetching efficiency
Refactored personal account components to centralize user data fetching and subsequently reduce and distribute calls. Instead of fetching user data individually in `UpdateAccountImageContainer`, `UpdateAccountDetailsFormContainer` and `UpdateAccountNameFormContainer`, data fetching is now performed in the parent component, `AccountSettingsContainer`. Also, implemented partial loading state.
This commit is contained in:
@@ -68,7 +68,7 @@ export function PersonalAccountDropdown({
|
|||||||
}, [user?.email, user?.phone]);
|
}, [user?.email, user?.phone]);
|
||||||
|
|
||||||
const displayName =
|
const displayName =
|
||||||
account?.name ?? personalAccountData?.name ?? user?.email ?? '';
|
personalAccountData?.name ?? account?.name ?? user?.email ?? '';
|
||||||
|
|
||||||
const isSuperAdmin = useMemo(() => {
|
const isSuperAdmin = useMemo(() => {
|
||||||
return user?.app_metadata.role === 'super-admin';
|
return user?.app_metadata.role === 'super-admin';
|
||||||
|
|||||||
@@ -11,8 +11,10 @@ import {
|
|||||||
} from '@kit/ui/card';
|
} from '@kit/ui/card';
|
||||||
import { If } from '@kit/ui/if';
|
import { If } from '@kit/ui/if';
|
||||||
import { LanguageSelector } from '@kit/ui/language-selector';
|
import { LanguageSelector } from '@kit/ui/language-selector';
|
||||||
|
import { LoadingOverlay } from '@kit/ui/loading-overlay';
|
||||||
import { Trans } from '@kit/ui/trans';
|
import { Trans } from '@kit/ui/trans';
|
||||||
|
|
||||||
|
import { usePersonalAccountData } from '../../hooks/use-personal-account-data';
|
||||||
import { AccountDangerZone } from './account-danger-zone';
|
import { AccountDangerZone } from './account-danger-zone';
|
||||||
import { UpdateEmailFormContainer } from './email/update-email-form-container';
|
import { UpdateEmailFormContainer } from './email/update-email-form-container';
|
||||||
import { MultiFactorAuthFactorsList } from './mfa/multi-factor-auth-list';
|
import { MultiFactorAuthFactorsList } from './mfa/multi-factor-auth-list';
|
||||||
@@ -32,6 +34,11 @@ export function PersonalAccountSettingsContainer(
|
|||||||
}>,
|
}>,
|
||||||
) {
|
) {
|
||||||
const supportsLanguageSelection = useSupportMultiLanguage();
|
const supportsLanguageSelection = useSupportMultiLanguage();
|
||||||
|
const user = usePersonalAccountData();
|
||||||
|
|
||||||
|
if (!user.data || user.isPending) {
|
||||||
|
return <LoadingOverlay fullPage />;
|
||||||
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className={'flex w-full flex-col space-y-6 pb-32'}>
|
<div className={'flex w-full flex-col space-y-6 pb-32'}>
|
||||||
@@ -47,7 +54,12 @@ export function PersonalAccountSettingsContainer(
|
|||||||
</CardHeader>
|
</CardHeader>
|
||||||
|
|
||||||
<CardContent>
|
<CardContent>
|
||||||
<UpdateAccountImageContainer />
|
<UpdateAccountImageContainer
|
||||||
|
user={{
|
||||||
|
pictureUrl: user.data.picture_url,
|
||||||
|
id: user.data.id,
|
||||||
|
}}
|
||||||
|
/>
|
||||||
</CardContent>
|
</CardContent>
|
||||||
</Card>
|
</Card>
|
||||||
|
|
||||||
@@ -63,7 +75,7 @@ export function PersonalAccountSettingsContainer(
|
|||||||
</CardHeader>
|
</CardHeader>
|
||||||
|
|
||||||
<CardContent>
|
<CardContent>
|
||||||
<UpdateAccountDetailsFormContainer />
|
<UpdateAccountDetailsFormContainer user={user.data} />
|
||||||
</CardContent>
|
</CardContent>
|
||||||
</Card>
|
</Card>
|
||||||
|
|
||||||
|
|||||||
@@ -1,32 +1,23 @@
|
|||||||
'use client';
|
'use client';
|
||||||
|
|
||||||
import { LoadingOverlay } from '@kit/ui/loading-overlay';
|
import { useRevalidatePersonalAccountDataQuery } from '../../hooks/use-personal-account-data';
|
||||||
|
|
||||||
import {
|
|
||||||
usePersonalAccountData,
|
|
||||||
useRevalidatePersonalAccountDataQuery,
|
|
||||||
} from '../../hooks/use-personal-account-data';
|
|
||||||
import { UpdateAccountDetailsForm } from './update-account-details-form';
|
import { UpdateAccountDetailsForm } from './update-account-details-form';
|
||||||
|
|
||||||
export function UpdateAccountDetailsFormContainer() {
|
export function UpdateAccountDetailsFormContainer({
|
||||||
const user = usePersonalAccountData();
|
user,
|
||||||
|
}: {
|
||||||
|
user: {
|
||||||
|
name: string | null;
|
||||||
|
id: string;
|
||||||
|
};
|
||||||
|
}) {
|
||||||
const revalidateUserDataQuery = useRevalidatePersonalAccountDataQuery();
|
const revalidateUserDataQuery = useRevalidatePersonalAccountDataQuery();
|
||||||
|
|
||||||
if (user.isLoading) {
|
|
||||||
return <LoadingOverlay fullPage={false} />;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!user.data) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
const userId = user.data.id;
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<UpdateAccountDetailsForm
|
<UpdateAccountDetailsForm
|
||||||
displayName={user.data.name ?? ''}
|
displayName={user.name ?? ''}
|
||||||
userId={userId}
|
userId={user.id}
|
||||||
onUpdate={() => revalidateUserDataQuery(userId)}
|
onUpdate={() => revalidateUserDataQuery(user.id)}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,31 +10,27 @@ import { toast } from 'sonner';
|
|||||||
import { Database } from '@kit/supabase/database';
|
import { Database } from '@kit/supabase/database';
|
||||||
import { useSupabase } from '@kit/supabase/hooks/use-supabase';
|
import { useSupabase } from '@kit/supabase/hooks/use-supabase';
|
||||||
import { ImageUploader } from '@kit/ui/image-uploader';
|
import { ImageUploader } from '@kit/ui/image-uploader';
|
||||||
import { LoadingOverlay } from '@kit/ui/loading-overlay';
|
|
||||||
import { Trans } from '@kit/ui/trans';
|
import { Trans } from '@kit/ui/trans';
|
||||||
|
|
||||||
import {
|
import { useRevalidatePersonalAccountDataQuery } from '../../hooks/use-personal-account-data';
|
||||||
usePersonalAccountData,
|
|
||||||
useRevalidatePersonalAccountDataQuery,
|
|
||||||
} from '../../hooks/use-personal-account-data';
|
|
||||||
|
|
||||||
const AVATARS_BUCKET = 'account_image';
|
const AVATARS_BUCKET = 'account_image';
|
||||||
|
|
||||||
export function UpdateAccountImageContainer() {
|
export function UpdateAccountImageContainer({
|
||||||
const accountData = usePersonalAccountData();
|
user,
|
||||||
|
}: {
|
||||||
|
user: {
|
||||||
|
pictureUrl: string | null;
|
||||||
|
id: string;
|
||||||
|
};
|
||||||
|
}) {
|
||||||
const revalidateUserDataQuery = useRevalidatePersonalAccountDataQuery();
|
const revalidateUserDataQuery = useRevalidatePersonalAccountDataQuery();
|
||||||
|
|
||||||
if (!accountData.data) {
|
|
||||||
return <LoadingOverlay fullPage={false} />;
|
|
||||||
}
|
|
||||||
|
|
||||||
const userId = accountData.data.id;
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<UploadProfileAvatarForm
|
<UploadProfileAvatarForm
|
||||||
pictureUrl={accountData.data.picture_url ?? null}
|
pictureUrl={user.pictureUrl ?? null}
|
||||||
userId={userId}
|
userId={user.id}
|
||||||
onAvatarUpdated={() => revalidateUserDataQuery(userId)}
|
onAvatarUpdated={() => revalidateUserDataQuery(user.id)}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -51,7 +51,13 @@ export function usePersonalAccountData(
|
|||||||
enabled: !!userId,
|
enabled: !!userId,
|
||||||
refetchOnWindowFocus: false,
|
refetchOnWindowFocus: false,
|
||||||
refetchOnMount: false,
|
refetchOnMount: false,
|
||||||
initialData: partialAccount,
|
initialData: partialAccount?.id
|
||||||
|
? {
|
||||||
|
id: partialAccount.id,
|
||||||
|
name: partialAccount.name,
|
||||||
|
picture_url: partialAccount.picture_url,
|
||||||
|
}
|
||||||
|
: undefined,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user