🔧 Wiring up the modal and the comic viewer

This commit is contained in:
Rishi Ghan
2022-05-05 13:56:07 -07:00
parent a0d29b5086
commit 5e7496028f
2 changed files with 54 additions and 3 deletions

View File

@@ -1,4 +1,10 @@
import React, { useState, useEffect, ReactElement, useContext } from "react"; import React, {
useState,
useEffect,
ReactElement,
useContext,
useCallback,
} from "react";
import { useDispatch, useSelector } from "react-redux"; import { useDispatch, useSelector } from "react-redux";
import { useParams } from "react-router-dom"; import { useParams } from "react-router-dom";
import Card from "./Carda"; import Card from "./Carda";
@@ -21,6 +27,8 @@ import "react-sliding-pane/dist/react-sliding-pane.css";
import "react-loader-spinner/dist/loader/css/react-spinner-loader.css"; import "react-loader-spinner/dist/loader/css/react-spinner-loader.css";
import Loader from "react-loader-spinner"; import Loader from "react-loader-spinner";
import SlidingPane from "react-sliding-pane"; import SlidingPane from "react-sliding-pane";
import Modal from "react-modal";
import ComicViewer from "react-comic-viewer";
import { escapePoundSymbol } from "../shared/utils/formatting.utils"; import { escapePoundSymbol } from "../shared/utils/formatting.utils";
@@ -28,6 +36,7 @@ import { LIBRARY_SERVICE_HOST } from "../constants/endpoints";
import { getSettings } from "../actions/settings.actions"; import { getSettings } from "../actions/settings.actions";
import { AirDCPPSocketContext } from "../context/AirDCPPSocket"; import { AirDCPPSocketContext } from "../context/AirDCPPSocket";
import AirDCPPSocket from "../services/DcppSearchService"; import AirDCPPSocket from "../services/DcppSearchService";
import { extractComicArchive } from "../actions/fileops.actions";
type ComicDetailProps = {}; type ComicDetailProps = {};
/** /**
@@ -45,6 +54,7 @@ export const ComicDetail = ({}: ComicDetailProps): ReactElement => {
const [active, setActive] = useState(1); const [active, setActive] = useState(1);
const [visible, setVisible] = useState(false); const [visible, setVisible] = useState(false);
const [slidingPanelContentId, setSlidingPanelContentId] = useState(""); const [slidingPanelContentId, setSlidingPanelContentId] = useState("");
const [modalIsOpen, setIsOpen] = useState(false);
const comicVineSearchResults = useSelector( const comicVineSearchResults = useSelector(
(state: RootState) => state.comicInfo.searchResults, (state: RootState) => state.comicInfo.searchResults,
@@ -58,11 +68,28 @@ export const ComicDetail = ({}: ComicDetailProps): ReactElement => {
const comicBookDetailData = useSelector( const comicBookDetailData = useSelector(
(state: RootState) => state.comicInfo.comicBookDetail, (state: RootState) => state.comicInfo.comicBookDetail,
); );
const extractedComicBook = useSelector(
(state: RootState) => state.fileOps.extractedComicBookArchive,
);
const { comicObjectId } = useParams<{ comicObjectId: string }>(); const { comicObjectId } = useParams<{ comicObjectId: string }>();
const userSettings = useSelector((state: RootState) => state.settings.data); const userSettings = useSelector((state: RootState) => state.settings.data);
const { ADCPPSocket, setADCPPSocket } = useContext(AirDCPPSocketContext); const { ADCPPSocket, setADCPPSocket } = useContext(AirDCPPSocketContext);
const dispatch = useDispatch(); const dispatch = useDispatch();
const openModal = useCallback((filePath) => {
setIsOpen(true);
dispatch(extractComicArchive(filePath));
}, []);
const afterOpenModal = useCallback(() => {
// references are now sync'd and can be accessed.
// subtitle.style.color = "#f00";
}, []);
const closeModal = useCallback(() => {
setIsOpen(false);
}, []);
useEffect(() => { useEffect(() => {
dispatch(getComicBookDetailById(comicObjectId)); dispatch(getComicBookDetailById(comicObjectId));
dispatch(getSettings()); dispatch(getSettings());
@@ -311,6 +338,32 @@ export const ComicDetail = ({}: ComicDetailProps): ReactElement => {
comicBookDetailData.inferredMetadata, comicBookDetailData.inferredMetadata,
}} }}
/> />
{/* Read comic button */}
<button
className="button is-success is-light"
onClick={() =>
openModal(comicBookDetailData.rawFileDetails.filePath)
}
>
<i className="fa-solid fa-book-open mr-2"></i>
Read
</button>
<Modal
style={{ content: { marginTop: "2rem" } }}
isOpen={modalIsOpen}
onAfterOpen={afterOpenModal}
onRequestClose={closeModal}
contentLabel="Example Modal"
>
<button onClick={closeModal}>close</button>
{extractedComicBook && (
<ComicViewer
pages={extractedComicBook}
direction="ltr"
/>
)}
</Modal>
</> </>
)} )}
</div> </div>

View File

@@ -7,8 +7,6 @@ import SlidingPane from "react-sliding-pane";
import { extractComicArchive } from "../../../actions/fileops.actions"; import { extractComicArchive } from "../../../actions/fileops.actions";
import { analyzeImage } from "../../../actions/fileops.actions"; import { analyzeImage } from "../../../actions/fileops.actions";
import { Canvas } from "../../shared/Canvas"; import { Canvas } from "../../shared/Canvas";
import ComicViewer from "react-comic-viewer";
import Modal from "react-modal";
export const ArchiveOperations = (props): ReactElement => { export const ArchiveOperations = (props): ReactElement => {
const { data } = props; const { data } = props;