diff --git a/src/frontend/apps/web/app/(main)/huddle/page.tsx b/src/frontend/apps/web/app/(main)/huddle/page.tsx new file mode 100644 index 00000000..bb7a7f7b --- /dev/null +++ b/src/frontend/apps/web/app/(main)/huddle/page.tsx @@ -0,0 +1,7 @@ +import HuddleContainer from '@/src/features/video/ui/huddle-container'; + +//허들 테스트를 위한 임시페이지(삭제예정) +const HuddleTest = () => { + return ; +}; +export default HuddleTest; diff --git a/src/frontend/apps/web/src/features/video/.keep b/src/frontend/apps/web/src/features/video/.keep deleted file mode 100644 index e69de29b..00000000 diff --git a/src/frontend/apps/web/src/features/video/index.ts b/src/frontend/apps/web/src/features/video/index.ts new file mode 100644 index 00000000..19b757b7 --- /dev/null +++ b/src/frontend/apps/web/src/features/video/index.ts @@ -0,0 +1 @@ +export { default as HuddleContainer } from './ui/huddle-container'; diff --git a/src/frontend/apps/web/src/features/video/model/huddle-control.type.ts b/src/frontend/apps/web/src/features/video/model/huddle-control.type.ts new file mode 100644 index 00000000..d0c333a7 --- /dev/null +++ b/src/frontend/apps/web/src/features/video/model/huddle-control.type.ts @@ -0,0 +1,5 @@ +export enum HuddleControl { + Mic = 'mic', + Video = 'video', + Screen = 'screen', +} diff --git a/src/frontend/apps/web/src/features/video/model/huddle-controls-reducer.ts b/src/frontend/apps/web/src/features/video/model/huddle-controls-reducer.ts new file mode 100644 index 00000000..c0667aea --- /dev/null +++ b/src/frontend/apps/web/src/features/video/model/huddle-controls-reducer.ts @@ -0,0 +1,16 @@ +import { type HuddleControl } from './huddle-control.type'; + +export type HuddleControlsState = { + [HuddleControl.Mic]: boolean; + [HuddleControl.Video]: boolean; + [HuddleControl.Screen]: boolean; +}; + +export type HuddleControlAction = { + type: HuddleControl; +}; + +export const huddleControlReducer = ( + state: HuddleControlsState, + action: HuddleControlAction, +) => ({ ...state, [action.type]: !state[action.type] }); diff --git a/src/frontend/apps/web/src/features/video/model/index.ts b/src/frontend/apps/web/src/features/video/model/index.ts new file mode 100644 index 00000000..25cac9ea --- /dev/null +++ b/src/frontend/apps/web/src/features/video/model/index.ts @@ -0,0 +1,6 @@ +export { HuddleControl } from './huddle-control.type'; +export { + type HuddleControlsState, + type HuddleControlAction, + huddleControlReducer, +} from './huddle-controls-reducer'; diff --git a/src/frontend/apps/web/src/features/video/ui/huddle-container.tsx b/src/frontend/apps/web/src/features/video/ui/huddle-container.tsx new file mode 100644 index 00000000..b6a7b042 --- /dev/null +++ b/src/frontend/apps/web/src/features/video/ui/huddle-container.tsx @@ -0,0 +1,20 @@ +import { Headphones } from 'lucide-react'; +import HuddleContent from './huddle-section'; +import ControlsContainer from './huddle-footer'; + +const HuddleContainer = () => { + return ( +
+

+ slack-전체에서의 허들 1명 +

+
+ +
+
+ +
+
+ ); +}; +export default HuddleContainer; diff --git a/src/frontend/apps/web/src/features/video/ui/huddle-control-item.tsx b/src/frontend/apps/web/src/features/video/ui/huddle-control-item.tsx new file mode 100644 index 00000000..18b8c2f6 --- /dev/null +++ b/src/frontend/apps/web/src/features/video/ui/huddle-control-item.tsx @@ -0,0 +1,25 @@ +import { ToggleGroupItem } from '@workspace/ui/components'; +import { HuddleControl, HuddleControlAction } from '../model'; +import { Dispatch } from 'react'; + +type HuddleControlProps = { + value: HuddleControl; + children: React.ReactNode; + dispatch: Dispatch; +}; + +const HuddleControlItem = ({ + value, + children, + dispatch, +}: HuddleControlProps) => { + return ( + dispatch({ type: value })} + > + {children} + + ); +}; +export default HuddleControlItem; diff --git a/src/frontend/apps/web/src/features/video/ui/huddle-controls-group.tsx b/src/frontend/apps/web/src/features/video/ui/huddle-controls-group.tsx new file mode 100644 index 00000000..5561a6f0 --- /dev/null +++ b/src/frontend/apps/web/src/features/video/ui/huddle-controls-group.tsx @@ -0,0 +1,63 @@ +'use client'; +import { Button, ToggleGroup } from '@workspace/ui/components'; +import { + Mic, + MicOff, + ScreenShare, + ScreenShareOff, + Video, + VideoOff, +} from 'lucide-react'; +import { useReducer } from 'react'; +import HuddleControlItem from './huddle-control-item'; +import { HuddleControl, huddleControlReducer } from '../model'; + +export const controlIconList = { + [HuddleControl.Mic]: { on: , off: }, + [HuddleControl.Video]: { on: