import type { Component } from "solid-js"; import { createResource, For, createSignal, Suspense, createEffect } from "solid-js"; import { Qiita } from "./qiita-types"; import lodash from "lodash"; import "./QiitaApp.css"; import dayjs from 'dayjs'; import relativeTime from 'dayjs/plugin/relativeTime'; dayjs.extend(relativeTime); const fetchData = async(page: number) => (await fetch(`https://qiita.com/api/v2/tags/react/items?page=${page}&per_page=100`)).json(); //const fetchData2 = async(tag: string) => // (await fetch(`https://qiita.com/api/v2/tags/${tag}/items?page=1`)).json(); const QiitaPage: Component = () => { //const [postsList, setPostsList] = createSignal([]); const [page, setPage] = createSignal(1); const [tag, setTag] = createSignal("React"); const [error, setError] = createSignal(""); const [data, { refetch }] = createResource(page, fetchData); //const [data2, { refetch2 }] = createResource(tag, fetchData2); createEffect(() => { if(data() == null) { //setError("Probably Rate limit exceeded"); //handleClick(); // if rate limit show Rate limit exceeded } //else { // setError(""); //} }); // 一番下に到達したら 次ページに更新 const handleScroll = lodash.throttle(() => { if ( window.innerHeight + document.documentElement.scrollTop !== document.documentElement.offsetHeight ) { return; } // 一番下に到達した時の処理 //if(message !== "loading...") { //setPage((prevCount) => prevCount + 1); setPage(page() + 1); //} }, 500); createEffect(() => { window.addEventListener('scroll', handleScroll); return () => { window.removeEventListener('scroll', handleScroll); }; }, []); // eslint-disable-line react-hooks/exhaustive-deps const tagButtonClick = (target) => { setPage(1); setTag(target); //handleClick(); }; const pageButtonClick = (target) => { const tmp = parseInt(target, 10); setPage(tmp); //handleClick(); }; /* const handleClick = () => { const limit = 10; //const url = `https://qiita.com/api/v2/tags/${tag}/items?page=${page}&per_page=${limit}`; //const url = `https://qiita.com/api/v2/tags/react/items`; //const url = `https://qiita.com/api/v2/tags/${tag}/items`; const url = `https://qiita.com/api/v2/tags/${tag}/items?page=${page}`; //document.title = `page: ${page()}, tag: ${tag()}`; const headers = {} fetch(url, { headers }) .then(res => res.json().then(data => ({ ok: res.ok, data, })) ) .then(res => { if (!res.ok) { setError(res.data.message); // Rate limit exceeded //throw Error(res.data.message) } else { //document.title = `res.ok`; //todo //setPostsList(postsList.concat(res.data)); } }) } */ //let input!: HTMLInputElement; const onNextPage= () => { setPage(page() + 1); }; const onPrevPage= () => { setPage(page() - 1); }; const renderTag = (list) => { const tags = list.map((item, index) => { return ( <>{item.name}, ); }); return tags; } return ( <>
{error}

Qiita Page

SolidJSでQiitaAPIから記事情報を取得して表示(vercel-solid-pages)

{tag}
page: ___: ___: ___: page: {page()}/100posts, {data.loading && "Loading..."} {data.error && "error"} Loading...}>
    {(item) => (
  • {item.title}

    {dayjs(item.created_at).fromNow(true)} / {renderTag(item.tags)} / {item.likes_count}likes / {item.user.items_count}posts

  • )}
{tag} Page {page}/100posts
); }; export default QiitaPage;