🔧 Fixed a nagging default active tab issue on comic detail page

This commit is contained in:
Rishi Ghan
2022-05-12 14:12:59 -07:00
parent 6b508d4c36
commit a64a8b5410
3 changed files with 70 additions and 44 deletions

View File

@@ -9,16 +9,18 @@ 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";
import { ComicVineMatchPanel } from "./ComicDetail/ComicVineMatchPanel"; import { ComicVineMatchPanel } from "./ComicDetail/ComicVineMatchPanel";
import { VolumeInformation } from "./ComicDetail/Tabs/VolumeInformation";
import { RawFileDetails } from "./ComicDetail/RawFileDetails";
import { ArchiveOperations } from "./ComicDetail/Tabs/ArchiveOperations"; import { ArchiveOperations } from "./ComicDetail/Tabs/ArchiveOperations";
import { ComicInfoXML } from "./ComicDetail/Tabs/ComicInfoXML"; import { ComicInfoXML } from "./ComicDetail/Tabs/ComicInfoXML";
import AcquisitionPanel from "./ComicDetail/AcquisitionPanel"; import AcquisitionPanel from "./ComicDetail/AcquisitionPanel";
import DownloadsPanel from "./ComicDetail/DownloadsPanel"; import DownloadsPanel from "./ComicDetail/DownloadsPanel";
import { VolumeInformation } from "./ComicDetail/Tabs/VolumeInformation";
import { RawFileDetails } from "./ComicDetail/RawFileDetails";
import TabControls from "./ComicDetail/TabControls";
import { EditMetadataPanel } from "./ComicDetail/EditMetadataPanel"; import { EditMetadataPanel } from "./ComicDetail/EditMetadataPanel";
import { Menu } from "./ComicDetail/ActionMenu/Menu"; import { Menu } from "./ComicDetail/ActionMenu/Menu";
import { isEmpty, isUndefined, isNil } from "lodash"; import { isEmpty, isUndefined, isNil, find, filter, omitBy } from "lodash";
import { RootState } from "threetwo-ui-typings"; import { RootState } from "threetwo-ui-typings";
import { getComicBookDetailById } from "../actions/comicinfo.actions"; import { getComicBookDetailById } from "../actions/comicinfo.actions";
@@ -51,7 +53,7 @@ type ComicDetailProps = {};
export const ComicDetail = ({}: ComicDetailProps): ReactElement => { export const ComicDetail = ({}: ComicDetailProps): ReactElement => {
const [page, setPage] = useState(1); const [page, setPage] = 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 [modalIsOpen, setIsOpen] = useState(false);
@@ -248,45 +250,13 @@ export const ComicDetail = ({}: ComicDetailProps): ReactElement => {
]; ];
// filtered Tabs // filtered Tabs
const filteredTabs = tabGroup.filter((tab) => tab.shouldShow); const filteredTabs = tabGroup.filter((tab) => tab.shouldShow);
const filteredTabIds = tabGroup
// Tabs .map((tab) => {
const MetadataTabGroup = () => { if (tab.shouldShow) {
return ( return tab.id;
<> }
<div className="tabs"> })
<ul> .filter((tab) => !isNil(tab));
{filteredTabs.map(({ id, name, icon }) => (
<li
key={id}
className={id === active ? "is-active" : ""}
onClick={() => setActive(id)}
>
{/* Downloads tab and count badge */}
<a>
{id === 5 &&
!isNil(comicBookDetailData) &&
!isEmpty(comicBookDetailData) ? (
<span className="download-icon-labels">
<i className="fa-solid fa-download"></i>
<span className="tag downloads-count is-info is-light">
{comicBookDetailData.acquisition.directconnect.length}
</span>
</span>
) : (
<span className="icon is-small">{icon}</span>
)}
{name}
</a>
</li>
))}
</ul>
</div>
{filteredTabs.map(({ id, content }) => {
return active === id ? content : null;
})}
</>
);
};
// Determine which cover image to use: // Determine which cover image to use:
// 1. from the locally imported or // 1. from the locally imported or
@@ -369,7 +339,14 @@ export const ComicDetail = ({}: ComicDetailProps): ReactElement => {
</div> </div>
</div> </div>
{<MetadataTabGroup />} {
<TabControls
comicBookDetailData={comicBookDetailData}
comicObjectId={comicObjectId}
filteredTabIds={filteredTabIds}
filteredTabs={filteredTabs}
/>
}
<SlidingPane <SlidingPane
isOpen={visible} isOpen={visible}

View File

@@ -26,6 +26,7 @@ export const DownloadsPanel = (
return state.airdcpp.bundles; return state.airdcpp.bundles;
}); });
console.log(bundles);
// AirDCPP Socket initialization // AirDCPP Socket initialization
const userSettings = useSelector((state: RootState) => state.settings.data); const userSettings = useSelector((state: RootState) => state.settings.data);
const { ADCPPSocket } = useContext(AirDCPPSocketContext); const { ADCPPSocket } = useContext(AirDCPPSocketContext);

View File

@@ -0,0 +1,48 @@
import React, { ReactElement, useEffect, useState } from "react";
import { isEmpty, isNil, isUndefined } from "lodash";
export const TabControls = (props): ReactElement => {
const { comicBookDetailData, filteredTabIds, filteredTabs } = props;
const [active, setActive] = useState(filteredTabIds[0]);
console.log(filteredTabIds);
useEffect(() => {
setActive(filteredTabIds[0]);
}, [filteredTabIds])
return (
<>
<div className="tabs">
<ul>
{filteredTabs.map(({ id, name, icon }) => (
<li
key={id}
className={id === active ? "is-active" : ""}
onClick={() => setActive(id)}
>
{/* Downloads tab and count badge */}
<a>
{id === 5 &&
!isNil(comicBookDetailData) &&
!isEmpty(comicBookDetailData) ? (
<span className="download-icon-labels">
<i className="fa-solid fa-download"></i>
<span className="tag downloads-count is-info is-light">
{comicBookDetailData.acquisition.directconnect.length}
</span>
</span>
) : (
<span className="icon is-small">{icon}</span>
)}
{name}
</a>
</li>
))}
</ul>
</div>
{filteredTabs.map(({ id, content }) => {
return active === id ? content : null;
})}
</>
);
};
export default TabControls;