mirror of
https://github.com/wgh136/nysoure.git
synced 2025-09-27 12:17:24 +00:00
Enhance navigation and tab management with hash support in resource details page
This commit is contained in:
@@ -117,7 +117,7 @@ function ActivityCard({ activity }: { activity: Activity }) {
|
|||||||
) {
|
) {
|
||||||
navigate(`/resources/${activity.resource?.id}`);
|
navigate(`/resources/${activity.resource?.id}`);
|
||||||
} else if (activity.type === ActivityType.ResourceCommented) {
|
} else if (activity.type === ActivityType.ResourceCommented) {
|
||||||
navigate(`/resources/${activity.comment?.resource.id}`);
|
navigate(`/resources/${activity.comment?.resource.id}#comments`);
|
||||||
}
|
}
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
|
@@ -99,6 +99,37 @@ export default function ResourcePage() {
|
|||||||
|
|
||||||
const navigate = useNavigate();
|
const navigate = useNavigate();
|
||||||
|
|
||||||
|
// 标签页与hash的映射
|
||||||
|
const tabHashList = ["description", "files", "comments"];
|
||||||
|
// 读取hash对应的tab索引
|
||||||
|
function getPageFromHash(hash: string) {
|
||||||
|
const h = hash.replace(/^#/, "");
|
||||||
|
const idx = tabHashList.indexOf(h);
|
||||||
|
return idx === -1 ? 0 : idx;
|
||||||
|
}
|
||||||
|
// 设置hash
|
||||||
|
function setHashByPage(idx: number) {
|
||||||
|
window.location.hash = "#" + tabHashList[idx];
|
||||||
|
}
|
||||||
|
|
||||||
|
// 初始状态读取hash
|
||||||
|
useEffect(() => {
|
||||||
|
setPage(getPageFromHash(window.location.hash));
|
||||||
|
// 监听hash变化
|
||||||
|
const onHashChange = () => {
|
||||||
|
setPage(getPageFromHash(window.location.hash));
|
||||||
|
};
|
||||||
|
window.addEventListener("hashchange", onHashChange);
|
||||||
|
return () => window.removeEventListener("hashchange", onHashChange);
|
||||||
|
// eslint-disable-next-line
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
// 切换标签页时同步hash
|
||||||
|
const handleTabChange = (idx: number) => {
|
||||||
|
setPage(idx);
|
||||||
|
setHashByPage(idx);
|
||||||
|
};
|
||||||
|
|
||||||
if (isNaN(id)) {
|
if (isNaN(id)) {
|
||||||
return (
|
return (
|
||||||
<div className="alert alert-error shadow-lg">
|
<div className="alert alert-error shadow-lg">
|
||||||
@@ -153,9 +184,7 @@ export default function ResourcePage() {
|
|||||||
type="radio"
|
type="radio"
|
||||||
name="my_tabs"
|
name="my_tabs"
|
||||||
checked={page === 0}
|
checked={page === 0}
|
||||||
onChange={() => {
|
onChange={() => handleTabChange(0)}
|
||||||
setPage(0);
|
|
||||||
}}
|
|
||||||
/>
|
/>
|
||||||
<MdOutlineArticle className="text-xl mr-2" />
|
<MdOutlineArticle className="text-xl mr-2" />
|
||||||
<span className="text-sm">{t("Description")}</span>
|
<span className="text-sm">{t("Description")}</span>
|
||||||
@@ -169,9 +198,7 @@ export default function ResourcePage() {
|
|||||||
type="radio"
|
type="radio"
|
||||||
name="my_tabs"
|
name="my_tabs"
|
||||||
checked={page === 1}
|
checked={page === 1}
|
||||||
onChange={() => {
|
onChange={() => handleTabChange(1)}
|
||||||
setPage(1);
|
|
||||||
}}
|
|
||||||
/>
|
/>
|
||||||
<MdOutlineDataset className="text-xl mr-2" />
|
<MdOutlineDataset className="text-xl mr-2" />
|
||||||
<span className="text-sm">{t("Files")}</span>
|
<span className="text-sm">{t("Files")}</span>
|
||||||
@@ -185,9 +212,7 @@ export default function ResourcePage() {
|
|||||||
type="radio"
|
type="radio"
|
||||||
name="my_tabs"
|
name="my_tabs"
|
||||||
checked={page === 2}
|
checked={page === 2}
|
||||||
onChange={() => {
|
onChange={() => handleTabChange(2)}
|
||||||
setPage(2);
|
|
||||||
}}
|
|
||||||
/>
|
/>
|
||||||
<MdOutlineComment className="text-xl mr-2" />
|
<MdOutlineComment className="text-xl mr-2" />
|
||||||
<span className="text-sm">{t("Comments")}</span>
|
<span className="text-sm">{t("Comments")}</span>
|
||||||
|
Reference in New Issue
Block a user