Skip to content

Commit 946200b

Browse files
committed
2 parents 777b162 + 3779734 commit 946200b

12 files changed

Lines changed: 3038 additions & 24428 deletions

File tree

.gitignore

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@
55
/.pnp
66
.pnp.js
77

8+
# lock files (use yarn.lock only)
9+
package-lock.json
10+
bun.lockb
11+
812
# testing
913
/coverage
1014

@@ -15,6 +19,9 @@
1519
# production
1620
/build
1721

22+
# storybook
23+
storybook-static
24+
1825
# misc
1926
.DS_Store
2027
*.pem

app/auth/slides/layout.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { FC, ReactNode } from 'react';
22
import Server from '../apis/server';
33
import { Header } from '@/components/Header';
44

5-
export const SlidesLayout: FC<{ children: ReactNode }> = async ({
5+
const SlidesLayout: FC<{ children: ReactNode }> = async ({
66
children,
77
}) => {
88
const user = await Server.getUserInfo();

bun.lockb

-579 KB
Binary file not shown.

components/Header/Header2.tsx

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
import BaseHeader from '@/components/BaseHeader/BaseHeader';
2-
import { Avatar, mergeClasses } from '@fluentui/react-components';
2+
import { mergeClasses } from '@fluentui/react-components';
33
import { useStyles } from './Header.styles';
44
import { Navigation24Filled } from '@fluentui/react-icons';
55
import { HeaderProps } from '@/components/Header/Header.types';
6+
import UserDropdown from '@/components/UserDropdown';
67

78
export const Header2 = ({ title }: HeaderProps) => {
89
const classes = useStyles();
@@ -16,13 +17,7 @@ export const Header2 = ({ title }: HeaderProps) => {
1617
}
1718
slot3={
1819
<div>
19-
<Avatar
20-
className="cursor-pointer"
21-
image={{
22-
src: 'https://placekitten.com/32/32',
23-
as: 'img',
24-
}}
25-
/>
20+
<UserDropdown />
2621
</div>
2722
}
2823
/>

components/Header/Header3.tsx

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Avatar, mergeClasses } from '@fluentui/react-components';
1+
import { mergeClasses } from '@fluentui/react-components';
22
import { Navigation24Filled } from '@fluentui/react-icons';
33

44
import BaseHeader from '@/components/BaseHeader/BaseHeader';
@@ -7,6 +7,7 @@ import { HeaderProps } from '@/components/Header/Header.types';
77
import ProjectDropdown from '@/components/ProjectDropdown/ProjectDropdown';
88
import { useVideoStore } from '@/src/stores/video.store';
99
import { useRouter } from 'next/navigation';
10+
import UserDropdown from '@/components/UserDropdown';
1011

1112
export const Header3 = ({ projectList }: HeaderProps) => {
1213
const router = useRouter();
@@ -34,13 +35,7 @@ export const Header3 = ({ projectList }: HeaderProps) => {
3435
}
3536
slot3={
3637
<div>
37-
<Avatar
38-
className="cursor-pointer"
39-
image={{
40-
src: 'https://placekitten.com/32/32',
41-
as: 'img',
42-
}}
43-
/>
38+
<UserDropdown />
4439
</div>
4540
}
4641
/>

components/Header/Header4.tsx

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import {
2-
Avatar,
32
Input,
43
mergeClasses,
54
Spinner,
@@ -21,6 +20,7 @@ import {
2120
useQueryGetVideo,
2221
} from '@/src/query/video.query';
2322
import Link from 'next/link';
23+
import UserDropdown from '@/components/UserDropdown';
2424

2525
let debouncedMutation: any = undefined;
2626

@@ -106,13 +106,7 @@ export const Header4 = ({ projectList }: HeaderProps) => {
106106
slot2={<Slot2 projectList={projectList} />}
107107
slot3={
108108
<div>
109-
<Avatar
110-
className="cursor-pointer"
111-
image={{
112-
src: 'https://placekitten.com/32/32',
113-
as: 'img',
114-
}}
115-
/>
109+
<UserDropdown />
116110
</div>
117111
}
118112
/>
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import type { Meta, StoryObj } from '@storybook/react';
2+
import { UserDropdown } from './UserDropdown';
3+
4+
// Mock the store for storybook
5+
const meta: Meta<typeof UserDropdown> = {
6+
title: 'Components/UserDropdown',
7+
component: UserDropdown,
8+
parameters: {
9+
layout: 'centered',
10+
},
11+
tags: ['autodocs'],
12+
};
13+
14+
export default meta;
15+
type Story = StoryObj<typeof meta>;
16+
17+
export const Default: Story = {
18+
args: {},
19+
};
Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
'use client';
2+
3+
import {
4+
Avatar,
5+
Button,
6+
Menu,
7+
MenuItem,
8+
MenuList,
9+
MenuPopover,
10+
MenuTrigger,
11+
tokens,
12+
} from '@fluentui/react-components';
13+
import { Person24Regular, SignOut24Regular } from '@fluentui/react-icons';
14+
import { useRouter } from 'next/navigation';
15+
import useSlidesStore from '@/src/stores/store';
16+
17+
export const UserDropdown = () => {
18+
const router = useRouter();
19+
const { user } = useSlidesStore();
20+
21+
const handleProfileClick = () => {
22+
// Navigate to profile page - assuming /auth/profile route
23+
router.push('/auth/profile');
24+
};
25+
26+
const handleLogoutClick = () => {
27+
// Clear user session and redirect to auth page
28+
// In a real app, you'd also clear authentication tokens/cookies
29+
router.push('/auth');
30+
};
31+
32+
return (
33+
<Menu positioning="below-end">
34+
<MenuTrigger disableButtonEnhancement>
35+
<Button
36+
style={{
37+
border: 'none',
38+
backgroundColor: 'transparent',
39+
padding: 0,
40+
minWidth: 'auto',
41+
height: 'auto'
42+
}}
43+
>
44+
<Avatar
45+
className="cursor-pointer"
46+
image={{
47+
src: 'https://placekitten.com/32/32',
48+
as: 'img',
49+
}}
50+
/>
51+
</Button>
52+
</MenuTrigger>
53+
54+
<MenuPopover>
55+
<MenuList>
56+
<div
57+
style={{
58+
padding: '8px 12px',
59+
borderBottom: `1px solid ${tokens.colorNeutralStroke2}`,
60+
pointerEvents: 'none'
61+
}}
62+
>
63+
<Avatar
64+
size={40}
65+
image={{
66+
src: 'https://placekitten.com/40/40',
67+
as: 'img',
68+
}}
69+
/>
70+
<div
71+
style={{
72+
fontSize: '12px',
73+
color: tokens.colorNeutralForeground2,
74+
marginTop: '4px',
75+
}}
76+
>
77+
{user?.email || 'user@example.com'}
78+
</div>
79+
</div>
80+
81+
<MenuItem
82+
icon={<Person24Regular />}
83+
onClick={handleProfileClick}
84+
>
85+
Profile
86+
</MenuItem>
87+
88+
<MenuItem
89+
icon={<SignOut24Regular />}
90+
onClick={handleLogoutClick}
91+
>
92+
Logout
93+
</MenuItem>
94+
</MenuList>
95+
</MenuPopover>
96+
</Menu>
97+
);
98+
};
99+
100+
export default UserDropdown;

components/UserDropdown/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
export * from './UserDropdown';
2+
export { default } from './UserDropdown';

0 commit comments

Comments
 (0)