Book list is now fetched from indexedDB
This commit is contained in:
parent
b6ede385ca
commit
a1f28d2b60
@ -4,6 +4,7 @@
|
|||||||
<meta charset="UTF-8" />
|
<meta charset="UTF-8" />
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
<link rel="shortcut icon" href="favicon.ico" type="image/x-icon" />
|
<link rel="shortcut icon" href="favicon.ico" type="image/x-icon" />
|
||||||
|
<!-- <link rel="manifest" href="manifest.json" /> -->
|
||||||
<title>Publite</title>
|
<title>Publite</title>
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
|
43
public/manifest.json
Normal file
43
public/manifest.json
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
{
|
||||||
|
"short_name": "Publite",
|
||||||
|
"name": "Publite: eBook reader",
|
||||||
|
"icons": [
|
||||||
|
{
|
||||||
|
"src": "/images/icons-192.png",
|
||||||
|
"type": "image/png",
|
||||||
|
"sizes": "192x192"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"src": "/images/icons-512.png",
|
||||||
|
"type": "image/png",
|
||||||
|
"sizes": "512x512"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"start_url": "/",
|
||||||
|
"background_color": "#000000",
|
||||||
|
"display": "standalone",
|
||||||
|
"scope": "/",
|
||||||
|
"theme_color": "#000000",
|
||||||
|
"shortcuts": [
|
||||||
|
{
|
||||||
|
"name": "How's weather today?",
|
||||||
|
"short_name": "Today",
|
||||||
|
"description": "View weather information for today",
|
||||||
|
"url": "/today?source=pwa",
|
||||||
|
"icons": [{ "src": "/images/today.png", "sizes": "192x192" }]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "eBook reader supporting EPUB and FB2 files",
|
||||||
|
"screenshots": [
|
||||||
|
{
|
||||||
|
"src": "/images/screenshot1.png",
|
||||||
|
"type": "image/png",
|
||||||
|
"sizes": "540x720"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"src": "/images/screenshot2.jpg",
|
||||||
|
"type": "image/jpg",
|
||||||
|
"sizes": "540x720"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
@ -1,16 +1,29 @@
|
|||||||
import React, { useContext, useEffect, useState } from "react";
|
import React, { useEffect, useState } from "react";
|
||||||
|
|
||||||
import styles from "./Bookshelf.module.css";
|
import styles from "./Bookshelf.module.css";
|
||||||
|
|
||||||
import { BookItem } from "./BookItem";
|
import { BookItem } from "./BookItem";
|
||||||
import { AddBook } from "./AddBook";
|
import { AddBook } from "./AddBook";
|
||||||
import { BookListContext } from "~/context";
|
|
||||||
import { IPageProps } from "~/types/page";
|
import { IPageProps } from "~/types/page";
|
||||||
|
import { API_URL } from "~/constants";
|
||||||
|
import { BookT } from "~/types/book";
|
||||||
|
import { connected as swConnected } from "~/utils/serviceFetch";
|
||||||
|
|
||||||
export const Bookshelf = ({ setLoading }: IPageProps) => {
|
export const Bookshelf = ({ setLoading }: IPageProps) => {
|
||||||
useEffect(() => setLoading(true), []);
|
useEffect(() => setLoading(true), []);
|
||||||
|
|
||||||
const [books] = useContext(BookListContext);
|
const [books, setBooks] = useState<BookT[]>([]);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
swConnected.then(async () => {
|
||||||
|
try {
|
||||||
|
const res = await fetch(API_URL + "/list");
|
||||||
|
setBooks(await res.json());
|
||||||
|
} catch (err) {
|
||||||
|
if (process.env.NODE_ENV === "development") console.error(err);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}, []);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (books) setLoading(false);
|
if (books) setLoading(false);
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import * as idb from "idb";
|
import { openDB as idbOpenDB } from "idb";
|
||||||
import { BookT } from "~/types/book";
|
import { BookT } from "~/types/book";
|
||||||
import { DB_NAME, DB_VERSION } from "../constants";
|
import { DB_NAME, DB_VERSION } from "../constants";
|
||||||
import { PubliteDB } from "./schema";
|
import { PubliteDB } from "./schema";
|
||||||
@ -7,7 +7,7 @@ import { PubliteDB } from "./schema";
|
|||||||
* Opens IndexedDB for interactions
|
* Opens IndexedDB for interactions
|
||||||
*/
|
*/
|
||||||
export const openDB = () =>
|
export const openDB = () =>
|
||||||
idb.openDB<PubliteDB>(DB_NAME, DB_VERSION, {
|
idbOpenDB<PubliteDB>(DB_NAME, DB_VERSION, {
|
||||||
upgrade: (db, oldVersion, _, tsx) => {
|
upgrade: (db, oldVersion, _, tsx) => {
|
||||||
if (oldVersion < 1) db.createObjectStore("Books", { keyPath: "hash" });
|
if (oldVersion < 1) db.createObjectStore("Books", { keyPath: "hash" });
|
||||||
},
|
},
|
||||||
|
@ -26,6 +26,7 @@ self.addEventListener("fetch", (event) => {
|
|||||||
let handlers: PathHandler[];
|
let handlers: PathHandler[];
|
||||||
|
|
||||||
if (request.url.startsWith(API_URL)) {
|
if (request.url.startsWith(API_URL)) {
|
||||||
|
console.log("API: ", path);
|
||||||
handlers = [
|
handlers = [
|
||||||
{ path: "/list", getResponse: () => handleBooks() },
|
{ path: "/list", getResponse: () => handleBooks() },
|
||||||
{ path: "/book/", getResponse: () => handleBook(request, getHash(path)) },
|
{ path: "/book/", getResponse: () => handleBook(request, getHash(path)) },
|
||||||
|
6
src/utils/serviceFetch.ts
Normal file
6
src/utils/serviceFetch.ts
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
export const connected = new Promise<void>((resolve) => {
|
||||||
|
if (navigator.serviceWorker.controller) return resolve();
|
||||||
|
navigator.serviceWorker.addEventListener("controllerchange", (e) =>
|
||||||
|
resolve()
|
||||||
|
);
|
||||||
|
});
|
@ -42,7 +42,7 @@ module.exports = {
|
|||||||
plugins: [
|
plugins: [
|
||||||
new webpack.DefinePlugin({
|
new webpack.DefinePlugin({
|
||||||
"process.env.PUBLIC_API_URL": JSON.stringify(
|
"process.env.PUBLIC_API_URL": JSON.stringify(
|
||||||
"https://publitebackend.dmitriy.icu"
|
"http://localhost:8081"
|
||||||
),
|
),
|
||||||
}),
|
}),
|
||||||
new ForkTsCheckerPlugin(),
|
new ForkTsCheckerPlugin(),
|
||||||
|
@ -11,11 +11,16 @@ module.exports = {
|
|||||||
contentBase: path.join(__dirname, "build"),
|
contentBase: path.join(__dirname, "build"),
|
||||||
compress: true,
|
compress: true,
|
||||||
port: 8080,
|
port: 8080,
|
||||||
hot: true,
|
hot: false,
|
||||||
|
inline: false,
|
||||||
|
historyApiFallback: {
|
||||||
|
index: "index.html",
|
||||||
|
},
|
||||||
},
|
},
|
||||||
plugins: [
|
plugins: [
|
||||||
new webpack.DefinePlugin({
|
new webpack.DefinePlugin({
|
||||||
"process.env.NODE_ENV": JSON.stringify("development"),
|
"process.env.NODE_ENV": JSON.stringify("development"),
|
||||||
|
"process.env.PUBLIC_BASE_URL": JSON.stringify("http://localhost:8080"),
|
||||||
}),
|
}),
|
||||||
...webpackConfig.plugins,
|
...webpackConfig.plugins,
|
||||||
],
|
],
|
||||||
|
@ -12,6 +12,9 @@ module.exports = {
|
|||||||
plugins: [
|
plugins: [
|
||||||
new webpack.DefinePlugin({
|
new webpack.DefinePlugin({
|
||||||
"process.env.NODE_ENV": JSON.stringify("production"),
|
"process.env.NODE_ENV": JSON.stringify("production"),
|
||||||
|
"process.env.PUBLIC_BASE_URL": JSON.stringify(
|
||||||
|
"https://publite.dmitriy.icu"
|
||||||
|
),
|
||||||
}),
|
}),
|
||||||
...webpackConfig.plugins,
|
...webpackConfig.plugins,
|
||||||
],
|
],
|
||||||
|
Loading…
x
Reference in New Issue
Block a user