diff --git a/src/app/layouts/MainLayout/SkeletonGenerator/SkeletonGenerator.tsx b/src/app/layouts/MainLayout/SkeletonGenerator/SkeletonGenerator.tsx index 688a7faa4..c6fc193cc 100644 --- a/src/app/layouts/MainLayout/SkeletonGenerator/SkeletonGenerator.tsx +++ b/src/app/layouts/MainLayout/SkeletonGenerator/SkeletonGenerator.tsx @@ -21,6 +21,7 @@ import { InterviewQuizResultPageSkeleton } from '@/pages/interview/interviewQuiz import { InterviewStatisticsPageSkeleton } from '@/pages/interview/interviewStatistics'; import { MainPageSkeleton } from '@/pages/interview/main'; import { ProfilePageSkeleton } from '@/pages/profile/profileInfo'; +import { UserProfilePageSkeleton } from '@/pages/profile/userProfile'; import { QuestionsPageSkeleton } from '@/pages/wiki/question/questions'; const SkeletonGenerator = () => { @@ -31,6 +32,7 @@ const SkeletonGenerator = () => { ROUTES.admin.questions.details.page, location.pathname, ); + const isUserProfilePage = matchPath(ROUTES.users.page, location.pathname); if (isInterviewResultPage) { return ; @@ -40,6 +42,10 @@ const SkeletonGenerator = () => { return ; } + if (isUserProfilePage) { + return ; + } + switch (location.pathname) { case ROUTES.appRoute: return ; diff --git a/src/entities/user/index.ts b/src/entities/user/index.ts index 5116ca93e..40e521970 100644 --- a/src/entities/user/index.ts +++ b/src/entities/user/index.ts @@ -17,6 +17,7 @@ export { export { UserCard } from './ui/UserCard/UserCard'; export { RoleSelect } from './ui/RoleSelect/RoleSelect'; export { UserEditButton } from './ui/UserEditButton/UserEditButton'; +export { UserEditButtonSkeleton } from './ui/UserEditButton/UserEditButton.skeleton'; export { UserRolesList } from './ui/UserRolesList/UserRolesList'; export { UserSelect } from './ui/UserSelect/UserSelect'; export { UserSelectSkeleton } from './ui/UserSelect/UserSelect.skeleton'; diff --git a/src/entities/user/ui/UserEditButton/UserEditButton.module.css b/src/entities/user/ui/UserEditButton/UserEditButton.module.css index e196dbfdd..07b59a541 100644 --- a/src/entities/user/ui/UserEditButton/UserEditButton.module.css +++ b/src/entities/user/ui/UserEditButton/UserEditButton.module.css @@ -3,3 +3,21 @@ margin-left: auto; font-size: var(--font-size-p-s); } + +.skeleton-link { + margin-left: auto; + width: 100px; + height: 20px; +} + +@media (width <=1280px) { + .skeleton-link { + width: 20px; + } +} + +@media (width <=720px) { + .skeleton-link-profile { + order: 1; + } +} \ No newline at end of file diff --git a/src/entities/user/ui/UserEditButton/UserEditButton.skeleton.tsx b/src/entities/user/ui/UserEditButton/UserEditButton.skeleton.tsx new file mode 100644 index 000000000..11634c2ff --- /dev/null +++ b/src/entities/user/ui/UserEditButton/UserEditButton.skeleton.tsx @@ -0,0 +1,13 @@ +import { Skeleton } from '@/shared/ui/Skeleton'; + +import styles from './UserEditButton.module.css'; + +export const UserEditButtonSkeleton = () => { + return ( +
+
+ +
+
+ ); +}; diff --git a/src/pages/profile/profileInfo/ui/ProfilePage/ProfilePage.module.css b/src/pages/profile/profileInfo/ui/ProfilePage/ProfilePage.module.css index e686c53e2..3c9bc6c13 100644 --- a/src/pages/profile/profileInfo/ui/ProfilePage/ProfilePage.module.css +++ b/src/pages/profile/profileInfo/ui/ProfilePage/ProfilePage.module.css @@ -1,7 +1,3 @@ -.title { - margin: 0; -} - .content { display: flex; flex-direction: row; @@ -26,53 +22,6 @@ width: 360px; } -.separator { - margin: 16px 0; - width: 100%; - height: 1px; - background-color: var(--color-black-50); -} - -.profile-card-skeleton, -.card-skeleton { - gap: 0; - height: auto; -} - -.profile-card-skeleton { - padding: 16px; -} - -.flex-profile-skeleton { - display: flex; - gap: 16px; -} - -.card-skeleton { - padding: 24px; -} - -.profile-card-skeleton, -.card-skeleton:not(:last-child) { - margin-bottom: 24px; -} - -.header-card-skeleton { - margin-bottom: 20px; -} - -.sleleton-link { - margin-left: auto; - width: 100px; - height: 20px; -} - -@media (width <= 1280px) { - .sleleton-link { - width: 20px; - } -} - @media (width <= 1440px) { .content { flex-direction: column-reverse; @@ -87,17 +36,3 @@ width: 100%; } } - -@media (width <= 720px) { - .flex-profile-skeleton { - flex-direction: column; - } - - .sleleton-link-profile { - order: -1; - } - - .card { - min-height: 100%; - } -} \ No newline at end of file diff --git a/src/pages/profile/profileInfo/ui/ProfilePage/ProfilePage.skeleton.tsx b/src/pages/profile/profileInfo/ui/ProfilePage/ProfilePage.skeleton.tsx index b8bbd100d..ab1cf1962 100644 --- a/src/pages/profile/profileInfo/ui/ProfilePage/ProfilePage.skeleton.tsx +++ b/src/pages/profile/profileInfo/ui/ProfilePage/ProfilePage.skeleton.tsx @@ -1,6 +1,6 @@ -import { Card } from '@/shared/ui/Card'; -import { Flex } from '@/shared/ui/Flex'; -import { Skeleton } from '@/shared/ui/Skeleton'; +import { InfoBlockSkeleton } from '@/widgets/Profile/InfoBlock'; +import { SkillsBlockSkeleton } from '@/widgets/Profile/SkillsBlock'; +import { UserBlockSkeleton } from '@/widgets/Profile/UserBlock'; import styles from './ProfilePage.module.css'; @@ -8,90 +8,9 @@ export const ProfilePageSkeleton = () => { return (
- -
- - - - - - - - - - - - - - {[...Array(4)].map((_, index) => ( - - - - ))} - - - {[...Array(2)].map((_, index) => ( - - - - ))} - - - {[...Array(6)].map((_, index) => ( - - - - ))} - - -
-
- -
-
-
-
- -
- - -
-
- -
-
-
-
- - {[...Array(6)].map((_, index) => ( - - ))} - -
- -
- - -
-
- -
-
-
-
- - {[...Array(8)].map((_, index) => ( - - - - ))} - -
+ + +
); diff --git a/src/pages/profile/userProfile/ui/UserProfilePage/UserProfilePage.module.css b/src/pages/profile/userProfile/ui/UserProfilePage/UserProfilePage.module.css index 72e19b6a8..1b7c188cd 100644 --- a/src/pages/profile/userProfile/ui/UserProfilePage/UserProfilePage.module.css +++ b/src/pages/profile/userProfile/ui/UserProfilePage/UserProfilePage.module.css @@ -1,7 +1,3 @@ -.title { - margin: 0; -} - .content { display: flex; flex-direction: row; @@ -26,52 +22,6 @@ width: 360px; } -.separator { - margin: 16px 0; - width: 100%; - height: 1px; - background-color: var(--color-black-50); -} - -.profile-card-skeleton, -.card-skeleton { - gap: 0; - height: auto; -} - -.profile-card-skeleton { - padding: 16px; -} - -.flex-profile-skeleton { - display: flex; - gap: 16px; -} - -.card-skeleton { - padding: 24px; -} - -.profile-card-skeleton, -.card-skeleton:not(:last-child) { - margin-bottom: 24px; -} - -.header-card-skeleton { - margin-bottom: 20px; -} - -.sleleton-link { - margin-left: auto; - width: 100px; - height: 20px; -} - -@media (width <= 1280px) { - .sleleton-link { - width: 20px; - } -} @media (width <= 1440px) { .content { @@ -89,18 +39,6 @@ } @media (width <= 720px) { - .flex-profile-skeleton { - flex-direction: column; - } - - .sleleton-link-profile { - order: -1; - } - - .card { - min-height: 100%; - } - .content { gap: 0 } diff --git a/src/pages/profile/userProfile/ui/UserProfilePage/UserProfilePage.skeleton.tsx b/src/pages/profile/userProfile/ui/UserProfilePage/UserProfilePage.skeleton.tsx index 47873ccee..99efae79b 100644 --- a/src/pages/profile/userProfile/ui/UserProfilePage/UserProfilePage.skeleton.tsx +++ b/src/pages/profile/userProfile/ui/UserProfilePage/UserProfilePage.skeleton.tsx @@ -1,6 +1,6 @@ -import { Card } from '@/shared/ui/Card'; -import { Flex } from '@/shared/ui/Flex'; -import { Skeleton } from '@/shared/ui/Skeleton'; +import { InfoBlockSkeleton } from '@/widgets/Profile/InfoBlock'; +import { SkillsBlockSkeleton } from '@/widgets/Profile/SkillsBlock'; +import { UserBlockSkeleton } from '@/widgets/Profile/UserBlock'; import styles from './UserProfilePage.module.css'; @@ -8,90 +8,9 @@ export const UserProfilePageSkeleton = () => { return (
- -
- - - - - - - - - - - - - - {[...Array(4)].map((_, index) => ( - - - - ))} - - - {[...Array(2)].map((_, index) => ( - - - - ))} - - - {[...Array(6)].map((_, index) => ( - - - - ))} - - -
-
- -
-
-
-
- -
- - -
-
- -
-
-
-
- - {[...Array(6)].map((_, index) => ( - - ))} - -
- -
- - -
-
- -
-
-
-
- - {[...Array(8)].map((_, index) => ( - - - - ))} - -
+ + +
); diff --git a/src/widgets/Profile/InfoBlock/index.ts b/src/widgets/Profile/InfoBlock/index.ts index 5d90517a4..bc2a686ce 100644 --- a/src/widgets/Profile/InfoBlock/index.ts +++ b/src/widgets/Profile/InfoBlock/index.ts @@ -1,3 +1,6 @@ +export { InfoBlockSkeleton } from './ui/InfoBlock/InfoBlock.skeleton'; export { InfoBlock } from './ui/InfoBlock/InfoBlock'; export { InfoBlockHeader } from './ui/InfoBlockHeader/InfoBlockHeader'; +export { InfoBlockHeaderSkeleton } from './ui/InfoBlockHeader/InfoBlockHeader.skeleton'; export { InfoBlockText } from './ui/InfoBlockText/InfoBlockText'; +export { InfoBlockTextSkeleton } from './ui/InfoBlockText/InfoBlockText.skeleton'; diff --git a/src/widgets/Profile/InfoBlock/ui/InfoBlock/InfoBlock.module.css b/src/widgets/Profile/InfoBlock/ui/InfoBlock/InfoBlock.module.css index 878559fc6..aaef5f5fd 100644 --- a/src/widgets/Profile/InfoBlock/ui/InfoBlock/InfoBlock.module.css +++ b/src/widgets/Profile/InfoBlock/ui/InfoBlock/InfoBlock.module.css @@ -7,4 +7,10 @@ .container { height: auto; +} + +.card-skeleton { + gap: 0; + padding: 24px; + height: auto; } \ No newline at end of file diff --git a/src/widgets/Profile/InfoBlock/ui/InfoBlock/InfoBlock.skeleton.tsx b/src/widgets/Profile/InfoBlock/ui/InfoBlock/InfoBlock.skeleton.tsx new file mode 100644 index 000000000..7c37f7402 --- /dev/null +++ b/src/widgets/Profile/InfoBlock/ui/InfoBlock/InfoBlock.skeleton.tsx @@ -0,0 +1,15 @@ +import { Card } from '@/shared/ui/Card'; + +import { InfoBlockHeaderSkeleton } from '../InfoBlockHeader/InfoBlockHeader.skeleton'; +import { InfoBlockTextSkeleton } from '../InfoBlockText/InfoBlockText.skeleton'; + +import styles from './InfoBlock.module.css'; + +export const InfoBlockSkeleton = () => { + return ( + + + + + ); +}; diff --git a/src/widgets/Profile/InfoBlock/ui/InfoBlockHeader/InfoBlockHeader.module.css b/src/widgets/Profile/InfoBlock/ui/InfoBlockHeader/InfoBlockHeader.module.css index 0f35af5f1..fb993e573 100644 --- a/src/widgets/Profile/InfoBlock/ui/InfoBlockHeader/InfoBlockHeader.module.css +++ b/src/widgets/Profile/InfoBlock/ui/InfoBlockHeader/InfoBlockHeader.module.css @@ -10,7 +10,6 @@ font-size: var(--font-size-h-xs); } -.info-edit { - cursor: pointer; - font-size: var(--font-size-p-s); -} +.header-card-skeleton { + margin-bottom: 20px; +} \ No newline at end of file diff --git a/src/widgets/Profile/InfoBlock/ui/InfoBlockHeader/InfoBlockHeader.skeleton.tsx b/src/widgets/Profile/InfoBlock/ui/InfoBlockHeader/InfoBlockHeader.skeleton.tsx new file mode 100644 index 000000000..63615149d --- /dev/null +++ b/src/widgets/Profile/InfoBlock/ui/InfoBlockHeader/InfoBlockHeader.skeleton.tsx @@ -0,0 +1,17 @@ +import { Flex } from '@/shared/ui/Flex'; +import { Skeleton } from '@/shared/ui/Skeleton'; + +import { UserEditButtonSkeleton } from '@/entities/user'; + +import styles from './InfoBlockHeader.module.css'; + +export const InfoBlockHeaderSkeleton = () => { + return ( +
+ + + + +
+ ); +}; diff --git a/src/widgets/Profile/InfoBlock/ui/InfoBlockText/InfoBlockText.skeleton.tsx b/src/widgets/Profile/InfoBlock/ui/InfoBlockText/InfoBlockText.skeleton.tsx new file mode 100644 index 000000000..4f3110984 --- /dev/null +++ b/src/widgets/Profile/InfoBlock/ui/InfoBlockText/InfoBlockText.skeleton.tsx @@ -0,0 +1,12 @@ +import { Flex } from '@/shared/ui/Flex'; +import { Skeleton } from '@/shared/ui/Skeleton'; + +export const InfoBlockTextSkeleton = () => { + return ( + + {[...Array(6)].map((_, index) => ( + + ))} + + ); +}; diff --git a/src/widgets/Profile/SkillsBlock/index.ts b/src/widgets/Profile/SkillsBlock/index.ts index 89d0056fc..04c18cca0 100644 --- a/src/widgets/Profile/SkillsBlock/index.ts +++ b/src/widgets/Profile/SkillsBlock/index.ts @@ -1,4 +1,7 @@ +export { SkillsBlockSkeleton } from './ui/SkillsBlock/SkillsBlock.skeleton'; export { SkillsBlock } from './ui/SkillsBlock/SkillsBlock'; export { SkillsBlockList } from './ui/SkillsBlockList/SkillsBlockList'; +export { SkillsBlockListSkeleton } from './ui/SkillsBlockList/SkillsBlockList.skeleton'; export { SkillsBlockItem } from './ui/SkillsBlockItem/SkillsBlockItem'; export { SkillsBlockHeader } from './ui/SkillsBlockHeader/SkillsBlockHeader'; +export { SkillsBlockHeaderSkeleton } from './ui/SkillsBlockHeader/SkillsBlockHeader.skeleton'; diff --git a/src/widgets/Profile/SkillsBlock/ui/SkillsBlock/SkillsBlock.module.css b/src/widgets/Profile/SkillsBlock/ui/SkillsBlock/SkillsBlock.module.css index 7c8c7d387..22bbc57a5 100644 --- a/src/widgets/Profile/SkillsBlock/ui/SkillsBlock/SkillsBlock.module.css +++ b/src/widgets/Profile/SkillsBlock/ui/SkillsBlock/SkillsBlock.module.css @@ -3,4 +3,10 @@ flex-direction: column; gap: 20px; width: 100%; +} + +.card-skeleton { + gap: 0; + padding: 24px; + height: auto; } \ No newline at end of file diff --git a/src/widgets/Profile/SkillsBlock/ui/SkillsBlock/SkillsBlock.skeleton.tsx b/src/widgets/Profile/SkillsBlock/ui/SkillsBlock/SkillsBlock.skeleton.tsx new file mode 100644 index 000000000..3977a72cb --- /dev/null +++ b/src/widgets/Profile/SkillsBlock/ui/SkillsBlock/SkillsBlock.skeleton.tsx @@ -0,0 +1,15 @@ +import { Card } from '@/shared/ui/Card'; + +import { SkillsBlockHeaderSkeleton } from '../SkillsBlockHeader/SkillsBlockHeader.skeleton'; +import { SkillsBlockListSkeleton } from '../SkillsBlockList/SkillsBlockList.skeleton'; + +import styles from './SkillsBlock.module.css'; + +export const SkillsBlockSkeleton = () => { + return ( + + + + + ); +}; diff --git a/src/widgets/Profile/SkillsBlock/ui/SkillsBlockHeader/SkillsBlockHeader.module.css b/src/widgets/Profile/SkillsBlock/ui/SkillsBlockHeader/SkillsBlockHeader.module.css index 738f8deaa..6e72ceae8 100644 --- a/src/widgets/Profile/SkillsBlock/ui/SkillsBlockHeader/SkillsBlockHeader.module.css +++ b/src/widgets/Profile/SkillsBlock/ui/SkillsBlockHeader/SkillsBlockHeader.module.css @@ -9,7 +9,6 @@ font-size: var(--font-size-h-xs); } -.skills-edit { - cursor: pointer; - font-size: var(--font-size-p-s); +.header-card-skeleton { + margin-bottom: 20px; } \ No newline at end of file diff --git a/src/widgets/Profile/SkillsBlock/ui/SkillsBlockHeader/SkillsBlockHeader.skeleton.tsx b/src/widgets/Profile/SkillsBlock/ui/SkillsBlockHeader/SkillsBlockHeader.skeleton.tsx new file mode 100644 index 000000000..392b23738 --- /dev/null +++ b/src/widgets/Profile/SkillsBlock/ui/SkillsBlockHeader/SkillsBlockHeader.skeleton.tsx @@ -0,0 +1,17 @@ +import { Flex } from '@/shared/ui/Flex'; +import { Skeleton } from '@/shared/ui/Skeleton'; + +import { UserEditButtonSkeleton } from '@/entities/user'; + +import styles from './SkillsBlockHeader.module.css'; + +export const SkillsBlockHeaderSkeleton = () => { + return ( +
+ + + + +
+ ); +}; diff --git a/src/widgets/Profile/SkillsBlock/ui/SkillsBlockList/SkillsBlockList.skeleton.tsx b/src/widgets/Profile/SkillsBlock/ui/SkillsBlockList/SkillsBlockList.skeleton.tsx new file mode 100644 index 000000000..66804db2a --- /dev/null +++ b/src/widgets/Profile/SkillsBlock/ui/SkillsBlockList/SkillsBlockList.skeleton.tsx @@ -0,0 +1,14 @@ +import { Flex } from '@/shared/ui/Flex'; +import { Skeleton } from '@/shared/ui/Skeleton'; + +export const SkillsBlockListSkeleton = () => { + return ( + + {[...Array(8)].map((_, index) => ( + + + + ))} + + ); +}; diff --git a/src/widgets/Profile/UserBlock/index.ts b/src/widgets/Profile/UserBlock/index.ts index bd65ba273..a1ef9abd6 100644 --- a/src/widgets/Profile/UserBlock/index.ts +++ b/src/widgets/Profile/UserBlock/index.ts @@ -1 +1 @@ -export { UserBlock } from './ui/UserBlock'; +export { UserBlock, UserBlockSkeleton } from './ui/UserBlock'; diff --git a/src/widgets/Profile/UserBlock/ui/UserBlock/UserBlock.module.css b/src/widgets/Profile/UserBlock/ui/UserBlock/UserBlock.module.css index 3385c8193..34126745e 100644 --- a/src/widgets/Profile/UserBlock/ui/UserBlock/UserBlock.module.css +++ b/src/widgets/Profile/UserBlock/ui/UserBlock/UserBlock.module.css @@ -12,6 +12,17 @@ width: 100%; } +.profile-card-skeleton { + gap: 0; + padding: 16px; + height: auto; +} + +.flex-profile-skeleton { + display: flex; + gap: 16px; +} + @media (width <= 768px) { .card { flex-direction: column; @@ -29,3 +40,9 @@ width: 100%; } } + +@media (width <=720px) { + .flex-profile-skeleton { + flex-direction: column; + } +} \ No newline at end of file diff --git a/src/widgets/Profile/UserBlock/ui/UserBlock/UserBlock.skeleton.tsx b/src/widgets/Profile/UserBlock/ui/UserBlock/UserBlock.skeleton.tsx new file mode 100644 index 000000000..dde05a7f6 --- /dev/null +++ b/src/widgets/Profile/UserBlock/ui/UserBlock/UserBlock.skeleton.tsx @@ -0,0 +1,20 @@ +import { Card } from '@/shared/ui/Card'; + +import { UserEditButtonSkeleton } from '@/entities/user'; + +import { UserImageBlockSkeleton } from '../UserImageBlock'; +import { UserInfoBlockSkeleton } from '../UserInfoBlock'; + +import styles from './UserBlock.module.css'; + +export const UserBlockSkeleton = () => { + return ( + +
+ + + +
+
+ ); +}; diff --git a/src/widgets/Profile/UserBlock/ui/UserBlock/index.ts b/src/widgets/Profile/UserBlock/ui/UserBlock/index.ts index fd27aff41..b599a1ec3 100644 --- a/src/widgets/Profile/UserBlock/ui/UserBlock/index.ts +++ b/src/widgets/Profile/UserBlock/ui/UserBlock/index.ts @@ -1 +1,2 @@ export { UserBlock } from './UserBlock'; +export { UserBlockSkeleton } from './UserBlock.skeleton'; diff --git a/src/widgets/Profile/UserBlock/ui/UserImageBlock/UserImageBlock.skeleton.tsx b/src/widgets/Profile/UserBlock/ui/UserImageBlock/UserImageBlock.skeleton.tsx new file mode 100644 index 000000000..c49a451bf --- /dev/null +++ b/src/widgets/Profile/UserBlock/ui/UserImageBlock/UserImageBlock.skeleton.tsx @@ -0,0 +1,14 @@ +import { Flex } from '@/shared/ui/Flex'; +import { Skeleton } from '@/shared/ui/Skeleton'; + +export const UserImageBlockSkeleton = () => { + return ( + + + + + + + + ); +}; diff --git a/src/widgets/Profile/UserBlock/ui/UserImageBlock/index.ts b/src/widgets/Profile/UserBlock/ui/UserImageBlock/index.ts index 548712366..498b8068e 100644 --- a/src/widgets/Profile/UserBlock/ui/UserImageBlock/index.ts +++ b/src/widgets/Profile/UserBlock/ui/UserImageBlock/index.ts @@ -1 +1,2 @@ +export { UserImageBlockSkeleton } from './UserImageBlock.skeleton'; export { UserImageBlock } from './UserImageBlock'; diff --git a/src/widgets/Profile/UserBlock/ui/UserInfoBlock/UserInfoBlock.skeleton.tsx b/src/widgets/Profile/UserBlock/ui/UserInfoBlock/UserInfoBlock.skeleton.tsx new file mode 100644 index 000000000..177b80cf3 --- /dev/null +++ b/src/widgets/Profile/UserBlock/ui/UserInfoBlock/UserInfoBlock.skeleton.tsx @@ -0,0 +1,34 @@ +import { Flex } from '@/shared/ui/Flex'; +import { Skeleton } from '@/shared/ui/Skeleton'; + +export const UserInfoBlockSkeleton = () => { + return ( + + + + + + + {[...Array(4)].map((_, index) => ( + + + + ))} + + + {[...Array(2)].map((_, index) => ( + + + + ))} + + + {[...Array(6)].map((_, index) => ( + + + + ))} + + + ); +}; diff --git a/src/widgets/Profile/UserBlock/ui/UserInfoBlock/index.ts b/src/widgets/Profile/UserBlock/ui/UserInfoBlock/index.ts index f02d5d634..ac566c338 100644 --- a/src/widgets/Profile/UserBlock/ui/UserInfoBlock/index.ts +++ b/src/widgets/Profile/UserBlock/ui/UserInfoBlock/index.ts @@ -1 +1,2 @@ +export { UserInfoBlockSkeleton } from './UserInfoBlock.skeleton'; export { UserInfoBlock } from './UserInfoBlock';