diff --git a/FE/package-lock.json b/FE/package-lock.json index bc50936..f6c7570 100644 --- a/FE/package-lock.json +++ b/FE/package-lock.json @@ -16,6 +16,7 @@ "@tanstack/react-query": "^5.8.1", "@tanstack/react-query-devtools": "^5.8.1", "axios": "^1.6.1", + "dayjs": "^1.11.10", "react": "^18.2.0", "react-confetti": "^6.1.0", "react-dom": "^18.2.0", @@ -4840,6 +4841,11 @@ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" }, + "node_modules/dayjs": { + "version": "1.11.10", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.10.tgz", + "integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==" + }, "node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", diff --git a/FE/package.json b/FE/package.json index 1053b55..ebe542f 100644 --- a/FE/package.json +++ b/FE/package.json @@ -18,6 +18,7 @@ "@tanstack/react-query": "^5.8.1", "@tanstack/react-query-devtools": "^5.8.1", "axios": "^1.6.1", + "dayjs": "^1.11.10", "react": "^18.2.0", "react-confetti": "^6.1.0", "react-dom": "^18.2.0", diff --git a/FE/src/AppRouter.tsx b/FE/src/AppRouter.tsx index 600cedf..9d6a711 100644 --- a/FE/src/AppRouter.tsx +++ b/FE/src/AppRouter.tsx @@ -10,6 +10,8 @@ import { createBrowserRouter, Outlet, RouterProvider } from 'react-router-dom'; import myPageLoader from '@routes/myPageLoader'; import invalidPathLoader from '@routes/invalidPathLoader'; import rootLoader from '@routes/rootLoader'; +import InterviewVideoPublicPage from '@page/interviewVideoPublicPage'; +import InterviewVideoPublicLoader from '@routes/interviewVideoPublicLoader'; const routes = ({ queryClient }: { queryClient: QueryClient }) => { return createBrowserRouter([ @@ -36,13 +38,22 @@ const routes = ({ queryClient }: { queryClient: QueryClient }) => { element: , }, { - path: PATH.INTERVIEW_VIDEO, // ":videoId" is a URL parameter + path: PATH.INTERVIEW_VIDEO, element: , }, + { + path: PATH.INTERVIEW_VIDEO_PUBLIC, + element: , + loader: ({ params }) => + InterviewVideoPublicLoader({ + params: params, + queryClient: queryClient, + }), + }, { path: '*', loader: () => invalidPathLoader(), - element: , //TODO url은 변경되지 않는 문제 해결해야함 + element: , }, ], }, diff --git a/FE/src/GlobalSvgProvider.tsx b/FE/src/GlobalSvgProvider.tsx index 203a619..f8103b2 100644 --- a/FE/src/GlobalSvgProvider.tsx +++ b/FE/src/GlobalSvgProvider.tsx @@ -107,6 +107,36 @@ const spliteSvgCode = ( /> + + + + + + + + + + + + + & + React.ButtonHTMLAttributes; +const LightButton: React.FC = ({ + children, + size = 'md', + ...args +}) => { + return ( + + ); +}; + +export default LightButton; diff --git a/FE/src/components/common/Loading/LoadingBounce.tsx b/FE/src/components/common/Loading/LoadingBounce.tsx new file mode 100644 index 0000000..3063f2f --- /dev/null +++ b/FE/src/components/common/Loading/LoadingBounce.tsx @@ -0,0 +1,27 @@ +import { css, keyframes } from '@emotion/react'; +import logo from '@assets/images/logo.png'; + +const LoadingBounce = () => { + const bounce = keyframes` + 0%, 100% { + transform: translateY(0); + } + 50% { + transform: translateY(-4rem); /* 공이 최대 높이까지 튀어오르는 지점 */ + } + `; + return ( + {'곰돌이 + ); +}; + +export default LoadingBounce; diff --git a/FE/src/components/landingPage/StartButton.tsx b/FE/src/components/common/StartButton/StartButton.tsx similarity index 100% rename from FE/src/components/landingPage/StartButton.tsx rename to FE/src/components/common/StartButton/StartButton.tsx diff --git a/FE/src/components/common/VideoPlayer/IconButton.tsx b/FE/src/components/common/VideoPlayer/IconButton.tsx new file mode 100644 index 0000000..060b6da --- /dev/null +++ b/FE/src/components/common/VideoPlayer/IconButton.tsx @@ -0,0 +1,36 @@ +import Button from '@foundation/Button/Button'; +import { theme } from '@styles/theme'; +import Icon from '@foundation/Icon/Icon'; +import Typography from '@foundation/Typography/Typography'; +import { css } from '@emotion/react'; +import { MouseEventHandler } from 'react'; + +type IconButtonProps = { + text: string; + iconName: string; + onClick: MouseEventHandler; +}; +const IconButton: React.FC = ({ text, iconName, onClick }) => { + return ( + + ); +}; + +export default IconButton; diff --git a/FE/src/components/common/VideoPlayer/VideoPlayer.tsx b/FE/src/components/common/VideoPlayer/VideoPlayer.tsx new file mode 100644 index 0000000..50c3b40 --- /dev/null +++ b/FE/src/components/common/VideoPlayer/VideoPlayer.tsx @@ -0,0 +1,25 @@ +import { css } from '@emotion/react'; + +type VideoPlayerProps = { + url: string; +}; + +const VideoPlayer: React.FC = ({ url }) => { + return ( +