diff --git a/package.json b/package.json index 5581108..fd2c20c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "neural", - "version": "1.4.0", + "version": "1.4.1", "private": true, "main": "public/electron.js", "homepage": "./", diff --git a/src/components/tag-detail.tsx b/src/components/tag-detail.tsx index 028bda2..7539011 100644 --- a/src/components/tag-detail.tsx +++ b/src/components/tag-detail.tsx @@ -18,7 +18,7 @@ import { FrownOutlined, } from "@ant-design/icons"; import neuralDB, { Tag, TagStatus } from "../utils/database"; -import { shake } from "../utils/window"; +import { CatchWrapper } from "../decorators/catch"; import "./tag-detail.scss"; const { Countdown } = Statistic; @@ -56,37 +56,27 @@ const TagDetail: FC = (tagDetailProps: ITagDetailProps) => { setWikiUrl(e.target.value); }; - const handleAddWiki = () => { - try { - let _wikiUrl = wikiUrl.trim(); - if (!_wikiUrl) return; - wikis.push(_wikiUrl); + const handleAddWiki = CatchWrapper(() => { + let _wikiUrl = wikiUrl.trim(); + if (!_wikiUrl) return; + wikis.push(_wikiUrl); - let tag: Tag = Object.assign({}, selectedTag, { - wikis, - }); - neuralDB.upsert_tag(tag); - onUpdate(tag); - setWikiUrl(""); - } catch (e) { - shake(); - console.log(e); - } - }; + let tag: Tag = Object.assign({}, selectedTag, { + wikis, + }); + neuralDB.upsert_tag(tag); + onUpdate(tag); + setWikiUrl(""); + }); - const handleDeleteWiki = (wiki: string, idx: number) => { - try { - wikis.splice(idx, 1); - let tag: Tag = Object.assign({}, selectedTag, { - wikis, - }); - neuralDB.upsert_tag(tag); - onUpdate(tag); - } catch (e) { - shake(); - console.log(e); - } - }; + const handleDeleteWiki = CatchWrapper((wiki: string, idx: number) => { + wikis.splice(idx, 1); + let tag: Tag = Object.assign({}, selectedTag, { + wikis, + }); + neuralDB.upsert_tag(tag); + onUpdate(tag); + }); const handleCopyWiki = (wiki: string) => { window.clipboard.writeText(wiki); @@ -132,51 +122,36 @@ const TagDetail: FC = (tagDetailProps: ITagDetailProps) => { setDescriptions(e.target.value); }; - const handleConfirmEdit = () => { - try { - let tag: Tag = Object.assign({}, selectedTag, { - descriptions: descriptions.trim(), - }); - neuralDB.upsert_tag(tag); - onUpdate(tag); - setIsEditing(false); - } catch (e) { - shake(); - console.log(e); - } - }; + const handleConfirmEdit = CatchWrapper(() => { + let tag: Tag = Object.assign({}, selectedTag, { + descriptions: descriptions.trim(), + }); + neuralDB.upsert_tag(tag); + onUpdate(tag); + setIsEditing(false); + }); const handleCancelEdit = () => { setDescriptions(selectedTag.descriptions || ""); setIsEditing(false); }; - const handleDone = () => { - try { - let tag: Tag = Object.assign({}, selectedTag, { - status: TagStatus.DONE, - }); - neuralDB.upsert_tag(tag); - onUpdate(tag); - } catch (e) { - shake(); - console.log(e); - } - }; - - const handleDelay = (val: number) => { - try { - let tag: Tag = Object.assign({}, selectedTag, { - expires: Date.now() + val * 24 * 3600000, - status: TagStatus.PENDING, - }); - neuralDB.upsert_tag(tag); - onUpdate(tag); - } catch (e) { - shake(); - console.log(e); - } - }; + const handleDone = CatchWrapper(() => { + let tag: Tag = Object.assign({}, selectedTag, { + status: TagStatus.DONE, + }); + neuralDB.upsert_tag(tag); + onUpdate(tag); + }); + + const handleDelay = CatchWrapper((val: number) => { + let tag: Tag = Object.assign({}, selectedTag, { + expires: Date.now() + val * 24 * 3600000, + status: TagStatus.PENDING, + }); + neuralDB.upsert_tag(tag); + onUpdate(tag); + }); const descriptionsRow = (
@@ -240,16 +215,11 @@ const TagDetail: FC = (tagDetailProps: ITagDetailProps) => { * Tag Detail ************************************************************************************************/ - const handleDeleteTag = async () => { - try { - let id = selectedTag.id; - await neuralDB.delete_tag_by_id(id!); - onDelete(); - } catch (e) { - shake(); - console.log(e); - } - }; + const handleDeleteTag = CatchWrapper(async () => { + let id = selectedTag.id; + await neuralDB.delete_tag_by_id(id!); + onDelete(); + }); return (
diff --git a/src/decorators/catch.ts b/src/decorators/catch.ts index 52654d9..cb3ba18 100644 --- a/src/decorators/catch.ts +++ b/src/decorators/catch.ts @@ -1,5 +1,15 @@ +import { shake } from "../utils/window"; + type HandlerFunction = (error: any, ctx: any) => void; +const defaultHandler: HandlerFunction = (e) => { + shake(); + console.log(e); +}; + +// ================================================================================================================ +// 装饰器 +// ================================================================================================================ function handleError(ctx: any, errorClass: any, handler: HandlerFunction, error: any) { if (typeof handler === "function" && error instanceof errorClass) { handler.call(null, error, ctx); @@ -8,7 +18,7 @@ function handleError(ctx: any, errorClass: any, handler: HandlerFunction, error: } } -export default (errorClass: any, handler: HandlerFunction): any => { +export const Catch = (errorClass: any, handler: HandlerFunction): any => { return (target: any, propertyKey: string, descriptor: PropertyDescriptor) => { const originalMethod = descriptor.value; @@ -31,3 +41,16 @@ export default (errorClass: any, handler: HandlerFunction): any => { return descriptor; }; }; + +// ================================================================================================================ +// 非装饰器 +// ================================================================================================================ +export const CatchWrapper = (callback: (...args: any[]) => any, errorHandler: HandlerFunction = defaultHandler) => { + return async (...args: Parameters) => { + try { + await callback(...args); + } catch (e) { + errorHandler(e, null); + } + }; +}; diff --git a/src/index.tsx b/src/index.tsx index 8354ade..364c2da 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -4,11 +4,13 @@ import SmartInput from "./components/smart-input"; import TagList from "./components/tag-list"; import TagDetail from "./components/tag-detail"; import neuralDB, { Tag } from "./utils/database"; -import { SizeType, resizeTo, shake } from "./utils/window"; +import { SizeType, resizeTo } from "./utils/window"; import Event from "./utils/event"; import Timer from "./utils/timer"; import useThrottle from "./hooks/use-throttle"; +import { CatchWrapper } from "./decorators/catch"; import { Symb } from "./const/base"; + import "./index.scss"; const Pattern = { @@ -24,33 +26,23 @@ const App: FC = () => { let [selectedTag, setSelectedTag] = useState(null); let [tagList, setTaglist] = useState>([]); - const onConfirmInput = async (input: string) => { + const onConfirmInput = CatchWrapper(async (input: string) => { input = input.trim(); switch (true) { case Pattern.isCreateCommand(input): let name = input.slice(1).trim(); if (!name) return; - try { - await neuralDB.upsert_tag({ name }); - setInputVal(name); - } catch (e) { - shake(); - console.log(e); - } + await neuralDB.upsert_tag({ name }); + setInputVal(name); return; case Pattern.isSymbolCommand(input): let symbol = input.slice(1).trim().toUpperCase(); switch (symbol) { case Symb.ALL: - try { - let result: any = await neuralDB.query_tag_by_paging(1, 10000); - let list = result.list; - setTaglist(list); - setSelectedTag(list[0] || null); - } catch (e) { - shake(); - console.log(e); - } + let result: any = await neuralDB.query_tag_by_paging(1, 10000); + let list = result.list; + setTaglist(list); + setSelectedTag(list[0] || null); return; default: return; @@ -58,7 +50,7 @@ const App: FC = () => { default: return; } - }; + }); const onChangeInput = useThrottle((input: string) => { input = input.trim(); @@ -68,16 +60,11 @@ const App: FC = () => { setSelectedTag(null); return; case Pattern.isSearchCommand(input): - try { - (async () => { - let result: any = await neuralDB.match_tag_by_name(input); - setTaglist(result); - setSelectedTag(result[0] || null); - })(); - } catch (e) { - shake(); - console.log(e); - } + CatchWrapper(async () => { + let result: any = await neuralDB.match_tag_by_name(input); + setTaglist(result); + setSelectedTag(result[0] || null); + })(); return; default: return;