import React, { useState, useEffect } from 'react'; // axiosをインポート import axios from 'axios'; import lodash from 'lodash'; import dayjs from 'dayjs'; import relativeTime from 'dayjs/plugin/relativeTime'; dayjs.extend(relativeTime); import './QiitaApp.css'; function App() { const [page, setPage] = useState(1); const [perPage, setPerPage] = useState(20); const [postsList, setPostsList] = useState([]); const [isLoading, setIsLoading] = useState(false); const [tag, setTag] = useState('React'); const [error, setError] = useState(''); // 一番下に到達したら handleClick()でページを更新 const handleScroll = lodash.throttle(() => { if ( window.innerHeight + document.documentElement.scrollTop !== document.documentElement.offsetHeight ) { return; } // 一番下に到達した時の処理 //if(message !== "loading...") { setPage((prevCount) => prevCount + 1); //} }, 500); useEffect(() => { window.addEventListener('scroll', handleScroll); return () => { window.removeEventListener('scroll', handleScroll); }; }, []); // eslint-disable-line react-hooks/exhaustive-deps // pageが変化した時に実行 useEffect(() => { //document.title = `page = ${page}, message = ${message}`; handleClick(); // eslint-disable-next-line }, [page]); // Only re-run the effect if count changes // tagが変化した時に実行 useEffect(() => { //document.title = `page = ${page}, message = ${message}`; handleClick(); // eslint-disable-next-line }, [tag]); // Only re-run the effect if count changes const tagButtonClick = (target) => { setPerPage(20); setPostsList([]); setPage(1); setTag(target); } const pageButtonClick = (target) => { setPerPage(100); setPostsList([]); const tmp = parseInt(target,10); setPage(tmp); //setTag('Swift'); } const handleClick = (target) => { const url = `https://qiita.com/api/v2/tags/${tag}/items?page=${page}&per_page=${perPage}`; setIsLoading(true); const headers = {} fetch(url, { headers }) .then(res => res.json().then(data => ({ ok: res.ok, data, })) ) .then(res => { if (!res.ok) { setError(res.data.message); setIsLoading(false); //throw Error(res.data.message) } else { setPostsList(postsList.concat(res.data)); setIsLoading(false); } }) } // page + 1 const getNextQiitaPosts = () => { const newPage = page + 1; setPage(newPage); } // page - 1 const getBeforeQiitaPosts = () => { const newPage = page - 1; setPage(newPage); } const renderTag = (list) => { const tags = list.map((item, index) => { return ( <>{item.name}, > ); }); return tags; } const renderImageList = (list) => { const posts = list.map((item, index) => { return (
{dayjs(item.created_at).fromNow(true)} / {renderTag(item.tags)} / {item.likes_count}likes / {item.user.items_count}posts