From eabf34e42305e78809535bec3f231414f6dc1347 Mon Sep 17 00:00:00 2001 From: SeonghunYang Date: Thu, 18 Apr 2024 10:33:18 +0000 Subject: [PATCH 1/9] [web] feat: Add Avatar component --- app/ui/view/atom/avatar/avatar.tsx | 43 ++++++++++++++++++++++++++++++ package-lock.json | 27 +++++++++++++++++++ package.json | 1 + 3 files changed, 71 insertions(+) create mode 100644 app/ui/view/atom/avatar/avatar.tsx diff --git a/app/ui/view/atom/avatar/avatar.tsx b/app/ui/view/atom/avatar/avatar.tsx new file mode 100644 index 00000000..f511b04c --- /dev/null +++ b/app/ui/view/atom/avatar/avatar.tsx @@ -0,0 +1,43 @@ +'use client'; + +import * as React from 'react'; +import * as AvatarPrimitive from '@radix-ui/react-avatar'; + +import { cn } from '@/app/utils/shadcn/utils'; + +const Avatar = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +Avatar.displayName = AvatarPrimitive.Root.displayName; + +const AvatarImage = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +AvatarImage.displayName = AvatarPrimitive.Image.displayName; + +const AvatarFallback = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +AvatarFallback.displayName = AvatarPrimitive.Fallback.displayName; + +export { Avatar, AvatarImage, AvatarFallback }; diff --git a/package-lock.json b/package-lock.json index 9f39b401..3ace1a6b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,6 +13,7 @@ "@heroicons/react": "^2.1.1", "@mswjs/http-middleware": "^0.9.2", "@radix-ui/react-alert-dialog": "^1.0.5", + "@radix-ui/react-avatar": "^1.0.4", "@radix-ui/react-dialog": "^1.0.5", "@radix-ui/react-icons": "^1.3.0", "@radix-ui/react-slot": "^1.0.2", @@ -3926,6 +3927,32 @@ } } }, + "node_modules/@radix-ui/react-avatar": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-avatar/-/react-avatar-1.0.4.tgz", + "integrity": "sha512-kVK2K7ZD3wwj3qhle0ElXhOjbezIgyl2hVvgwfIdexL3rN6zJmy5AqqIf+D31lxVppdzV8CjAfZ6PklkmInZLw==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-context": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-use-callback-ref": "1.0.1", + "@radix-ui/react-use-layout-effect": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, "node_modules/@radix-ui/react-collection": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.0.3.tgz", diff --git a/package.json b/package.json index 5973ac8f..fee2e12a 100644 --- a/package.json +++ b/package.json @@ -26,6 +26,7 @@ "@heroicons/react": "^2.1.1", "@mswjs/http-middleware": "^0.9.2", "@radix-ui/react-alert-dialog": "^1.0.5", + "@radix-ui/react-avatar": "^1.0.4", "@radix-ui/react-dialog": "^1.0.5", "@radix-ui/react-icons": "^1.3.0", "@radix-ui/react-slot": "^1.0.2", From 6289fe7492eee6bac60c384cab54d9c9a012b71c Mon Sep 17 00:00:00 2001 From: SeonghunYang Date: Thu, 18 Apr 2024 10:33:57 +0000 Subject: [PATCH 2/9] [web] chore: Add profile image asset --- public/assets/profile-image.png | Bin 0 -> 24923 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 public/assets/profile-image.png diff --git a/public/assets/profile-image.png b/public/assets/profile-image.png new file mode 100644 index 0000000000000000000000000000000000000000..c53f181c33e39ac9974726de154e23a9d863c485 GIT binary patch literal 24923 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 ewyyqY Date: Thu, 18 Apr 2024 10:49:12 +0000 Subject: [PATCH 3/9] [web] feat: Add Avatar component and stories --- app/ui/view/atom/avatar/avatar.stories.tsx | 17 +++++++++++++++++ app/ui/view/atom/avatar/avatar.tsx | 22 ++++++++++++++++++---- 2 files changed, 35 insertions(+), 4 deletions(-) create mode 100644 app/ui/view/atom/avatar/avatar.stories.tsx diff --git a/app/ui/view/atom/avatar/avatar.stories.tsx b/app/ui/view/atom/avatar/avatar.stories.tsx new file mode 100644 index 00000000..e548910e --- /dev/null +++ b/app/ui/view/atom/avatar/avatar.stories.tsx @@ -0,0 +1,17 @@ +import type { Meta, StoryObj } from '@storybook/react'; + +import Avatar from './avatar'; + +const meta = { + title: 'ui/view/atom/Avatar', + component: Avatar, +} as Meta; + +export default meta; +type Story = StoryObj; + +export const Default: Story = { + args: { + src: './assets/profile-image.png', + }, +}; diff --git a/app/ui/view/atom/avatar/avatar.tsx b/app/ui/view/atom/avatar/avatar.tsx index f511b04c..5ab47206 100644 --- a/app/ui/view/atom/avatar/avatar.tsx +++ b/app/ui/view/atom/avatar/avatar.tsx @@ -5,7 +5,23 @@ import * as AvatarPrimitive from '@radix-ui/react-avatar'; import { cn } from '@/app/utils/shadcn/utils'; -const Avatar = React.forwardRef< +interface AvatarProps { + src: string; + fallback?: React.ReactNode; + alt?: string; + className?: string; +} + +export default function Avatar({ src, fallback, alt, className }: AvatarProps) { + return ( + + + {fallback} + + ); +} + +const AvatarRoot = React.forwardRef< React.ElementRef, React.ComponentPropsWithoutRef >(({ className, ...props }, ref) => ( @@ -15,7 +31,7 @@ const Avatar = React.forwardRef< {...props} /> )); -Avatar.displayName = AvatarPrimitive.Root.displayName; +AvatarRoot.displayName = AvatarPrimitive.Root.displayName; const AvatarImage = React.forwardRef< React.ElementRef, @@ -39,5 +55,3 @@ const AvatarFallback = React.forwardRef< /> )); AvatarFallback.displayName = AvatarPrimitive.Fallback.displayName; - -export { Avatar, AvatarImage, AvatarFallback }; From 07b30eada1b63403f5ac9970008cd4d1e4acb792 Mon Sep 17 00:00:00 2001 From: SeonghunYang Date: Thu, 18 Apr 2024 11:09:00 +0000 Subject: [PATCH 4/9] [web] feat: Add UserInfoNavigator component to MyPage --- app/(sub-page)/my/page.tsx | 5 +++- .../user-info-navigator.tsx | 25 +++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 app/ui/user/user-info-navigator/user-info-navigator.tsx diff --git a/app/(sub-page)/my/page.tsx b/app/(sub-page)/my/page.tsx index f4075c0c..9eab058e 100644 --- a/app/(sub-page)/my/page.tsx +++ b/app/(sub-page)/my/page.tsx @@ -1,5 +1,6 @@ import LectureSearch from '@/app/ui/lecture/lecture-search'; import TakenLecture from '@/app/ui/lecture/taken-lecture'; +import UserInfoNavigator from '@/app/ui/user/user-info-navigator/user-info-navigator'; import ContentContainer from '@/app/ui/view/atom/content-container'; import Drawer from '@/app/ui/view/molecule/drawer/drawer'; import { DIALOG_KEY } from '@/app/utils/key/dialog.key'; @@ -8,7 +9,9 @@ export default function MyPage() { return ( <> -
정보칸
+
+ +
diff --git a/app/ui/user/user-info-navigator/user-info-navigator.tsx b/app/ui/user/user-info-navigator/user-info-navigator.tsx new file mode 100644 index 00000000..89f9cda3 --- /dev/null +++ b/app/ui/user/user-info-navigator/user-info-navigator.tsx @@ -0,0 +1,25 @@ +import Avatar from '../../view/atom/avatar/avatar'; + +import Button from '../../view/atom/button/button'; + +export default function UserInfoNavigator() { + return ( +
+ + +
+ 모유진 + +
+
용용스튜디오연구원
+
60201671
+ +
+
+
+
+
+ ); +} From 1c87404dad7a61de0d51925bb55427027de026d4 Mon Sep 17 00:00:00 2001 From: SeonghunYang Date: Thu, 18 Apr 2024 11:19:14 +0000 Subject: [PATCH 5/9] feat: Add Suspense to UserInfoNavigator component and increase delay in user-handler.mock.ts --- app/(sub-page)/my/page.tsx | 5 ++++- app/mocks/handlers/user-handler.mock.ts | 2 +- .../user/user-info-navigator/user-info-navigator.tsx | 12 +++++++----- 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/app/(sub-page)/my/page.tsx b/app/(sub-page)/my/page.tsx index 9eab058e..ad6ebcf7 100644 --- a/app/(sub-page)/my/page.tsx +++ b/app/(sub-page)/my/page.tsx @@ -4,13 +4,16 @@ import UserInfoNavigator from '@/app/ui/user/user-info-navigator/user-info-navig import ContentContainer from '@/app/ui/view/atom/content-container'; import Drawer from '@/app/ui/view/molecule/drawer/drawer'; import { DIALOG_KEY } from '@/app/utils/key/dialog.key'; +import { Suspense } from 'react'; export default function MyPage() { return ( <>
- + + +
diff --git a/app/mocks/handlers/user-handler.mock.ts b/app/mocks/handlers/user-handler.mock.ts index bde7ac3a..473cfe70 100644 --- a/app/mocks/handlers/user-handler.mock.ts +++ b/app/mocks/handlers/user-handler.mock.ts @@ -38,7 +38,7 @@ export const userHandlers = [ } const userInfo = mockDatabase.getUserInfo(mockDecryptToken(accessToken).authId); - await delay(500); + await delay(3000); if (!userInfo) { return HttpResponse.json({ status: 401, message: 'Unauthorized' }, { status: 401 }); diff --git a/app/ui/user/user-info-navigator/user-info-navigator.tsx b/app/ui/user/user-info-navigator/user-info-navigator.tsx index 89f9cda3..69701268 100644 --- a/app/ui/user/user-info-navigator/user-info-navigator.tsx +++ b/app/ui/user/user-info-navigator/user-info-navigator.tsx @@ -1,18 +1,20 @@ import Avatar from '../../view/atom/avatar/avatar'; - import Button from '../../view/atom/button/button'; +import { getUserInfo } from '@/app/business/user/user.query'; + +export default async function UserInfoNavigator() { + const userInfo = await getUserInfo(); -export default function UserInfoNavigator() { return (
- 모유진 + {userInfo.studentName}
-
용용스튜디오연구원
-
60201671
+
{userInfo.major}
+
{userInfo.studentNumber}