From 53e65ae2f48789f371e944154909b04931cf42f7 Mon Sep 17 00:00:00 2001 From: novice1993 Date: Sat, 23 Sep 2023 22:16:37 +0900 Subject: [PATCH] =?UTF-8?q?[Rename]=20=ED=8F=B4=EB=8D=94=20=EB=B0=8F=20?= =?UTF-8?q?=ED=8C=8C=EC=9D=BC=EB=AA=85=20=EC=9D=BC=EB=B6=80=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 폴더 및 파일명 일부 수정 (첫글자 대문자로 통일) Issues #122 --- .../asset/CentralSectionMenu-BookmarkOff.png | Bin 1146 -> 0 bytes .../CentralSectionMenu-BookmarkOn.png.png | Bin 1192 -> 0 bytes .../src/asset/CentralSectionMenu-dummyImg.png | Bin 4955 -> 0 bytes .../asset/CompareChartSection-SearchIcon.png | Bin 11318 -> 0 bytes .../CentralSectionMenu-compareChart.png | Bin .../CompareChartSection/CompareList.tsx | 32 -- .../components/CompareChartSection/Index.tsx | 62 ---- .../CompareChartSection/SearchBox.tsx | 38 -- client/src/components/Headers/LoginHeader.tsx | 4 +- .../src/components/Headers/LogoutHeader.tsx | 6 +- client/src/components/Profile/cashModal.tsx | 324 +++++++++--------- .../src/components/Profile/profileModal.tsx | 120 +++---- .../components/stockinfoComponents/index.tsx | 2 +- client/src/components/watchlist/WatchList.tsx | 2 +- client/src/page/MainPage.tsx | 8 +- client/src/page/TabPages/MarketInfoPage.tsx | 2 +- client/src/page/TabPages/TabContainerPage.tsx | 35 +- client/src/page/TabPages/communityPage.tsx | 2 +- 18 files changed, 240 insertions(+), 397 deletions(-) delete mode 100644 client/src/asset/CentralSectionMenu-BookmarkOff.png delete mode 100644 client/src/asset/CentralSectionMenu-BookmarkOn.png.png delete mode 100644 client/src/asset/CentralSectionMenu-dummyImg.png delete mode 100644 client/src/asset/CompareChartSection-SearchIcon.png rename client/src/asset/{ => images}/CentralSectionMenu-compareChart.png (100%) delete mode 100644 client/src/components/CompareChartSection/CompareList.tsx delete mode 100644 client/src/components/CompareChartSection/Index.tsx delete mode 100644 client/src/components/CompareChartSection/SearchBox.tsx diff --git a/client/src/asset/CentralSectionMenu-BookmarkOff.png b/client/src/asset/CentralSectionMenu-BookmarkOff.png deleted file mode 100644 index 1f3bec98b0b51da7dd7dc28706798c4e52164eef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1146 zcmV-=1cm#FP)K~#7F)mKYM zRa+Qdd+&3OdPF_G5V>-Epo8nRE2x8WFIRDL2W4Ut!{{*#Y+8++NJSDvrwAuKhE39m zNYKzhLa7 zAQ0&6?d{F4tgJMeo100w?llyiLNGf!dmaQz9k+7o>gt-Nr>CFM1xT29F1)~N2+k$m z$j{Heh`|5}eQ0P%>+bIM#2{q?oP3Rm_x*nVzXJmU$A|>&H#s?JSA|Fst^`ypX(U0y zb-Aq#hr`EtFTJm?&mL8Iif@oP^l)r!ER>#}9`gBorG{aIaVy8NtTGTd2@ixtaktAk>3O>1l6omrTYw zL;xASBaRT|<>k4g7$hu^AOf}*;yD28Z;B(r_V)H|@u}nu&XKs`hMMH&=Dw(@sX-X^ z|HMzk#>Pgpwzl?;V2j0P_kZaD)UT+js_Hp7IJhN#5@NB~-KM6ds9=jrN=hW_lIotb z3N*xr%E&)HK7KYkJNv%)0nE?OUu|h=d5Vm;Ha9mv;1-F=qs8(?4hSfxsoB=n_GEE! z@f4Mp@CbSbrF;g;`?j{WBtlAx%(AjFv%bFGWW|TeP+hYZh?p@kF>xs?E9-{vfVH)? zdkqZ@QC9T9A+~Z5v@KV?Ah8olE)kn;W@hF;!Xwhs(*B@*5JF|SQf?C<#m+{Q>@<|z zt!VKv;Sm`b84=opTwhpNDAC{~E01?WCz758bfh8?!)~qjYe4%h>Fn&xM)}E=l@*H( zN~+wI04+u@_iVjFM@L6Q%@Im+x$A-CMnHoljmaKRmMnk6%c(CND3~CQw{l zEJj8~;-_lL1U`98{GE7ze}Df~e}DgpNF?$I@_2A?@H9S5pC+!ur`lg+#M07|UR_-+ zP+6`{&|C;;NS;MZbLbk!@tdissmrMC*C}DE|EZyNZg6 zKQVpJqADRZ4-i{y(o6H*-Q5Sk|4{ytHbHiq1qB7~p~oPlp6qG9YOXKjNxL={Q_y^z$=X6GQ?A`CVmzXK1X%$D0RGQhvTx zXL?+SG_SYUBKZP5S46)HnuACxe?QK@q(q`Wgp@bn64o4F#lJQ_0^hR3-RzMSU;qFB M07*qoM6N<$f-yM|L;wH) diff --git a/client/src/asset/CentralSectionMenu-BookmarkOn.png.png b/client/src/asset/CentralSectionMenu-BookmarkOn.png.png deleted file mode 100644 index af97fcf38f70378a973b320d8b7e8673b94e9325..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1192 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 diff --git a/client/src/asset/CompareChartSection-SearchIcon.png b/client/src/asset/CompareChartSection-SearchIcon.png deleted file mode 100644 index 8e3e2eed93212b1284164bff66363706c8159733..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11318 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 P2L{iT)D>&wEyMo@BUtdM diff --git a/client/src/asset/CentralSectionMenu-compareChart.png b/client/src/asset/images/CentralSectionMenu-compareChart.png similarity index 100% rename from client/src/asset/CentralSectionMenu-compareChart.png rename to client/src/asset/images/CentralSectionMenu-compareChart.png diff --git a/client/src/components/CompareChartSection/CompareList.tsx b/client/src/components/CompareChartSection/CompareList.tsx deleted file mode 100644 index 24d5b918..00000000 --- a/client/src/components/CompareChartSection/CompareList.tsx +++ /dev/null @@ -1,32 +0,0 @@ -import { styled } from "styled-components"; - -const emptyMessage: string = `현재 비교 중인 종목이 없습니다 -비교하고 싶은 항목을 추가해보세요`; - -const CompareList = () => { - return ( - - {emptyMessage} - - ); -}; - -export default CompareList; - -const Container = styled.div` - flex: 1 0 0; -`; - -const EmptyIndicator = styled.div` - height: 70%; - display: flex; - justify-content: center; - align-items: center; - font-size: 14px; - color: #999999; - padding-left: 18px; - padding-right: 18px; - white-space: pre-wrap; - text-align: center; - line-height: 20px; -`; diff --git a/client/src/components/CompareChartSection/Index.tsx b/client/src/components/CompareChartSection/Index.tsx deleted file mode 100644 index 96b21c59..00000000 --- a/client/src/components/CompareChartSection/Index.tsx +++ /dev/null @@ -1,62 +0,0 @@ -import { styled } from "styled-components"; - -import SearchBox from "./SearchBox"; -import CompareList from "./CompareList"; - -const titleText: string = "비교차트"; - -const CompareChartSection = () => { - return ( - - - {titleText} - - - - - - ); -}; - -export default CompareChartSection; - -const Container = styled.div` - position: fixed; - z-index: 1; - left: -300px; - transition: 0.3s left ease-in-out; - display: flex; - flex-direction: column; - min-width: 248px; - height: 100%; - background-color: #ffffff; - border: 1px solid black; -`; - -const UpperBar = styled.div` - position: relative; - width: 100%; - height: 43px; - display: flex; - flex-direction: row; - justify-content: center; - align-items: center; - border-bottom: 1px solid darkgray; -`; - -const Title = styled.h2` - font-size: 17px; - font-weight: 500; -`; - -const CloseBtn = styled.button` - position: absolute; - right: 10px; - width: 28px; - height: 95%; - border: none; - font-size: 17px; - font-weight: 500; - color: #525252; - background-color: #ffff; -`; diff --git a/client/src/components/CompareChartSection/SearchBox.tsx b/client/src/components/CompareChartSection/SearchBox.tsx deleted file mode 100644 index 3c17f1b4..00000000 --- a/client/src/components/CompareChartSection/SearchBox.tsx +++ /dev/null @@ -1,38 +0,0 @@ -import { styled } from "styled-components"; -import searchIcon from "../../asset/CompareChartSection-SearchIcon.png"; - -const SearchBox = () => { - return ( - - - - - ); -}; - -export default SearchBox; - -const Container = styled.div` - width: 100%; - height: 39px; - padding-left: 12px; - padding-right: 12px; - border-bottom: 1px solid darkgray; - - display: flex; - flex-direction: row; - align-items: center; - gap: 6px; -`; - -const SearchIcon = styled.img` - width: 20px; - height: 20px; -`; - -const SeachBar = styled.input` - flex: 1 0 0; - height: 26px; - border: none; - padding-left: 2px; -`; diff --git a/client/src/components/Headers/LoginHeader.tsx b/client/src/components/Headers/LoginHeader.tsx index 3ea87d3a..ecf17c7e 100644 --- a/client/src/components/Headers/LoginHeader.tsx +++ b/client/src/components/Headers/LoginHeader.tsx @@ -2,8 +2,8 @@ import React, { useEffect, useState } from "react"; import styled from "styled-components"; import StockHolmLogo from "../../asset/images/StockHolmLogo.png"; // import SampleProfile from "../../asset/images/ProfileSample.png"; -import ProfileModal from "../Profile/profileModal"; -import StockSearchComponent from "./stockSearchComponent"; +import ProfileModal from "../Profile/ProfileModal"; +import StockSearchComponent from "./StockSearchComponent"; import { setLogoutState } from "../../reducer/member/loginSlice"; import { useDispatch } from "react-redux"; import { useGetMemberInfo } from "../../hooks/useGetMemberInfo"; // import the hook diff --git a/client/src/components/Headers/LogoutHeader.tsx b/client/src/components/Headers/LogoutHeader.tsx index e408ac4f..6b27acfb 100644 --- a/client/src/components/Headers/LogoutHeader.tsx +++ b/client/src/components/Headers/LogoutHeader.tsx @@ -2,16 +2,14 @@ import React from "react"; import styled from "styled-components"; import StockHolmLogo from "../../asset/images/StockHolmLogo.png"; -import StockSearchComponent from "./stockSearchComponent"; +import StockSearchComponent from "./StockSearchComponent"; const LogoutHeader: React.FC = ({ onLoginClick }) => { - - const loginText = "로그인"; // 로그인 버튼 텍스트 // 로고 클릭 핸들러 const handleLogoClick = () => { - window.location.reload() + window.location.reload(); }; // 컴포넌트 렌더링 diff --git a/client/src/components/Profile/cashModal.tsx b/client/src/components/Profile/cashModal.tsx index 4c3cd501..5e8260b6 100644 --- a/client/src/components/Profile/cashModal.tsx +++ b/client/src/components/Profile/cashModal.tsx @@ -1,141 +1,139 @@ -import React, { useState } from 'react'; -import styled from 'styled-components'; -import { useDispatch} from 'react-redux'; // <-- Import useSelector -import { useCreateCash, useResetCash } from '../../hooks/useCash'; -import useGetCash from '../../hooks/useGetCash'; -import useGetCashId from '../../hooks/useGetCashId'; -import { setCashId, setMoney } from '../../reducer/cash/cashSlice'; - - +import React, { useState } from "react"; +import styled from "styled-components"; +import { useDispatch } from "react-redux"; // <-- Import useSelector +import { useCreateCash, useResetCash } from "../../hooks/useCash"; +import useGetCash from "../../hooks/useGetCash"; +import useGetCashId from "../../hooks/useGetCashId"; +import { setCashId, setMoney } from "../../reducer/cash/cashSlice"; const CashModal: React.FC<{ onClose: () => void }> = ({ onClose }) => { - - // 상태 및 변수 초기화 - const titleText = "현금생성/재생성"; - const cashCreationPlaceholder = "1백만원~5억원 사이를 입력하세요"; - const createCashButtonText = "현금 생성"; - const cashInputPlaceholder = "1백만원~5억원 사이를 입력하세요"; - const resetButtonText = "현금 재생성"; - // const refreshButtonText ="새로고침"; - - const [errorMessage, setErrorMessage] = useState(null); // 에러 메시지 상태 변수 추가 - - const dispatch = useDispatch(); - - // useGetCash 훅을 사용하여 현금 보유량 가져오기 - const { cashData: holdingsAmount } = useGetCash(); // 👈 useGetCash 훅을 사용하여 현금 보유량 데이터를 가져옵니다. - - // useGetCashId 훅을 사용하여 cashId 가져오기 - const { cashData: cashId, cashError } = useGetCashId(); - - const createCashMutation = useCreateCash(); - const updateCashMutation = useResetCash(); - - const [cashInput, setCashInput] = useState('0'); - const [initialAmount, setInitialAmount] = useState('0'); // 현금 생성을 위한 상태 변수 - - // 현금 생성 및 cashId 전역 저장 함수 - const handleCreateCash = () => { - createCashMutation.mutate(initialAmount, { - onSuccess: () => { - window.location.reload(); - }, - onError: (error) => { - // 에러 처리 - const err = error as Error; - setErrorMessage(err?.message || "현금 생성에 실패했습니다."); - } - }); - }; - - // 입력한 금액으로 현금 리셋 함수 - const handleCashReset = () => { - if (cashId) { - const numericCashAmount = cashInput; - updateCashMutation.mutate({ money: numericCashAmount }, { - onSuccess: () => { - dispatch(setMoney(numericCashAmount)); - dispatch(setCashId(cashId)); - window.location.reload(); - }, - onError: (error) => { - // 에러 처리 - const err = error as Error; - setErrorMessage(err?.message || "현금 재생성에 실패했습니다."); - } - }); - } else { - console.error("cashId is null or not a valid number."); - } - }; - - const validateCashInput = (inputValue: string) => { - const numericValue = parseInt(inputValue.replace(/,/g, ''), 10); - if (isNaN(numericValue) || numericValue < 1000000 || numericValue > 500000000) { - setErrorMessage("100만에서 5억 사이의 수를 입력하세요"); - } else { - setErrorMessage(null); + // 상태 및 변수 초기화 + const titleText = "현금생성/재생성"; + const cashCreationPlaceholder = "1백만원~5억원 사이를 입력하세요"; + const createCashButtonText = "현금 생성"; + const cashInputPlaceholder = "1백만원~5억원 사이를 입력하세요"; + const resetButtonText = "현금 재생성"; + // const refreshButtonText ="새로고침"; + + const [errorMessage, setErrorMessage] = useState(null); // 에러 메시지 상태 변수 추가 + + const dispatch = useDispatch(); + + // useGetCash 훅을 사용하여 현금 보유량 가져오기 + const { cashData: holdingsAmount } = useGetCash(); // 👈 useGetCash 훅을 사용하여 현금 보유량 데이터를 가져옵니다. + + // useGetCashId 훅을 사용하여 cashId 가져오기 + const { cashData: cashId, cashError } = useGetCashId(); + + const createCashMutation = useCreateCash(); + const updateCashMutation = useResetCash(); + + const [cashInput, setCashInput] = useState("0"); + const [initialAmount, setInitialAmount] = useState("0"); // 현금 생성을 위한 상태 변수 + + // 현금 생성 및 cashId 전역 저장 함수 + const handleCreateCash = () => { + createCashMutation.mutate(initialAmount, { + onSuccess: () => { + window.location.reload(); + }, + onError: (error) => { + // 에러 처리 + const err = error as Error; + setErrorMessage(err?.message || "현금 생성에 실패했습니다."); + }, + }); + }; + + // 입력한 금액으로 현금 리셋 함수 + const handleCashReset = () => { + if (cashId) { + const numericCashAmount = cashInput; + updateCashMutation.mutate( + { money: numericCashAmount }, + { + onSuccess: () => { + dispatch(setMoney(numericCashAmount)); + dispatch(setCashId(cashId)); + window.location.reload(); + }, + onError: (error) => { + // 에러 처리 + const err = error as Error; + setErrorMessage(err?.message || "현금 재생성에 실패했습니다."); + }, } - }; + ); + } else { + console.error("cashId is null or not a valid number."); + } + }; + + const validateCashInput = (inputValue: string) => { + const numericValue = parseInt(inputValue.replace(/,/g, ""), 10); + if (isNaN(numericValue) || numericValue < 1000000 || numericValue > 500000000) { + setErrorMessage("100만에서 5억 사이의 수를 입력하세요"); + } else { + setErrorMessage(null); + } + }; - const handleEnterPress = (event: React.KeyboardEvent, action: () => void) => { - if (event.key === 'Enter') { - action(); - } - }; + const handleEnterPress = (event: React.KeyboardEvent, action: () => void) => { + if (event.key === "Enter") { + action(); + } + }; -return ( + return ( - - × - {titleText} - - {/* cashId가 없거나 cashId 요청에 오류가 있으면 현금 생성 UI 표시 */} - {(!cashId || cashError) && ( -
- { - setInitialAmount(e.target.value); - validateCashInput(e.target.value); // 입력 값 변경 시 유효성 검사 - }} - placeholder={cashCreationPlaceholder} - onKeyDown={(event) => handleEnterPress(event, handleCreateCash)} - /> - - {createCashButtonText} -
- )} - - {/* cashId가 있으면 현금 리셋 UI 표시 */} - {cashId && !cashError && ( -
- { - setCashInput(e.target.value); - validateCashInput(e.target.value); // 입력 값 변경 시 유효성 검사 - }} - placeholder={cashInputPlaceholder} - onKeyDown={(event) => handleEnterPress(event, handleCashReset)} - /> - - {resetButtonText} -
- )} - -
- - 현금 보유량: {holdingsAmount}원 - {errorMessage && {errorMessage}} - -
-
+ + × + {titleText} + + {/* cashId가 없거나 cashId 요청에 오류가 있으면 현금 생성 UI 표시 */} + {(!cashId || cashError) && ( +
+ { + setInitialAmount(e.target.value); + validateCashInput(e.target.value); // 입력 값 변경 시 유효성 검사 + }} + placeholder={cashCreationPlaceholder} + onKeyDown={(event) => handleEnterPress(event, handleCreateCash)} + /> + + {createCashButtonText} +
+ )} + + {/* cashId가 있으면 현금 리셋 UI 표시 */} + {cashId && !cashError && ( +
+ { + setCashInput(e.target.value); + validateCashInput(e.target.value); // 입력 값 변경 시 유효성 검사 + }} + placeholder={cashInputPlaceholder} + onKeyDown={(event) => handleEnterPress(event, handleCashReset)} + /> + + {resetButtonText} +
+ )} + +
+ + 현금 보유량: {holdingsAmount}원{errorMessage && {errorMessage}} + +
+
-); - + ); }; export default CashModal; @@ -159,7 +157,7 @@ const ModalContainer = styled.div` background-color: white; padding: 20px; width: 400px; - height:230px; + height: 230px; border-radius: 10px; display: flex; flex-direction: column; @@ -176,57 +174,57 @@ const CloseButton = styled.button` position: absolute; top: 10px; right: 10px; - background: #FFFFFF; - border-radius:5px; + background: #ffffff; + border-radius: 5px; border: 1px solid lightgray; font-size: 1.5rem; cursor: pointer; `; const StyledButton = styled.button` - padding: 10px 15px; - background-color: white; - color: darkslategray; - border: 1px solid darkslategray; - border-radius: 5px; - margin-bottom:5px; - cursor: pointer; - - //호버 시 회색 - &:hover { - background-color: #f2f2f2; - } + padding: 10px 15px; + background-color: white; + color: darkslategray; + border: 1px solid darkslategray; + border-radius: 5px; + margin-bottom: 5px; + cursor: pointer; + + //호버 시 회색 + &:hover { + background-color: #f2f2f2; + } `; const CashInput = styled.input` - padding: 10px; - border: 1px solid lightgray; - border-radius: 5px; - margin-right: 10px; + padding: 10px; + border: 1px solid lightgray; + border-radius: 5px; + margin-right: 10px; `; const ReceiveButton = styled(StyledButton)``; const CashCreationInput = styled.input` - padding: 10px; - border: 1px solid lightgray; - border-radius: 5px; - margin-right: 10px; + padding: 10px; + border: 1px solid lightgray; + border-radius: 5px; + margin-right: 10px; `; const CreateCashButton = styled(StyledButton)``; const Content = styled.p` - margin: 15px 0; // 간격 조정 - font-size: 1.1rem; // 폰트 크기 증가 - line-height: 1.5; - color: #555; // 색상 변경 - text-align: center; // 텍스트 중앙 정렬 + margin: 15px 0; // 간격 조정 + font-size: 1.1rem; // 폰트 크기 증가 + line-height: 1.5; + color: #555; // 색상 변경 + text-align: center; // 텍스트 중앙 정렬 `; // 에러 메시지 스타일링 const ErrorMessage = styled.div` - color: red; - font-size: 0.8rem; - margin-top: 5px; -`; \ No newline at end of file + color: red; + font-size: 0.8rem; + margin-top: 5px; +`; diff --git a/client/src/components/Profile/profileModal.tsx b/client/src/components/Profile/profileModal.tsx index 7921becc..2a7aac51 100644 --- a/client/src/components/Profile/profileModal.tsx +++ b/client/src/components/Profile/profileModal.tsx @@ -1,48 +1,51 @@ -import React, { useState, useCallback } from 'react'; -import styled from 'styled-components'; -import MemberInfoModal from './memberInfoModal'; -import MemberWithdrawalModal from './memberWithdrawalModal'; -import CashModal from './cashModal'; +import React, { useState, useCallback } from "react"; +import styled from "styled-components"; +import MemberInfoModal from "./MemberInfoModal"; +import MemberWithdrawalModal from "./MemberWithdrawalModal"; +import CashModal from "./CashModal"; const ProfileModal: React.FC = ({ onClose }) => { - const memberInfoText = "회원정보"; - const cashText = "현금"; - const memberWithdrawText = "회원탈퇴"; + const memberInfoText = "회원정보"; + const cashText = "현금"; + const memberWithdrawText = "회원탈퇴"; - const [selectedTab, setSelectedTab] = useState(1); - const [isErrorVisible, setIsErrorVisible] = useState(false); + const [selectedTab, setSelectedTab] = useState(1); + const [isErrorVisible, setIsErrorVisible] = useState(false); - const handleErrorVisibility = useCallback((visibility: boolean) => { - setIsErrorVisible(visibility); - }, []); + const handleErrorVisibility = useCallback((visibility: boolean) => { + setIsErrorVisible(visibility); + }, []); - return ( - - - - setSelectedTab(1)}>{memberInfoText} - setSelectedTab(2)}>{cashText} - setSelectedTab(3)}>{memberWithdrawText} - - - {selectedTab === 1 && } - {selectedTab === 2 && } - {selectedTab === 3 && } - - - - - ); + return ( + + + + setSelectedTab(1)}> + {memberInfoText} + + setSelectedTab(2)}> + {cashText} + + setSelectedTab(3)}> + {memberWithdrawText} + + + + {selectedTab === 1 && } + {selectedTab === 2 && } + {selectedTab === 3 && } + + + + ); }; export default ProfileModal; - interface ProfileModalProps { - onClose: () => void; + onClose: () => void; } - // 모달 배경 스타일 const ModalBackground = styled.div` z-index: 1000; @@ -65,40 +68,39 @@ const ModalContainer = styled.div` height: 300px; border-radius: 10px; display: flex; - flex-direction: column; + flex-direction: column; align-items: center; - background-color: none; // 배경색을 하얀색으로 변경 + background-color: none; // 배경색을 하얀색으로 변경 `; const Tabs = styled.div` - display: flex; - justify-content: space-between; - width: 100%; - margin-bottom: 0px; - z-index: 1002; // 이 값을 추가하여 Tabs를 최상위로 올립니다. + display: flex; + justify-content: space-between; + width: 100%; + margin-bottom: 0px; + z-index: 1002; // 이 값을 추가하여 Tabs를 최상위로 올립니다. `; // TabButton 컴포넌트 스타일링 const TabButton = styled.button<{ isActive?: boolean }>` - flex: 1; - padding: 10px; - border: 1px solid lightgray; - border-bottom: ${({ isActive }) => (isActive ? '3px solid darkslategray' : '1px solid lightgray')}; - border-radius: 5px; - cursor: pointer; - background-color: #FFFFFF; - color: darkslategray; + flex: 1; + padding: 10px; + border: 1px solid lightgray; + border-bottom: ${({ isActive }) => (isActive ? "3px solid darkslategray" : "1px solid lightgray")}; + border-radius: 5px; + cursor: pointer; + background-color: #ffffff; + color: darkslategray; `; const TabContent = styled.div<{ isErrorVisible: boolean }>` - width: 100%; - flex: 1; - display: flex; - flex-direction: column; - align-items: center; - justify-content: flex-start; - overflow-y: auto; - position: top; - min-height: 200px; - -`; \ No newline at end of file + width: 100%; + flex: 1; + display: flex; + flex-direction: column; + align-items: center; + justify-content: flex-start; + overflow-y: auto; + position: top; + min-height: 200px; +`; diff --git a/client/src/components/stockinfoComponents/index.tsx b/client/src/components/stockinfoComponents/index.tsx index 4104626b..4877c577 100644 --- a/client/src/components/stockinfoComponents/index.tsx +++ b/client/src/components/stockinfoComponents/index.tsx @@ -2,7 +2,7 @@ import styled from "styled-components"; import { useState } from "react"; import { useSelector } from "react-redux"; import { RootState } from "../../store/config"; -import PortFolioChart from "./stockinfoChart"; +import PortFolioChart from "./StockinfoChart"; const DetailStockInformation: React.FC = () => { // Redux의 companyId 상태를 구독합니다. diff --git a/client/src/components/watchlist/WatchList.tsx b/client/src/components/watchlist/WatchList.tsx index 1ae886a0..916f64eb 100644 --- a/client/src/components/watchlist/WatchList.tsx +++ b/client/src/components/watchlist/WatchList.tsx @@ -3,7 +3,7 @@ import styled from "styled-components"; import StockSearchComponent from "./StockSearchComponent.tsx"; import Header from "./Header.tsx"; import StockItem from "./StockItem.tsx"; -import useCompanyData from "../../hooks/useCompanyData"; +import useCompanyData from "../../hooks/useCompanyData.ts"; import useGetStars from "../../hooks/stars/useGetstars.ts"; // useGetStars 훅의 경로를 지정해주세요. import { useSelector } from "react-redux"; import { RootState } from "../../store/config.ts"; diff --git a/client/src/page/MainPage.tsx b/client/src/page/MainPage.tsx index 93d61d77..3052a4b8 100644 --- a/client/src/page/MainPage.tsx +++ b/client/src/page/MainPage.tsx @@ -1,6 +1,5 @@ import { useState, useEffect, useCallback } from "react"; import { useSelector, useDispatch } from "react-redux"; -// import { BrowserRouter as Router, Route, Routes } from "react-router-dom"; import styled from "styled-components"; import LogoutHeader from "../components/Headers/LogoutHeader"; @@ -20,12 +19,10 @@ import CentralChart from "../components/CentralChart/Index"; import EntireList from "../components/EntireList/EntireList"; import HoldingList from "../components/HoldingList/HoldingList"; -import WatchList from "../components/watchlist/WatchList"; // Assuming you have a Holdings component -import CompareChartSection from "../components/CompareChartSection/Index"; +import WatchList from "../components/Watchlist/WatchList"; // Assuming you have a Holdings component import StockOrderSection from "../components/StockOrderSection/Index"; -import ProfileModal from "../components/Profile/profileModal"; -// import CashModal from "../components/Profile/cashModal"; +import ProfileModal from "../components/Profile/ProfileModal"; import { StateProps } from "../models/stateProps"; import { TabContainerPage } from "./TabPages/TabContainerPage"; import { RootState } from "../store/config"; @@ -208,7 +205,6 @@ const MainPage = () => { {isLogin == 1 ? : }
- {selectedMenu === "전체종목" ? ( diff --git a/client/src/page/TabPages/MarketInfoPage.tsx b/client/src/page/TabPages/MarketInfoPage.tsx index 75d5947b..28ef51e4 100644 --- a/client/src/page/TabPages/MarketInfoPage.tsx +++ b/client/src/page/TabPages/MarketInfoPage.tsx @@ -1,6 +1,6 @@ import styled from "styled-components"; import React, { useState } from "react"; -import MarketSummary from "../../components/MarketComponents/index"; +import MarketSummary from "../../components/MarketComponents/Index"; import MarketStockList from "../../components/MarketComponents/MarketStockList"; interface Props {} diff --git a/client/src/page/TabPages/TabContainerPage.tsx b/client/src/page/TabPages/TabContainerPage.tsx index f30656ac..6ce0c492 100644 --- a/client/src/page/TabPages/TabContainerPage.tsx +++ b/client/src/page/TabPages/TabContainerPage.tsx @@ -3,14 +3,10 @@ import { StateProps } from "../../models/stateProps"; import MarketInfo from "./MarketInfoPage"; import { Routes, Route, Link } from "react-router-dom"; import styled from "styled-components"; -import DetailStockInformation from "../../components/stockinfoComponents/index"; -import { Community } from "./communityPage"; +import DetailStockInformation from "../../components/StockinfoComponents/Index"; +import { Community } from "./CommunityPage"; import { useState } from "react"; -import { - MarketImages, - InfoImages, - CommunityImages, -} from "../../components/communityComponents/IconComponent/Icon"; +import { MarketImages, InfoImages, CommunityImages } from "../../components/CommunityComponents/IconComponent/Icon"; import { useLocation } from "react-router-dom"; export const TabContainerPage = () => { const location = useLocation(); @@ -19,7 +15,7 @@ export const TabContainerPage = () => { const [activeTab, setActiveTab] = useState(initialTab); // 초기 탭 번호를 반환하는 함수 - function getInitialTab(pathname:string) { + function getInitialTab(pathname: string) { switch (pathname) { case "/stockitems": return 2; @@ -38,34 +34,19 @@ export const TabContainerPage = () => { return ( - +
-