From 988f291b70963a6dcd90e91c8b908f3963241d18 Mon Sep 17 00:00:00 2001 From: AmarTrebinjac Date: Thu, 5 Feb 2026 14:48:35 +0000 Subject: [PATCH] feat(profile): add loading skeleton to experience pages Show a loading skeleton with 2 placeholder items while experience data is being fetched, instead of showing misleading "No experiences" message. Co-Authored-By: Claude Opus 4.5 --- .../components/profile/ExperienceSettings.tsx | 14 +++++- .../experience/UserExperienceItemSkeleton.tsx | 43 +++++++++++++++++++ 2 files changed, 56 insertions(+), 1 deletion(-) create mode 100644 packages/shared/src/features/profile/components/experience/UserExperienceItemSkeleton.tsx diff --git a/packages/shared/src/components/profile/ExperienceSettings.tsx b/packages/shared/src/components/profile/ExperienceSettings.tsx index a9d8bd3f04..11884da5e0 100644 --- a/packages/shared/src/components/profile/ExperienceSettings.tsx +++ b/packages/shared/src/components/profile/ExperienceSettings.tsx @@ -6,6 +6,7 @@ import { UserExperienceList } from '../../features/profile/components/experience import { useAuthContext } from '../../contexts/AuthContext'; import type { PublicProfile } from '../../lib/user'; import { ExperienceEmptyState } from './ExperienceEmptyState'; +import { UserExperienceItemSkeleton } from '../../features/profile/components/experience/UserExperienceItemSkeleton'; type ExperienceSettingsProps = { experienceType: UserExperienceType; @@ -17,7 +18,18 @@ export const ExperienceSettings = ({ emptyStateMessage, }: ExperienceSettingsProps): ReactElement => { const { user } = useAuthContext(); - const { experiences } = useUserExperiencesByType(experienceType, user?.id); + const { experiences, isPending } = useUserExperiencesByType( + experienceType, + user?.id, + ); + + if (isPending) { + return ( +
+ +
+ ); + } return (
diff --git a/packages/shared/src/features/profile/components/experience/UserExperienceItemSkeleton.tsx b/packages/shared/src/features/profile/components/experience/UserExperienceItemSkeleton.tsx new file mode 100644 index 0000000000..0add1a224c --- /dev/null +++ b/packages/shared/src/features/profile/components/experience/UserExperienceItemSkeleton.tsx @@ -0,0 +1,43 @@ +import type { ReactElement } from 'react'; +import React from 'react'; +import { ElementPlaceholder } from '../../../../components/ElementPlaceholder'; + +interface UserExperienceItemSkeletonProps { + count?: number; +} + +export function UserExperienceItemSkeleton({ + count = 2, +}: UserExperienceItemSkeletonProps): ReactElement { + return ( +
    + {Array.from({ length: count }).map((_, index) => ( + // eslint-disable-next-line react/no-array-index-key +
  • + {/* Company logo placeholder */} + + +
    + {/* Title line */} + + {/* Company name line */} + + {/* Date/location line */} + + {/* Description lines */} +
    + + +
    + {/* Skills pills */} +
    + + + +
    +
    +
  • + ))} +
+ ); +}