Item.tsx 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. import NovelCover from "components/NovelCover";
  2. import { delHistoryItem, putHistoryItem } from "libs/db/history";
  3. import Link from "next/link";
  4. import styles from "./index.module.scss";
  5. interface ItemProps {
  6. type: string;
  7. data: HistoryItem;
  8. onRemoved: () => void;
  9. }
  10. export default function Item({ type, data, onRemoved }: ItemProps) {
  11. const isHistory = type === "History";
  12. const url = `/novel/${isHistory ? data.chapterUri : data.uri}`;
  13. const handleRemoveItem = () => {
  14. const item = { ...data };
  15. if (isHistory) {
  16. item.isReading = 0;
  17. } else {
  18. item.isFavorite = 0;
  19. }
  20. (!item.isReading && !item.isFavorite
  21. ? delHistoryItem(data.uri)
  22. : putHistoryItem(data)
  23. ).then(onRemoved);
  24. };
  25. return (
  26. <li key={data.uri} className={styles.item}>
  27. <NovelCover
  28. className={styles.cover}
  29. component={Link}
  30. href={url}
  31. title={`${data.name} ${data.chapterName}`}
  32. src={data.img}
  33. />
  34. <div className={styles.body}>
  35. <div className={styles.title}>
  36. <Link href={url}>{data.name}</Link>
  37. </div>
  38. <div className={styles.progressTitle}>
  39. <Link href={url}>
  40. You have read {data.chapterIndex}/{data.chapterCount}
  41. </Link>
  42. </div>
  43. <div role="progressbar" className={styles.progressbar}>
  44. <div
  45. style={{
  46. width: `${(data.chapterIndex / data.chapterCount) * 100}%`,
  47. }}
  48. ></div>
  49. </div>
  50. <div className={styles.btns}>
  51. <Link className={styles.btn} href={url}>
  52. Continue Reading
  53. </Link>
  54. </div>
  55. </div>
  56. <button
  57. className={styles.close}
  58. onClick={handleRemoveItem}
  59. title={isHistory ? "Remove History" : "Remove Favorite"}
  60. >
  61. <svg>
  62. <use xlinkHref="/icons.svg#close"></use>
  63. </svg>
  64. </button>
  65. </li>
  66. );
  67. }