From d77c42393026b48682643c5d3c04615fe583610a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=A0=95=EC=9A=B0?= Date: Wed, 21 Feb 2024 19:09:44 +0900 Subject: [PATCH] =?UTF-8?q?[Feat]=20=ED=99=88=20=ED=99=94=EB=A9=B4=20API?= =?UTF-8?q?=20=EC=97=B0=EA=B2=B0,=20=EC=A3=BC=ED=96=89=20=EC=A4=91=20Toast?= =?UTF-8?q?=20UI=20(#23)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: 홈 화면 코멘트 API 연결 * feat: 주행 중 알림 Toast UI * 홈 화면 API 추가 * 홈 화면 API 연결 --- src/api/homeAPIS.ts | 41 +++++++++++++++ src/assets/sound/alram.mp3 | Bin 0 -> 29424 bytes src/components/Home/Comment.tsx | 15 +++++- src/components/Home/CurrentScoreChart.tsx | 9 +++- src/components/Home/Scores.tsx | 29 +++++++++-- src/components/Home/Warning.tsx | 28 ++++++---- src/components/common/Toast.tsx | 59 ++++++++++++++++++++++ src/types/home.ts | 13 +++++ tsconfig.json | 1 + 9 files changed, 180 insertions(+), 15 deletions(-) create mode 100644 src/api/homeAPIS.ts create mode 100644 src/assets/sound/alram.mp3 create mode 100644 src/components/common/Toast.tsx create mode 100644 src/types/home.ts diff --git a/src/api/homeAPIS.ts b/src/api/homeAPIS.ts new file mode 100644 index 0000000..3776434 --- /dev/null +++ b/src/api/homeAPIS.ts @@ -0,0 +1,41 @@ +import { HomeRecentType, LatestScoresType } from "src/types/home"; +import { axiosInstance } from "./instance"; + +//최근 주행 점수 +export const homeScoreAPI = async () => { + try { + const response = await axiosInstance.get("/home/score"); + return response.data; + } catch { + return null; + } +}; + +export const homeLatestScoreAPI = async () => { + try { + const response = await axiosInstance.get("/home/latestScores"); + return response.data as LatestScoresType; + } catch { + return null; + } +}; + +//최근 주행 피드백 +export const homeFeedbackAPI = async () => { + try { + const response = await axiosInstance.get("/home/feedback"); + return response.data; + } catch { + return null; + } +}; + +//주의해야 할 운전 습관 +export const homeRecentsAPI = async () => { + try { + const response = await axiosInstance.get("/home/recentRisks"); + return response.data as HomeRecentType; + } catch { + return null; + } +}; diff --git a/src/assets/sound/alram.mp3 b/src/assets/sound/alram.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..9707f2392b526a2e55a37fa5009b308c82a390d1 GIT binary patch literal 29424 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

9PRa6BTMZ2UG^r^^LWoN+kAprp0kV5YoHVTt_1 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 literal 0 HcmV?d00001 diff --git a/src/components/Home/Comment.tsx b/src/components/Home/Comment.tsx index 5bf09fe..08a3820 100644 --- a/src/components/Home/Comment.tsx +++ b/src/components/Home/Comment.tsx @@ -1,12 +1,25 @@ import styled from "styled-components"; import comment_icon from "@assets/icons/comment_icon.svg"; +import { homeFeedbackAPI } from "@api/homeAPIS"; +import { useEffect, useState } from "react"; export const Comment = () => { + const [data, setData] = useState<{ + feedback: string; + }>(); + + useEffect(() => { + const response = homeFeedbackAPI(); + response.then((res) => { + setData(res); + }); + }, []); + return ( 코멘트 - {"오늘도 안전한 운전 하세요!"} + {data?.feedback} ); diff --git a/src/components/Home/CurrentScoreChart.tsx b/src/components/Home/CurrentScoreChart.tsx index ec68bee..1632702 100644 --- a/src/components/Home/CurrentScoreChart.tsx +++ b/src/components/Home/CurrentScoreChart.tsx @@ -9,6 +9,7 @@ import { Legend, } from "chart.js"; import { Line } from "react-chartjs-2"; +import { LatestScoresType } from "src/types/home"; ChartJS.register( CategoryScale, @@ -45,12 +46,16 @@ export const options = { const labels = ["", "", ""]; -export const CurrentScoreChart = () => { +interface CurrentScoreChartProps { + scoresData: LatestScoresType | undefined; +} +export const CurrentScoreChart = ({ scoresData }: CurrentScoreChartProps) => { + const scores = scoresData?.latestScores?.map((el) => el.score); const data = { labels, datasets: [ { - data: [63, 88, 72], + data: scores, borderColor: "#87A3FF", backgroundColor: "#4561DB", }, diff --git a/src/components/Home/Scores.tsx b/src/components/Home/Scores.tsx index 662af54..8150035 100644 --- a/src/components/Home/Scores.tsx +++ b/src/components/Home/Scores.tsx @@ -2,18 +2,41 @@ import styled from "styled-components"; import ChangingProgressProvider from "@components/Report/Score/ChaingingProgressProvider"; import { CircularProgressbar, buildStyles } from "react-circular-progressbar"; import { CurrentScoreChart } from "./CurrentScoreChart"; +import { useEffect, useState } from "react"; +import { homeScoreAPI, homeLatestScoreAPI } from "@api/homeAPIS"; +import { LatestScoresType } from "src/types/home"; export const Scores = () => { + const [scoreData, setScoreData] = useState<{ + score: Number; + }>({ score: 0 }); + + useEffect(() => { + const response = homeScoreAPI(); + response.then((res) => { + if (res.score) setScoreData(res); + }); + }, []); + + const [scoresData, setScoresData] = useState(); + + useEffect(() => { + const response = homeLatestScoreAPI(); + response.then((res) => { + if (res) setScoresData(res); + }); + }, []); + return ( 나의 운전 점수 - + {(percentage) => ( {

- + diff --git a/src/components/Home/Warning.tsx b/src/components/Home/Warning.tsx index 4c315cf..b853858 100644 --- a/src/components/Home/Warning.tsx +++ b/src/components/Home/Warning.tsx @@ -1,7 +1,19 @@ import styled from "styled-components"; import info_icon from "@assets/icons/info_icon.svg"; +import { homeRecentsAPI } from "@api/homeAPIS"; +import { useState, useEffect } from "react"; +import { ScenarioType } from "src/types/driving"; export const Warning = () => { + const [data, setData] = useState(); + + useEffect(() => { + const response = homeRecentsAPI(); + response.then((res) => { + if (res) setData(res?.recentRisks); + }); + }, []); + return ( @@ -10,15 +22,13 @@ export const Warning = () => { 정보 최근 주행 기록을 바탕으로 산정된 주의 항목입니다. - - 1. 실선에서 차선 변경 12번 - - - 2. 실선에서 차선 변경 8번 - - - 3. 실선에서 차선 변경 4번 - + {data?.map((el, idx) => { + return ( + + {`${idx}. ${el.scenarioName}`} {el.scenarioCount}번 + + ); + })} ); diff --git a/src/components/common/Toast.tsx b/src/components/common/Toast.tsx new file mode 100644 index 0000000..0e940b3 --- /dev/null +++ b/src/components/common/Toast.tsx @@ -0,0 +1,59 @@ +import { useEffect } from "react"; +import styled from "styled-components"; +import alarm_sound from "@assets/sound/alram.mp3"; + +interface ToastProps { + message: string; + setToast: React.Dispatch>; +} +export const Toast = ({ message, setToast }: ToastProps) => { + useEffect(() => { + const timer = setTimeout(() => { + setToast(false); + }, 3000); + return () => { + clearTimeout(timer); + }; + }, []); + return ( + + + ); +}; + +const ToastContainer = styled.div` + width: 280px; + height: 42px; + padding: 0 12px; + border-radius: 4px; + background-color: #f86d60; + + color: white; + font-family: "Pretendard"; + font-weight: 500; + line-height: 42px; + + position: absolute; + left: 10px; + top: 40px; + + animation: fadeout 2s ease-in-out; + opacity: 0; + + @keyframes fadeout { + 0% { + opacity: 0; + } + 25% { + opacity: 1; + } + 75% { + opacity: 1; + } + 100% { + opacity: 0; + } + } +`; diff --git a/src/types/home.ts b/src/types/home.ts new file mode 100644 index 0000000..a867d71 --- /dev/null +++ b/src/types/home.ts @@ -0,0 +1,13 @@ +import { ScenarioType } from "./driving"; + +interface ScoreType { + reportId: number; + score: number; +} +export interface LatestScoresType { + latestScores: ScoreType[]; +} + +export interface HomeRecentType { + recentRisks: ScenarioType[]; +} diff --git a/tsconfig.json b/tsconfig.json index e68b6f3..31e15b5 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -14,6 +14,7 @@ "@utils/*": ["src/utils/*"], "@api/*": ["src/api/*"] }, + "typeRoots": ["./use-sound.d.ts"], /* Bundler mode */ "moduleResolution": "bundler",