{"id":1551,"date":"2021-08-06T14:03:25","date_gmt":"2021-08-06T05:03:25","guid":{"rendered":"http:\/\/www.agile-software.site\/?p=1551"},"modified":"2022-11-27T04:11:05","modified_gmt":"2022-11-26T19:11:05","slug":"covid19_dashboard","status":"publish","type":"post","link":"https:\/\/agile-software.net\/?p=1551","title":{"rendered":"covid19_dashboard"},"content":{"rendered":"\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u4f5c\u6210<\/h2>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\"><code>npx create-react-app . --template redux-typescript<\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">\u30e2\u30b8\u30e5\u30fc\u30eb\u306e\u30a4\u30f3\u30dd\u30fc\u30c8<\/h2>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\"><code>npm install axios\nnpm install @material-ui\/core\nnpm install chart.js --save\nmpm install react-chartjs-2\nnpm install react-countup\nnpm install react-icons<\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">\u30d5\u30a1\u30a4\u30eb\u306e\u6e96\u5099<\/h2>\n\n\n\n<p>features\u306e\u76f4\u4e0b\u306bcovid\u30d5\u30a9\u30eb\u30c0\u3092\u4f5c\u6210\u3057\u305d\u306e\u4e2d\u306bCards\u3001Chart\u3001DashBoard\u3001PieChart\u3001SwitchCountry\u306e\u30d5\u30a9\u30eb\u30c0\u3092\u4f5c\u6210\u3002<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\"><code><\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">covidSlice.ts\u30d5\u30a1\u30a4\u30eb\u306e\u4f5c\u6210<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">API\u306e\u30d1\u30b9\u3092\u5b9a\u7fa9<\/h3>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\"><code><\/code><\/pre><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">data\u578b\u5b9a\u7fa9<\/h3>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\"><code>type DATADAILY = typeof dataDaily;<\/code><\/pre><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">State\u69cb\u9020\u5b9a\u7fa9<\/h3>\n\n\n\n<h3 class=\"wp-block-heading\">initialState\u5b9a\u7fa9<\/h3>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\" data-file=\"covidSlice.ts\"><code>import { createSlice, createAsyncThunk } from &quot;@reduxjs\/toolkit&quot;;\nimport axios from &quot;axios&quot;;\nimport { RootState } from &quot;..\/..\/app\/store&quot;;\nimport dataDaily from &quot;.\/apiDataDaily.json&quot;;\nconst apiUrl = &quot;https:\/\/api.covid19api.com\/total\/country&quot;;\ntype DATADAILY = typeof dataDaily;\n\ntype covidState = {\n  daily: DATADAILY;\n  country: string;\n};\n\nconst initialState: covidState = {\n  daily: dataDaily,\n  country: &quot;Japan&quot;,\n};\n\nexport const fetchAsyncGetDaily = createAsyncThunk(\n  &quot;covid\/getDaily&quot;,\n  async (country: string) =&gt; {\n    const { data } = await axios.get&lt;DATADAILY&gt;(`${apiUrl}\/${country}`);\n    return { data: data, country: country };\n  }\n);\n\nconst covidSlice = createSlice({\n  name: &quot;covid&quot;,\n  initialState: initialState,\n  reducers: {},\n  extraReducers: (builder) =&gt; {\n    builder.addCase(fetchAsyncGetDaily.fulfilled, (state, action) =&gt; {\n      return {\n        ...state,\n        daily: action.payload.data,\n        country: action.payload.country,\n      };\n    });\n  },\n});\n\nexport const selectDaily = (state: RootState) =&gt; state.covid.daily;\nexport const selectCountry = (state: RootState) =&gt; state.covid.country;\n\nexport default covidSlice.reducer;<\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><\/h2>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\"><code>[\n  {\n    &quot;Country&quot;: &quot;Japan&quot;,\n    &quot;CountryCode&quot;: &quot;&quot;,\n    &quot;Province&quot;: &quot;&quot;,\n    &quot;City&quot;: &quot;&quot;,\n    &quot;CityCode&quot;: &quot;&quot;,\n    &quot;Lat&quot;: &quot;0&quot;,\n    &quot;Lon&quot;: &quot;0&quot;,\n    &quot;Confirmed&quot;: 0,\n    &quot;Deaths&quot;: 0,\n    &quot;Recovered&quot;: 0,\n    &quot;Active&quot;: 0,\n    &quot;Date&quot;: &quot;2020-01-22T00:00:00Z&quot;\n  }\n]<\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">React\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"> Cards <\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">Cards.tsx<\/h4>\n\n\n\n<p>covidSlice.ts\u3067\u30a8\u30af\u30b9\u30dd\u30fc\u30c8\u3057\u305fselectDaily\u3092<\/p>\n\n\n\n<p>\u914d\u5217\u306e\u9577\u3055-1\u3067\u4e00\u756a\u4e0b\u306e<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\"><code>import React from &quot;react&quot;;\nimport styles from &quot;.\/Cards.module.css&quot;;\nimport CountUp from &quot;react-countup&quot;;\nimport { Card, CardContent, Typography, Grid } from &quot;@material-ui\/core&quot;;\n\nimport { GiHastyGrave } from &quot;react-icons\/gi&quot;;\nimport { MdLocalHospital } from &quot;react-icons\/md&quot;;\nimport { AiFillLike } from &quot;react-icons\/ai&quot;;\n\nimport { useSelector } from &quot;react-redux&quot;;\nimport { selectDaily } from &quot;..\/covidSlice&quot;;\n\nconst Cards: React.FC = () =&gt; {\n  const daily = useSelector(selectDaily);\n  return (\n    &lt;div className={styles.container}&gt;\n      &lt;Grid container spacing={1} justify=&quot;center&quot;&gt;\n        &lt;Grid item xs={12} md={3} component={Card} className={styles.infected}&gt;\n          &lt;CardContent&gt;\n            &lt;Typography color=&quot;textSecondary&quot; gutterBottom&gt;\n              &lt;MdLocalHospital \/&gt;\n              Infected persons\n            &lt;\/Typography&gt;\n            &lt;Typography variant=&quot;h5&quot;&gt;\n              &lt;CountUp\n                start={0}\n                end={daily[daily.length - 1].Confirmed}\n                duration={1.5}\n                separator=&quot;,&quot;\n              \/&gt;\n            &lt;\/Typography&gt;\n          &lt;\/CardContent&gt;\n        &lt;\/Grid&gt;\n        &lt;Grid item xs={12} md={3} component={Card} className={styles.recovered}&gt;\n          &lt;CardContent&gt;\n            &lt;Typography color=&quot;textSecondary&quot; gutterBottom&gt;\n              &lt;AiFillLike \/&gt; Recovered persons\n            &lt;\/Typography&gt;\n            &lt;Typography variant=&quot;h5&quot;&gt;\n              &lt;CountUp\n                start={0}\n                end={daily[daily.length - 1].Recovered}\n                duration={1.5}\n                separator=&quot;,&quot;\n              \/&gt;\n            &lt;\/Typography&gt;\n          &lt;\/CardContent&gt;\n        &lt;\/Grid&gt;\n        &lt;Grid item xs={12} md={3} component={Card} className={styles.deaths}&gt;\n          &lt;CardContent&gt;\n            &lt;Typography color=&quot;textSecondary&quot; gutterBottom&gt;\n              &lt;GiHastyGrave \/&gt;\n              Dead persons\n            &lt;\/Typography&gt;\n            &lt;Typography variant=&quot;h5&quot;&gt;\n              &lt;CountUp\n                start={0}\n                end={daily[daily.length - 1].Deaths}\n                duration={1.5}\n                separator=&quot;,&quot;\n              \/&gt;\n            &lt;\/Typography&gt;\n          &lt;\/CardContent&gt;\n        &lt;\/Grid&gt;\n      &lt;\/Grid&gt;\n    &lt;\/div&gt;\n  );\n};\n\nexport default Cards;<\/code><\/pre><\/div>\n\n\n\n<h4 class=\"wp-block-heading\">Cards.module.css<\/h4>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\"><code>.container {\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  margin-top: 10px;\n}\n\n.infected {\n  border-left: 5px solid #33a3ff;\n  border-radius: 0% !important;\n  margin: 2% 2% !important;\n}\n\n.recovered {\n  border-left: 5px solid #3cb371;\n  border-radius: 0% !important;\n  margin: 2% 2% !important;\n}\n\n.deaths {\n  border-left: 5px solid #ff3370;\n  border-radius: 0% !important;\n  margin: 2% 2% !important;\n}<\/code><\/pre><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">PieChart<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">PieChart.tsx<\/h4>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\"><code>import React from &quot;react&quot;;\nimport { Typography } from &quot;@material-ui\/core&quot;;\nimport { Doughnut } from &quot;react-chartjs-2&quot;;\n\nimport { useSelector } from &quot;react-redux&quot;;\nimport { selectDaily } from &quot;..\/covidSlice&quot;;\n\nconst PieChart: React.FC = () =&gt; {\n  const daily = useSelector(selectDaily);\n\n  const motality =\n    (100 * daily[daily.length - 1].Deaths) \/ daily[daily.length - 1].Confirmed;\n\n  const pieChart = daily[0] && (\n    &lt;Doughnut\n      data={{\n        labels: [&quot;Infected&quot;, &quot;Recovered&quot;, &quot;Deaths&quot;],\n        datasets: [\n          {\n            data: [\n              daily[daily.length - 1].Confirmed,\n              daily[daily.length - 1].Recovered,\n              daily[daily.length - 1].Deaths,\n            ],\n            backgroundColor: [\n              &quot;rgba(0, 0, 255, 0.5)&quot;,\n              &quot;#008080&quot;,\n              &quot;rgba(255, 0, 0, 0.5)&quot;,\n            ],\n            hoverBackgroundColor: [&quot;#36A2EB&quot;, &quot;#3cb371&quot;, &quot;#FF6384&quot;],\n            borderColor: [&quot;transparent&quot;, &quot;transparent&quot;, &quot;transparent&quot;],\n          },\n        ],\n      }}\n      options={{\n        legend: {\n          position: &quot;bottom&quot;,\n          labels: {\n            boxWidth: 15,\n          },\n        },\n      }}\n    \/&gt;\n  );\n\n  return (\n    &lt;&gt;\n      &lt;Typography align=&quot;center&quot; color=&quot;textSecondary&quot; gutterBottom&gt;\n        Motarity {motality.toFixed(2)} [%]\n      &lt;\/Typography&gt;\n      {pieChart}\n    &lt;\/&gt;\n  );\n};\n\nexport default PieChart;<\/code><\/pre><\/div>\n\n\n\n<script async=\"\" src=\"https:\/\/pagead2.googlesyndication.com\/pagead\/js\/adsbygoogle.js?client=ca-pub-4276705529344958\" crossorigin=\"anonymous\"><\/script>\n<!-- Agile\u80b2\u6210\u30d6\u30ed\u30b0 -->\n<ins class=\"adsbygoogle\" style=\"display:block\" data-ad-client=\"ca-pub-4276705529344958\" data-ad-slot=\"9009931297\" data-ad-format=\"auto\" data-full-width-responsive=\"true\"><\/ins>\n<script>\n     (adsbygoogle = window.adsbygoogle || []).push({});\n<\/script>\n","protected":false},"excerpt":{"rendered":"<p>\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u4f5c\u6210 \u30e2\u30b8\u30e5\u30fc\u30eb\u306e\u30a4\u30f3\u30dd\u30fc\u30c8 \u30d5\u30a1\u30a4\u30eb\u306e\u6e96\u5099 features\u306e\u76f4\u4e0b\u306bcovid\u30d5\u30a9\u30eb\u30c0\u3092\u4f5c\u6210\u3057\u305d\u306e\u4e2d\u306bCards\u3001Chart\u3001DashBoard\u3001PieChart\u3001SwitchCountry\u306e\u30d5\u30a9\u30eb\u30c0\u3092\u4f5c\u6210<\/p>\n","protected":false},"author":1,"featured_media":1561,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jin_ogp_image_url":"","_jin_last_featured_id":0,"footnotes":""},"categories":[21],"tags":[],"class_list":["post-1551","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-react"],"_links":{"self":[{"href":"https:\/\/agile-software.net\/index.php?rest_route=\/wp\/v2\/posts\/1551","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/agile-software.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/agile-software.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/agile-software.net\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/agile-software.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1551"}],"version-history":[{"count":2,"href":"https:\/\/agile-software.net\/index.php?rest_route=\/wp\/v2\/posts\/1551\/revisions"}],"predecessor-version":[{"id":2264,"href":"https:\/\/agile-software.net\/index.php?rest_route=\/wp\/v2\/posts\/1551\/revisions\/2264"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/agile-software.net\/index.php?rest_route=\/wp\/v2\/media\/1561"}],"wp:attachment":[{"href":"https:\/\/agile-software.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1551"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/agile-software.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1551"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/agile-software.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1551"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}