feat: hidden error result

This commit is contained in:
mrbunker
2024-09-21 17:56:26 +08:00
parent 93a51282b6
commit 7e3044a0cf
4 changed files with 59 additions and 52 deletions

View File

@@ -13,23 +13,24 @@ const App = memo(function ({ libItem, CODE }: { libItem: LibItem; CODE: string }
];
const [disables, setDisables] = useState(GM_getValue<SiteItem["name"][]>("disable", DEF_DIS));
const [multipleNavi, setMultipleNavi] = useState(GM_getValue<boolean>("multipleNavi", true));
const [hiddenError, setHiddenError] = useState(GM_getValue<boolean>("hiddenError", false));
const list = siteList.filter(
(siteItem) => !disables.includes(siteItem.name) && !siteItem.hostname.includes(libItem.name),
);
return (
<>
<div class="jop-list">
{siteList
.filter(
(siteItem) =>
!disables.includes(siteItem.name) && libItem.name !== siteItem.disableLibItemName,
)
.map((siteItem) => (
<SiteBtn
siteItem={siteItem}
CODE={CODE}
key={siteItem.name}
multipleNavi={multipleNavi}
/>
))}
{list.map((siteItem) => (
<SiteBtn
siteItem={siteItem}
CODE={CODE}
key={siteItem.name}
multipleNavi={multipleNavi}
hiddenError={hiddenError}
/>
))}
</div>
<Setting
@@ -44,6 +45,11 @@ const App = memo(function ({ libItem, CODE }: { libItem: LibItem; CODE: string }
GM_setValue("multipleNavi", multipleNavi);
}}
disables={disables}
hiddenError={hiddenError}
setHiddenError={(v) => {
setHiddenError(v);
GM_setValue("hiddenError", v);
}}
/>
</>
);

View File

@@ -9,9 +9,19 @@ type Props = {
disables: SiteItem["name"][];
multipleNavi: boolean;
setMultipleNavi: Dispatch<StateUpdater<boolean>>;
hiddenError: boolean;
setHiddenError: Dispatch<StateUpdater<boolean>>;
};
const Setting = ({ siteList, setDisables, disables, multipleNavi, setMultipleNavi }: Props) => {
const Setting = ({
siteList,
setDisables,
disables,
multipleNavi,
setMultipleNavi,
hiddenError,
setHiddenError,
}: Props) => {
const [showSetting, setShowSetting] = useState(true);
const hanleListChange = (item: SiteItem, isHidden: boolean) => {
@@ -27,6 +37,10 @@ const Setting = ({ siteList, setDisables, disables, multipleNavi, setMultipleNav
GM_setValue("multipleNavi", checked);
};
const handlehiddenErrorChange = (checked: boolean) => {
setHiddenError(checked);
GM_setValue("hiddenError", checked);
};
return (
<>
{!showSetting && (
@@ -58,7 +72,11 @@ const Setting = ({ siteList, setDisables, disables, multipleNavi, setMultipleNav
tip="一个站点内出现多条匹配结果时,打开后跳转搜索结果页"
onChange={handleNaviChange}
/>
{/* <Checkbox label="简洁模式" value={true} onChange={() => {}} /> */}
<Checkbox
label="隐藏失败结果"
value={hiddenError}
onChange={handlehiddenErrorChange}
/>
</Group>
</div>

View File

@@ -1,53 +1,42 @@
import { fetcher } from "@/utils/xhr";
import { fetcher, FetchResult } from "@/utils/xhr";
import { SiteItem } from "@/utils/siteList";
import { memo, useEffect, useState } from "preact/compat";
import { useEffect, useState } from "preact/compat";
interface Status {
isSuccess: "pedding" | "rejected" | "fulfilled";
resultLink?: string;
tag?: string;
}
type Props = {
siteItem: SiteItem;
CODE: string;
multipleNavi?: boolean;
hiddenError?: boolean;
};
const SiteBtn = memo(({ siteItem, CODE, multipleNavi }: Props) => {
const SiteBtn = ({ siteItem, CODE, multipleNavi, hiddenError }: Props) => {
const { name, codeFormater } = siteItem;
/** 格式化 CODE */
const formatCode = codeFormater ? codeFormater(CODE) : CODE;
const link = siteItem.url.replace("{{code}}", formatCode);
const [status, setStatus] = useState<Status>({
isSuccess: "pedding",
tag: "",
resultLink: "",
});
const { isSuccess, tag, resultLink } = status;
const [loading, setLoading] = useState(false);
const [fetchRes, setFetchRes] = useState<FetchResult>();
useEffect(() => {
setLoading(true);
fetcher({ siteItem, targetLink: link, CODE: formatCode }).then((res) => {
const resultLink = multipleNavi && res.multipleRes ? res.multipResLink : res.targetLink;
setStatus({
isSuccess: res.isSuccess ? "fulfilled" : "rejected",
tag: multipleNavi && res.multipleRes ? "多结果" : res.tag,
resultLink,
});
setFetchRes(res);
setLoading(false);
});
}, [fetcher, siteItem, CODE, link, multipleNavi]);
}, [fetcher, siteItem, CODE, link]);
const colorClass =
isSuccess === "pedding"
? " "
: isSuccess === "fulfilled"
? "jop-button_green "
: "jop-button_red ";
const tag = multipleNavi && fetchRes?.multipleRes ? "多结果" : fetchRes?.tag;
const resultLink = fetchRes?.multipleRes ? fetchRes.multipResLink : fetchRes?.targetLink;
const colorClass = fetchRes?.isSuccess ? "jop-button_green " : "jop-button_red ";
if (hiddenError && !fetchRes?.isSuccess) {
return <></>;
}
return (
<a
className={"jop-button " + colorClass}
className={"jop-button " + (loading ? " " : colorClass)}
target="_blank"
href={resultLink === "" ? link : resultLink}
>
@@ -58,6 +47,6 @@ const SiteBtn = memo(({ siteItem, CODE, multipleNavi }: Props) => {
<span>{name}</span>
</a>
);
});
};
export default SiteBtn;

View File

@@ -32,10 +32,7 @@ interface SiteItemBase {
/** [废弃] 用户定义的 disable */
// disable: boolean;
/** 在指定 LibItem.name 下不显示
* 点名:都是针对的 matchList 里的三个,防止出现自己检索自己站。
*/
disableLibItemName?: string;
/** 在指定 LibItem.name 下不显示 */
hostname: string;
url: string;
@@ -277,7 +274,6 @@ export const siteList: SiteItem[] = [
},
{
name: "JavBus",
disableLibItemName: "javbus",
hostname: "javbus.com",
url: "https://javbus.com/{{code}}",
fetchType: "get",
@@ -286,7 +282,6 @@ export const siteList: SiteItem[] = [
},
{
name: "JavDB",
disableLibItemName: "javdb",
hostname: "javdb.com",
url: "https://javdb.com/search?q={{code}}",
fetchType: "parser",
@@ -297,7 +292,6 @@ export const siteList: SiteItem[] = [
},
{
name: "JAVLib",
disableLibItemName: "javlib",
hostname: "javlibrary.com",
url: "https://www.javlibrary.com/cn/vl_searchbyid.php?keyword={{code}}",
fetchType: "parser",