diff --git a/src/assets/images/image_profile_bg.png b/src/assets/images/image_profile_bg.png new file mode 100644 index 0000000..6edc73d Binary files /dev/null and b/src/assets/images/image_profile_bg.png differ diff --git a/src/components/JD/Announcement.tsx b/src/components/JD/Announcement.tsx index f02fe08..b0bb683 100644 --- a/src/components/JD/Announcement.tsx +++ b/src/components/JD/Announcement.tsx @@ -3,6 +3,7 @@ import styled, { css } from "styled-components"; import { JobAnnouncement } from "../../types/type"; import { useNavigate } from "react-router-dom"; import StateBox from "./StateBox"; +import { formatDate } from "../../pages/JDDetailPage"; interface JobAnnouncementProps { announcement: JobAnnouncement; @@ -11,7 +12,7 @@ interface JobAnnouncementProps { const JobAnnouncementCard: React.FC = ({ announcement, }) => { - const { id, title, description, recruitmentPeriod, status, dday } = + const { id, title, description, recruitmentPeriod, status, dday, createdAt } = announcement; const nav = useNavigate(); @@ -19,10 +20,12 @@ const JobAnnouncementCard: React.FC = ({ nav(`/jd/${id}`)}> - {status !== "CLOSED" && {"D-" + dday}} + {status !== "CLOSED" && ( + {dday === 0 ? "D-DAY" : "D-" + dday} + )} {status !== "NOT_APPLIED" && } - 24.01.19 + {formatDate(createdAt)} {title} {description} diff --git a/src/components/JD/ExpContainer.tsx b/src/components/JD/ExpContainer.tsx index e7f56b3..9ff0ead 100644 --- a/src/components/JD/ExpContainer.tsx +++ b/src/components/JD/ExpContainer.tsx @@ -1,4 +1,4 @@ -import React from "react"; +import React, { useEffect, useState } from "react"; import styled from "styled-components"; import ExpData from "../../services/JD/ExpData"; import { useRecoilState } from "recoil"; @@ -6,6 +6,8 @@ import { detailStore } from "../../store/jdStore"; import { questions } from "../../assets/data/questions"; import JDChip from "./JDChip"; import ArrowIcon from "../../assets/icons/icon_arrow_right_main500.svg"; +import { getCookie } from "../../services/cookie"; +import { getExperience } from "../../services/Experience/experienceApi"; interface JobContainerProps { expId: number | string; @@ -13,8 +15,32 @@ interface JobContainerProps { const ExperienceBox: React.FC = ({ expId }) => { const expData = ExpData[0]; + const user = getCookie("user"); + const [apiData, setapiData] = useState({ + id: "", + title: "", + parentTag: "", + childTag: "", + strongPoints: "", + contents: [], + }); + + useEffect(() => { + // getExperienceData(expId.toString(), user.token); + }, []); + const [detailId, setDetailId] = useRecoilState(detailStore); + const getExperienceData = async (expId: string, token: string) => { + try { + const response = await getExperience(expId, token); + console.log(response); + } catch (error) { + console.error(error); + alert(JSON.stringify(error)); + } + }; + return ( diff --git a/src/components/JD/Experience.tsx b/src/components/JD/Experience.tsx index 562bd26..bcd92b4 100644 --- a/src/components/JD/Experience.tsx +++ b/src/components/JD/Experience.tsx @@ -47,7 +47,7 @@ const Experience: React.FC = ({ const isSection = type === "section"; // 경험의 선택된 질문 답변 - const answer = detail?.[(question || 1)-1]?.answer; + const answer = detail?.[(question || 1) - 1]?.answer; const handleClick = () => { setDetailId(id); diff --git a/src/components/JD/ExperienceList.tsx b/src/components/JD/ExperienceList.tsx index 5dff66a..08dcd30 100644 --- a/src/components/JD/ExperienceList.tsx +++ b/src/components/JD/ExperienceList.tsx @@ -1,11 +1,10 @@ -import React, { useState } from "react"; +import React, { useEffect, useState } from "react"; import ExpData from "../../services/JD/ExpData"; import Experience from "./Experience"; import styled from "styled-components"; import FillfilterIcon from "../../assets/icons/icon_filter_fill.svg"; import BlankfilterIcon from "../../assets/icons/icon_filter_blank.svg"; import SearchIcon from "../../assets/icons/icon_search_grey500.svg"; -import { TagList } from "../../services/JD/TagData"; import ArrowIcon_net from "../../assets/icons/icon_arrow_right_net500.svg"; import ArrowIcon_main from "../../assets/icons/icon_arrow_right_main500.svg"; import FilterRemoveIcon from "../../assets/icons/icon_filter_remove.svg"; @@ -15,6 +14,9 @@ import PopperPagination from "../Experience/PopperPagination"; import { basicKeywords } from "../../assets/data/keywords"; import { myKeywords } from "../../services/Experience/myKeywords"; import Checkbox from "../common/Checkbox"; +import { getAllExperienceList } from "../../services/JD/ExperienceApi"; +import { getCookie } from "../../services/cookie"; +import { getAllTags } from "../../services/JD/tagApi"; type TabType = "basic" | "my"; @@ -37,6 +39,8 @@ const ExperienceList: React.FC = ({ const bookmarkData = ExpData.filter((post) => post.bookmark); // 북마크된 데이터들 const [keywordTabOption, setKeywordTabOption] = React.useState("basic"); + const user = getCookie("user"); + const [experienceData, setExperienceData] = useState({}); const [anchorEl, setAnchorEl] = React.useState(null); const open = Boolean(anchorEl); @@ -62,6 +66,21 @@ const ExperienceList: React.FC = ({ lastMyKeywordIndex ); + useEffect(() => { + // getExperienceList(user.token); + }, []); + + //모든 경험리스트 불러오기 + const getExperienceList = async (token: string) => { + try { + const response = await getAllExperienceList(token); + console.log(response); + } catch (error) { + console.error(error); + alert(JSON.stringify(error)); + } + }; + // 체크된 역량 키워드 리스트 const [checkedKeywords, setCheckedKeywords] = React.useState([]); @@ -104,6 +123,24 @@ const ExperienceList: React.FC = ({ } }; + useEffect(() => { + if (mainTag) { + console.log("maintag: " + mainTag); + } + }, [mainTag]); + + useEffect(() => { + if (subTag) { + console.log("subtag: " + subTag); + } + }, [subTag]); + + useEffect(() => { + if (searchText) { + console.log("search: " + searchText); + } + }, [searchText]); + return ( {!showDetail ? ( @@ -315,30 +352,71 @@ interface TagPopupProps { onSelect: (mainTag: string, subTag?: string) => void; } +interface ChildTag { + id: string; + name: string; +} + +interface Tag { + id: string; + name: string; + childTags: ChildTag[]; +} + const TagPopup: React.FC = ({ onSelect }) => { - const [visibleSubTag, setVisibleSubTag] = useState(null); + const [visibleSubTag, setVisibleSubTag] = useState(null); + const [tagList, setTagList] = useState([]); + const user = getCookie("user"); + + const getTagList = async (token: string) => { + try { + const response = await getAllTags(token); + console.log(response); + const list = response.data.tags.map((tag: Tag) => ({ + id: tag.id, + name: tag.name, + childTags: tag.childTags, + })); + setTagList(list); + } catch (error) { + console.error(error); + alert(JSON.stringify(error)); + } + }; + + useEffect(() => { + getTagList(user.token); + }, []); - const toggleSubTags = (id: number, mainTag: string) => { - onSelect(mainTag); + const toggleSubTags = (id: string) => { if (visibleSubTag === id) { setVisibleSubTag(null); } else { setVisibleSubTag(id); } }; + return ( - {TagList.map((tag) => ( + {tagList.map((tag) => (
- toggleSubTags(tag.id, tag.mainTag)}> + { + toggleSubTags(tag.id); + onSelect(tag.name); + }} + > arrow - {tag.mainTag} + {tag.name} {visibleSubTag === tag.id && - tag.subTag.map((sub) => ( - onSelect(tag.mainTag, sub)}> + tag.childTags.map((child) => ( + onSelect(tag.name, child.name)} + > arrow - {sub} + {child.name} ))}
diff --git a/src/components/JD/JDContainer.tsx b/src/components/JD/JDContainer.tsx index 9b37165..1a3007b 100644 --- a/src/components/JD/JDContainer.tsx +++ b/src/components/JD/JDContainer.tsx @@ -4,8 +4,9 @@ import StateBox from "./StateBox"; import calendarIcon from "../../assets/icons/icon_calendar.svg"; import linkIcon from "../../assets/icons/icon_link.svg"; import { JobDescriptionAPI } from "../../types/type"; -import { jobdescriptionget } from "../../services/jd"; +import { jobdescriptionget } from "../../services/JD/jdApi"; import { formatDateRange } from "../../pages/JDListPage"; +import { formatDate } from "../../pages/JDDetailPage"; interface JobContainerProps { jdId: string; @@ -26,15 +27,6 @@ const JDContainer: React.FC = ({ jdId, token }) => { endedAt: null, }); - const formatDate = (createdAt: Date) => { - const date = new Date(createdAt); - const formattedDate = `${date.getDate()}.${date.getMonth() + 1}.${date - .getFullYear() - .toString() - .substring(2)}`; - return formattedDate; - }; - const getJobData = async (jdId: string, token: string) => { try { const response = await jobdescriptionget(jdId, token); @@ -43,7 +35,7 @@ const JDContainer: React.FC = ({ jdId, token }) => { enterpriseName: response.data.enterpriseName, title: response.data.title, remainingDate: response.data.remainingDate, - content: response.data.link, + content: response.data.content, writeStatus: response.data.writeStatus, link: response.data.link, createdAt: FormatstartDate, @@ -51,7 +43,6 @@ const JDContainer: React.FC = ({ jdId, token }) => { endedAt: response.data.endedAt, }; setJdData(jdApiData); - console.log(jdData); } catch (error) { console.error(error); alert(JSON.stringify(error)); @@ -71,9 +62,9 @@ const JDContainer: React.FC = ({ jdId, token }) => {
{"D-" + jdData.remainingDate}
-
{jdData.title}
+
{jdData.enterpriseName}
- {jdData.content} + {jdData.title}
calendar @@ -110,6 +101,7 @@ export default JDContainer; const ScrollDiv = styled.div` overflow-y: auto; + width: 100%; &::-webkit-scrollbar { width: 4px; } diff --git a/src/pages/ApplyEditPage.tsx b/src/pages/ApplyEditPage.tsx index 49276aa..4b91d90 100644 --- a/src/pages/ApplyEditPage.tsx +++ b/src/pages/ApplyEditPage.tsx @@ -16,7 +16,7 @@ import DiscardModal from "../components/JD/DiscardModal"; import JDContainer from "../components/JD/JDContainer"; import ExperienceBox from "../components/JD/ExpContainer"; import { ApplyAPI } from "../types/type"; -import { applyget, applypatch, statuspatch } from "../services/jd"; +import { applyget, applypatch, statuspatch } from "../services/JD/jdApi"; import { getCookie } from "../services/cookie"; const ApplyEditPage: React.FC = () => { @@ -27,7 +27,7 @@ const ApplyEditPage: React.FC = () => { { question: "", answer: "" }, ]); //문항 데이터 const [editing, setEditing] = useState(false); //수정중 여부 - const [completed, setCompleted] = useState(""); //작성 완료 + const [completed, setCompleted] = useState(""); //작성 완료 const [isAllFilled, setIsAllFilled] = useState(false); // 문항이 빈칸이 없는지 검사 const [detailId, setDetailId] = useRecoilState(detailStore); //경험의 고유 id(0이 아니여야함) @@ -124,6 +124,8 @@ const ApplyEditPage: React.FC = () => { //저장기능 } else if (!editing && !completed) { setEditing(!editing); + } else if (!editing && completed === "작성중") { + setEditing(!editing); } }; @@ -275,13 +277,17 @@ const ApplyEditPage: React.FC = () => { - - 작성완료 - (!editing ? handleCompeletedButton() : null)} - /> - + {!editing ? ( + + 작성완료 + (!editing ? handleCompeletedButton() : null)} + /> + + ) : ( + + )} {editing ? ( { > 저장 + ) : completed === "작성완료" ? ( + + 수정 + ) : ( - + 수정 )} @@ -476,7 +483,7 @@ const SaveButton = styled.button<{ isNotNull: boolean }>` display: inline-flex; padding: 0.625rem 4rem; justify-content: center; - align-items: center; + align-items: end; color:#FFF; gap: 0.625rem; font-size: 1rem; diff --git a/src/pages/ApplyPage.tsx b/src/pages/ApplyPage.tsx index a821d21..da64ff5 100644 --- a/src/pages/ApplyPage.tsx +++ b/src/pages/ApplyPage.tsx @@ -16,7 +16,7 @@ import DiscardModal from "../components/JD/DiscardModal"; import JDContainer from "../components/JD/JDContainer"; import ExperienceBox from "../components/JD/ExpContainer"; import { ApplyAPI } from "../types/type"; -import { applypost } from "../services/jd"; +import { applypost } from "../services/JD/jdApi"; import { getCookie } from "../services/cookie"; const ApplyPage: React.FC = () => { diff --git a/src/pages/JDDetailPage.tsx b/src/pages/JDDetailPage.tsx index 47e1e74..6e65ea2 100644 --- a/src/pages/JDDetailPage.tsx +++ b/src/pages/JDDetailPage.tsx @@ -14,7 +14,7 @@ import calendarIcon from "../assets/icons/icon_calendar.svg"; import linkIcon from "../assets/icons/icon_link.svg"; import ExperienceBox from "../components/JD/ExpContainer"; import { formatDateRange } from "./JDListPage"; -import { jobdelete, jobdescriptionget } from "../services/jd"; +import { jobdelete, jobdescriptionget } from "../services/JD/jdApi"; import { getCookie } from "../services/cookie"; import PlaneLoading from "../components/common/Loading"; import JDDeleteModal from "../components/JD/JDDeleteModal"; @@ -88,15 +88,6 @@ const JDDetailPage: React.FC = () => { } }, [active]); - const formatDate = (createdAt: Date) => { - const date = new Date(createdAt); - const formattedDate = `${date.getDate()}.${date.getMonth() + 1}.${date - .getFullYear() - .toString() - .substring(2)}`; - return formattedDate; - }; - const getJobData = async (jdId: string, token: string) => { try { const response = await jobdescriptionget(jdId, token); @@ -197,9 +188,11 @@ const JDDetailPage: React.FC = () => { -
- {"D-" + jdData.remainingDate} -
+ {jdData.writeStatus !== "CLOSED" && ( +
+ {"D-" + jdData.remainingDate} +
+ )}
{jdData.title}
{jdData.enterpriseName} @@ -284,6 +277,15 @@ const JDDetailPage: React.FC = () => { export default JDDetailPage; +export const formatDate = (createdAt: any) => { + const date = new Date(createdAt); + const year = date.getFullYear().toString().slice(2); // 년도의 마지막 두 자리 + const month = (date.getMonth() + 1).toString().padStart(2, "0"); // 월 (0부터 시작하므로 1을 더함) + const day = date.getDate().toString().padStart(2, "0"); // 날짜 + + return `${year}.${month}.${day}`; // 포맷된 문자열 반환 +}; + const StyledDivContainer = styled.div` width: 100%; display: flex; diff --git a/src/pages/JDEditPage.tsx b/src/pages/JDEditPage.tsx index 79166e3..daae7e6 100644 --- a/src/pages/JDEditPage.tsx +++ b/src/pages/JDEditPage.tsx @@ -7,7 +7,7 @@ import OneDatePick from "../components/common/DatePicker"; import { useNavigate, useParams } from "react-router-dom"; import Modal from "../components/JD/JDEditModal"; import ClockIcon from "../assets/icons/icon_clock_net600.svg"; -import { jobdescriptionget, jobpatch, jobpost } from "../services/jd"; +import { jobdescriptionget, jobpatch, jobpost } from "../services/JD/jdApi"; import { JobAPI, JobDescriptionAPI } from "../types/type"; import { getCookie } from "../services/cookie"; diff --git a/src/pages/JDListPage.tsx b/src/pages/JDListPage.tsx index 95f597b..dc8b412 100644 --- a/src/pages/JDListPage.tsx +++ b/src/pages/JDListPage.tsx @@ -11,7 +11,7 @@ import nextbtn_v2 from "../assets/icons/icon_next_btn_v2.svg"; import { useNavigate } from "react-router-dom"; import PlusIcon from "../assets/icons/icon_plus_white.svg"; import { JobAnnouncement } from "../types/type"; -import { filteredjobget, jobget } from "../services/jd"; +import { filteredjobget, jobget } from "../services/JD/jdApi"; import { getCookie } from "../services/cookie"; const JDListPage: React.FC = () => { @@ -26,11 +26,16 @@ const JDListPage: React.FC = () => { const user = getCookie("user"); const nav = useNavigate(); + + //전체, 작성전, 작성중, 작성완료, 마감 const handleClick = (buttonName: string) => { + setCurrentPage(1); setActiveButton(buttonName); }; + //CREATED, ENDED const handleSortChange = (sortType: string) => { + setCurrentPage(1); setSelectedSort(sortType); }; @@ -97,13 +102,16 @@ const JDListPage: React.FC = () => { generatePages(); setPages(tempPages); - console.log("curr" + currentPage); - console.log("total" + pageTotal); }, [currentPage, pageTotal, activeButton]); - const getJobList = async (page: string, token: string) => { + //writenStatus 없이 전체 조회 + const getJobList = async ( + page: string, + token: string, + sortType: string = "CREATED" + ) => { try { - const response = await jobget(page, token); + const response = await jobget(page, token, sortType); const mappedData = response.data.content.map((job: any) => ({ id: job.jobDescriptionId, title: job.title, @@ -111,6 +119,7 @@ const JDListPage: React.FC = () => { dday: job.remainingDate, recruitmentPeriod: formatDateRange(job.startedAt, job.endedAt), status: job.writeStatus, + createdAt: job.createdAt, })); setJobsData(mappedData); if (response.data.totalPage !== 0) { @@ -126,55 +135,50 @@ const JDListPage: React.FC = () => { } }; + //page 넘길 때 api 호출 useEffect(() => { let currentpage = (currentPage - 1).toString(); if (activeButton === "작성전") { - setCurrentPage(1); getFilteredJobList(currentpage, "NOT_APPLIED", selectedSort, user.token); } else if (activeButton === "작성중") { - setCurrentPage(1); getFilteredJobList(currentpage, "WRITING", selectedSort, user.token); } else if (activeButton === "작성완료") { - setCurrentPage(1); getFilteredJobList(currentpage, "WRITTEN", selectedSort, user.token); } else if (activeButton === "마감") { - setCurrentPage(1); getFilteredJobList(currentpage, "CLOSED", selectedSort, user.token); } else if (activeButton === "전체") { - setCurrentPage(1); - getFilteredJobList(currentpage, "ALL", selectedSort, user.token); + getJobList(currentpage, user.token); + } + }, [currentPage]); + + useEffect(() => { + if (selectedSort !== "") { + handleApiGet(selectedSort); + } else { + handleApiGet("CREATED"); } }, [activeButton]); useEffect(() => { - let currentpage = (currentPage - 1).toString(); - if (activeButton === "작성전") { - getFilteredJobList(currentpage, "NOT_APPLIED", selectedSort, user.token); - } else if (activeButton === "작성중") { - getFilteredJobList(currentpage, "WRITING", selectedSort, user.token); - } else if (activeButton === "작성완료") { - getFilteredJobList(currentpage, "WRITTEN", selectedSort, user.token); - } else if (activeButton === "마감") { - getFilteredJobList(currentpage, "CLOSED", selectedSort, user.token); - } else if (activeButton === "전체") { - getFilteredJobList(currentpage, "ALL", selectedSort, user.token); + if (selectedSort !== "") { + handleApiGet(selectedSort); } }, [selectedSort]); - useEffect(() => { + const handleApiGet = (sortedType: string) => { let currentpage = (currentPage - 1).toString(); if (activeButton === "작성전") { - getFilteredJobList(currentpage, "NOT_APPLIED", selectedSort, user.token); + getFilteredJobList(currentpage, "NOT_APPLIED", sortedType, user.token); } else if (activeButton === "작성중") { - getFilteredJobList(currentpage, "WRITING", selectedSort, user.token); + getFilteredJobList(currentpage, "WRITING", sortedType, user.token); } else if (activeButton === "작성완료") { - getFilteredJobList(currentpage, "WRITTEN", selectedSort, user.token); + getFilteredJobList(currentpage, "WRITTEN", sortedType, user.token); } else if (activeButton === "마감") { - getFilteredJobList(currentpage, "CLOSED", selectedSort, user.token); + getFilteredJobList(currentpage, "CLOSED", sortedType, user.token); } else if (activeButton === "전체") { - getJobList(currentpage, user.token); + getJobList(currentpage, user.token, sortedType); } - }, [currentPage]); + }; const getFilteredJobList = async ( page: string, @@ -197,6 +201,7 @@ const JDListPage: React.FC = () => { dday: job.remainingDate, recruitmentPeriod: formatDateRange(job.startedAt, job.endedAt), status: job.writeStatus, + createdAt: job.createdAt, })); setJobsData(mappedData); setpageTotal(response.data.totalPage); @@ -225,7 +230,7 @@ const JDListPage: React.FC = () => { active={activeButton === button} onClick={() => handleClick(button)} > - {button.toUpperCase()} + {button} ))} diff --git a/src/pages/JDPlusPage.tsx b/src/pages/JDPlusPage.tsx index 1269889..15efbff 100644 --- a/src/pages/JDPlusPage.tsx +++ b/src/pages/JDPlusPage.tsx @@ -7,7 +7,7 @@ import OneDatePick from "../components/common/DatePicker"; import { useNavigate } from "react-router-dom"; import Modal from "../components/JD/JDModal"; import ClockIcon from "../assets/icons/icon_clock_net600.svg"; -import { jobpost } from "../services/jd"; +import { jobpost } from "../services/JD/jdApi"; import { JobAPI } from "../types/type"; import { getCookie } from "../services/cookie"; @@ -32,6 +32,19 @@ const JDPlusPage: React.FC = () => { }); }, []); + //유효성검사 + const isJobDataComplete = () => { + const { title, enterpriseName, content, link, startAt, endedAt } = jobData; + return ( + title.trim() !== "" && + enterpriseName.trim() !== "" && + content.trim() !== "" && + link.trim() !== "" && + startAt !== null && + endedAt !== null + ); + }; + // endTime 계산 const getEndTime = () => { if (!jobData.endedAt) return null; // endDate가 null이면 null 반환 @@ -127,10 +140,10 @@ const JDPlusPage: React.FC = () => { 취소 { - if (jobData.startAt && jobData.endedAt) { + if (isJobDataComplete()) { handleJDPost(jobData, user.token); } else { - alert("Start date and end date must be provided."); + alert("모든 문항을 입력하세요."); } }} > diff --git a/src/pages/ProfilePage.tsx b/src/pages/ProfilePage.tsx index 7942594..bed1eee 100644 --- a/src/pages/ProfilePage.tsx +++ b/src/pages/ProfilePage.tsx @@ -1,6 +1,6 @@ import React, { useEffect, useState } from "react"; import styled from "styled-components"; -import TicketContainer from "../assets/images/ticketContainer.svg"; +import TicketContainer from "../assets/images/image_profile_bg.png"; import TicketContent from "../assets/images/ticketContent.svg"; import { GoogleIcon, KakaoIcon } from "../assets"; import { useNavigate } from "react-router-dom"; @@ -8,6 +8,11 @@ import { getCookie, removeCookie } from "../services/cookie"; import { getUserInfo } from "../services/user"; import { UserDataType } from "../types/user"; import PlaneLoading from "../components/common/Loading"; +import profile1 from "../assets/images/profile1.png"; +import profile2 from "../assets/images/profile2.png"; +import profile3 from "../assets/images/profile3.png"; +import profile4 from "../assets/images/profile4.png"; +import profile5 from "../assets/images/profile5.png"; interface UserDetail { question: string; @@ -18,6 +23,8 @@ const ProfilePage = () => { const nav = useNavigate(); const user = getCookie("user"); const [userData, setUserData] = React.useState(); + const [profileImage, setprofileImage] = useState(profile1); + const userDetailList: UserDetail[] = [ { question: "구직활동 여부", @@ -47,6 +54,17 @@ const ProfilePage = () => { getUserInfo(user?.token).then((res) => { console.log(res); setUserData(res.data); + if (res.data.profileImgUrl === "/assets/profile1.png") { + setprofileImage(profile1); + } else if (res.data.profileImgUrl === "/assets/profile2.png") { + setprofileImage(profile2); + } else if (res.data.profileImgUrl === "/assets/profile3.png") { + setprofileImage(profile3); + } else if (res.data.profileImgUrl === "/assets/profile4.png") { + setprofileImage(profile4); + } else if (res.data.profileImgUrl === "/assets/profile5.png") { + setprofileImage(profile5); + } }); } }, []); @@ -67,6 +85,9 @@ const ProfilePage = () => { 마이페이지 + + profileImage + ticketContainer 로그아웃 @@ -194,3 +215,13 @@ const ContentWrapper = styled.div` flex-direction: column; display: flex; `; + +const ProfileImage = styled.div` + position: absolute; + top: 3rem; + left: 3rem; + img{ + width: 9.0625rem; + height: 12.125rem; + } +`; diff --git a/src/services/JD/ExperienceApi.tsx b/src/services/JD/ExperienceApi.tsx new file mode 100644 index 0000000..83a2325 --- /dev/null +++ b/src/services/JD/ExperienceApi.tsx @@ -0,0 +1,10 @@ +import client from "../client"; + +// 경험 목록 조회 +export const getAllExperienceList = async (token: string) => { + return await client.get(`/api/experiences`, { + headers: { + Authorization: `Bearer ${token}`, + }, + }); +}; diff --git a/src/services/JD/bookmarkApi.tsx b/src/services/JD/bookmarkApi.tsx new file mode 100644 index 0000000..f0b3a51 --- /dev/null +++ b/src/services/JD/bookmarkApi.tsx @@ -0,0 +1,17 @@ +import client from "../client"; + +export const bookmarkpatch = async ( + token: string, + jobId: string, + expId: string +) => { + return await client.patch( + `/api/bookmark/${jobId}/${expId}`, + {}, + { + headers: { + Authorization: `Bearer ${token}`, + }, + } + ); +}; diff --git a/src/services/jd.tsx b/src/services/JD/jdApi.tsx similarity index 89% rename from src/services/jd.tsx rename to src/services/JD/jdApi.tsx index e970356..b68568b 100644 --- a/src/services/jd.tsx +++ b/src/services/JD/jdApi.tsx @@ -1,5 +1,5 @@ -import { ApplyAPI, JobAPI } from "../types/type"; -import client from "./client"; +import { ApplyAPI, JobAPI } from "../../types/type"; +import client from "../client"; export const jobpost = async (job: JobAPI, token: string) => { return await client.post( @@ -39,12 +39,15 @@ export const jobpatch = async (job: JobAPI, jdId: string, token: string) => { ); }; -export const jobget = async (page: string, token: string) => { - return await client.get(`/api/job-description?page=${page}&size=9`, { - headers: { - Authorization: `Bearer ${token}`, - }, - }); +export const jobget = async (page: string, token: string, sortType: string) => { + return await client.get( + `/api/job-description?page=${page}&size=9&sortType=${sortType}`, + { + headers: { + Authorization: `Bearer ${token}`, + }, + } + ); }; export const filteredjobget = async ( diff --git a/src/services/JD/tagApi.tsx b/src/services/JD/tagApi.tsx new file mode 100644 index 0000000..4f892b4 --- /dev/null +++ b/src/services/JD/tagApi.tsx @@ -0,0 +1,10 @@ +import client from "../client"; + +// 태그 리스트 전체 조회 +export const getAllTags = async (token: string) => { + return await client.get(`/api/tags/all-tags`, { + headers: { + Authorization: `Bearer ${token}`, + }, + }); +}; diff --git a/src/types/type.ts b/src/types/type.ts index b6287cb..7394782 100644 --- a/src/types/type.ts +++ b/src/types/type.ts @@ -18,6 +18,7 @@ export interface JobAnnouncement { dday: number; recruitmentPeriod: string; status: RecruitmentStatus; + createdAt?: string; } export interface Job { @@ -70,3 +71,19 @@ export type JobDescriptionAPI = { startAt: Date | null; endedAt: Date | null; }; + +export type ExperienceSimpleAPI = { + id: string; + title: string; + strongPoints: []; +}; + +export interface TagListAPI { + id: string; + name: string; + childTags?: TagAPI[]; +} + +export interface TagAPI { + tags: TagListAPI[]; +}