Files
accountbook/frontend/.next/cache/webpack/server-production/5.pack
T

7010 lines
413 KiB
Plaintext
Raw Normal View History

2026-03-12 11:24:10 +08:00
wpc,t§webpack/lib/cache/PackFileCacheStrategyPackContentItems {ResolverCachePlugin|normal|default|alias=[|server-only$=|next/dist/compiled/server-only/index|client-only$=|next/dist/compiled/client-only/index|next/dist/compiled/client-only$=|next/dist/compiled/client-only/index|next/dist/compiled/server-only=|next/dist/compiled/server-only/index|]|dependencyType=|esm|path=|/opt/accountbook/frontend|request=|private-next-pages/categories.jsÀCompilation/modules|/opt/accountbook/frontend/node_modules/next/dist/build/webpack/loaders/next-swc-loader.js??ruleSet[1].rules[6].oneOf[3].use[0]!/opt/accountbook/frontend/pages/categories.jsÈFlagDependencyExportsPlugin|/opt/accountbook/frontend/node_modules/next/dist/build/webpack/loaders/next-swc-loader.js??ruleSet[1].rules[6].oneOf[3].use[0]!/opt/accountbook/frontend/pages/categories.jsCompilation/codeGeneration|/opt/accountbook/frontend/node_modules/next/dist/build/webpack/loaders/next-route-loader/index.js?kind=PAGES&page=%2Fcategories&preferredRegion=&absolutePagePath=private-next-pages%2Fcategories.js&absoluteAppPath=private-next-pages%2F_app.js&absoluteDocumentPath=next%2Fdist%2Fpages%2F_document&middlewareConfigBase64=e30%3D!|fcccd479db02094d|webpack-runtimeCompilation/assets|chunk161ªTerserWebpackPlugin|../pages/categories.js¥webpack/lib/cache/ResolverCachePlugin`_ResolverCachePluginCacheMiss‡context„path‡request…queryˆfragment†module‰directory„fileˆinternalŽfullySpecified“descriptionFilePath“descriptionFileData“descriptionFileRootŒrelativePath †issuerissuerLayerˆcompiler†server­/opt/accountbook/frontend/pages/categories.js€€ ¦/opt/accountbook/frontend/package.json„name‡version‡private‡scriptsŒdependencies”accountbook-frontend…1.0.0 ƒdev…build…startnext dev -p 3500Šnext buildnext start -p 3500ˆchart.js„next…react‰react-dom†^4.5.1‡^14.0.0‡^18.2.0ÿ™/opt/accountbook/frontend•./pages/categories.jsšwebpack/lib/FileSystemInfoˆSnapshot@‰ €•_ÃÍyBáâŸ/opt/accountbook/frontend/pagesü„/opt/opt/accountbook/ˆsafeTime‰timestamp„hash!à<^ÃÍyBÐ<^ÃÍyBd22930d1a5f1da1cý!@07ØÊyB /7ØÊyBf3b4def2c53d3cadûÇúÆùÅøÄ÷Ã`
Å/opt/accountbook/frontend/opt/accountbook/frontend/pages/package.json¿/opt/accountbook/frontend/opt/accountbook/frontend/package.json¶/opt/accountbook/frontend/opt/accountbook/package.jsonª/opt/accountbook/frontend/opt/package.jsonÆ/opt/accountbook/frontend/opt/accountbook/frontend/pages/categories.jsÉ/opt/accountbook/frontend/opt/accountbook/frontend/pages/categories.js.jsÊ/opt/accountbook/frontend/opt/accountbook/frontend/pages/categories.js.mjsÊ/opt/accountbook/frontend/opt/accountbook/frontend/pages/categories.js.tsxÉ/opt/accountbook/frontend/opt/accountbook/frontend/pages/categories.js.tsÊ/opt/accountbook/frontend/opt/accountbook/frontend/pages/categories.js.jsxË/opt/accountbook/frontend/opt/accountbook/frontend/pages/categories.js.jsonË/opt/accountbook/frontend/opt/accountbook/frontend/pages/categories.js.wasm¬/opt/accountbook/frontend/pages/package.json˜webpack/lib/NormalModule«webpack/lib/util/registerExternalSerializer™webpack-sources/RawSource€Limport { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
import { useState, useEffect } from "react";
import { useRouter } from "next/router";
import { isLoggedIn, getCategories, createCategory, deleteCategory } from "../lib/api";
import AppShell from "../components/AppShell";
import { Icon } from "../components/icons";
import { useToast } from "../components/ToastProvider";
import { useConfirm } from "../components/ConfirmProvider";
const ICONS = [
"\uD83C\uDF5C",
"\uD83E\uDD58",
"\uD83E\uDD6C",
"\uD83E\uDD69",
"\uD83C\uDF54",
"\uD83C\uDF55",
"☕",
"\uD83C\uDF7A",
"\uD83E\uDDCB",
"\uD83C\uDF4E",
"\uD83C\uDF6A",
"\uD83C\uDF6B",
"\uD83D\uDE97",
"\uD83D\uDE95",
"\uD83D\uDE8C",
"\uD83D\uDE87",
"⛽",
"\uD83D\uDE99",
"\uD83D\uDEF5",
"✈ï¸",
"\uD83D\uDEA2",
"\uD83D\uDED2",
"\uD83D\uDC54",
"\uD83D\uDC55",
"\uD83D\uDC56",
"\uD83D\uDC5F",
"\uD83D\uDC53",
"\uD83E\uDDE2",
"\uD83D\uDC5C",
"\uD83C\uDF92",
"\uD83D\uDC8D",
"\uD83D\uDC84",
"\uD83C\uDFE0",
"\uD83C\uDFE2",
"\uD83C\uDFE6",
"\uD83C\uDFE5",
"\uD83C\uDFE8",
"\uD83C\uDFE9",
"\uD83D\uDD27",
"\uD83D\uDD28",
"\uD83D\uDECBï¸",
"\uD83D\uDCFA",
"\uD83D\uDCBB",
"\uD83D\uDCF1",
"\uD83D\uDCDD",
"\uD83D\uDCB0",
"\uD83C\uDF81",
"\uD83D\uDCC8",
"\uD83E\uDDE7",
"\uD83D\uDCB3",
"\uD83C\uDFAF",
"\uD83D\uDCDA",
"\uD83C\uDFB5",
"\uD83C\uDFAE",
"\uD83C\uDFC3",
"âš½",
"\uD83C\uDFCA",
"\uD83D\uDEB4",
"\uD83C\uDFAD",
"\uD83C\uDFA8",
"\uD83C\uDFAC",
"\uD83D\uDCF7",
"\uD83C\uDFA5",
"\uD83D\uDCFA",
"\uD83E\uDDF8",
"\uD83D\uDC15",
"\uD83D\uDC08",
"\uD83C\uDF38",
"\uD83C\uDF3A"
];
export default function Categories() {
const router = useRouter();
const { showToast } = useToast();
const { confirm } = useConfirm();
const [categories, setCategories] = useState({
expense: [],
income: []
});
const [modalOpen, setModalOpen] = useState(false);
const [categoryType, setCategoryType] = useState("expense");
const [loading, setLoading] = useState(true);
const [submitting, setSubmitting] = useState(false);
const [formError, setFormError] = useState("");
const [formData, setFormData] = useState({
name: "",
icon: "\uD83D\uDCDD"
});
null;
const loadCategories = async ()=>{
setLoading(true);
try {
const data = await getCategories();
setCategories(data);
} catch (err) {
console.error(err);
showToast(err.message, {
tone: "error"
});
} finally{
setLoading(false);
}
};
const openAddModal = (type)=>{
setCategoryType(type);
setFormData({
name: "",
icon: "\uD83D\uDCDD"
});
setFormError("");
setModalOpen(true);
};
const closeModal = ()=>{
if (submitting) return;
setModalOpen(false);
setFormError("");
};
const handleSubmit = async (e)=>{
e.preventDefault();
if (!formData.name || !formData.icon) {
setFormError("请填写完整信æ¯");
return;
}
setSubmitting(true);
setFormError("");
try {
await createCategory({
type: categoryType,
name: formData.name,
icon: formData.icon
});
closeModal();
showToast("分类已创建", {
tone: "success"
});
await loadCategories();
} catch (err) {
setFormError(err.message);
showToast(err.message, {
tone: "error"
});
} finally{
setSubmitting(false);
}
};
const handleDelete = async (id)=>{
const shouldDelete = await confirm({
title: "删除此分类?",
description: "默认分类ä¸å¯åˆ é™¤ï¼Œè‡ªå®šä¹‰åˆ†ç±»åˆ é™¤åŽå°†æ— æ³•æ¢å¤ã€‚",
confirmText: "删除"
});
if (!shouldDelete) return;
try {
await deleteCategory(id);
showToast("分类已删除", {
tone: "success"
});
await loadCategories();
} catch (err) {
showToast(err.message, {
tone: "error"
});
}
};
const actions = /*#__PURE__*/ _jsx("button", {
type: "button",
className: "icon-button",
"aria-label": "设置",
onClick: ()=>router.push("/settings"),
children: /*#__PURE__*/ _jsx(Icon, {
name: "settings",
size: 18
})
});
return /*#__PURE__*/ _jsxs(AppShell, {
title: "分类",
subtitle: "æ•´ç†å¸¸ç”¨åˆ†ç±»ä¸Žå›¾æ ‡",
actions: actions,
compactHeader: true,
children: [
loading ? /*#__PURE__*/ _jsx("div", {
className: "card loading-state",
children: "加载中..."
}) : /*#__PURE__*/ _jsxs(_Fragment, {
children: [
/*#__PURE__*/ _jsxs("section", {
className: "card category-section category-section--refresh",
children: [
/*#__PURE__*/ _jsxs("div", {
className: "section-header",
children: [
/*#__PURE__*/ _jsxs("div", {
children: [
/*#__PURE__*/ _jsx("p", {
className: "eyebrow",
children: "支出分类"
}),
/*#__PURE__*/ _jsx("h2", {
children: "支出"
})
]
}),
/*#__PURE__*/ _jsx("button", {
type: "button",
className: "btn btn-secondary btn-inline",
onClick: ()=>openAddModal("expense"),
children: /*#__PURE__*/ _jsxs("span", {
className: "button-content",
children: [
/*#__PURE__*/ _jsx(Icon, {
name: "plus",
size: 16
}),
"添加"
]
})
})
]
}),
/*#__PURE__*/ _jsx("div", {
className: "category-list category-list--chips",
children: categories.expense.map((cat)=>/*#__PURE__*/ _jsxs("div", {
className: "category-tag",
children: [
/*#__PURE__*/ _jsx("span", {
className: "cat-icon",
children: cat.icon
}),
/*#__PURE__*/ _jsx("span", {
className: "cat-name",
children: cat.name
}),
!cat.is_default && /*#__PURE__*/ _jsx("button", {
type: "button",
className: "icon-button icon-button--ghost cat-delete",
"aria-label": `删除${cat.name}`,
onClick: ()=>handleDelete(cat.id),
children: /*#__PURE__*/ _jsx(Icon, {
name: "close",
size: 14
})
})
]
}, cat.id || cat.name))
})
]
}),
/*#__PURE__*/ _jsxs("section", {
className: "card category-section category-section--refresh",
children: [
/*#__PURE__*/ _jsxs("div", {
className: "section-header",
children: [
/*#__PURE__*/ _jsxs("div", {
children: [
/*#__PURE__*/ _jsx("p", {
className: "eyebrow",
children: "收入分类"
}),
/*#__PURE__*/ _jsx("h2", {
children: "æ”¶å…¥"
})
]
}),
/*#__PURE__*/ _jsx("button", {
type: "button",
className: "btn btn-secondary btn-inline",
onClick: ()=>openAddModal("income"),
children: /*#__PURE__*/ _jsxs("span", {
className: "button-content",
children: [
/*#__PURE__*/ _jsx(Icon, {
name: "plus",
size: 16
}),
"添加"
]
})
})
]
}),
/*#__PURE__*/ _jsx("div", {
className: "category-list category-list--chips",
children: categories.income.map((cat)=>/*#__PURE__*/ _jsxs("div", {
className: "category-tag",
children: [
/*#__PURE__*/ _jsx("span", {
className: "cat-icon",
children: cat.icon
}),
/*#__PURE__*/ _jsx("span", {
className: "cat-name",
children: cat.name
}),
!cat.is_default && /*#__PURE__*/ _jsx("button", {
type: "button",
className: "icon-button icon-button--ghost cat-delete",
"aria-label": `删除${cat.name}`,
onClick: ()=>handleDelete(cat.id),
children: /*#__PURE__*/ _jsx(Icon, {
name: "close",
size: 14
})
})
]
}, cat.id || cat.name))
})
]
}),
/*#__PURE__*/ _jsx("div", {
className: "card category-tip category-tip--refresh",
children: /*#__PURE__*/ _jsx("p", {
children: "默认分类无法删除,自定义分类å¯ä»¥åˆ é™¤ã€‚"
})
})
]
}),
modalOpen && /*#__PURE__*/ _jsx("div", {
className: "modal-overlay",
onClick: closeModal,
children: /*#__PURE__*/ _jsxs("div", {
className: "modal",
onClick: (e)=>e.stopPropagation(),
children: [
/*#__PURE__*/ _jsxs("div", {
className: "modal-header",
children: [
/*#__PURE__*/ _jsxs("div", {
children: [
/*#__PURE__*/ _jsx("p", {
className: "eyebrow",
children: "新增分类"
}),
/*#__PURE__*/ _jsx("h2", {
children: categoryType === "expense" ? "新建支出分类" : "新建收入分类"
})
]
}),
/*#__PURE__*/ _jsx("button", {
type: "button",
className: "icon-button icon-button--ghost",
"aria-label": "关闭弹窗",
onClick: closeModal,
children: /*#__PURE__*/ _jsx(Icon, {
name: "close",
size: 18
})
})
]
}),
formError && /*#__PURE__*/ _jsx("div", {
className: "error-msg",
children: formError
}),
/*#__PURE__*/ _jsxs("form", {
onSubmit: handleSubmit,
children: [
/*#__PURE__*/ _jsxs("div", {
className: "form-group",
children: [
/*#__PURE__*/ _jsx("label", {
htmlFor: "category-name",
children: "分类åç§°"
}),
/*#__PURE__*/ _jsx("input", {
id: "category-name",
type: "text",
value: formData.name,
onChange: (e)=>setFormData({
...formData,
name: e.target.value
}),
placeholder: "请输入分类åç§°",
required: true,
disabled: submitting
})
]
}),
/*#__PURE__*/ _jsxs("div", {
className: "form-group",
children: [
/*#__PURE__*/ _jsx("label", {
children: "选择图标"
}),
/*#__PURE__*/ _jsx("div", {
className: "icon-grid",
style: {
display: "grid",
gridTemplateColumns: "repeat(8, minmax(0, 1fr))",
gap: "8px"
},
children: ICONS.map((icon)=>/*#__PURE__*/ _jsx("button", {
type: "button",
className: `icon-btn ${formData.icon === icon ? "active" : ""}`,
onClick: ()=>setFormData({
...formData,
icon
}),
disabled: submitting,
children: icon
}, icon))
})
]
}),
/*#__PURE__*/ _jsx("div", {
className: "modal-actions",
children: /*#__PURE__*/ _jsx("button", {
type: "submit",
className: "btn btn-primary",
disabled: submitting,
children: submitting ? /*#__PURE__*/ _jsxs("span", {
className: "button-content",
children: [
/*#__PURE__*/ _jsx(Icon, {
name: "spinner",
size: 16,
className: "is-spinning"
}),
"ä¿å­˜ä¸­..."
]
}) : "ä¿å­˜"
})
})
]
})
]
})
})
]
});
}
exportsTypeŽsideEffectFree‰namespace 
javascript/auto…aliasªŒserver-only$Œclient-only$Ÿnext/dist/compiled/client-only$žnext/dist/compiled/server-only¤next/dist/compiled/server-only/index¤next/dist/compiled/client-only/indexÿþ

ò`‰cacheable†parsedfileDependencies“contextDependencies“missingDependenciesbuildDependenciesvalueDependenciesɆassetsŠassetsInfo†strictexportsArgument”topLevelDeclarationsˆsnapshot ˜webpack/lib/util/LazySetÙ/opt/accountbook/frontend/node_modules/next/dist/build/webpack/loaders/next-swc-loader.js™webpack/DefinePlugin_hashˆ3b076c43f817d2b9141090b3 “__webpack_exports__…ICONS‰*default*ŠCategories àˆ_ÃÍyB º
·webpack/lib/dependencies/HarmonyCompatibilityDependency
dÿÿý¨webpack/lib/dependencies/ConstDependency`V
`V`W@ƒ
`,A„¬
`(A­
`WA3
`.A4_
`+A`
`7A˜Ó
`;¶webpack/lib/dependencies/HarmonyExportHeaderDependency A/UK A UK
aP `Xºwebpack/lib/dependencies/HarmonyImportSideEffectDependencyreact/jsx-runtimeÿ
`V
`,next/routerÿ
`(Š../lib/apiÿ
`W../components/AppShellÿ
`.“../components/iconsÿ
`+../components/ToastProviderÿ
`7../components/ConfirmProviderÿ
`;±webpack/lib/dependencies/PureExpressionDependencya ‡default
aO¹webpack/lib/dependencies/HarmonyExportSpecifierDependencyý
aP¹webpack/lib/dependencies/HarmonyImportSpecifierDependencya
‰useRouterþ
AZc
 øêêý
cQQ
ˆuseToastþ
A
 úííþ
cRR"
ŠuseConfirmþ
¯
 õêêþ
cSS"
ˆuseStateþ
ã
 ðgÿÿÿgÿÿÿþ
cT(T0
ûú
A<D
 ìcÿÿÿcÿÿÿþ
cX&X.
÷ö
Ay
 è_ÿÿÿ_ÿÿÿþ
cY,Y4
óò
¸
 ä[ÿÿÿ[ÿÿÿþ
cZ"Z*
ïî
ð
 àWÿÿÿWÿÿÿþ
c[([0
ëê
A ' 
 ÜSÿÿÿSÿÿÿþ
c\&\.
çæ
AQ Y 
 ØOÿÿÿOÿÿÿþ
c]$],
getCategoriesþ
A


 ÓÀÀþ
cee,
ŽcreateCategoryþ
Aj
x

 λ»þ
@‡`@‡` 
ŽdeleteCategoryþ
Aq
 Éþ
`` 
ƒjsx„_jsx
A˜œ
4ë«þ
@­`"@­`&ûü
ANR
4À¨¨þ
` @²`$
„Iconþ
ASW
4»¬¬þ
`%@²`)
„jsxs…_jsxs
¿
 µþ
``
¬ˆAppShell
È
4°ŸŸþ
``'èé
Aos
4­þ
`$@½`(
òó
õ
 ©þ
``$
ˆFragment‰_Fragment
ÿ
4£þ
`%@À`.
èé
AAF
 Ÿþ
`"@Â`'
äå
ý
 ƒƒþ
`*@Å`/
àá
§
 ÿÿÿÿÿÿþ
`2@È`7ÏÐ
A#
4|ÿÿÿ|ÿÿÿþ
`:@Ê`>ÌÍ
A 
4yÿÿÿyÿÿÿþ
`:@Î`>ÉÊ
A
4Žvÿÿÿvÿÿÿþ
`2@Ó`6
ÓÔ
AEJ
 Šrÿÿÿrÿÿÿþ
@×`@@×`EÂÃ
A
4oÿÿÿoÿÿÿþ
`>@Ú`BÈÇ
A
4uÿÿÿuÿÿÿþ
`C@Ú`G¼½
ù
4iÿÿÿiÿÿÿþ
`*@ä`.
ÆÇ
¯
 }ÿÿÿeÿÿÿeÿÿÿþ
`V@æ`[µ
Ajn
4zÿÿÿbÿÿÿbÿÿÿþ
`:@é`>²³
Amq
4wÿÿÿ_ÿÿÿ_ÿÿÿþ
`:@í`>¯°

4tÿÿÿ\ÿÿÿ\ÿÿÿþ
`M@ñ`Q¬­
A&!*!
4qÿÿÿYÿÿÿYÿÿÿþ
`H@ö`L²±
A+!/!
4nÿÿÿ_ÿÿÿ_ÿÿÿþ
`M@ö`Q
³´
Aî"ó"
 jÿÿÿRÿÿÿRÿÿÿþ
@`"@`'
¯°
A¥#ª#
 fÿÿÿNÿÿÿNÿÿÿþ
@`*@`/
«¬
AO$T$
 bÿÿÿJÿÿÿJÿÿÿþ
@`2@`7š
AÌ$Ð$
4_ÿÿÿGÿÿÿGÿÿÿþ
@`:@`>˜
AÉ%Í%
4\ÿÿÿDÿÿÿDÿÿÿþ
@ `:@ `>
AÈ&Ì&
4YÿÿÿAÿÿÿAÿÿÿþ
@`2@`6
žŸ
Añ'ö'
 Uÿÿÿ=ÿÿÿ=ÿÿÿþ
@`@@`EŽ
AÀ(Ä(
4Rÿÿÿ:ÿÿÿ:ÿÿÿþ
@`>@`B
AÅ(É(
4Oÿÿÿ@ÿÿÿ@ÿÿÿþ
@`C@`Gˆ
A¡*¥*
4Lÿÿÿ4ÿÿÿ4ÿÿÿþ
@"`*@"`.

AU+Z+
 Hÿÿÿ0ÿÿÿ0ÿÿÿþ
@$`U@$`Z
A,,
4Eÿÿÿ-ÿÿÿ-ÿÿÿþ
@'`:@'`>}ÿÿÿ~ÿÿÿ
A--
4Bÿÿÿ*ÿÿÿ*ÿÿÿþ
@+`:@+`>zÿÿÿ{ÿÿÿ
A..2.
4?ÿÿÿ'ÿÿÿ'ÿÿÿþ
@/`M@/`Qwÿÿÿxÿÿÿ
AÑ/Õ/
4<ÿÿÿ$ÿÿÿ$ÿÿÿþ
@4`H@4`L}ÿÿÿ|ÿÿÿ
AÖ/Ú/
49ÿÿÿ*ÿÿÿ*ÿÿÿþ
@4`M@4`Qqÿÿÿrÿÿÿ
A™11
46ÿÿÿÿÿÿÿÿÿþ
@>`"@>`&nÿÿÿoÿÿÿ
A%2)2
43ÿÿÿÿÿÿÿÿÿþ
@@`0@@`4kÿÿÿlÿÿÿ
Aè2ì2
40ÿÿÿÿÿÿÿÿÿþ
@F`'@F`+
uÿÿÿvÿÿÿ
Ao3t3
 ,ÿÿÿÿÿÿÿÿÿþ
@I`(@I`-
qÿÿÿrÿÿÿ
A#4(4
 (ÿÿÿÿÿÿÿÿÿþ
@M`&@M`+
mÿÿÿnÿÿÿ
A¿4Ä4
 $ÿÿÿ ÿÿÿ ÿÿÿþ
@P`.@P`3\ÿÿÿ]ÿÿÿ
A4585
4!ÿÿÿ ÿÿÿ ÿÿÿþ
@R`6@R`:YÿÿÿZÿÿÿ
A!6%6
4ÿÿÿÿÿÿÿÿÿþ
@V`6@V`:VÿÿÿWÿÿÿ
A87<7
4ÿÿÿÿÿÿÿÿÿþ
@[`.@[`2SÿÿÿTÿÿÿ
A}88
4ÿÿÿÿÿÿÿÿÿþ
@``<@``@YÿÿÿXÿÿÿ
A8†8
4ÿÿÿÿÿÿÿÿÿþ
@``A@``EMÿÿÿNÿÿÿ
A©9­9
4ÿÿÿúþÿÿúþÿÿþ
@g`3@g`7
WÿÿÿXÿÿÿ
A]:b:
 ÿÿÿöþÿÿöþÿÿþ
@k`&@k`+
SÿÿÿTÿÿÿ
A÷:ü:
 
ÿÿÿòþÿÿòþÿÿþ
@n`.@n`3BÿÿÿCÿÿÿ
A©;­;
4ÿÿÿïþÿÿïþÿÿþ
@q`6@q`:?ÿÿÿ@ÿÿÿ
Až<¢<
4ÿÿÿìþÿÿìþÿÿþ
@u`6@u`:
IÿÿÿJÿÿÿ
AÖ?Û?
 ÿÿÿèþÿÿèþÿÿþ
`.@ƒ`38ÿÿÿ9ÿÿÿ
Aˆ@Œ@
4ýþÿÿåþÿÿåþÿÿþ
@†`6@†`:5ÿÿÿ6ÿÿÿ
A7A;A
4úþÿÿâþÿÿâþÿÿþ
@‰`6@‰`:2ÿÿÿ3ÿÿÿ
A!C%C
4÷þÿÿßþÿÿßþÿÿþ
@`V@`Z/ÿÿÿ0ÿÿÿ
AjFnF
4ôþÿÿÜþÿÿÜþÿÿþ
@`.@`2,ÿÿÿ-ÿÿÿ
AôFøF
4ñþÿÿÙþÿÿÙþÿÿþ
`<@Ÿ`@
6ÿÿÿ7ÿÿÿ
AHH
 íþÿÿÕþÿÿÕþÿÿþ
`M@£`R%ÿÿÿ&ÿÿÿ
AÝHáH
4êþÿÿÒþÿÿÒþÿÿþ
`>@¦`B+ÿÿÿ*ÿÿÿ
AâHæH
4çþÿÿØþÿÿØþÿÿþ
`C@¦`G
—webpack/lib/ModuleGraph“RestoreProvidedDataHþÿÿˆprovidedcanMangleProvideterminalBindingexportsInfoÖþÿÿ
‡sources„data“runtimeRequirementsŠjavascript«webpack/lib/util/registerExternalSerializerœwebpack-sources/CachedSource h[«webpack/lib/util/registerExternalSerializerœwebpack-sources/ConcatSource«webpack/lib/util/registerExternalSerializer™webpack-sources/RawSource
// ESM COMPAT FLAG
__webpack_require__.r(__webpack_exports__);
// EXPORTS
__webpack_require__.d(__webpack_exports__, {
config: () => (/* binding */ config),
"default": () => (/* binding */ next_route_loaderkind_PAGES_page_2Fcategories_preferredRegion_absolutePagePath_private_next_pages_2Fcategories_js_absoluteAppPath_private_next_pages_2F_app_js_absoluteDocumentPath_next_2Fdist_2Fpages_2F_document_middlewareConfigBase64_e30_3D_),
getServerSideProps: () => (/* binding */ getServerSideProps),
getStaticPaths: () => (/* binding */ getStaticPaths),
getStaticProps: () => (/* binding */ getStaticProps),
reportWebVitals: () => (/* binding */ reportWebVitals),
routeModule: () => (/* binding */ routeModule),
unstable_getServerProps: () => (/* binding */ unstable_getServerProps),
unstable_getServerSideProps: () => (/* binding */ unstable_getServerSideProps),
unstable_getStaticParams: () => (/* binding */ unstable_getStaticParams),
unstable_getStaticPaths: () => (/* binding */ unstable_getStaticPaths),
unstable_getStaticProps: () => (/* binding */ unstable_getStaticProps)
});
// NAMESPACE OBJECT: ./pages/categories.js
var categories_namespaceObject = {};
__webpack_require__.r(categories_namespaceObject);
__webpack_require__.d(categories_namespaceObject, {
"default": () => (Categories)
});
// EXTERNAL MODULE: ./node_modules/next/dist/server/future/route-modules/pages/module.compiled.js
var module_compiled = __webpack_require__(7093);
// EXTERNAL MODULE: ./node_modules/next/dist/server/future/route-kind.js
var route_kind = __webpack_require__(5244);
// EXTERNAL MODULE: ./node_modules/next/dist/build/templates/helpers.js
var helpers = __webpack_require__(1323);
// EXTERNAL MODULE: ./node_modules/next/dist/pages/_document.js
var _document = __webpack_require__(2899);
var _document_default = /*#__PURE__*/__webpack_require__.n(_document);
// EXTERNAL MODULE: ./pages/_app.js
var _app = __webpack_require__(3414);
// EXTERNAL MODULE: external "react/jsx-runtime"
var jsx_runtime_ = __webpack_require__(997);
// EXTERNAL MODULE: external "react"
var external_react_ = __webpack_require__(6689);
// EXTERNAL MODULE: ./node_modules/next/router.js
var next_router = __webpack_require__(1163);
// EXTERNAL MODULE: ./lib/api.js
var api = __webpack_require__(7751);
// EXTERNAL MODULE: ./components/AppShell.js
var AppShell = __webpack_require__(1712);
// EXTERNAL MODULE: ./components/icons.js
var icons = __webpack_require__(349);
// EXTERNAL MODULE: ./components/ToastProvider.js
var ToastProvider = __webpack_require__(4190);
// EXTERNAL MODULE: ./components/ConfirmProvider.js
var ConfirmProvider = __webpack_require__(4407);
;// CONCATENATED MODULE: ./pages/categories.js
«webpack/lib/util/registerExternalSerializerwebpack-sources/ReplaceSource«webpack/lib/util/registerExternalSerializerœwebpack-sources/CachedSource ºT«webpack/lib/util/registerExternalSerializerwebpack-sources/ReplaceSource«webpack/lib/util/registerExternalSerializer™webpack-sources/RawSource€Limport { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
import { useState, useEffect } from "react";
import { useRouter } from "next/router";
import { isLoggedIn, getCategories, createCategory, deleteCategory } from "../lib/api";
import AppShell from "../components/AppShell";
import { Icon } from "../components/icons";
import { useToast } from "../components/ToastProvider";
import { useConfirm } from "../components/ConfirmProvider";
const ICONS = [
"\uD83C\uDF5C",
"\uD83E\uDD58",
"\uD83E\uDD6C",
"\uD83E\uDD69",
"\uD83C\uDF54",
"\uD83C\uDF55",
"☕",
"\uD83C\uDF7A",
"\uD83E\uDDCB",
"\uD83C\uDF4E",
"\uD83C\uDF6A",
"\uD83C\uDF6B",
"\uD83D\uDE97",
"\uD83D\uDE95",
"\uD83D\uDE8C",
"\uD83D\uDE87",
"⛽",
"\uD83D\uDE99",
"\uD83D\uDEF5",
"✈ï¸",
"\uD83D\uDEA2",
"\uD83D\uDED2",
"\uD83D\uDC54",
"\uD83D\uDC55",
"\uD83D\uDC56",
"\uD83D\uDC5F",
"\uD83D\uDC53",
"\uD83E\uDDE2",
"\uD83D\uDC5C",
"\uD83C\uDF92",
"\uD83D\uDC8D",
"\uD83D\uDC84",
"\uD83C\uDFE0",
"\uD83C\uDFE2",
"\uD83C\uDFE6",
"\uD83C\uDFE5",
"\uD83C\uDFE8",
"\uD83C\uDFE9",
"\uD83D\uDD27",
"\uD83D\uDD28",
"\uD83D\uDECBï¸",
"\uD83D\uDCFA",
"\uD83D\uDCBB",
"\uD83D\uDCF1",
"\uD83D\uDCDD",
"\uD83D\uDCB0",
"\uD83C\uDF81",
"\uD83D\uDCC8",
"\uD83E\uDDE7",
"\uD83D\uDCB3",
"\uD83C\uDFAF",
"\uD83D\uDCDA",
"\uD83C\uDFB5",
"\uD83C\uDFAE",
"\uD83C\uDFC3",
"âš½",
"\uD83C\uDFCA",
"\uD83D\uDEB4",
"\uD83C\uDFAD",
"\uD83C\uDFA8",
"\uD83C\uDFAC",
"\uD83D\uDCF7",
"\uD83C\uDFA5",
"\uD83D\uDCFA",
"\uD83E\uDDF8",
"\uD83D\uDC15",
"\uD83D\uDC08",
"\uD83C\uDF38",
"\uD83C\uDF3A"
];
export default function Categories() {
const router = useRouter();
const { showToast } = useToast();
const { confirm } = useConfirm();
const [categories, setCategories] = useState({
expense: [],
income: []
});
const [modalOpen, setModalOpen] = useState(false);
const [categoryType, setCategoryType] = useState("expense");
const [loading, setLoading] = useState(true);
const [submitting, setSubmitting] = useState(false);
const [formError, setFormError] = useState("");
const [formData, setFormData] = useState({
name: "",
icon: "\uD83D\uDCDD"
});
null;
const loadCategories = async ()=>{
setLoading(true);
try {
const data = await getCategories();
setCategories(data);
} catch (err) {
console.error(err);
showToast(err.message, {
tone: "error"
});
} finally{
setLoading(false);
}
};
const openAddModal = (type)=>{
setCategoryType(type);
setFormData({
name: "",
icon: "\uD83D\uDCDD"
});
setFormError("");
setModalOpen(true);
};
const closeModal = ()=>{
if (submitting) return;
setModalOpen(false);
setFormError("");
};
const handleSubmit = async (e)=>{
e.preventDefault();
if (!formData.name || !formData.icon) {
setFormError("请填写完整信æ¯");
return;
}
setSubmitting(true);
setFormError("");
try {
await createCategory({
type: categoryType,
name: formData.name,
icon: formData.icon
});
closeModal();
showToast("分类已创建", {
tone: "success"
});
await loadCategories();
} catch (err) {
setFormError(err.message);
showToast(err.message, {
tone: "error"
});
} finally{
setSubmitting(false);
}
};
const handleDelete = async (id)=>{
const shouldDelete = await confirm({
title: "删除此分类?",
description: "默认分类ä¸å¯åˆ é™¤ï¼Œè‡ªå®šä¹‰åˆ†ç±»åˆ é™¤åŽå°†æ— æ³•æ¢å¤ã€‚",
confirmText: "删除"
});
if (!shouldDelete) return;
try {
await deleteCategory(id);
showToast("分类已删除", {
tone: "success"
});
await loadCategories();
} catch (err) {
showToast(err.message, {
tone: "error"
});
}
};
const actions = /*#__PURE__*/ _jsx("button", {
type: "button",
className: "icon-button",
"aria-label": "设置",
onClick: ()=>router.push("/settings"),
children: /*#__PURE__*/ _jsx(Icon, {
name: "settings",
size: 18
})
});
return /*#__PURE__*/ _jsxs(AppShell, {
title: "分类",
subtitle: "æ•´ç†å¸¸ç”¨åˆ†ç±»ä¸Žå›¾æ ‡",
actions: actions,
compactHeader: true,
children: [
loading ? /*#__PURE__*/ _jsx("div", {
className: "card loading-state",
children: "加载中..."
}) : /*#__PURE__*/ _jsxs(_Fragment, {
children: [
/*#__PURE__*/ _jsxs("section", {
className: "card category-section category-section--refresh",
children: [
/*#__PURE__*/ _jsxs("div", {
className: "section-header",
children: [
/*#__PURE__*/ _jsxs("div", {
children: [
/*#__PURE__*/ _jsx("p", {
className: "eyebrow",
children: "支出分类"
}),
/*#__PURE__*/ _jsx("h2", {
children: "支出"
})
]
}),
/*#__PURE__*/ _jsx("button", {
type: "button",
className: "btn btn-secondary btn-inline",
onClick: ()=>openAddModal("expense"),
children: /*#__PURE__*/ _jsxs("span", {
className: "button-content",
children: [
/*#__PURE__*/ _jsx(Icon, {
name: "plus",
size: 16
}),
"添加"
]
})
})
]
}),
/*#__PURE__*/ _jsx("div", {
className: "category-list category-list--chips",
children: categories.expense.map((cat)=>/*#__PURE__*/ _jsxs("div", {
className: "category-tag",
children: [
/*#__PURE__*/ _jsx("span", {
className: "cat-icon",
children: cat.icon
}),
/*#__PURE__*/ _jsx("span", {
className: "cat-name",
children: cat.name
}),
!cat.is_default && /*#__PURE__*/ _jsx("button", {
type: "button",
className: "icon-button icon-button--ghost cat-delete",
"aria-label": `删除${cat.name}`,
onClick: ()=>handleDelete(cat.id),
children: /*#__PURE__*/ _jsx(Icon, {
name: "close",
size: 14
})
})
]
}, cat.id || cat.name))
})
]
}),
/*#__PURE__*/ _jsxs("section", {
className: "card category-section category-section--refresh",
children: [
/*#__PURE__*/ _jsxs("div", {
className: "section-header",
children: [
/*#__PURE__*/ _jsxs("div", {
children: [
/*#__PURE__*/ _jsx("p", {
className: "eyebrow",
children: "收入分类"
}),
/*#__PURE__*/ _jsx("h2", {
children: "æ”¶å…¥"
})
]
}),
/*#__PURE__*/ _jsx("button", {
type: "button",
className: "btn btn-secondary btn-inline",
onClick: ()=>openAddModal("income"),
children: /*#__PURE__*/ _jsxs("span", {
className: "button-content",
children: [
/*#__PURE__*/ _jsx(Icon, {
name: "plus",
size: 16
}),
"添加"
]
})
})
]
}),
/*#__PURE__*/ _jsx("div", {
className: "category-list category-list--chips",
children: categories.income.map((cat)=>/*#__PURE__*/ _jsxs("div", {
className: "category-tag",
children: [
/*#__PURE__*/ _jsx("span", {
className: "cat-icon",
children: cat.icon
}),
/*#__PURE__*/ _jsx("span", {
className: "cat-name",
children: cat.name
}),
!cat.is_default && /*#__PURE__*/ _jsx("button", {
type: "button",
className: "icon-button icon-button--ghost cat-delete",
"aria-label": `删除${cat.name}`,
onClick: ()=>handleDelete(cat.id),
children: /*#__PURE__*/ _jsx(Icon, {
name: "close",
size: 14
})
})
]
}, cat.id || cat.name))
})
]
}),
/*#__PURE__*/ _jsx("div", {
className: "card category-tip category-tip--refresh",
children: /*#__PURE__*/ _jsx("p", {
children: "默认分类无法删除,自定义分类å¯ä»¥åˆ é™¤ã€‚"
})
})
]
}),
modalOpen && /*#__PURE__*/ _jsx("div", {
className: "modal-overlay",
onClick: closeModal,
children: /*#__PURE__*/ _jsxs("div", {
className: "modal",
onClick: (e)=>e.stopPropagation(),
children: [
/*#__PURE__*/ _jsxs("div", {
className: "modal-header",
children: [
/*#__PURE__*/ _jsxs("div", {
children: [
/*#__PURE__*/ _jsx("p", {
className: "eyebrow",
children: "新增分类"
}),
/*#__PURE__*/ _jsx("h2", {
children: categoryType === "expense" ? "新建支出分类" : "新建收入分类"
})
]
}),
/*#__PURE__*/ _jsx("button", {
type: "button",
className: "icon-button icon-button--ghost",
"aria-label": "关闭弹窗",
onClick: closeModal,
children: /*#__PURE__*/ _jsx(Icon, {
name: "close",
size: 18
})
})
]
}),
formError && /*#__PURE__*/ _jsx("div", {
className: "error-msg",
children: formError
}),
/*#__PURE__*/ _jsxs("form", {
onSubmit: handleSubmit,
children: [
/*#__PURE__*/ _jsxs("div", {
className: "form-group",
children: [
/*#__PURE__*/ _jsx("label", {
htmlFor: "category-name",
children: "分类åç§°"
}),
/*#__PURE__*/ _jsx("input", {
id: "category-name",
type: "text",
value: formData.name,
onChange: (e)=>setFormData({
...formData,
name: e.target.value
}),
placeholder: "请输入分类åç§°",
required: true,
disabled: submitting
})
]
}),
/*#__PURE__*/ _jsxs("div", {
className: "form-group",
children: [
/*#__PURE__*/ _jsx("label", {
children: "选择图标"
}),
/*#__PURE__*/ _jsx("div", {
className: "icon-grid",
style: {
display: "grid",
gridTemplateColumns: "repeat(8, minmax(0, 1fr))",
gap: "8px"
},
children: ICONS.map((icon)=>/*#__PURE__*/ _jsx("button", {
type: "button",
className: `icon-btn ${formData.icon === icon ? "active" : ""}`,
onClick: ()=>setFormData({
...formData,
icon
}),
disabled: submitting,
children: icon
}, icon))
})
]
}),
/*#__PURE__*/ _jsx("div", {
className: "modal-actions",
children: /*#__PURE__*/ _jsx("button", {
type: "submit",
className: "btn btn-primary",
disabled: submitting,
children: submitting ? /*#__PURE__*/ _jsxs("span", {
className: "button-content",
children: [
/*#__PURE__*/ _jsx(Icon, {
name: "spinner",
size: 16,
className: "is-spinning"
}),
"ä¿å­˜ä¸­..."
]
}) : "ä¿å­˜"
})
})
]
})
]
})
})
]
});
}
cWUW_«­24^`˜Ò .Zbˆ¥®Ûâ<Cy°·èï _& Q X

j
w
q~˜NQSVº¾ÀÇorðôöþAEøü¢¦_"EIõøª®jmmpƒ&!)!+!.!î"ò"¥#©#O$S$Ì$_Ï$É%Ì%È&Ë&ñ'õ'À(Ã(Å(È(¡*¤*U+Y+,,--..1.Ñ/Ô/Ö/Ù/™1œ1%2(2è2ë2o3_s3#4'4¿4Ã44575!6$687;7}8€88…8©9¬9]:a:÷:û:©;¬;ž<¡<Ö?Ú?ˆ@@7A:A!CJ$CjFmFôF÷FHHÝHàHâHåH×__WEBPACK_MODULE_REFERENCE__7_5b22757365526f75746572225d_call_directImport_asiSafe1__._Ö__WEBPACK_MODULE_REFERENCE__11_5b22757365546f617374225d_call_directImport_asiSafe1__._Ú__WEBPACK_MODULE_REFERENCE__12_5b22757365436f6e6669726d225d_call_directImport_asiSafe1__._Õ__WEBPACK_MODULE_REFERENCE__6_5b227573655374617465225d_call_directImport_asiSafe1__._ÿÿÿÿÿÿß__WEBPACK_MODULE_REFERENCE__8_5b2267657443617465676f72696573225d_call_directImport_asiSafe1__._á__WEBPACK_MODULE_REFERENCE__8_5b2263726561746543617465676f7279225d_call_directImport_asiSafe1__._á__WEBPACK_MODULE_REFERENCE__8_5b2264656c65746543617465676f7279225d_call_directImport_asiSafe1__._Æ__WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._ÿÉ__WEBPACK_MODULE_REFERENCE__10_5b2249636f6e225d_directImport_asiSafe1__._Í__WEBPACK_MODULE_REFERENCE__5_5b226a737873225d_call_directImport_asiSafe1__._Î__WEBPACK_MODULE_REFERENCE__9_5b2264656661756c74225d_directImport_asiSafe1__._üþÐ__WEBPACK_MODULE_REFERENCE__5_5b22467261676d656e74225d_directImport_asiSafe1__._ýýýûûûýûüûýûûûûüýýýûûûýûüûýûûûûüûûûýýýûûûûüûýýûûýûûûûûýûü†buffer†source„size„maps„hashö_
const ICONS = [
"\uD83C\uDF5C",
"\uD83E\uDD58",
"\uD83E\uDD6C",
"\uD83E\uDD69",
"\uD83C\uDF54",
"\uD83C\uDF55",
"☕",
"\uD83C\uDF7A",
"\uD83E\uDDCB",
"\uD83C\uDF4E",
"\uD83C\uDF6A",
"\uD83C\uDF6B",
"\uD83D\uDE97",
"\uD83D\uDE95",
"\uD83D\uDE8C",
"\uD83D\uDE87",
"⛽",
"\uD83D\uDE99",
"\uD83D\uDEF5",
"✈ï¸",
"\uD83D\uDEA2",
"\uD83D\uDED2",
"\uD83D\uDC54",
"\uD83D\uDC55",
"\uD83D\uDC56",
"\uD83D\uDC5F",
"\uD83D\uDC53",
"\uD83E\uDDE2",
"\uD83D\uDC5C",
"\uD83C\uDF92",
"\uD83D\uDC8D",
"\uD83D\uDC84",
"\uD83C\uDFE0",
"\uD83C\uDFE2",
"\uD83C\uDFE6",
"\uD83C\uDFE5",
"\uD83C\uDFE8",
"\uD83C\uDFE9",
"\uD83D\uDD27",
"\uD83D\uDD28",
"\uD83D\uDECBï¸",
"\uD83D\uDCFA",
"\uD83D\uDCBB",
"\uD83D\uDCF1",
"\uD83D\uDCDD",
"\uD83D\uDCB0",
"\uD83C\uDF81",
"\uD83D\uDCC8",
"\uD83E\uDDE7",
"\uD83D\uDCB3",
"\uD83C\uDFAF",
"\uD83D\uDCDA",
"\uD83C\uDFB5",
"\uD83C\uDFAE",
"\uD83C\uDFC3",
"âš½",
"\uD83C\uDFCA",
"\uD83D\uDEB4",
"\uD83C\uDFAD",
"\uD83C\uDFA8",
"\uD83C\uDFAC",
"\uD83D\uDCF7",
"\uD83C\uDFA5",
"\uD83D\uDCFA",
"\uD83E\uDDF8",
"\uD83D\uDC15",
"\uD83D\uDC08",
"\uD83C\uDF38",
"\uD83C\uDF3A"
];
function Categories() {
const router = __WEBPACK_MODULE_REFERENCE__7_5b22757365526f75746572225d_call_directImport_asiSafe1__._();
const { showToast } = __WEBPACK_MODULE_REFERENCE__11_5b22757365546f617374225d_call_directImport_asiSafe1__._();
const { confirm } = __WEBPACK_MODULE_REFERENCE__12_5b22757365436f6e6669726d225d_call_directImport_asiSafe1__._();
const [categories, setCategories] = __WEBPACK_MODULE_REFERENCE__6_5b227573655374617465225d_call_directImport_asiSafe1__._({
expense: [],
income: []
});
const [modalOpen, setModalOpen] = __WEBPACK_MODULE_REFERENCE__6_5b227573655374617465225d_call_directImport_asiSafe1__._(false);
const [categoryType, setCategoryType] = __WEBPACK_MODULE_REFERENCE__6_5b227573655374617465225d_call_directImport_asiSafe1__._("expense");
const [loading, setLoading] = __WEBPACK_MODULE_REFERENCE__6_5b227573655374617465225d_call_directImport_asiSafe1__._(true);
const [submitting, setSubmitting] = __WEBPACK_MODULE_REFERENCE__6_5b227573655374617465225d_call_directImport_asiSafe1__._(false);
const [formError, setFormError] = __WEBPACK_MODULE_REFERENCE__6_5b227573655374617465225d_call_directImport_asiSafe1__._("");
const [formData, setFormData] = __WEBPACK_MODULE_REFERENCE__6_5b227573655374617465225d_call_directImport_asiSafe1__._({
name: "",
icon: "\uD83D\uDCDD"
});
null;
const loadCategories = async ()=>{
setLoading(true);
try {
const data = await __WEBPACK_MODULE_REFERENCE__8_5b2267657443617465676f72696573225d_call_directImport_asiSafe1__._();
setCategories(data);
} catch (err) {
console.error(err);
showToast(err.message, {
tone: "error"
});
} finally{
setLoading(false);
}
};
const openAddModal = (type)=>{
setCategoryType(type);
setFormData({
name: "",
icon: "\uD83D\uDCDD"
});
setFormError("");
setModalOpen(true);
};
const closeModal = ()=>{
if (submitting) return;
setModalOpen(false);
setFormError("");
};
const handleSubmit = async (e)=>{
e.preventDefault();
if (!formData.name || !formData.icon) {
setFormError("请填写完整信æ¯");
return;
}
setSubmitting(true);
setFormError("");
try {
await __WEBPACK_MODULE_REFERENCE__8_5b2263726561746543617465676f7279225d_call_directImport_asiSafe1__._({
type: categoryType,
name: formData.name,
icon: formData.icon
});
closeModal();
showToast("分类已创建", {
tone: "success"
});
await loadCategories();
} catch (err) {
setFormError(err.message);
showToast(err.message, {
tone: "error"
});
} finally{
setSubmitting(false);
}
};
const handleDelete = async (id)=>{
const shouldDelete = await confirm({
title: "删除此分类?",
description: "默认分类ä¸å¯åˆ é™¤ï¼Œè‡ªå®šä¹‰åˆ†ç±»åˆ é™¤åŽå°†æ— æ³•æ¢å¤ã€‚",
confirmText: "删除"
});
if (!shouldDelete) return;
try {
await __WEBPACK_MODULE_REFERENCE__8_5b2264656c65746543617465676f7279225d_call_directImport_asiSafe1__._(id);
showToast("分类已删除", {
tone: "success"
});
await loadCategories();
} catch (err) {
showToast(err.message, {
tone: "error"
});
}
};
const actions = /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._("button", {
type: "button",
className: "icon-button",
"aria-label": "设置",
onClick: ()=>router.push("/settings"),
children: /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._(__WEBPACK_MODULE_REFERENCE__10_5b2249636f6e225d_directImport_asiSafe1__._, {
name: "settings",
size: 18
})
});
return /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__5_5b226a737873225d_call_directImport_asiSafe1__._(__WEBPACK_MODULE_REFERENCE__9_5b2264656661756c74225d_directImport_asiSafe1__._, {
title: "分类",
subtitle: "æ•´ç†å¸¸ç”¨åˆ†ç±»ä¸Žå›¾æ ‡",
actions: actions,
compactHeader: true,
children: [
loading ? /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._("div", {
className: "card loading-state",
children: "加载中..."
}) : /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__5_5b226a737873225d_call_directImport_asiSafe1__._(__WEBPACK_MODULE_REFERENCE__5_5b22467261676d656e74225d_directImport_asiSafe1__._, {
children: [
/*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__5_5b226a737873225d_call_directImport_asiSafe1__._("section", {
className: "card category-section category-section--refresh",
children: [
/*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__5_5b226a737873225d_call_directImport_asiSafe1__._("div", {
className: "section-header",
children: [
/*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__5_5b226a737873225d_call_directImport_asiSafe1__._("div", {
children: [
/*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._("p", {
className: "eyebrow",
children: "支出分类"
}),
/*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._("h2", {
children: "支出"
})
]
}),
/*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._("button", {
type: "button",
className: "btn btn-secondary btn-inline",
onClick: ()=>openAddModal("expense"),
children: /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__5_5b226a737873225d_call_directImport_asiSafe1__._("span", {
className: "button-content",
children: [
/*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._(__WEBPACK_MODULE_REFERENCE__10_5b2249636f6e225d_directImport_asiSafe1__._, {
name: "plus",
size: 16
}),
"添加"
]
})
})
]
}),
/*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._("div", {
className: "category-list category-list--chips",
children: categories.expense.map((cat)=>/*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__5_5b226a737873225d_call_directImport_asiSafe1__._("div", {
className: "category-tag",
children: [
/*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._("span", {
className: "cat-icon",
children: cat.icon
}),
/*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._("span", {
className: "cat-name",
children: cat.name
}),
!cat.is_default && /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._("button", {
type: "button",
className: "icon-button icon-button--ghost cat-delete",
"aria-label": `删除${cat.name}`,
onClick: ()=>handleDelete(cat.id),
children: /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._(__WEBPACK_MODULE_REFERENCE__10_5b2249636f6e225d_directImport_asiSafe1__._, {
name: "close",
size: 14
})
})
]
}, cat.id || cat.name))
})
]
}),
/*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__5_5b226a737873225d_call_directImport_asiSafe1__._("section", {
className: "card category-section category-section--refresh",
children: [
/*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__5_5b226a737873225d_call_directImport_asiSafe1__._("div", {
className: "section-header",
children: [
/*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__5_5b226a737873225d_call_directImport_asiSafe1__._("div", {
children: [
/*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._("p", {
className: "eyebrow",
children: "收入分类"
}),
/*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._("h2", {
children: "æ”¶å…¥"
})
]
}),
/*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._("button", {
type: "button",
className: "btn btn-secondary btn-inline",
onClick: ()=>openAddModal("income"),
children: /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__5_5b226a737873225d_call_directImport_asiSafe1__._("span", {
className: "button-content",
children: [
/*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._(__WEBPACK_MODULE_REFERENCE__10_5b2249636f6e225d_directImport_asiSafe1__._, {
name: "plus",
size: 16
}),
"添加"
]
})
})
]
}),
/*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._("div", {
className: "category-list category-list--chips",
children: categories.income.map((cat)=>/*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__5_5b226a737873225d_call_directImport_asiSafe1__._("div", {
className: "category-tag",
children: [
/*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._("span", {
className: "cat-icon",
children: cat.icon
}),
/*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._("span", {
className: "cat-name",
children: cat.name
}),
!cat.is_default && /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._("button", {
type: "button",
className: "icon-button icon-button--ghost cat-delete",
"aria-label": `删除${cat.name}`,
onClick: ()=>handleDelete(cat.id),
children: /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._(__WEBPACK_MODULE_REFERENCE__10_5b2249636f6e225d_directImport_asiSafe1__._, {
name: "close",
size: 14
})
})
]
}, cat.id || cat.name))
})
]
}),
/*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._("div", {
className: "card category-tip category-tip--refresh",
children: /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._("p", {
children: "默认分类无法删除,自定义分类å¯ä»¥åˆ é™¤ã€‚"
})
})
]
}),
modalOpen && /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._("div", {
className: "modal-overlay",
onClick: closeModal,
children: /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__5_5b226a737873225d_call_directImport_asiSafe1__._("div", {
className: "modal",
onClick: (e)=>e.stopPropagation(),
children: [
/*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__5_5b226a737873225d_call_directImport_asiSafe1__._("div", {
className: "modal-header",
children: [
/*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__5_5b226a737873225d_call_directImport_asiSafe1__._("div", {
children: [
/*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._("p", {
className: "eyebrow",
children: "新增分类"
}),
/*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._("h2", {
children: categoryType === "expense" ? "新建支出分类" : "新建收入分类"
})
]
}),
/*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._("button", {
type: "button",
className: "icon-button icon-button--ghost",
"aria-label": "关闭弹窗",
onClick: closeModal,
children: /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._(__WEBPACK_MODULE_REFERENCE__10_5b2249636f6e225d_directImport_asiSafe1__._, {
name: "close",
size: 18
})
})
]
}),
formError && /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._("div", {
className: "error-msg",
children: formError
}),
/*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__5_5b226a737873225d_call_directImport_asiSafe1__._("form", {
onSubmit: handleSubmit,
children: [
/*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__5_5b226a737873225d_call_directImport_asiSafe1__._("div", {
className: "form-group",
children: [
/*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._("label", {
htmlFor: "category-name",
children: "分类åç§°"
}),
/*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._("input", {
id: "category-name",
type: "text",
value: formData.name,
onChange: (e)=>setFormData({
...formData,
name: e.target.value
}),
placeholder: "请输入分类åç§°",
required: true,
disabled: submitting
})
]
}),
/*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__5_5b226a737873225d_call_directImport_asiSafe1__._("div", {
className: "form-group",
children: [
/*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._("label", {
children: "选择图标"
}),
/*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._("div", {
className: "icon-grid",
style: {
display: "grid",
gridTemplateColumns: "repeat(8, minmax(0, 1fr))",
gap: "8px"
},
children: ICONS.map((icon)=>/*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._("button", {
type: "button",
className: `icon-btn ${formData.icon === icon ? "active" : ""}`,
onClick: ()=>setFormData({
...formData,
icon
}),
disabled: submitting,
children: icon
}, icon))
})
]
}),
/*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._("div", {
className: "modal-actions",
children: /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._("button", {
type: "submit",
className: "btn btn-primary",
disabled: submitting,
children: submitting ? /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__5_5b226a737873225d_call_directImport_asiSafe1__._("span", {
className: "button-content",
children: [
/*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._(__WEBPACK_MODULE_REFERENCE__10_5b2249636f6e225d_directImport_asiSafe1__._, {
name: "spinner",
size: 16,
className: "is-spinning"
}),
"ä¿å­˜ä¸­..."
]
}) : "ä¿å­˜"
})
})
]
})
]
})
})
]
});
}
•{"finalSource":false}ƒmapbufferedMap ReplaceSourceRawSource€Limport { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
import { useState, useEffect } from "react";
import { useRouter } from "next/router";
import { isLoggedIn, getCategories, createCategory, deleteCategory } from "../lib/api";
import AppShell from "../components/AppShell";
import { Icon } from "../components/icons";
import { useToast } from "../components/ToastProvider";
import { useConfirm } from "../components/ConfirmProvider";
const ICONS = [
"\uD83C\uDF5C",
"\uD83E\uDD58",
"\uD83E\uDD6C",
"\uD83E\uDD69",
"\uD83C\uDF54",
"\uD83C\uDF55",
"☕",
"\uD83C\uDF7A",
"\uD83E\uDDCB",
"\uD83C\uDF4E",
"\uD83C\uDF6A",
"\uD83C\uDF6B",
"\uD83D\uDE97",
"\uD83D\uDE95",
"\uD83D\uDE8C",
"\uD83D\uDE87",
"⛽",
"\uD83D\uDE99",
"\uD83D\uDEF5",
"✈ï¸",
"\uD83D\uDEA2",
"\uD83D\uDED2",
"\uD83D\uDC54",
"\uD83D\uDC55",
"\uD83D\uDC56",
"\uD83D\uDC5F",
"\uD83D\uDC53",
"\uD83E\uDDE2",
"\uD83D\uDC5C",
"\uD83C\uDF92",
"\uD83D\uDC8D",
"\uD83D\uDC84",
"\uD83C\uDFE0",
"\uD83C\uDFE2",
"\uD83C\uDFE6",
"\uD83C\uDFE5",
"\uD83C\uDFE8",
"\uD83C\uDFE9",
"\uD83D\uDD27",
"\uD83D\uDD28",
"\uD83D\uDECBï¸",
"\uD83D\uDCFA",
"\uD83D\uDCBB",
"\uD83D\uDCF1",
"\uD83D\uDCDD",
"\uD83D\uDCB0",
"\uD83C\uDF81",
"\uD83D\uDCC8",
"\uD83E\uDDE7",
"\uD83D\uDCB3",
"\uD83C\uDFAF",
"\uD83D\uDCDA",
"\uD83C\uDFB5",
"\uD83C\uDFAE",
"\uD83C\uDFC3",
"âš½",
"\uD83C\uDFCA",
"\uD83D\uDEB4",
"\uD83C\uDFAD",
"\uD83C\uDFA8",
"\uD83C\uDFAC",
"\uD83D\uDCF7",
"\uD83C\uDFA5",
"\uD83D\uDCFA",
"\uD83E\uDDF8",
"\uD83D\uDC15",
"\uD83D\uDC08",
"\uD83C\uDF38",
"\uD83C\uDF3A"
];
export default function Categories() {
const router = useRouter();
const { showToast } = useToast();
const { confirm } = useConfirm();
const [categories, setCategories] = useState({
expense: [],
income: []
});
const [modalOpen, setModalOpen] = useState(false);
const [categoryType, setCategoryType] = useState("expense");
const [loading, setLoading] = useState(true);
const [submitting, setSubmitting] = useState(false);
const [formError, setFormError] = useState("");
const [formData, setFormData] = useState({
name: "",
icon: "\uD83D\uDCDD"
});
null;
const loadCategories = async ()=>{
setLoading(true);
try {
const data = await getCategories();
setCategories(data);
} catch (err) {
console.error(err);
showToast(err.message, {
tone: "error"
});
} finally{
setLoading(false);
}
};
const openAddModal = (type)=>{
setCategoryType(type);
setFormData({
name: "",
icon: "\uD83D\uDCDD"
});
setFormError("");
setModalOpen(true);
};
const closeModal = ()=>{
if (submitting) return;
setModalOpen(false);
setFormError("");
};
const handleSubmit = async (e)=>{
e.preventDefault();
if (!formData.name || !formData.icon) {
setFormError("请填写完整信æ¯");
return;
}
setSubmitting(true);
setFormError("");
try {
await createCategory({
type: categoryType,
name: formData.name,
icon: formData.icon
});
closeModal();
showToast("分类已创建", {
tone: "success"
});
await loadCategories();
} catch (err) {
setFormError(err.message);
showToast(err.message, {
tone: "error"
});
} finally{
setSubmitting(false);
}
};
const handleDelete = async (id)=>{
const shouldDelete = await confirm({
title: "删除此分类?",
description: "默认分类ä¸å¯åˆ é™¤ï¼Œè‡ªå®šä¹‰åˆ†ç±»åˆ é™¤åŽå°†æ— æ³•æ¢å¤ã€‚",
confirmText: "删除"
});
if (!shouldDelete) return;
try {
await deleteCategory(id);
showToast("分类已删除", {
tone: "success"
});
await loadCategories();
} catch (err) {
showToast(err.message, {
tone: "error"
});
}
};
const actions = /*#__PURE__*/ _jsx("button", {
type: "button",
className: "icon-button",
"aria-label": "设置",
onClick: ()=>router.push("/settings"),
children: /*#__PURE__*/ _jsx(Icon, {
name: "settings",
size: 18
})
});
return /*#__PURE__*/ _jsxs(AppShell, {
title: "分类",
subtitle: "æ•´ç†å¸¸ç”¨åˆ†ç±»ä¸Žå›¾æ ‡",
actions: actions,
compactHeader: true,
children: [
loading ? /*#__PURE__*/ _jsx("div", {
className: "card loading-state",
children: "加载中..."
}) : /*#__PURE__*/ _jsxs(_Fragment, {
children: [
/*#__PURE__*/ _jsxs("section", {
className: "card category-section category-section--refresh",
children: [
/*#__PURE__*/ _jsxs("div", {
className: "section-header",
children: [
/*#__PURE__*/ _jsxs("div", {
children: [
/*#__PURE__*/ _jsx("p", {
className: "eyebrow",
children: "支出分类"
}),
/*#__PURE__*/ _jsx("h2", {
children: "支出"
})
]
}),
/*#__PURE__*/ _jsx("button", {
type: "button",
className: "btn btn-secondary btn-inline",
onClick: ()=>openAddModal("expense"),
children: /*#__PURE__*/ _jsxs("span", {
className: "button-content",
children: [
/*#__PURE__*/ _jsx(Icon, {
name: "plus",
size: 16
}),
"添加"
]
})
})
]
}),
/*#__PURE__*/ _jsx("div", {
className: "category-list category-list--chips",
children: categories.expense.map((cat)=>/*#__PURE__*/ _jsxs("div", {
className: "category-tag",
children: [
/*#__PURE__*/ _jsx("span", {
className: "cat-icon",
children: cat.icon
}),
/*#__PURE__*/ _jsx("span", {
className: "cat-name",
children: cat.name
}),
!cat.is_default && /*#__PURE__*/ _jsx("button", {
type: "button",
className: "icon-button icon-button--ghost cat-delete",
"aria-label": `删除${cat.name}`,
onClick: ()=>handleDelete(cat.id),
children: /*#__PURE__*/ _jsx(Icon, {
name: "close",
size: 14
})
})
]
}, cat.id || cat.name))
})
]
}),
/*#__PURE__*/ _jsxs("section", {
className: "card category-section category-section--refresh",
children: [
/*#__PURE__*/ _jsxs("div", {
className: "section-header",
children: [
/*#__PURE__*/ _jsxs("div", {
children: [
/*#__PURE__*/ _jsx("p", {
className: "eyebrow",
children: "收入分类"
}),
/*#__PURE__*/ _jsx("h2", {
children: "æ”¶å…¥"
})
]
}),
/*#__PURE__*/ _jsx("button", {
type: "button",
className: "btn btn-secondary btn-inline",
onClick: ()=>openAddModal("income"),
children: /*#__PURE__*/ _jsxs("span", {
className: "button-content",
children: [
/*#__PURE__*/ _jsx(Icon, {
name: "plus",
size: 16
}),
"添加"
]
})
})
]
}),
/*#__PURE__*/ _jsx("div", {
className: "category-list category-list--chips",
children: categories.income.map((cat)=>/*#__PURE__*/ _jsxs("div", {
className: "category-tag",
children: [
/*#__PURE__*/ _jsx("span", {
className: "cat-icon",
children: cat.icon
}),
/*#__PURE__*/ _jsx("span", {
className: "cat-name",
children: cat.name
}),
!cat.is_default && /*#__PURE__*/ _jsx("button", {
type: "button",
className: "icon-button icon-button--ghost cat-delete",
"aria-label": `删除${cat.name}`,
onClick: ()=>handleDelete(cat.id),
children: /*#__PURE__*/ _jsx(Icon, {
name: "close",
size: 14
})
})
]
}, cat.id || cat.name))
})
]
}),
/*#__PURE__*/ _jsx("div", {
className: "card category-tip category-tip--refresh",
children: /*#__PURE__*/ _jsx("p", {
children: "默认分类无法删除,自定义分类å¯ä»¥åˆ é™¤ã€‚"
})
})
]
}),
modalOpen && /*#__PURE__*/ _jsx("div", {
className: "modal-overlay",
onClick: closeModal,
children: /*#__PURE__*/ _jsxs("div", {
className: "modal",
onClick: (e)=>e.stopPropagation(),
children: [
/*#__PURE__*/ _jsxs("div", {
className: "modal-header",
children: [
/*#__PURE__*/ _jsxs("div", {
children: [
/*#__PURE__*/ _jsx("p", {
className: "eyebrow",
children: "新增分类"
}),
/*#__PURE__*/ _jsx("h2", {
children: categoryType === "expense" ? "新建支出分类" : "新建收入分类"
})
]
}),
/*#__PURE__*/ _jsx("button", {
type: "button",
className: "icon-button icon-button--ghost",
"aria-label": "关闭弹窗",
onClick: closeModal,
children: /*#__PURE__*/ _jsx(Icon, {
name: "close",
size: 18
})
})
]
}),
formError && /*#__PURE__*/ _jsx("div", {
className: "error-msg",
children: formError
}),
/*#__PURE__*/ _jsxs("form", {
onSubmit: handleSubmit,
children: [
/*#__PURE__*/ _jsxs("div", {
className: "form-group",
children: [
/*#__PURE__*/ _jsx("label", {
htmlFor: "category-name",
children: "分类åç§°"
}),
/*#__PURE__*/ _jsx("input", {
id: "category-name",
type: "text",
value: formData.name,
onChange: (e)=>setFormData({
...formData,
name: e.target.value
}),
placeholder: "请输入分类åç§°",
required: true,
disabled: submitting
})
]
}),
/*#__PURE__*/ _jsxs("div", {
className: "form-group",
children: [
/*#__PURE__*/ _jsx("label", {
children: "选择图标"
}),
/*#__PURE__*/ _jsx("div", {
className: "icon-grid",
style: {
display: "grid",
gridTemplateColumns: "repeat(8, minmax(0, 1fr))",
gap: "8px"
},
children: ICONS.map((icon)=>/*#__PURE__*/ _jsx("button", {
type: "button",
className: `icon-btn ${formData.icon === icon ? "active" : ""}`,
onClick: ()=>setFormData({
...formData,
icon
}),
disabled: submitting,
children: icon
}, icon))
})
]
}),
/*#__PURE__*/ _jsx("div", {
className: "modal-actions",
children: /*#__PURE__*/ _jsx("button", {
type: "submit",
className: "btn btn-primary",
disabled: submitting,
children: submitting ? /*#__PURE__*/ _jsxs("span", {
className: "button-content",
children: [
/*#__PURE__*/ _jsx(Icon, {
name: "spinner",
size: 16,
className: "is-spinning"
}),
"ä¿å­˜ä¸­..."
]
}) : "ä¿å­˜"
})
})
]
})
]
})
})
]
});
}
æ085undefined87130undefined132171undefined173259undefined261306undefined308350undefined352406undefined408466undefined18241838undefined18821890__WEBPACK_MODULE_REFERENCE__7_5b22757365526f75746572225d_call_directImport_asiSafe1__._undefined19211928__WEBPACK_MODULE_REFERENCE__11_5b22757365546f617374225d_call_directImport_asiSafe1__._undefined19571966__WEBPACK_MODULE_REFERENCE__12_5b22757365436f6e6669726d225d_call_directImport_asiSafe1__._undefined20112018__WEBPACK_MODULE_REFERENCE__6_5b227573655374617465225d_call_directImport_asiSafe1__._undefined21082115__WEBPACK_MODULE_REFERENCE__6_5b227573655374617465225d_call_directImport_asiSafe1__._undefined21692176__WEBPACK_MODULE_REFERENCE__6_5b227573655374617465225d_call_directImport_asiSafe1__._undefined22242231__WEBPACK_MODULE_REFERENCE__6_5b227573655374617465225d_call_directImport_asiSafe1__._undefined22802287__WEBPACK_MODULE_REFERENCE__6_5b227573655374617465225d_call_directImport_asiSafe1__._undefined23352342__WEBPACK_MODULE_REFERENCE__6_5b227573655374617465225d_call_directImport_asiSafe1__._undefined23852392__WEBPACK_MODULE_REFERENCE__6_5b227573655374617465225d_call_directImport_asiSafe1__._undefined25712583__WEBPACK_MODULE_REFERENCE__8_5b2267657443617465676f72696573225d_call_directImport_asiSafe1__._undefined34343447__WEBPACK_MODULE_REFERENCE__8_5b2263726561746543617465676f7279225d_call_directImport_asiSafe1__._undefined42094222__WEBPACK_MODULE_REFERENCE__8_5b2264656c65746543617465676f7279225d_call_directImport_asiSafe1__._undefined45044507__WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._undefined46864689__WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._undefined46914694__WEBPACK_MODULE_REFERENCE__10_5b2249636f6e225d_directImport_asiSafe1__._undefined47944798__WEBPACK_MODULE_REFERENCE__5_5b226a737873225d_call_directImport_asiSafe1__._undefined48004807__WEBPACK_MODULE_REFERENCE__9_5b2264656661756c74225d_directImport_asiSafe1__._undefined49754978__WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._undefined51045108__WEBPACK_MODULE_REFERENCE__5_5b226a737873225d_call_directImport_asiSafe1__._undefined51105118__WEBPACK_MODULE_REFERENCE__5_5b22467261676d656e74225d_directImport_asiSafe1__._undefined51855189__WEBPACK_MODULE_REFERENCE__5_5b226a737873225d_call_directImport_asiSafe1__._undefined53685372__WEBPACK_MODULE_REFERENCE__5_5b226a737873225d_call_directImport_asiSafe1__._undefined55385542__WEBPACK_MODULE_REFERENCE__5_5b226a737873225d_call_directImport_asiSafe1__._undefined56635666__WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._undefined59165919__WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._undefined61716174__WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._undefined64696473__WEBPACK_MODULE_REFERENCE__5_5b226a737873225d_call_directImport_asiSafe1__._undefined66766679__WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._undefined66816684__WEBPACK_MODULE_REFERENCE__10_5b2249636f6e225d_directImport_asiSafe1__._undefined71577160__WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._undefined73387342__WEBPACK_MODULE_REFERENCE__5_5b226a737873225d_call_directImport_asiSafe1__._undefined75307533__WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._undefined77897792__WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._undefined80678070__WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._undefined84868489__WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._undefined84918494__WEBPACK_MODULE_REFERENCE__10_5b2249636f6e225d_directImport_asiSafe1__._undefined89428946__WEBPACK_MODULE_REFERENCE__5_5b226a737873225d_call_directImport_asiSafe1__._undefined91259129__WEBPACK_MODULE_REFERENCE__5_5b226a737873225d_call_directImport_asiSafe1__._undefined92959299__WEBPACK_MODULE_REFERENCE__5_5b226a737873225d_call_directImport_asiSafe1__._undefined94209423__WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._undefined96739676__WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_dir
0
7 èHB¢¼´ùûCóõBê/­ùûJÙŒØ~ÊCˆÇÃ/{F Õ ®"ó"¥#ñ#_­$ò$ò%7&J''/)t)v)¾)~+Ê+},É,o-»-4.y.s/¸/´0ù02k263{3}3Å3ž5ã5”6à6_œ7á7á8&99:~:<c<e<­<m>²>;?€?@@…@ AUABQBéB5C¦CëCÕDE.FsFµGúGüGDH[hI­I^JªJ@KŒK:LLqM¶MëP7QåQ*RÖRSUGUXÒXYYžYµZ[Ì[\\[\™(0,next_router.useRouter)¡(0,ToastProvider/* useToast */.p)¥(0,ConfirmProvider/* useConfirm */.N)œ(0,external_react_.useState)ÿÿÿÿÿÿ(0,api/* getCategories */.CP)ž(0,api/* createCategory */.k4)ž(0,api/* deleteCategory */.uu)jsx_runtime_.jsxÿicons/* Icon */.J•(0,jsx_runtime_.jsxs)—AppShell/* default */.Züþ•jsx_runtime_.FragmentýýýûûûýûüûýûûûûüýýýûûûýûüûýûûûûüûûûýýýûûûûüûýýûûýûûûûûýûüH
;// CONCATENATED MODULE: ./node_modules/next/dist/build/webpack/loaders/next-route-loader/index.js?kind=PAGES&page=%2Fcategories&preferredRegion=&absolutePagePath=private-next-pages%2Fcategories.js&absoluteAppPath=private-next-pages%2F_app.js&absoluteDocumentPath=next%2Fdist%2Fpages%2F_document&middlewareConfigBase64=e30%3D!
 ¬ «webpack/lib/util/registerExternalSerializerwebpack-sources/ReplaceSource«webpack/lib/util/registerExternalSerializer™webpack-sources/RawSourceïimport { PagesRouteModule } from "next/dist/server/future/route-modules/pages/module.compiled";
import { RouteKind } from "next/dist/server/future/route-kind";
import { hoist } from "next/dist/build/templates/helpers";
// Import the app and document modules.
import Document from "next/dist/pages/_document";
import App from "private-next-pages/_app.js";
// Import the userland code.
import * as userland from "private-next-pages/categories.js";
// Re-export the component (should be the default export).
export default hoist(userland, "default");
// Re-export methods.
export const getStaticProps = hoist(userland, "getStaticProps");
export const getStaticPaths = hoist(userland, "getStaticPaths");
export const getServerSideProps = hoist(userland, "getServerSideProps");
export const config = hoist(userland, "config");
export const reportWebVitals = hoist(userland, "reportWebVitals");
// Re-export legacy methods.
export const unstable_getStaticProps = hoist(userland, "unstable_getStaticProps");
export const unstable_getStaticPaths = hoist(userland, "unstable_getStaticPaths");
export const unstable_getStaticParams = hoist(userland, "unstable_getStaticParams");
export const unstable_getServerProps = hoist(userland, "unstable_getServerProps");
export const unstable_getServerSideProps = hoist(userland, "unstable_getServerSideProps");
// Create and export the route module that will be consumed.
export const routeModule = new PagesRouteModule({
definition: {
kind: RouteKind.PAGES,
page: "/categories",
pathname: "/categories",
// The following aren't used in production.
bundlePath: "",
filename: ""
},
components: {
App,
Document
},
userland
});
//# sourceMappingURL=pages.js.map c/^`Qž Ù35a¼ùù " @_:@X\^e{Ÿ¦¼ÂÞâäë !(6<UY[bœÁÃÊéï<Bdhjq¸¼¾Åäê|ªÖ¢¡´³ÈÇÁ/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Ï__WEBPACK_MODULE_REFERENCE__2_5b22686f697374225d_call_directImport_asiSafe1__._®__WEBPACK_MODULE_REFERENCE__13_ns_asiSafe1__._);ýþýþýþýþýþýþýþýþýþýþà__WEBPACK_MODULE_REFERENCE__0_5b225061676573526f7574654d6f64756c65225d_directImport_asiSafe1__._Å__WEBPACK_MODULE_REFERENCE__1_5b22526f7574654b696e64225d_asiSafe1__._Ð: __WEBPACK_MODULE_REFERENCE__4_5b2264656661756c74225d_directImport_asiSafe1__._Ð: __WEBPACK_MODULE_REFERENCE__3_5b2264656661756c74225d_directImport_asiSafe1__._°: __WEBPACK_MODULE_REFERENCE__13_ns_asiSafe1__._ãŽ
// Import the app and document modules.
// Import the userland code.
// Re-export the component (should be the default export).
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (__WEBPACK_MODULE_REFERENCE__2_5b22686f697374225d_call_directImport_asiSafe1__._(__WEBPACK_MODULE_REFERENCE__13_ns_asiSafe1__._, "default"));
// Re-export methods.
const getStaticProps = __WEBPACK_MODULE_REFERENCE__2_5b22686f697374225d_call_directImport_asiSafe1__._(__WEBPACK_MODULE_REFERENCE__13_ns_asiSafe1__._, "getStaticProps");
const getStaticPaths = __WEBPACK_MODULE_REFERENCE__2_5b22686f697374225d_call_directImport_asiSafe1__._(__WEBPACK_MODULE_REFERENCE__13_ns_asiSafe1__._, "getStaticPaths");
const getServerSideProps = __WEBPACK_MODULE_REFERENCE__2_5b22686f697374225d_call_directImport_asiSafe1__._(__WEBPACK_MODULE_REFERENCE__13_ns_asiSafe1__._, "getServerSideProps");
const config = __WEBPACK_MODULE_REFERENCE__2_5b22686f697374225d_call_directImport_asiSafe1__._(__WEBPACK_MODULE_REFERENCE__13_ns_asiSafe1__._, "config");
const reportWebVitals = __WEBPACK_MODULE_REFERENCE__2_5b22686f697374225d_call_directImport_asiSafe1__._(__WEBPACK_MODULE_REFERENCE__13_ns_asiSafe1__._, "reportWebVitals");
// Re-export legacy methods.
const unstable_getStaticProps = __WEBPACK_MODULE_REFERENCE__2_5b22686f697374225d_call_directImport_asiSafe1__._(__WEBPACK_MODULE_REFERENCE__13_ns_asiSafe1__._, "unstable_getStaticProps");
const unstable_getStaticPaths = __WEBPACK_MODULE_REFERENCE__2_5b22686f697374225d_call_directImport_asiSafe1__._(__WEBPACK_MODULE_REFERENCE__13_ns_asiSafe1__._, "unstable_getStaticPaths");
const unstable_getStaticParams = __WEBPACK_MODULE_REFERENCE__2_5b22686f697374225d_call_directImport_asiSafe1__._(__WEBPACK_MODULE_REFERENCE__13_ns_asiSafe1__._, "unstable_getStaticParams");
const unstable_getServerProps = __WEBPACK_MODULE_REFERENCE__2_5b22686f697374225d_call_directImport_asiSafe1__._(__WEBPACK_MODULE_REFERENCE__13_ns_asiSafe1__._, "unstable_getServerProps");
const unstable_getServerSideProps = __WEBPACK_MODULE_REFERENCE__2_5b22686f697374225d_call_directImport_asiSafe1__._(__WEBPACK_MODULE_REFERENCE__13_ns_asiSafe1__._, "unstable_getServerSideProps");
// Create and export the route module that will be consumed.
const routeModule = new __WEBPACK_MODULE_REFERENCE__0_5b225061676573526f7574654d6f64756c65225d_directImport_asiSafe1__._({
definition: {
kind: __WEBPACK_MODULE_REFERENCE__1_5b22526f7574654b696e64225d_asiSafe1__._.PAGES,
page: "/categories",
pathname: "/categories",
// The following aren't used in production.
bundlePath: "",
filename: ""
},
components: {
App: __WEBPACK_MODULE_REFERENCE__4_5b2264656661756c74225d_directImport_asiSafe1__._,
Document: __WEBPACK_MODULE_REFERENCE__3_5b2264656661756c74225d_directImport_asiSafe1__._
},
userland: __WEBPACK_MODULE_REFERENCE__13_ns_asiSafe1__._
});
//# sourceMappingURL=pages.js.map äç èïimport { PagesRouteModule } from "next/dist/server/future/route-modules/pages/module.compiled";
import { RouteKind } from "next/dist/server/future/route-kind";
import { hoist } from "next/dist/build/templates/helpers";
// Import the app and document modules.
import Document from "next/dist/pages/_document";
import App from "private-next-pages/_app.js";
// Import the userland code.
import * as userland from "private-next-pages/categories.js";
// Re-export the component (should be the default export).
export default hoist(userland, "default");
// Re-export methods.
export const getStaticProps = hoist(userland, "getStaticProps");
export const getStaticPaths = hoist(userland, "getStaticPaths");
export const getServerSideProps = hoist(userland, "getServerSideProps");
export const config = hoist(userland, "config");
export const reportWebVitals = hoist(userland, "reportWebVitals");
// Re-export legacy methods.
export const unstable_getStaticProps = hoist(userland, "unstable_getStaticProps");
export const unstable_getStaticPaths = hoist(userland, "unstable_getStaticPaths");
export const unstable_getStaticParams = hoist(userland, "unstable_getStaticParams");
export const unstable_getServerProps = hoist(userland, "unstable_getServerProps");
export const unstable_getServerSideProps = hoist(userland, "unstable_getServerSideProps");
// Create and export the route module that will be consumed.
export const routeModule = new PagesRouteModule({
definition: {
kind: RouteKind.PAGES,
page: "/categories",
pathname: "/categories",
// The following aren't used in production.
bundlePath: "",
filename: ""
},
components: {
App,
Document
},
userland
});
//# sourceMappingURL=pages.js.mapú 094undefined96158undefined160217undefined259307undefined309353undefined384444undefined505519/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (undefined505519undefined520524__WEBPACK_MODULE_REFERENCE__2_5b22686f697374225d_call_directImport_asiSafe1__._undefined526533__WEBPACK_MODULE_REFERENCE__13_ns_asiSafe1__._undefined546546.5);undefined570576undefined600604__WEBPACK_MODULE_REFERENCE__2_5b22686f697374225d_call_directImport_asiSafe1__._undefined606613__WEBPACK_MODULE_REFERENCE__13_ns_asiSafe1__._undefined635641undefined665669__WEBPACK_MODULE_REFERENCE__2_5b22686f697374225d_call_directImport_asiSafe1__._undefined671678__WEBPACK_MODULE_REFERENCE__13_ns_asiSafe1__._undefined700706undefined734738__WEBPACK_MODULE_REFERENCE__2_5b22686f697374225d_call_directImport_asiSafe1__._undefined740747__WEBPACK_MODULE_REFERENCE__13_ns_asiSafe1__._undefined773779undefined795799__WEBPACK_MODULE_REFERENCE__2_5b22686f697374225d_call_directImport_asiSafe1__._undefined801808__WEBPACK_MODULE_REFERENCE__13_ns_asiSafe1__._undefined822828undefined853857__WEBPACK_MODULE_REFERENCE__2_5b22686f697374225d_call_directImport_asiSafe1__._undefined859866__WEBPACK_MODULE_REFERENCE__13_ns_asiSafe1__._undefined918924undefined957961__WEBPACK_MODULE_REFERENCE__2_5b22686f697374225d_call_directImport_asiSafe1__._undefined963970__WEBPACK_MODULE_REFERENCE__13_ns_asiSafe1__._undefined10011007undefined10401044__WEBPACK_MODULE_REFERENCE__2_5b22686f697374225d_call_directImport_asiSafe1__._undefined10461053__WEBPACK_MODULE_REFERENCE__13_ns_asiSafe1__._undefined10841090undefined11241128__WEBPACK_MODULE_REFERENCE__2_5b22686f697374225d_call_directImport_asiSafe1__._undefined11301137__WEBPACK_MODULE_REFERENCE__13_ns_asiSafe1__._undefined11691175undefined12081212__WEBPACK_MODULE_REFERENCE__2_5b22686f697374225d_call_directImport_asiSafe1__._undefined12141221__WEBPACK_MODULE_REFERENCE__13_ns_asiSafe1__._undefined12521258undefined12951299__WEBPACK_MODULE_REFERENCE__2_5b22686f697374225d_call_directImport_asiSafe1__._undefined13011308__WEBPACK_MODULE_REFERENCE__13_ns_asiSafe1__._undefined14041410undefined14351450__WEBPACK_MODULE_REFERENCE__0_5b225061676573526f7574654d6f64756c65225d_directImport_asiSafe1__._undefined14861494__WEBPACK_MODULE_REFERENCE__1_5b22526f7574654b696e64225d_asiSafe1__._undefined16981697: __WEBPACK_MODULE_REFERENCE__4_5b2264656661756c74225d_directImport_asiSafe1__._undefined17161715: __WEBPACK_MODULE_REFERENCE__3_5b2264656661756c74225d_directImport_asiSafe1__._undefined17361735: __WEBPACK_MODULE_REFERENCE__13_ns_asiSafe1__._undefined`ÂÇDÏÑþ+y{¨Ù')VÍÏü"prŸóACp¯ýWÿ,lº¼é)wy¦é79fÞ= a ¥ s
À
Õ
" 9 f ònext_route_loaderkind_PAGES_page_2Fcategories_preferredRegion_absolutePagePath_private_next_pages_2Fcategories_js_absoluteAppPath_private_next_pages_2F_app_js_absoluteDocumentPath_next_2Fdist_2Fpages_2F_document_middlewareConfigBase64_e30_3D_˜(0,helpers/* hoist */.l)šcategories_namespaceObjectþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿ module_compiled.PagesRouteModuleroute_kind/* RouteKind */.x_app["default"]•(_document_default())û†buffer†source„size„mapsYþÿÿc// ESM COMPAT FLAG
__webpack_require__.r(__webpack_exports__);
// EXPORTS
__webpack_require__.d(__webpack_exports__, {
config: () => (/* binding */ config),
"default": () => (/* binding */ next_route_loaderkind_PAGES_page_2Fcategories_preferredRegion_absolutePagePath_private_next_pages_2Fcategories_js_absoluteAppPath_private_next_pages_2F_app_js_absoluteDocumentPath_next_2Fdist_2Fpages_2F_document_middlewareConfigBase64_e30_3D_),
getServerSideProps: () => (/* binding */ getServerSideProps),
getStaticPaths: () => (/* binding */ getStaticPaths),
getStaticProps: () => (/* binding */ getStaticProps),
reportWebVitals: () => (/* binding */ reportWebVitals),
routeModule: () => (/* binding */ routeModule),
unstable_getServerProps: () => (/* binding */ unstable_getServerProps),
unstable_getServerSideProps: () => (/* binding */ unstable_getServerSideProps),
unstable_getStaticParams: () => (/* binding */ unstable_getStaticParams),
unstable_getStaticPaths: () => (/* binding */ unstable_getStaticPaths),
unstable_getStaticProps: () => (/* binding */ unstable_getStaticProps)
});
// NAMESPACE OBJECT: ./pages/categories.js
var categories_namespaceObject = {};
__webpack_require__.r(categories_namespaceObject);
__webpack_require__.d(categories_namespaceObject, {
"default": () => (Categories)
});
// EXTERNAL MODULE: ./node_modules/next/dist/server/future/route-modules/pages/module.compiled.js
var module_compiled = __webpack_require__(7093);
// EXTERNAL MODULE: ./node_modules/next/dist/server/future/route-kind.js
var route_kind = __webpack_require__(5244);
// EXTERNAL MODULE: ./node_modules/next/dist/build/templates/helpers.js
var helpers = __webpack_require__(1323);
// EXTERNAL MODULE: ./node_modules/next/dist/pages/_document.js
var _document = __webpack_require__(2899);
var _document_default = /*#__PURE__*/__webpack_require__.n(_document);
// EXTERNAL MODULE: ./pages/_app.js
var _app = __webpack_require__(3414);
// EXTERNAL MODULE: external "react/jsx-runtime"
var jsx_runtime_ = __webpack_require__(997);
// EXTERNAL MODULE: external "react"
var external_react_ = __webpack_require__(6689);
// EXTERNAL MODULE: ./node_modules/next/router.js
var next_router = __webpack_require__(1163);
// EXTERNAL MODULE: ./lib/api.js
var api = __webpack_require__(7751);
// EXTERNAL MODULE: ./components/AppShell.js
var AppShell = __webpack_require__(1712);
// EXTERNAL MODULE: ./components/icons.js
var icons = __webpack_require__(349);
// EXTERNAL MODULE: ./components/ToastProvider.js
var ToastProvider = __webpack_require__(4190);
// EXTERNAL MODULE: ./components/ConfirmProvider.js
var ConfirmProvider = __webpack_require__(4407);
;// CONCATENATED MODULE: ./pages/categories.js
const ICONS = [
"\uD83C\uDF5C",
"\uD83E\uDD58",
"\uD83E\uDD6C",
"\uD83E\uDD69",
"\uD83C\uDF54",
"\uD83C\uDF55",
"☕",
"\uD83C\uDF7A",
"\uD83E\uDDCB",
"\uD83C\uDF4E",
"\uD83C\uDF6A",
"\uD83C\uDF6B",
"\uD83D\uDE97",
"\uD83D\uDE95",
"\uD83D\uDE8C",
"\uD83D\uDE87",
"⛽",
"\uD83D\uDE99",
"\uD83D\uDEF5",
"✈ï¸",
"\uD83D\uDEA2",
"\uD83D\uDED2",
"\uD83D\uDC54",
"\uD83D\uDC55",
"\uD83D\uDC56",
"\uD83D\uDC5F",
"\uD83D\uDC53",
"\uD83E\uDDE2",
"\uD83D\uDC5C",
"\uD83C\uDF92",
"\uD83D\uDC8D",
"\uD83D\uDC84",
"\uD83C\uDFE0",
"\uD83C\uDFE2",
"\uD83C\uDFE6",
"\uD83C\uDFE5",
"\uD83C\uDFE8",
"\uD83C\uDFE9",
"\uD83D\uDD27",
"\uD83D\uDD28",
"\uD83D\uDECBï¸",
"\uD83D\uDCFA",
"\uD83D\uDCBB",
"\uD83D\uDCF1",
"\uD83D\uDCDD",
"\uD83D\uDCB0",
"\uD83C\uDF81",
"\uD83D\uDCC8",
"\uD83E\uDDE7",
"\uD83D\uDCB3",
"\uD83C\uDFAF",
"\uD83D\uDCDA",
"\uD83C\uDFB5",
"\uD83C\uDFAE",
"\uD83C\uDFC3",
"âš½",
"\uD83C\uDFCA",
"\uD83D\uDEB4",
"\uD83C\uDFAD",
"\uD83C\uDFA8",
"\uD83C\uDFAC",
"\uD83D\uDCF7",
"\uD83C\uDFA5",
"\uD83D\uDCFA",
"\uD83E\uDDF8",
"\uD83D\uDC15",
"\uD83D\uDC08",
"\uD83C\uDF38",
"\uD83C\uDF3A"
];
function Categories() {
const router = (0,next_router.useRouter)();
const { showToast } = (0,ToastProvider/* useToast */.p)();
const { confirm } = (0,ConfirmProvider/* useConfirm */.N)();
const [categories, setCategories] = (0,external_react_.useState)({
expense: [],
income: []
});
const [modalOpen, setModalOpen] = (0,external_react_.useState)(false);
const [categoryType, setCategoryType] = (0,external_react_.useState)("expense");
const [loading, setLoading] = (0,external_react_.useState)(true);
const [submitting, setSubmitting] = (0,external_react_.useState)(false);
const [formError, setFormError] = (0,external_react_.useState)("");
const [formData, setFormData] = (0,external_react_.useState)({
name: "",
icon: "\uD83D\uDCDD"
});
null;
const loadCategories = async ()=>{
setLoading(true);
try {
const data = await (0,api/* getCategories */.CP)();
setCategories(data);
} catch (err) {
console.error(err);
showToast(err.message, {
tone: "error"
});
} finally{
setLoading(false);
}
};
const openAddModal = (type)=>{
setCategoryType(type);
setFormData({
name: "",
icon: "\uD83D\uDCDD"
});
setFormError("");
setModalOpen(true);
};
const closeModal = ()=>{
if (submitting) return;
setModalOpen(false);
setFormError("");
};
const handleSubmit = async (e)=>{
e.preventDefault();
if (!formData.name || !formData.icon) {
setFormError("请填写完整信æ¯");
return;
}
setSubmitting(true);
setFormError("");
try {
await (0,api/* createCategory */.k4)({
type: categoryType,
name: formData.name,
icon: formData.icon
});
closeModal();
showToast("分类已创建", {
tone: "success"
});
await loadCategories();
} catch (err) {
setFormError(err.message);
showToast(err.message, {
tone: "error"
});
} finally{
setSubmitting(false);
}
};
const handleDelete = async (id)=>{
const shouldDelete = await confirm({
title: "删除此分类?",
description: "默认分类ä¸å¯åˆ é™¤ï¼Œè‡ªå®šä¹‰åˆ†ç±»åˆ é™¤åŽå°†æ— æ³•æ¢å¤ã€‚",
confirmText: "删除"
});
if (!shouldDelete) return;
try {
await (0,api/* deleteCategory */.uu)(id);
showToast("分类已删除", {
tone: "success"
});
await loadCategories();
} catch (err) {
showToast(err.message, {
tone: "error"
});
}
};
const actions = /*#__PURE__*/ jsx_runtime_.jsx("button", {
type: "button",
className: "icon-button",
"aria-label": "设置",
onClick: ()=>router.push("/settings"),
children: /*#__PURE__*/ jsx_runtime_.jsx(icons/* Icon */.J, {
name: "settings",
size: 18
})
});
return /*#__PURE__*/ (0,jsx_runtime_.jsxs)(AppShell/* default */.Z, {
title: "分类",
subtitle: "æ•´ç†å¸¸ç”¨åˆ†ç±»ä¸Žå›¾æ ‡",
actions: actions,
compactHeader: true,
children: [
loading ? /*#__PURE__*/ jsx_runtime_.jsx("div", {
className: "card loading-state",
children: "加载中..."
}) : /*#__PURE__*/ (0,jsx_runtime_.jsxs)(jsx_runtime_.Fragment, {
children: [
/*#__PURE__*/ (0,jsx_runtime_.jsxs)("section", {
className: "card category-section category-section--refresh",
children: [
/*#__PURE__*/ (0,jsx_runtime_.jsxs)("div", {
className: "section-header",
children: [
/*#__PURE__*/ (0,jsx_runtime_.jsxs)("div", {
children: [
/*#__PURE__*/ jsx_runtime_.jsx("p", {
className: "eyebrow",
children: "支出分类"
}),
/*#__PURE__*/ jsx_runtime_.jsx("h2", {
children: "支出"
})
]
}),
/*#__PURE__*/ jsx_runtime_.jsx("button", {
type: "button",
className: "btn btn-secondary btn-inline",
onClick: ()=>openAddModal("expense"),
children: /*#__PURE__*/ (0,jsx_runtime_.jsxs)("span", {
className: "button-content",
children: [
/*#__PURE__*/ jsx_runtime_.jsx(icons/* Icon */.J, {
name: "plus",
size: 16
}),
"添加"
]
})
})
]
}),
/*#__PURE__*/ jsx_runtime_.jsx("div", {
className: "category-list category-list--chips",
children: categories.expense.map((cat)=>/*#__PURE__*/ (0,jsx_runtime_.jsxs)("div", {
className: "category-tag",
children: [
/*#__PURE__*/ jsx_runtime_.jsx("span", {
className: "cat-icon",
children: cat.icon
}),
/*#__PURE__*/ jsx_runtime_.jsx("span", {
className: "cat-name",
children: cat.name
}),
!cat.is_default && /*#__PURE__*/ jsx_runtime_.jsx("button", {
type: "button",
className: "icon-button icon-button--ghost cat-delete",
"aria-label": `删除${cat.name}`,
onClick: ()=>handleDelete(cat.id),
children: /*#__PURE__*/ jsx_runtime_.jsx(icons/* Icon */.J, {
name: "close",
size: 14
})
})
]
}, cat.id || cat.name))
})
]
}),
/*#__PURE__*/ (0,jsx_runtime_.jsxs)("section", {
className: "card category-section category-section--refresh",
children: [
/*#__PURE__*/ (0,jsx_runtime_.jsxs)("div", {
className: "section-header",
children: [
/*#__PURE__*/ (0,jsx_runtime_.jsxs)("div", {
children: [
/*#__PURE__*/ jsx_runtime_.jsx("p", {
className: "eyebrow",
children: "收入分类"
}),
/*#__PURE__*/ jsx_runtime_.jsx("h2", {
children: "æ”¶å…¥"
})
]
}),
/*#__PURE__*/ jsx_runtime_.jsx("button", {
type: "button",
className: "btn btn-secondary btn-inline",
onClick: ()=>openAddModal("income"),
children: /*#__PURE__*/ (0,jsx_runtime_.jsxs)("span", {
className: "button-content",
children: [
/*#__PURE__*/ jsx_runtime_.jsx(icons/* Icon */.J, {
name: "plus",
size: 16
}),
"添加"
]
})
})
]
}),
/*#__PURE__*/ jsx_runtime_.jsx("div", {
className: "category-list category-list--chips",
children: categories.income.map((cat)=>/*#__PURE__*/ (0,jsx_runtime_.jsxs)("div", {
className: "category-tag",
children: [
/*#__PURE__*/ jsx_runtime_.jsx("span", {
className: "cat-icon",
children: cat.icon
}),
/*#__PURE__*/ jsx_runtime_.jsx("span", {
className: "cat-name",
children: cat.name
}),
!cat.is_default && /*#__PURE__*/ jsx_runtime_.jsx("button", {
type: "button",
className: "icon-button icon-button--ghost cat-delete",
"aria-label": `删除${cat.name}`,
onClick: ()=>handleDelete(cat.id),
children: /*#__PURE__*/ jsx_runtime_.jsx(icons/* Icon */.J, {
name: "close",
size: 14
})
})
]
}, cat.id || cat.name))
})
]
}),
/*#__PURE__*/ jsx_runtime_.jsx("div", {
className: "card category-tip category-tip--refresh",
children: /*#__PURE__*/ jsx_runtime_.jsx("p", {
children: "默认分类无法删除,自定义分类å¯ä»¥åˆ é™¤ã€‚"
})
})
]
}),
modalOpen && /*#__PURE__*/ jsx_runtime_.jsx("div", {
className: "modal-overlay",
onClick: closeModal,
children: /*#__PURE__*/ (0,jsx_runtime_.jsxs)("div", {
className: "modal",
onClick: (e)=>e.stopPropagation(),
children: [
/*#__PURE__*/ (0,jsx_runtime_.jsxs)("div", {
className: "modal-header",
children: [
/*#__PURE__*/ (0,jsx_runtime_.jsxs)("div", {
children: [
/*#__PURE__*/ jsx_runtime_.jsx("p", {
className: "eyebrow",
children: "新增分类"
}),
/*#__PURE__*/ jsx_runtime_.jsx("h2", {
children: categoryType === "expense" ? "新建支出分类" : "新建收入分类"
})
]
}),
/*#__PURE__*/ jsx_runtime_.jsx("button", {
type: "button",
className: "icon-button icon-button--ghost",
"aria-label": "关闭弹窗",
onClick: closeModal,
children: /*#__PURE__*/ jsx_runtime_.jsx(icons/* Icon */.J, {
name: "close",
size: 18
})
})
]
}),
formError && /*#__PURE__*/ jsx_runtime_.jsx("div", {
className: "error-msg",
children: formError
}),
/*#__PURE__*/ (0,jsx_runtime_.jsxs)("form", {
onSubmit: handleSubmit,
children: [
/*#__PURE__*/ (0,jsx_runtime_.jsxs)("div", {
className: "form-group",
children: [
/*#__PURE__*/ jsx_runtime_.jsx("label", {
htmlFor: "category-name",
children: "分类åç§°"
}),
/*#__PURE__*/ jsx_runtime_.jsx("input", {
id: "category-name",
type: "text",
value: formData.name,
onChange: (e)=>setFormData({
...formData,
name: e.target.value
}),
placeholder: "请输入分类åç§°",
required: true,
disabled: submitting
})
]
}),
/*#__PURE__*/ (0,jsx_runtime_.jsxs)("div", {
className: "form-group",
children: [
/*#__PURE__*/ jsx_runtime_.jsx("label", {
children: "选择图标"
}),
/*#__PURE__*/ jsx_runtime_.jsx("div", {
className: "icon-grid",
style: {
display: "grid",
gridTemplateColumns: "repeat(8, minmax(0, 1fr))",
gap: "8px"
},
children: ICONS.map((icon)=>/*#__PURE__*/ jsx_runtime_.jsx("button", {
type: "button",
className: `icon-btn ${formData.icon === icon ? "active" : ""}`,
onClick: ()=>setFormData({
...formData,
icon
}),
disabled: submitting,
children: icon
}, icon))
})
]
}),
/*#__PURE__*/ jsx_runtime_.jsx("div", {
className: "modal-actions",
children: /*#__PURE__*/ jsx_runtime_.jsx("button", {
type: "submit",
className: "btn btn-primary",
disabled: submitting,
children: submitting ? /*#__PURE__*/ (0,jsx_runtime_.jsxs)("span", {
className: "button-content",
children: [
/*#__PURE__*/ jsx_runtime_.jsx(icons/* Icon */.J, {
name: "spinner",
size: 16,
className: "is-spinning"
}),
"ä¿å­˜ä¸­..."
]
}) : "ä¿å­˜"
})
})
]
})
]
})
})
]
});
}
;// CONCATENATED MODULE: ./node_modules/next/dist/build/webpack/loaders/next-route-loader/index.js?kind=PAGES&page=%2Fcategories&preferredRegion=&absolutePagePath=private-next-pages%2Fcategories.js&absoluteAppPath=private-next-pages%2F_app.js&absoluteDocumentPath=next%2Fdist%2Fpages%2F_document&middlewareConfigBase64=e30%3D!
// Import the app and document modules.
// Import the userland code.
// Re-export the component (should be the default export).
/* harmony default export */ const next_route_loaderkind_PAGES_page_2Fcategories_preferredRegion_absolutePagePath_private_next_pages_2Fcategories_js_absoluteAppPath_private_next_pages_2F_app_js_absoluteDocumentPath_next_2Fdist_2Fpages_2F_document_middlewareConfigBase64_e30_3D_ = ((0,helpers/* hoist */.l)(categories_namespaceObject, "default"));
// Re-export methods.
const getStaticProps = (0,helpers/* hoist */.l)(categories_namespaceObject, "getStaticProps");
const getStaticPaths = (0,helpers/* hoist */.l)(categories_namespaceObject, "getStaticPaths");
const getServerSideProps = (0,helpers/* hoist */.l)(categories_namespaceObject, "getServerSideProps");
const config = (0,helpers/* hoist */.l)(categories_namespaceObject, "config");
const reportWebVitals = (0,helpers/* hoist */.l)(categories_namespaceObject, "reportWebVitals");
// Re-export legacy methods.
const unstable_getStaticProps = (0,helpers/* hoist */.l)(categories_namespaceObject, "unstable_getStaticProps");
const unstable_getStaticPaths = (0,helpers/* hoist */.l)(categories_namespaceObject, "unstable_getStaticPaths");
const unstable_getStaticParams = (0,helpers/* hoist */.l)(categories_namespaceObject, "unstable_getStaticParams");
const unstable_getServerProps = (0,helpers/* hoist */.l)(categories_namespaceObject, "unstable_getServerProps");
const unstable_getServerSideProps = (0,helpers/* hoist */.l)(categories_namespaceObject, "unstable_getServerSideProps");
// Create and export the route module that will be consumed.
const routeModule = new module_compiled.PagesRouteModule({
definition: {
kind: route_kind/* RouteKind */.x.PAGES,
page: "/categories",
pathname: "/categories",
// The following aren't used in production.
bundlePath: "",
filename: ""
},
components: {
App: _app["default"],
Document: (_document_default())
},
userland: categories_namespaceObject
});
//# sourceMappingURL=pages.js.map ”{"finalSource":true}ƒmapbufferedMap `
ConcatSourceRawSource
// ESM COMPAT FLAG
__webpack_require__.r(__webpack_exports__);
// EXPORTS
__webpack_require__.d(__webpack_exports__, {
config: () => (/* binding */ config),
"default": () => (/* binding */ next_route_loaderkind_PAGES_page_2Fcategories_preferredRegion_absolutePagePath_private_next_pages_2Fcategories_js_absoluteAppPath_private_next_pages_2F_app_js_absoluteDocumentPath_next_2Fdist_2Fpages_2F_document_middlewareConfigBase64_e30_3D_),
getServerSideProps: () => (/* binding */ getServerSideProps),
getStaticPaths: () => (/* binding */ getStaticPaths),
getStaticProps: () => (/* binding */ getStaticProps),
reportWebVitals: () => (/* binding */ reportWebVitals),
routeModule: () => (/* binding */ routeModule),
unstable_getServerProps: () => (/* binding */ unstable_getServerProps),
unstable_getServerSideProps: () => (/* binding */ unstable_getServerSideProps),
unstable_getStaticParams: () => (/* binding */ unstable_getStaticParams),
unstable_getStaticPaths: () => (/* binding */ unstable_getStaticPaths),
unstable_getStaticProps: () => (/* binding */ unstable_getStaticProps)
});
// NAMESPACE OBJECT: ./pages/categories.js
var categories_namespaceObject = {};
__webpack_require__.r(categories_namespaceObject);
__webpack_require__.d(categories_namespaceObject, {
"default": () => (Categories)
});
// EXTERNAL MODULE: ./node_modules/next/dist/server/future/route-modules/pages/module.compiled.js
var module_compiled = __webpack_require__(7093);
// EXTERNAL MODULE: ./node_modules/next/dist/server/future/route-kind.js
var route_kind = __webpack_require__(5244);
// EXTERNAL MODULE: ./node_modules/next/dist/build/templates/helpers.js
var helpers = __webpack_require__(1323);
// EXTERNAL MODULE: ./node_modules/next/dist/pages/_document.js
var _document = __webpack_require__(2899);
var _document_default = /*#__PURE__*/__webpack_require__.n(_document);
// EXTERNAL MODULE: ./pages/_app.js
var _app = __webpack_require__(3414);
// EXTERNAL MODULE: external "react/jsx-runtime"
var jsx_runtime_ = __webpack_require__(997);
// EXTERNAL MODULE: external "react"
var external_react_ = __webpack_require__(6689);
// EXTERNAL MODULE: ./node_modules/next/router.js
var next_router = __webpack_require__(1163);
// EXTERNAL MODULE: ./lib/api.js
var api = __webpack_require__(7751);
// EXTERNAL MODULE: ./components/AppShell.js
var AppShell = __webpack_require__(1712);
// EXTERNAL MODULE: ./components/icons.js
var icons = __webpack_require__(349);
// EXTERNAL MODULE: ./components/ToastProvider.js
var ToastProvider = __webpack_require__(4190);
// EXTERNAL MODULE: ./components/ConfirmProvider.js
var ConfirmProvider = __webpack_require__(4407);
;// CONCATENATED MODULE: ./pages/categories.js

ReplaceSourceReplaceSourceRawSourceiþÿÿæ085undefined87130undefined132171undefined173259undefined261306undefined308350undefined352406undefined408466undefined18241838undefined18821890__WEBPACK_MODULE_REFERENCE__7_5b22757365526f75746572225d_call_directImport_asiSafe1__._undefined19211928__WEBPACK_MODULE_REFERENCE__11_5b22757365546f617374225d_call_directImport_asiSafe1__._undefined19571966__WEBPACK_MODULE_REFERENCE__12_5b22757365436f6e6669726d225d_call_directImport_asiSafe1__._undefined20112018__WEBPACK_MODULE_REFERENCE__6_5b227573655374617465225d_call_directImport_asiSafe1__._undefined21082115__WEBPACK_MODULE_REFERENCE__6_5b227573655374617465225d_call_directImport_asiSafe1__._undefined21692176__WEBPACK_MODULE_REFERENCE__6_5b227573655374617465225d_call_directImport_asiSafe1__._undefined22242231__WEBPACK_MODULE_REFERENCE__6_5b227573655374617465225d_call_directImport_asiSafe1__._undefined22802287__WEBPACK_MODULE_REFERENCE__6_5b227573655374617465225d_call_directImport_asiSafe1__._undefined23352342__WEBPACK_MODULE_REFERENCE__6_5b227573655374617465225d_call_directImport_asiSafe1__._undefined23852392__WEBPACK_MODULE_REFERENCE__6_5b227573655374617465225d_call_directImport_asiSafe1__._undefined25712583__WEBPACK_MODULE_REFERENCE__8_5b2267657443617465676f72696573225d_call_directImport_asiSafe1__._undefined34343447__WEBPACK_MODULE_REFERENCE__8_5b2263726561746543617465676f7279225d_call_directImport_asiSafe1__._undefined42094222__WEBPACK_MODULE_REFERENCE__8_5b2264656c65746543617465676f7279225d_call_directImport_asiSafe1__._undefined45044507__WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._undefined46864689__WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._undefined46914694__WEBPACK_MODULE_REFERENCE__10_5b2249636f6e225d_directImport_asiSafe1__._undefined47944798__WEBPACK_MODULE_REFERENCE__5_5b226a737873225d_call_directImport_asiSafe1__._undefined48004807__WEBPACK_MODULE_REFERENCE__9_5b2264656661756c74225d_directImport_asiSafe1__._undefined49754978__WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._undefined51045108__WEBPACK_MODULE_REFERENCE__5_5b226a737873225d_call_directImport_asiSafe1__._undefined51105118__WEBPACK_MODULE_REFERENCE__5_5b22467261676d656e74225d_directImport_asiSafe1__._undefined51855189__WEBPACK_MODULE_REFERENCE__5_5b226a737873225d_call_directImport_asiSafe1__._undefined53685372__WEBPACK_MODULE_REFERENCE__5_5b226a737873225d_call_directImport_asiSafe1__._undefined55385542__WEBPACK_MODULE_REFERENCE__5_5b226a737873225d_call_directImport_asiSafe1__._undefined56635666__WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._undefined59165919__WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._undefined61716174__WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._undefined64696473__WEBPACK_MODULE_REFERENCE__5_5b226a737873225d_call_directImport_asiSafe1__._undefined66766679__WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._undefined66816684__WEBPACK_MODULE_REFERENCE__10_5b2249636f6e225d_directImport_asiSafe1__._undefined71577160__WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._undefined73387342__WEBPACK_MODULE_REFERENCE__5_5b226a737873225d_call_directImport_asiSafe1__._undefined75307533__WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._undefined77897792__WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._undefined80678070__WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._undefined84868489__WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._undefined84918494__WEBPACK_MODULE_REFERENCE__10_5b2249636f6e225d_directImport_asiSafe1__._undefined89428946__WEBPACK_MODULE_REFERENCE__5_5b226a737873225d_call_directImport_asiSafe1__._undefined91259129__WEBPACK_MODULE_REFERENCE__5_5b226a737873225d_call_directImport_asiSafe1__._undefined92959299__WEBPACK_MODULE_REFERENCE__5_5b226a737873225d_call_directImport_asiSafe1__._undefined94209423__WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._undefined967396
;// CONCATENATED MODULE: ./node_modules/next/dist/build/webpack/loaders/next-route-loader/index.js?kind=PAGES&page=%2Fcategories&preferredRegion=&absolutePagePath=private-next-pages%2Fcategories.js&absoluteAppPath=private-next-pages%2F_app.js&absoluteDocumentPath=next%2Fdist%2Fpages%2F_document&middlewareConfigBase64=e30%3D!
ûüïimport { PagesRouteModule } from "next/dist/server/future/route-modules/pages/module.compiled";
import { RouteKind } from "next/dist/server/future/route-kind";
import { hoist } from "next/dist/build/templates/helpers";
// Import the app and document modules.
import Document from "next/dist/pages/_document";
import App from "private-next-pages/_app.js";
// Import the userland code.
import * as userland from "private-next-pages/categories.js";
// Re-export the component (should be the default export).
export default hoist(userland, "default");
// Re-export methods.
export const getStaticProps = hoist(userland, "getStaticProps");
export const getStaticPaths = hoist(userland, "getStaticPaths");
export const getServerSideProps = hoist(userland, "getServerSideProps");
export const config = hoist(userland, "config");
export const reportWebVitals = hoist(userland, "reportWebVitals");
// Re-export legacy methods.
export const unstable_getStaticProps = hoist(userland, "unstable_getStaticProps");
export const unstable_getStaticPaths = hoist(userland, "unstable_getStaticPaths");
export const unstable_getStaticParams = hoist(userland, "unstable_getStaticParams");
export const unstable_getServerProps = hoist(userland, "unstable_getServerProps");
export const unstable_getServerSideProps = hoist(userland, "unstable_getServerSideProps");
// Create and export the route module that will be consumed.
export const routeModule = new PagesRouteModule({
definition: {
kind: RouteKind.PAGES,
page: "/categories",
pathname: "/categories",
// The following aren't used in production.
bundlePath: "",
filename: ""
},
components: {
App,
Document
},
userland
});
//# sourceMappingURL=pages.js.mapú 094undefined96158undefined160217undefined259307undefined309353undefined384444undefined505519/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (undefined505519undefined520524__WEBPACK_MODULE_REFERENCE__2_5b22686f697374225d_call_directImport_asiSafe1__._undefined526533__WEBPACK_MODULE_REFERENCE__13_ns_asiSafe1__._undefined546546.5);undefined570576undefined600604__WEBPACK_MODULE_REFERENCE__2_5b22686f697374225d_call_directImport_asiSafe1__._undefined606613__WEBPACK_MODULE_REFERENCE__13_ns_asiSafe1__._undefined635641undefined665669__WEBPACK_MODULE_REFERENCE__2_5b22686f697374225d_call_directImport_asiSafe1__._undefined671678__WEBPACK_MODULE_REFERENCE__13_ns_asiSafe1__._undefined700706undefined734738__WEBPACK_MODULE_REFERENCE__2_5b22686f697374225d_call_directImport_asiSafe1__._undefined740747__WEBPACK_MODULE_REFERENCE__13_ns_asiSafe1__._undefined773779undefined795799__WEBPACK_MODULE_REFERENCE__2_5b22686f697374225d_call_directImport_asiSafe1__._undefined801808__WEBPACK_MODULE_REFERENCE__13_ns_asiSafe1__._undefined822828undefined853857__WEBPACK_MODULE_REFERENCE__2_5b22686f697374225d_call_directImport_asiSafe1__._undefined859866__WEBPACK_MODULE_REFERENCE__13_ns_asiSafe1__._undefined918924undefined957961__WEBPACK_MODULE_REFERENCE__2_5b22686f697374225d_call_directImport_asiSafe1__._undefined963970__WEBPACK_MODULE_REFERENCE__13_ns_asiSafe1__._undefined10011007undefined10401044__WEBPACK_MODULE_REFERENCE__2_5b22686f697374225d_call_directImport_asiSafe1__._undefined10461053__WEBPACK_MODULE_REFERENCE__13_ns_asiSafe1__._undefined10841090undefined11241128__WEBPACK_MODULE_REFERENCE__2_5b22686f697374225d_call_directImport_asiSafe1__._undefined11301137__WEBPACK_MODULE_REFERENCE__13_ns_asiSafe1__._undefined11691175undefined12081212__WEBPACK_MODULE_REFERENCE__2_5b22686f697374225d_call_directImport_asiSafe1__._undefined12141221__WEBPACK_MODULE_REFERENCE__13_ns_asiSafe1__._undefined12521258undefined12951299__WEBPACK_MODULE_REFERENCE__2_5b22686f697374225d_call_directImport_asiSafe1__._undefined13011308__WEBPACK_MODULE_REFERENCE__13_ns_asiSafe1__._undefined14041410undefined14351450__WEBPACK_MODULE_REFERENCE__0_5b225061676573526f7574654d6f64756c65225d_directImport_asiSafe1__._undefined14861494__WEBPACK_MODULE_REFERENCE__1_5b22526f7574654b696e64225d_asiSafe1__._undefined16981697: __WEBPACK_MODULE_REFERENCE__4_5b2264656661756c74225d_directImport_asiSafe1__._undefined17161715: __WEBPACK_MODULE_REFERENCE__3_5b2264656661756c74225d_directImport_asiSafe1__._undefined17361735: __WEBPACK_MODULE_REFERENCE__13_ns_asiSafe1__._undefinedX169194next_route_loaderkind_PAGES_page_2Fcategories_preferredRegion_absolutePagePath_private_next_pages_2Fcategories_js_absoluteAppPath_private_next_pages_2F_app_js_absoluteDocumentPath_next_2Fdist_2Fpages_2F_document_middlewareConfigBase64_e30_3D_undefined199277(0,helpers/* hoist */.l)undefined279324categories_namespaceObjectundefined385463(0,helpers/* hoist */.l)undefined465510categories_namespaceObjectundefined555633(0,helpers/* hoist */.l)undefined635680categories_namespaceObjectundefined729807(0,helpers/* hoist */.l)undefined809854categories_namespaceObjectundefined895973(0,helpers/* hoist */.l)undefined9751020categories_namespaceObjectundefined10581136(0,helpers/* hoist */.l)undefined11381183categories_namespaceObjectundefined12671345(0,helpers/* hoist */.l)undefined13471392categories_namespaceObjectundefined14551533(0,helpers/* hoist */.l)undefined15351580categories_namespaceObjectundefined16441722(0,helpers/* hoist */.l)undefined17241769categories_namespaceObjectundefined18331911(0,helpers/* hoist */.l)undefined19131958categories_namespaceObjectundefined20252103(0,helpers/* hoist */.l)undefined21052150categories_namespaceObjectundefined22702365module_compiled.PagesRouteModuleundefined24012469route_kind/* RouteKind */.xundefined26752752_app["default"]undefined27732850(_document_default())undefined28732918categories_namespaceObjectundefined~þÿÿ
`)module_compiledŸmodule_compiled_namespaceObject—module_compiled_defaultŠroute_kindšroute_kind_namespaceObject‡helpers—helpers_namespaceObject‰_document™_document_namespaceObject_document_default„_appŒjsx_runtime_jsx_runtime_namespaceObject“jsx_runtime_defaultexternal_react_žexternal_react_namespaceObjectexternal_react_defaultnext_routerrouter_namespaceObjectŽrouter_defaultƒapiôþÿÿ…iconsToastProviderConfirmProviderpþÿÿrþÿÿšcategories_namespaceObjectònext_route_loaderkind_PAGES_page_2Fcategories_preferredRegion_absolutePagePath_private_next_pages_2Fcategories_js_absoluteAppPath_private_next_pages_2F_app_js_absoluteDocumentPath_next_2Fdist_2Fpages_2F_document_middlewareConfigBase64_e30_3D_ŽgetStaticPropsŽgetStaticPathsgetServerSideProps†configreportWebVitals—unstable_getStaticProps—unstable_getStaticPaths˜unstable_getStaticParams—unstable_getServerPropsunstable_getServerSidePropsrouteModulenext_route_loaderkind_PAGES_page_2Fcategories_preferredRegion_absolutePagePath_private_next_pages_2Fcategories_js_absoluteAppPath_private_next_pages_2F_app_js_absoluteDocumentPath_next_2Fdist_2Fpages_2F_document_middlewareConfigBase64_e30_3D_namespaceObject
•__webpack_require__.r^þÿÿ•__webpack_require__.d“__webpack_require__•__webpack_require__.n Šd«webpack/lib/util/registerExternalSerializerœwebpack-sources/ConcatSource`«webpack/lib/util/registerExternalSerializer™webpack-sources/RawSourceu"use strict";
(() => {
var exports = {};
exports.id = 161;
exports.ids = [161,660];
exports.modules = {
/***/ 3686:
«webpack/lib/util/registerExternalSerializerœwebpack-sources/CachedSource ÊW«webpack/lib/util/registerExternalSerializerœwebpack-sources/ConcatSource«webpack/lib/util/registerExternalSerializer™webpack-sources/RawSourceQ/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
«webpack/lib/util/registerExternalSerializerœwebpack-sources/CachedSource h[«webpack/lib/util/registerExternalSerializerœwebpack-sources/ConcatSource«webpack/lib/util/registerExternalSerializer™webpack-sources/RawSource
// ESM COMPAT FLAG
__webpack_require__.r(__webpack_exports__);
// EXPORTS
__webpack_require__.d(__webpack_exports__, {
config: () => (/* binding */ config),
"default": () => (/* binding */ next_route_loaderkind_PAGES_page_2Fcategories_preferredRegion_absolutePagePath_private_next_pages_2Fcategories_js_absoluteAppPath_private_next_pages_2F_app_js_absoluteDocumentPath_next_2Fdist_2Fpages_2F_document_middlewareConfigBase64_e30_3D_),
getServerSideProps: () => (/* binding */ getServerSideProps),
getStaticPaths: () => (/* binding */ getStaticPaths),
getStaticProps: () => (/* binding */ getStaticProps),
reportWebVitals: () => (/* binding */ reportWebVitals),
routeModule: () => (/* binding */ routeModule),
unstable_getServerProps: () => (/* binding */ unstable_getServerProps),
unstable_getServerSideProps: () => (/* binding */ unstable_getServerSideProps),
unstable_getStaticParams: () => (/* binding */ unstable_getStaticParams),
unstable_getStaticPaths: () => (/* binding */ unstable_getStaticPaths),
unstable_getStaticProps: () => (/* binding */ unstable_getStaticProps)
});
// NAMESPACE OBJECT: ./pages/categories.js
var categories_namespaceObject = {};
__webpack_require__.r(categories_namespaceObject);
__webpack_require__.d(categories_namespaceObject, {
"default": () => (Categories)
});
// EXTERNAL MODULE: ./node_modules/next/dist/server/future/route-modules/pages/module.compiled.js
var module_compiled = __webpack_require__(7093);
// EXTERNAL MODULE: ./node_modules/next/dist/server/future/route-kind.js
var route_kind = __webpack_require__(5244);
// EXTERNAL MODULE: ./node_modules/next/dist/build/templates/helpers.js
var helpers = __webpack_require__(1323);
// EXTERNAL MODULE: ./node_modules/next/dist/pages/_document.js
var _document = __webpack_require__(2899);
var _document_default = /*#__PURE__*/__webpack_require__.n(_document);
// EXTERNAL MODULE: ./pages/_app.js
var _app = __webpack_require__(3414);
// EXTERNAL MODULE: external "react/jsx-runtime"
var jsx_runtime_ = __webpack_require__(997);
// EXTERNAL MODULE: external "react"
var external_react_ = __webpack_require__(6689);
// EXTERNAL MODULE: ./node_modules/next/router.js
var next_router = __webpack_require__(1163);
// EXTERNAL MODULE: ./lib/api.js
var api = __webpack_require__(7751);
// EXTERNAL MODULE: ./components/AppShell.js
var AppShell = __webpack_require__(1712);
// EXTERNAL MODULE: ./components/icons.js
var icons = __webpack_require__(349);
// EXTERNAL MODULE: ./components/ToastProvider.js
var ToastProvider = __webpack_require__(4190);
// EXTERNAL MODULE: ./components/ConfirmProvider.js
var ConfirmProvider = __webpack_require__(4407);
;// CONCATENATED MODULE: ./pages/categories.js
«webpack/lib/util/registerExternalSerializerwebpack-sources/ReplaceSource«webpack/lib/util/registerExternalSerializerœwebpack-sources/CachedSource ºT«webpack/lib/util/registerExternalSerializerwebpack-sources/ReplaceSource«webpack/lib/util/registerExternalSerializer™webpack-sources/RawSource€Limport { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
import { useState, useEffect } from "react";
import { useRouter } from "next/router";
import { isLoggedIn, getCategories, createCategory, deleteCategory } from "../lib/api";
import AppShell from "../components/AppShell";
import { Icon } from "../components/icons";
import { useToast } from "../components/ToastProvider";
import { useConfirm } from "../components/ConfirmProvider";
const ICONS = [
"\uD83C\uDF5C",
"\uD83E\uDD58",
"\uD83E\uDD6C",
"\uD83E\uDD69",
"\uD83C\uDF54",
"\uD83C\uDF55",
"☕",
"\uD83C\uDF7A",
"\uD83E\uDDCB",
"\uD83C\uDF4E",
"\uD83C\uDF6A",
"\uD83C\uDF6B",
"\uD83D\uDE97",
"\uD83D\uDE95",
"\uD83D\uDE8C",
"\uD83D\uDE87",
"⛽",
"\uD83D\uDE99",
"\uD83D\uDEF5",
"✈ï¸",
"\uD83D\uDEA2",
"\uD83D\uDED2",
"\uD83D\uDC54",
"\uD83D\uDC55",
"\uD83D\uDC56",
"\uD83D\uDC5F",
"\uD83D\uDC53",
"\uD83E\uDDE2",
"\uD83D\uDC5C",
"\uD83C\uDF92",
"\uD83D\uDC8D",
"\uD83D\uDC84",
"\uD83C\uDFE0",
"\uD83C\uDFE2",
"\uD83C\uDFE6",
"\uD83C\uDFE5",
"\uD83C\uDFE8",
"\uD83C\uDFE9",
"\uD83D\uDD27",
"\uD83D\uDD28",
"\uD83D\uDECBï¸",
"\uD83D\uDCFA",
"\uD83D\uDCBB",
"\uD83D\uDCF1",
"\uD83D\uDCDD",
"\uD83D\uDCB0",
"\uD83C\uDF81",
"\uD83D\uDCC8",
"\uD83E\uDDE7",
"\uD83D\uDCB3",
"\uD83C\uDFAF",
"\uD83D\uDCDA",
"\uD83C\uDFB5",
"\uD83C\uDFAE",
"\uD83C\uDFC3",
"âš½",
"\uD83C\uDFCA",
"\uD83D\uDEB4",
"\uD83C\uDFAD",
"\uD83C\uDFA8",
"\uD83C\uDFAC",
"\uD83D\uDCF7",
"\uD83C\uDFA5",
"\uD83D\uDCFA",
"\uD83E\uDDF8",
"\uD83D\uDC15",
"\uD83D\uDC08",
"\uD83C\uDF38",
"\uD83C\uDF3A"
];
export default function Categories() {
const router = useRouter();
const { showToast } = useToast();
const { confirm } = useConfirm();
const [categories, setCategories] = useState({
expense: [],
income: []
});
const [modalOpen, setModalOpen] = useState(false);
const [categoryType, setCategoryType] = useState("expense");
const [loading, setLoading] = useState(true);
const [submitting, setSubmitting] = useState(false);
const [formError, setFormError] = useState("");
const [formData, setFormData] = useState({
name: "",
icon: "\uD83D\uDCDD"
});
null;
const loadCategories = async ()=>{
setLoading(true);
try {
const data = await getCategories();
setCategories(data);
} catch (err) {
console.error(err);
showToast(err.message, {
tone: "error"
});
} finally{
setLoading(false);
}
};
const openAddModal = (type)=>{
setCategoryType(type);
setFormData({
name: "",
icon: "\uD83D\uDCDD"
});
setFormError("");
setModalOpen(true);
};
const closeModal = ()=>{
if (submitting) return;
setModalOpen(false);
setFormError("");
};
const handleSubmit = async (e)=>{
e.preventDefault();
if (!formData.name || !formData.icon) {
setFormError("请填写完整信æ¯");
return;
}
setSubmitting(true);
setFormError("");
try {
await createCategory({
type: categoryType,
name: formData.name,
icon: formData.icon
});
closeModal();
showToast("分类已创建", {
tone: "success"
});
await loadCategories();
} catch (err) {
setFormError(err.message);
showToast(err.message, {
tone: "error"
});
} finally{
setSubmitting(false);
}
};
const handleDelete = async (id)=>{
const shouldDelete = await confirm({
title: "删除此分类?",
description: "默认分类ä¸å¯åˆ é™¤ï¼Œè‡ªå®šä¹‰åˆ†ç±»åˆ é™¤åŽå°†æ— æ³•æ¢å¤ã€‚",
confirmText: "删除"
});
if (!shouldDelete) return;
try {
await deleteCategory(id);
showToast("分类已删除", {
tone: "success"
});
await loadCategories();
} catch (err) {
showToast(err.message, {
tone: "error"
});
}
};
const actions = /*#__PURE__*/ _jsx("button", {
type: "button",
className: "icon-button",
"aria-label": "设置",
onClick: ()=>router.push("/settings"),
children: /*#__PURE__*/ _jsx(Icon, {
name: "settings",
size: 18
})
});
return /*#__PURE__*/ _jsxs(AppShell, {
title: "分类",
subtitle: "æ•´ç†å¸¸ç”¨åˆ†ç±»ä¸Žå›¾æ ‡",
actions: actions,
compactHeader: true,
children: [
loading ? /*#__PURE__*/ _jsx("div", {
className: "card loading-state",
children: "加载中..."
}) : /*#__PURE__*/ _jsxs(_Fragment, {
children: [
/*#__PURE__*/ _jsxs("section", {
className: "card category-section category-section--refresh",
children: [
/*#__PURE__*/ _jsxs("div", {
className: "section-header",
children: [
/*#__PURE__*/ _jsxs("div", {
children: [
/*#__PURE__*/ _jsx("p", {
className: "eyebrow",
children: "支出分类"
}),
/*#__PURE__*/ _jsx("h2", {
children: "支出"
})
]
}),
/*#__PURE__*/ _jsx("button", {
type: "button",
className: "btn btn-secondary btn-inline",
onClick: ()=>openAddModal("expense"),
children: /*#__PURE__*/ _jsxs("span", {
className: "button-content",
children: [
/*#__PURE__*/ _jsx(Icon, {
name: "plus",
size: 16
}),
"添加"
]
})
})
]
}),
/*#__PURE__*/ _jsx("div", {
className: "category-list category-list--chips",
children: categories.expense.map((cat)=>/*#__PURE__*/ _jsxs("div", {
className: "category-tag",
children: [
/*#__PURE__*/ _jsx("span", {
className: "cat-icon",
children: cat.icon
}),
/*#__PURE__*/ _jsx("span", {
className: "cat-name",
children: cat.name
}),
!cat.is_default && /*#__PURE__*/ _jsx("button", {
type: "button",
className: "icon-button icon-button--ghost cat-delete",
"aria-label": `删除${cat.name}`,
onClick: ()=>handleDelete(cat.id),
children: /*#__PURE__*/ _jsx(Icon, {
name: "close",
size: 14
})
})
]
}, cat.id || cat.name))
})
]
}),
/*#__PURE__*/ _jsxs("section", {
className: "card category-section category-section--refresh",
children: [
/*#__PURE__*/ _jsxs("div", {
className: "section-header",
children: [
/*#__PURE__*/ _jsxs("div", {
children: [
/*#__PURE__*/ _jsx("p", {
className: "eyebrow",
children: "收入分类"
}),
/*#__PURE__*/ _jsx("h2", {
children: "æ”¶å…¥"
})
]
}),
/*#__PURE__*/ _jsx("button", {
type: "button",
className: "btn btn-secondary btn-inline",
onClick: ()=>openAddModal("income"),
children: /*#__PURE__*/ _jsxs("span", {
className: "button-content",
children: [
/*#__PURE__*/ _jsx(Icon, {
name: "plus",
size: 16
}),
"添加"
]
})
})
]
}),
/*#__PURE__*/ _jsx("div", {
className: "category-list category-list--chips",
children: categories.income.map((cat)=>/*#__PURE__*/ _jsxs("div", {
className: "category-tag",
children: [
/*#__PURE__*/ _jsx("span", {
className: "cat-icon",
children: cat.icon
}),
/*#__PURE__*/ _jsx("span", {
className: "cat-name",
children: cat.name
}),
!cat.is_default && /*#__PURE__*/ _jsx("button", {
type: "button",
className: "icon-button icon-button--ghost cat-delete",
"aria-label": `删除${cat.name}`,
onClick: ()=>handleDelete(cat.id),
children: /*#__PURE__*/ _jsx(Icon, {
name: "close",
size: 14
})
})
]
}, cat.id || cat.name))
})
]
}),
/*#__PURE__*/ _jsx("div", {
className: "card category-tip category-tip--refresh",
children: /*#__PURE__*/ _jsx("p", {
children: "默认分类无法删除,自定义分类å¯ä»¥åˆ é™¤ã€‚"
})
})
]
}),
modalOpen && /*#__PURE__*/ _jsx("div", {
className: "modal-overlay",
onClick: closeModal,
children: /*#__PURE__*/ _jsxs("div", {
className: "modal",
onClick: (e)=>e.stopPropagation(),
children: [
/*#__PURE__*/ _jsxs("div", {
className: "modal-header",
children: [
/*#__PURE__*/ _jsxs("div", {
children: [
/*#__PURE__*/ _jsx("p", {
className: "eyebrow",
children: "新增分类"
}),
/*#__PURE__*/ _jsx("h2", {
children: categoryType === "expense" ? "新建支出分类" : "新建收入分类"
})
]
}),
/*#__PURE__*/ _jsx("button", {
type: "button",
className: "icon-button icon-button--ghost",
"aria-label": "关闭弹窗",
onClick: closeModal,
children: /*#__PURE__*/ _jsx(Icon, {
name: "close",
size: 18
})
})
]
}),
formError && /*#__PURE__*/ _jsx("div", {
className: "error-msg",
children: formError
}),
/*#__PURE__*/ _jsxs("form", {
onSubmit: handleSubmit,
children: [
/*#__PURE__*/ _jsxs("div", {
className: "form-group",
children: [
/*#__PURE__*/ _jsx("label", {
htmlFor: "category-name",
children: "分类åç§°"
}),
/*#__PURE__*/ _jsx("input", {
id: "category-name",
type: "text",
value: formData.name,
onChange: (e)=>setFormData({
...formData,
name: e.target.value
}),
placeholder: "请输入分类åç§°",
required: true,
disabled: submitting
})
]
}),
/*#__PURE__*/ _jsxs("div", {
className: "form-group",
children: [
/*#__PURE__*/ _jsx("label", {
children: "选择图标"
}),
/*#__PURE__*/ _jsx("div", {
className: "icon-grid",
style: {
display: "grid",
gridTemplateColumns: "repeat(8, minmax(0, 1fr))",
gap: "8px"
},
children: ICONS.map((icon)=>/*#__PURE__*/ _jsx("button", {
type: "button",
className: `icon-btn ${formData.icon === icon ? "active" : ""}`,
onClick: ()=>setFormData({
...formData,
icon
}),
disabled: submitting,
children: icon
}, icon))
})
]
}),
/*#__PURE__*/ _jsx("div", {
className: "modal-actions",
children: /*#__PURE__*/ _jsx("button", {
type: "submit",
className: "btn btn-primary",
disabled: submitting,
children: submitting ? /*#__PURE__*/ _jsxs("span", {
className: "button-content",
children: [
/*#__PURE__*/ _jsx(Icon, {
name: "spinner",
size: 16,
className: "is-spinning"
}),
"ä¿å­˜ä¸­..."
]
}) : "ä¿å­˜"
})
})
]
})
]
})
})
]
});
}
cWUW_«­24^`˜Ò .Zbˆ¥®Ûâ<Cy°·èï _& Q X

j
w
q~˜NQSVº¾ÀÇorðôöþAEøü¢¦_"EIõøª®jmmpƒ&!)!+!.!î"ò"¥#©#O$S$Ì$_Ï$É%Ì%È&Ë&ñ'õ'À(Ã(Å(È(¡*¤*U+Y+,,--..1.Ñ/Ô/Ö/Ù/™1œ1%2(2è2ë2o3_s3#4'4¿4Ã44575!6$687;7}8€88…8©9¬9]:a:÷:û:©;¬;ž<¡<Ö?Ú?ˆ@@7A:A!CJ$CjFmFôF÷FHHÝHàHâHåH×__WEBPACK_MODULE_REFERENCE__7_5b22757365526f75746572225d_call_directImport_asiSafe1__._Ö__WEBPACK_MODULE_REFERENCE__11_5b22757365546f617374225d_call_directImport_asiSafe1__._Ú__WEBPACK_MODULE_REFERENCE__12_5b22757365436f6e6669726d225d_call_directImport_asiSafe1__._Õ__WEBPACK_MODULE_REFERENCE__6_5b227573655374617465225d_call_directImport_asiSafe1__._ÿÿÿÿÿÿß__WEBPACK_MODULE_REFERENCE__8_5b2267657443617465676f72696573225d_call_directImport_asiSafe1__._á__WEBPACK_MODULE_REFERENCE__8_5b2263726561746543617465676f7279225d_call_directImport_asiSafe1__._á__WEBPACK_MODULE_REFERENCE__8_5b2264656c65746543617465676f7279225d_call_directImport_asiSafe1__._Æ__WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._ÿÉ__WEBPACK_MODULE_REFERENCE__10_5b2249636f6e225d_directImport_asiSafe1__._Í__WEBPACK_MODULE_REFERENCE__5_5b226a737873225d_call_directImport_asiSafe1__._Î__WEBPACK_MODULE_REFERENCE__9_5b2264656661756c74225d_directImport_asiSafe1__._üþÐ__WEBPACK_MODULE_REFERENCE__5_5b22467261676d656e74225d_directImport_asiSafe1__._ýýýûûûýûüûýûûûûüýýýûûûýûüûýûûûûüûûûýýýûûûûüûýýûûýûûûûûýûü†buffer†source„size„maps„hashö_
const ICONS = [
"\uD83C\uDF5C",
"\uD83E\uDD58",
"\uD83E\uDD6C",
"\uD83E\uDD69",
"\uD83C\uDF54",
"\uD83C\uDF55",
"☕",
"\uD83C\uDF7A",
"\uD83E\uDDCB",
"\uD83C\uDF4E",
"\uD83C\uDF6A",
"\uD83C\uDF6B",
"\uD83D\uDE97",
"\uD83D\uDE95",
"\uD83D\uDE8C",
"\uD83D\uDE87",
"⛽",
"\uD83D\uDE99",
"\uD83D\uDEF5",
"✈ï¸",
"\uD83D\uDEA2",
"\uD83D\uDED2",
"\uD83D\uDC54",
"\uD83D\uDC55",
"\uD83D\uDC56",
"\uD83D\uDC5F",
"\uD83D\uDC53",
"\uD83E\uDDE2",
"\uD83D\uDC5C",
"\uD83C\uDF92",
"\uD83D\uDC8D",
"\uD83D\uDC84",
"\uD83C\uDFE0",
"\uD83C\uDFE2",
"\uD83C\uDFE6",
"\uD83C\uDFE5",
"\uD83C\uDFE8",
"\uD83C\uDFE9",
"\uD83D\uDD27",
"\uD83D\uDD28",
"\uD83D\uDECBï¸",
"\uD83D\uDCFA",
"\uD83D\uDCBB",
"\uD83D\uDCF1",
"\uD83D\uDCDD",
"\uD83D\uDCB0",
"\uD83C\uDF81",
"\uD83D\uDCC8",
"\uD83E\uDDE7",
"\uD83D\uDCB3",
"\uD83C\uDFAF",
"\uD83D\uDCDA",
"\uD83C\uDFB5",
"\uD83C\uDFAE",
"\uD83C\uDFC3",
"âš½",
"\uD83C\uDFCA",
"\uD83D\uDEB4",
"\uD83C\uDFAD",
"\uD83C\uDFA8",
"\uD83C\uDFAC",
"\uD83D\uDCF7",
"\uD83C\uDFA5",
"\uD83D\uDCFA",
"\uD83E\uDDF8",
"\uD83D\uDC15",
"\uD83D\uDC08",
"\uD83C\uDF38",
"\uD83C\uDF3A"
];
function Categories() {
const router = __WEBPACK_MODULE_REFERENCE__7_5b22757365526f75746572225d_call_directImport_asiSafe1__._();
const { showToast } = __WEBPACK_MODULE_REFERENCE__11_5b22757365546f617374225d_call_directImport_asiSafe1__._();
const { confirm } = __WEBPACK_MODULE_REFERENCE__12_5b22757365436f6e6669726d225d_call_directImport_asiSafe1__._();
const [categories, setCategories] = __WEBPACK_MODULE_REFERENCE__6_5b227573655374617465225d_call_directImport_asiSafe1__._({
expense: [],
income: []
});
const [modalOpen, setModalOpen] = __WEBPACK_MODULE_REFERENCE__6_5b227573655374617465225d_call_directImport_asiSafe1__._(false);
const [categoryType, setCategoryType] = __WEBPACK_MODULE_REFERENCE__6_5b227573655374617465225d_call_directImport_asiSafe1__._("expense");
const [loading, setLoading] = __WEBPACK_MODULE_REFERENCE__6_5b227573655374617465225d_call_directImport_asiSafe1__._(true);
const [submitting, setSubmitting] = __WEBPACK_MODULE_REFERENCE__6_5b227573655374617465225d_call_directImport_asiSafe1__._(false);
const [formError, setFormError] = __WEBPACK_MODULE_REFERENCE__6_5b227573655374617465225d_call_directImport_asiSafe1__._("");
const [formData, setFormData] = __WEBPACK_MODULE_REFERENCE__6_5b227573655374617465225d_call_directImport_asiSafe1__._({
name: "",
icon: "\uD83D\uDCDD"
});
null;
const loadCategories = async ()=>{
setLoading(true);
try {
const data = await __WEBPACK_MODULE_REFERENCE__8_5b2267657443617465676f72696573225d_call_directImport_asiSafe1__._();
setCategories(data);
} catch (err) {
console.error(err);
showToast(err.message, {
tone: "error"
});
} finally{
setLoading(false);
}
};
const openAddModal = (type)=>{
setCategoryType(type);
setFormData({
name: "",
icon: "\uD83D\uDCDD"
});
setFormError("");
setModalOpen(true);
};
const closeModal = ()=>{
if (submitting) return;
setModalOpen(false);
setFormError("");
};
const handleSubmit = async (e)=>{
e.preventDefault();
if (!formData.name || !formData.icon) {
setFormError("请填写完整信æ¯");
return;
}
setSubmitting(true);
setFormError("");
try {
await __WEBPACK_MODULE_REFERENCE__8_5b2263726561746543617465676f7279225d_call_directImport_asiSafe1__._({
type: categoryType,
name: formData.name,
icon: formData.icon
});
closeModal();
showToast("分类已创建", {
tone: "success"
});
await loadCategories();
} catch (err) {
setFormError(err.message);
showToast(err.message, {
tone: "error"
});
} finally{
setSubmitting(false);
}
};
const handleDelete = async (id)=>{
const shouldDelete = await confirm({
title: "删除此分类?",
description: "默认分类ä¸å¯åˆ é™¤ï¼Œè‡ªå®šä¹‰åˆ†ç±»åˆ é™¤åŽå°†æ— æ³•æ¢å¤ã€‚",
confirmText: "删除"
});
if (!shouldDelete) return;
try {
await __WEBPACK_MODULE_REFERENCE__8_5b2264656c65746543617465676f7279225d_call_directImport_asiSafe1__._(id);
showToast("分类已删除", {
tone: "success"
});
await loadCategories();
} catch (err) {
showToast(err.message, {
tone: "error"
});
}
};
const actions = /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._("button", {
type: "button",
className: "icon-button",
"aria-label": "设置",
onClick: ()=>router.push("/settings"),
children: /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._(__WEBPACK_MODULE_REFERENCE__10_5b2249636f6e225d_directImport_asiSafe1__._, {
name: "settings",
size: 18
})
});
return /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__5_5b226a737873225d_call_directImport_asiSafe1__._(__WEBPACK_MODULE_REFERENCE__9_5b2264656661756c74225d_directImport_asiSafe1__._, {
title: "分类",
subtitle: "æ•´ç†å¸¸ç”¨åˆ†ç±»ä¸Žå›¾æ ‡",
actions: actions,
compactHeader: true,
children: [
loading ? /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._("div", {
className: "card loading-state",
children: "加载中..."
}) : /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__5_5b226a737873225d_call_directImport_asiSafe1__._(__WEBPACK_MODULE_REFERENCE__5_5b22467261676d656e74225d_directImport_asiSafe1__._, {
children: [
/*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__5_5b226a737873225d_call_directImport_asiSafe1__._("section", {
className: "card category-section category-section--refresh",
children: [
/*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__5_5b226a737873225d_call_directImport_asiSafe1__._("div", {
className: "section-header",
children: [
/*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__5_5b226a737873225d_call_directImport_asiSafe1__._("div", {
children: [
/*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._("p", {
className: "eyebrow",
children: "支出分类"
}),
/*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._("h2", {
children: "支出"
})
]
}),
/*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._("button", {
type: "button",
className: "btn btn-secondary btn-inline",
onClick: ()=>openAddModal("expense"),
children: /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__5_5b226a737873225d_call_directImport_asiSafe1__._("span", {
className: "button-content",
children: [
/*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._(__WEBPACK_MODULE_REFERENCE__10_5b2249636f6e225d_directImport_asiSafe1__._, {
name: "plus",
size: 16
}),
"添加"
]
})
})
]
}),
/*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._("div", {
className: "category-list category-list--chips",
children: categories.expense.map((cat)=>/*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__5_5b226a737873225d_call_directImport_asiSafe1__._("div", {
className: "category-tag",
children: [
/*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._("span", {
className: "cat-icon",
children: cat.icon
}),
/*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._("span", {
className: "cat-name",
children: cat.name
}),
!cat.is_default && /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._("button", {
type: "button",
className: "icon-button icon-button--ghost cat-delete",
"aria-label": `删除${cat.name}`,
onClick: ()=>handleDelete(cat.id),
children: /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._(__WEBPACK_MODULE_REFERENCE__10_5b2249636f6e225d_directImport_asiSafe1__._, {
name: "close",
size: 14
})
})
]
}, cat.id || cat.name))
})
]
}),
/*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__5_5b226a737873225d_call_directImport_asiSafe1__._("section", {
className: "card category-section category-section--refresh",
children: [
/*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__5_5b226a737873225d_call_directImport_asiSafe1__._("div", {
className: "section-header",
children: [
/*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__5_5b226a737873225d_call_directImport_asiSafe1__._("div", {
children: [
/*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._("p", {
className: "eyebrow",
children: "收入分类"
}),
/*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._("h2", {
children: "æ”¶å…¥"
})
]
}),
/*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._("button", {
type: "button",
className: "btn btn-secondary btn-inline",
onClick: ()=>openAddModal("income"),
children: /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__5_5b226a737873225d_call_directImport_asiSafe1__._("span", {
className: "button-content",
children: [
/*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._(__WEBPACK_MODULE_REFERENCE__10_5b2249636f6e225d_directImport_asiSafe1__._, {
name: "plus",
size: 16
}),
"添加"
]
})
})
]
}),
/*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._("div", {
className: "category-list category-list--chips",
children: categories.income.map((cat)=>/*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__5_5b226a737873225d_call_directImport_asiSafe1__._("div", {
className: "category-tag",
children: [
/*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._("span", {
className: "cat-icon",
children: cat.icon
}),
/*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._("span", {
className: "cat-name",
children: cat.name
}),
!cat.is_default && /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._("button", {
type: "button",
className: "icon-button icon-button--ghost cat-delete",
"aria-label": `删除${cat.name}`,
onClick: ()=>handleDelete(cat.id),
children: /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._(__WEBPACK_MODULE_REFERENCE__10_5b2249636f6e225d_directImport_asiSafe1__._, {
name: "close",
size: 14
})
})
]
}, cat.id || cat.name))
})
]
}),
/*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._("div", {
className: "card category-tip category-tip--refresh",
children: /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._("p", {
children: "默认分类无法删除,自定义分类å¯ä»¥åˆ é™¤ã€‚"
})
})
]
}),
modalOpen && /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._("div", {
className: "modal-overlay",
onClick: closeModal,
children: /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__5_5b226a737873225d_call_directImport_asiSafe1__._("div", {
className: "modal",
onClick: (e)=>e.stopPropagation(),
children: [
/*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__5_5b226a737873225d_call_directImport_asiSafe1__._("div", {
className: "modal-header",
children: [
/*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__5_5b226a737873225d_call_directImport_asiSafe1__._("div", {
children: [
/*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._("p", {
className: "eyebrow",
children: "新增分类"
}),
/*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._("h2", {
children: categoryType === "expense" ? "新建支出分类" : "新建收入分类"
})
]
}),
/*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._("button", {
type: "button",
className: "icon-button icon-button--ghost",
"aria-label": "关闭弹窗",
onClick: closeModal,
children: /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._(__WEBPACK_MODULE_REFERENCE__10_5b2249636f6e225d_directImport_asiSafe1__._, {
name: "close",
size: 18
})
})
]
}),
formError && /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._("div", {
className: "error-msg",
children: formError
}),
/*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__5_5b226a737873225d_call_directImport_asiSafe1__._("form", {
onSubmit: handleSubmit,
children: [
/*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__5_5b226a737873225d_call_directImport_asiSafe1__._("div", {
className: "form-group",
children: [
/*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._("label", {
htmlFor: "category-name",
children: "分类åç§°"
}),
/*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._("input", {
id: "category-name",
type: "text",
value: formData.name,
onChange: (e)=>setFormData({
...formData,
name: e.target.value
}),
placeholder: "请输入分类åç§°",
required: true,
disabled: submitting
})
]
}),
/*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__5_5b226a737873225d_call_directImport_asiSafe1__._("div", {
className: "form-group",
children: [
/*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._("label", {
children: "选择图标"
}),
/*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._("div", {
className: "icon-grid",
style: {
display: "grid",
gridTemplateColumns: "repeat(8, minmax(0, 1fr))",
gap: "8px"
},
children: ICONS.map((icon)=>/*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._("button", {
type: "button",
className: `icon-btn ${formData.icon === icon ? "active" : ""}`,
onClick: ()=>setFormData({
...formData,
icon
}),
disabled: submitting,
children: icon
}, icon))
})
]
}),
/*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._("div", {
className: "modal-actions",
children: /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._("button", {
type: "submit",
className: "btn btn-primary",
disabled: submitting,
children: submitting ? /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__5_5b226a737873225d_call_directImport_asiSafe1__._("span", {
className: "button-content",
children: [
/*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._(__WEBPACK_MODULE_REFERENCE__10_5b2249636f6e225d_directImport_asiSafe1__._, {
name: "spinner",
size: 16,
className: "is-spinning"
}),
"ä¿å­˜ä¸­..."
]
}) : "ä¿å­˜"
})
})
]
})
]
})
})
]
});
}
•{"finalSource":false}ƒmapbufferedMap ReplaceSourceRawSource€Limport { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
import { useState, useEffect } from "react";
import { useRouter } from "next/router";
import { isLoggedIn, getCategories, createCategory, deleteCategory } from "../lib/api";
import AppShell from "../components/AppShell";
import { Icon } from "../components/icons";
import { useToast } from "../components/ToastProvider";
import { useConfirm } from "../components/ConfirmProvider";
const ICONS = [
"\uD83C\uDF5C",
"\uD83E\uDD58",
"\uD83E\uDD6C",
"\uD83E\uDD69",
"\uD83C\uDF54",
"\uD83C\uDF55",
"☕",
"\uD83C\uDF7A",
"\uD83E\uDDCB",
"\uD83C\uDF4E",
"\uD83C\uDF6A",
"\uD83C\uDF6B",
"\uD83D\uDE97",
"\uD83D\uDE95",
"\uD83D\uDE8C",
"\uD83D\uDE87",
"⛽",
"\uD83D\uDE99",
"\uD83D\uDEF5",
"✈ï¸",
"\uD83D\uDEA2",
"\uD83D\uDED2",
"\uD83D\uDC54",
"\uD83D\uDC55",
"\uD83D\uDC56",
"\uD83D\uDC5F",
"\uD83D\uDC53",
"\uD83E\uDDE2",
"\uD83D\uDC5C",
"\uD83C\uDF92",
"\uD83D\uDC8D",
"\uD83D\uDC84",
"\uD83C\uDFE0",
"\uD83C\uDFE2",
"\uD83C\uDFE6",
"\uD83C\uDFE5",
"\uD83C\uDFE8",
"\uD83C\uDFE9",
"\uD83D\uDD27",
"\uD83D\uDD28",
"\uD83D\uDECBï¸",
"\uD83D\uDCFA",
"\uD83D\uDCBB",
"\uD83D\uDCF1",
"\uD83D\uDCDD",
"\uD83D\uDCB0",
"\uD83C\uDF81",
"\uD83D\uDCC8",
"\uD83E\uDDE7",
"\uD83D\uDCB3",
"\uD83C\uDFAF",
"\uD83D\uDCDA",
"\uD83C\uDFB5",
"\uD83C\uDFAE",
"\uD83C\uDFC3",
"âš½",
"\uD83C\uDFCA",
"\uD83D\uDEB4",
"\uD83C\uDFAD",
"\uD83C\uDFA8",
"\uD83C\uDFAC",
"\uD83D\uDCF7",
"\uD83C\uDFA5",
"\uD83D\uDCFA",
"\uD83E\uDDF8",
"\uD83D\uDC15",
"\uD83D\uDC08",
"\uD83C\uDF38",
"\uD83C\uDF3A"
];
export default function Categories() {
const router = useRouter();
const { showToast } = useToast();
const { confirm } = useConfirm();
const [categories, setCategories] = useState({
expense: [],
income: []
});
const [modalOpen, setModalOpen] = useState(false);
const [categoryType, setCategoryType] = useState("expense");
const [loading, setLoading] = useState(true);
const [submitting, setSubmitting] = useState(false);
const [formError, setFormError] = useState("");
const [formData, setFormData] = useState({
name: "",
icon: "\uD83D\uDCDD"
});
null;
const loadCategories = async ()=>{
setLoading(true);
try {
const data = await getCategories();
setCategories(data);
} catch (err) {
console.error(err);
showToast(err.message, {
tone: "error"
});
} finally{
setLoading(false);
}
};
const openAddModal = (type)=>{
setCategoryType(type);
setFormData({
name: "",
icon: "\uD83D\uDCDD"
});
setFormError("");
setModalOpen(true);
};
const closeModal = ()=>{
if (submitting) return;
setModalOpen(false);
setFormError("");
};
const handleSubmit = async (e)=>{
e.preventDefault();
if (!formData.name || !formData.icon) {
setFormError("请填写完整信æ¯");
return;
}
setSubmitting(true);
setFormError("");
try {
await createCategory({
type: categoryType,
name: formData.name,
icon: formData.icon
});
closeModal();
showToast("分类已创建", {
tone: "success"
});
await loadCategories();
} catch (err) {
setFormError(err.message);
showToast(err.message, {
tone: "error"
});
} finally{
setSubmitting(false);
}
};
const handleDelete = async (id)=>{
const shouldDelete = await confirm({
title: "删除此分类?",
description: "默认分类ä¸å¯åˆ é™¤ï¼Œè‡ªå®šä¹‰åˆ†ç±»åˆ é™¤åŽå°†æ— æ³•æ¢å¤ã€‚",
confirmText: "删除"
});
if (!shouldDelete) return;
try {
await deleteCategory(id);
showToast("分类已删除", {
tone: "success"
});
await loadCategories();
} catch (err) {
showToast(err.message, {
tone: "error"
});
}
};
const actions = /*#__PURE__*/ _jsx("button", {
type: "button",
className: "icon-button",
"aria-label": "设置",
onClick: ()=>router.push("/settings"),
children: /*#__PURE__*/ _jsx(Icon, {
name: "settings",
size: 18
})
});
return /*#__PURE__*/ _jsxs(AppShell, {
title: "分类",
subtitle: "æ•´ç†å¸¸ç”¨åˆ†ç±»ä¸Žå›¾æ ‡",
actions: actions,
compactHeader: true,
children: [
loading ? /*#__PURE__*/ _jsx("div", {
className: "card loading-state",
children: "加载中..."
}) : /*#__PURE__*/ _jsxs(_Fragment, {
children: [
/*#__PURE__*/ _jsxs("section", {
className: "card category-section category-section--refresh",
children: [
/*#__PURE__*/ _jsxs("div", {
className: "section-header",
children: [
/*#__PURE__*/ _jsxs("div", {
children: [
/*#__PURE__*/ _jsx("p", {
className: "eyebrow",
children: "支出分类"
}),
/*#__PURE__*/ _jsx("h2", {
children: "支出"
})
]
}),
/*#__PURE__*/ _jsx("button", {
type: "button",
className: "btn btn-secondary btn-inline",
onClick: ()=>openAddModal("expense"),
children: /*#__PURE__*/ _jsxs("span", {
className: "button-content",
children: [
/*#__PURE__*/ _jsx(Icon, {
name: "plus",
size: 16
}),
"添加"
]
})
})
]
}),
/*#__PURE__*/ _jsx("div", {
className: "category-list category-list--chips",
children: categories.expense.map((cat)=>/*#__PURE__*/ _jsxs("div", {
className: "category-tag",
children: [
/*#__PURE__*/ _jsx("span", {
className: "cat-icon",
children: cat.icon
}),
/*#__PURE__*/ _jsx("span", {
className: "cat-name",
children: cat.name
}),
!cat.is_default && /*#__PURE__*/ _jsx("button", {
type: "button",
className: "icon-button icon-button--ghost cat-delete",
"aria-label": `删除${cat.name}`,
onClick: ()=>handleDelete(cat.id),
children: /*#__PURE__*/ _jsx(Icon, {
name: "close",
size: 14
})
})
]
}, cat.id || cat.name))
})
]
}),
/*#__PURE__*/ _jsxs("section", {
className: "card category-section category-section--refresh",
children: [
/*#__PURE__*/ _jsxs("div", {
className: "section-header",
children: [
/*#__PURE__*/ _jsxs("div", {
children: [
/*#__PURE__*/ _jsx("p", {
className: "eyebrow",
children: "收入分类"
}),
/*#__PURE__*/ _jsx("h2", {
children: "æ”¶å…¥"
})
]
}),
/*#__PURE__*/ _jsx("button", {
type: "button",
className: "btn btn-secondary btn-inline",
onClick: ()=>openAddModal("income"),
children: /*#__PURE__*/ _jsxs("span", {
className: "button-content",
children: [
/*#__PURE__*/ _jsx(Icon, {
name: "plus",
size: 16
}),
"添加"
]
})
})
]
}),
/*#__PURE__*/ _jsx("div", {
className: "category-list category-list--chips",
children: categories.income.map((cat)=>/*#__PURE__*/ _jsxs("div", {
className: "category-tag",
children: [
/*#__PURE__*/ _jsx("span", {
className: "cat-icon",
children: cat.icon
}),
/*#__PURE__*/ _jsx("span", {
className: "cat-name",
children: cat.name
}),
!cat.is_default && /*#__PURE__*/ _jsx("button", {
type: "button",
className: "icon-button icon-button--ghost cat-delete",
"aria-label": `删除${cat.name}`,
onClick: ()=>handleDelete(cat.id),
children: /*#__PURE__*/ _jsx(Icon, {
name: "close",
size: 14
})
})
]
}, cat.id || cat.name))
})
]
}),
/*#__PURE__*/ _jsx("div", {
className: "card category-tip category-tip--refresh",
children: /*#__PURE__*/ _jsx("p", {
children: "默认分类无法删除,自定义分类å¯ä»¥åˆ é™¤ã€‚"
})
})
]
}),
modalOpen && /*#__PURE__*/ _jsx("div", {
className: "modal-overlay",
onClick: closeModal,
children: /*#__PURE__*/ _jsxs("div", {
className: "modal",
onClick: (e)=>e.stopPropagation(),
children: [
/*#__PURE__*/ _jsxs("div", {
className: "modal-header",
children: [
/*#__PURE__*/ _jsxs("div", {
children: [
/*#__PURE__*/ _jsx("p", {
className: "eyebrow",
children: "新增分类"
}),
/*#__PURE__*/ _jsx("h2", {
children: categoryType === "expense" ? "新建支出分类" : "新建收入分类"
})
]
}),
/*#__PURE__*/ _jsx("button", {
type: "button",
className: "icon-button icon-button--ghost",
"aria-label": "关闭弹窗",
onClick: closeModal,
children: /*#__PURE__*/ _jsx(Icon, {
name: "close",
size: 18
})
})
]
}),
formError && /*#__PURE__*/ _jsx("div", {
className: "error-msg",
children: formError
}),
/*#__PURE__*/ _jsxs("form", {
onSubmit: handleSubmit,
children: [
/*#__PURE__*/ _jsxs("div", {
className: "form-group",
children: [
/*#__PURE__*/ _jsx("label", {
htmlFor: "category-name",
children: "分类åç§°"
}),
/*#__PURE__*/ _jsx("input", {
id: "category-name",
type: "text",
value: formData.name,
onChange: (e)=>setFormData({
...formData,
name: e.target.value
}),
placeholder: "请输入分类åç§°",
required: true,
disabled: submitting
})
]
}),
/*#__PURE__*/ _jsxs("div", {
className: "form-group",
children: [
/*#__PURE__*/ _jsx("label", {
children: "选择图标"
}),
/*#__PURE__*/ _jsx("div", {
className: "icon-grid",
style: {
display: "grid",
gridTemplateColumns: "repeat(8, minmax(0, 1fr))",
gap: "8px"
},
children: ICONS.map((icon)=>/*#__PURE__*/ _jsx("button", {
type: "button",
className: `icon-btn ${formData.icon === icon ? "active" : ""}`,
onClick: ()=>setFormData({
...formData,
icon
}),
disabled: submitting,
children: icon
}, icon))
})
]
}),
/*#__PURE__*/ _jsx("div", {
className: "modal-actions",
children: /*#__PURE__*/ _jsx("button", {
type: "submit",
className: "btn btn-primary",
disabled: submitting,
children: submitting ? /*#__PURE__*/ _jsxs("span", {
className: "button-content",
children: [
/*#__PURE__*/ _jsx(Icon, {
name: "spinner",
size: 16,
className: "is-spinning"
}),
"ä¿å­˜ä¸­..."
]
}) : "ä¿å­˜"
})
})
]
})
]
})
})
]
});
}
æ085undefined87130undefined132171undefined173259undefined261306undefined308350undefined352406undefined408466undefined18241838undefined18821890__WEBPACK_MODULE_REFERENCE__7_5b22757365526f75746572225d_call_directImport_asiSafe1__._undefined19211928__WEBPACK_MODULE_REFERENCE__11_5b22757365546f617374225d_call_directImport_asiSafe1__._undefined19571966__WEBPACK_MODULE_REFERENCE__12_5b22757365436f6e6669726d225d_call_directImport_asiSafe1__._undefined20112018__WEBPACK_MODULE_REFERENCE__6_5b227573655374617465225d_call_directImport_asiSafe1__._undefined21082115__WEBPACK_MODULE_REFERENCE__6_5b227573655374617465225d_call_directImport_asiSafe1__._undefined21692176__WEBPACK_MODULE_REFERENCE__6_5b227573655374617465225d_call_directImport_asiSafe1__._undefined22242231__WEBPACK_MODULE_REFERENCE__6_5b227573655374617465225d_call_directImport_asiSafe1__._undefined22802287__WEBPACK_MODULE_REFERENCE__6_5b227573655374617465225d_call_directImport_asiSafe1__._undefined23352342__WEBPACK_MODULE_REFERENCE__6_5b227573655374617465225d_call_directImport_asiSafe1__._undefined23852392__WEBPACK_MODULE_REFERENCE__6_5b227573655374617465225d_call_directImport_asiSafe1__._undefined25712583__WEBPACK_MODULE_REFERENCE__8_5b2267657443617465676f72696573225d_call_directImport_asiSafe1__._undefined34343447__WEBPACK_MODULE_REFERENCE__8_5b2263726561746543617465676f7279225d_call_directImport_asiSafe1__._undefined42094222__WEBPACK_MODULE_REFERENCE__8_5b2264656c65746543617465676f7279225d_call_directImport_asiSafe1__._undefined45044507__WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._undefined46864689__WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._undefined46914694__WEBPACK_MODULE_REFERENCE__10_5b2249636f6e225d_directImport_asiSafe1__._undefined47944798__WEBPACK_MODULE_REFERENCE__5_5b226a737873225d_call_directImport_asiSafe1__._undefined48004807__WEBPACK_MODULE_REFERENCE__9_5b2264656661756c74225d_directImport_asiSafe1__._undefined49754978__WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._undefined51045108__WEBPACK_MODULE_REFERENCE__5_5b226a737873225d_call_directImport_asiSafe1__._undefined51105118__WEBPACK_MODULE_REFERENCE__5_5b22467261676d656e74225d_directImport_asiSafe1__._undefined51855189__WEBPACK_MODULE_REFERENCE__5_5b226a737873225d_call_directImport_asiSafe1__._undefined53685372__WEBPACK_MODULE_REFERENCE__5_5b226a737873225d_call_directImport_asiSafe1__._undefined55385542__WEBPACK_MODULE_REFERENCE__5_5b226a737873225d_call_directImport_asiSafe1__._undefined56635666__WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._undefined59165919__WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._undefined61716174__WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._undefined64696473__WEBPACK_MODULE_REFERENCE__5_5b226a737873225d_call_directImport_asiSafe1__._undefined66766679__WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._undefined66816684__WEBPACK_MODULE_REFERENCE__10_5b2249636f6e225d_directImport_asiSafe1__._undefined71577160__WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._undefined73387342__WEBPACK_MODULE_REFERENCE__5_5b226a737873225d_call_directImport_asiSafe1__._undefined75307533__WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._undefined77897792__WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._undefined80678070__WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._undefined84868489__WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._undefined84918494__WEBPACK_MODULE_REFERENCE__10_5b2249636f6e225d_directImport_asiSafe1__._undefined89428946__WEBPACK_MODULE_REFERENCE__5_5b226a737873225d_call_directImport_asiSafe1__._undefined91259129__WEBPACK_MODULE_REFERENCE__5_5b226a737873225d_call_directImport_asiSafe1__._undefined92959299__WEBPACK_MODULE_REFERENCE__5_5b226a737873225d_call_directImport_asiSafe1__._undefined94209423__WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._undefined96739676__WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_dir
0
7 èHB¢¼´ùûCóõBê/­ùûJÙŒØ~ÊCˆÇÃ/{F Õ ®"ó"¥#ñ#_­$ò$ò%7&J''/)t)v)¾)~+Ê+},É,o-»-4.y.s/¸/´0ù02k263{3}3Å3ž5ã5”6à6_œ7á7á8&99:~:<c<e<­<m>²>;?€?@@…@ AUABQBéB5C¦CëCÕDE.FsFµGúGüGDH[hI­I^JªJ@KŒK:LLqM¶MëP7QåQ*RÖRSUGUXÒXYYžYµZ[Ì[\\[\™(0,next_router.useRouter)¡(0,ToastProvider/* useToast */.p)¥(0,ConfirmProvider/* useConfirm */.N)œ(0,external_react_.useState)ÿÿÿÿÿÿ(0,api/* getCategories */.CP)ž(0,api/* createCategory */.k4)ž(0,api/* deleteCategory */.uu)jsx_runtime_.jsxÿicons/* Icon */.J•(0,jsx_runtime_.jsxs)—AppShell/* default */.Züþ•jsx_runtime_.FragmentýýýûûûýûüûýûûûûüýýýûûûýûüûýûûûûüûûûýýýûûûûüûýýûûýûûûûûýûüH
;// CONCATENATED MODULE: ./node_modules/next/dist/build/webpack/loaders/next-route-loader/index.js?kind=PAGES&page=%2Fcategories&preferredRegion=&absolutePagePath=private-next-pages%2Fcategories.js&absoluteAppPath=private-next-pages%2F_app.js&absoluteDocumentPath=next%2Fdist%2Fpages%2F_document&middlewareConfigBase64=e30%3D!
 ¬ «webpack/lib/util/registerExternalSerializerwebpack-sources/ReplaceSource«webpack/lib/util/registerExternalSerializer™webpack-sources/RawSourceïimport { PagesRouteModule } from "next/dist/server/future/route-modules/pages/module.compiled";
import { RouteKind } from "next/dist/server/future/route-kind";
import { hoist } from "next/dist/build/templates/helpers";
// Import the app and document modules.
import Document from "next/dist/pages/_document";
import App from "private-next-pages/_app.js";
// Import the userland code.
import * as userland from "private-next-pages/categories.js";
// Re-export the component (should be the default export).
export default hoist(userland, "default");
// Re-export methods.
export const getStaticProps = hoist(userland, "getStaticProps");
export const getStaticPaths = hoist(userland, "getStaticPaths");
export const getServerSideProps = hoist(userland, "getServerSideProps");
export const config = hoist(userland, "config");
export const reportWebVitals = hoist(userland, "reportWebVitals");
// Re-export legacy methods.
export const unstable_getStaticProps = hoist(userland, "unstable_getStaticProps");
export const unstable_getStaticPaths = hoist(userland, "unstable_getStaticPaths");
export const unstable_getStaticParams = hoist(userland, "unstable_getStaticParams");
export const unstable_getServerProps = hoist(userland, "unstable_getServerProps");
export const unstable_getServerSideProps = hoist(userland, "unstable_getServerSideProps");
// Create and export the route module that will be consumed.
export const routeModule = new PagesRouteModule({
definition: {
kind: RouteKind.PAGES,
page: "/categories",
pathname: "/categories",
// The following aren't used in production.
bundlePath: "",
filename: ""
},
components: {
App,
Document
},
userland
});
//# sourceMappingURL=pages.js.map c/^`Qž Ù35a¼ùù " @_:@X\^e{Ÿ¦¼ÂÞâäë !(6<UY[bœÁÃÊéï<Bdhjq¸¼¾Åäê|ªÖ¢¡´³ÈÇÁ/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Ï__WEBPACK_MODULE_REFERENCE__2_5b22686f697374225d_call_directImport_asiSafe1__._®__WEBPACK_MODULE_REFERENCE__13_ns_asiSafe1__._);ýþýþýþýþýþýþýþýþýþýþà__WEBPACK_MODULE_REFERENCE__0_5b225061676573526f7574654d6f64756c65225d_directImport_asiSafe1__._Å__WEBPACK_MODULE_REFERENCE__1_5b22526f7574654b696e64225d_asiSafe1__._Ð: __WEBPACK_MODULE_REFERENCE__4_5b2264656661756c74225d_directImport_asiSafe1__._Ð: __WEBPACK_MODULE_REFERENCE__3_5b2264656661756c74225d_directImport_asiSafe1__._°: __WEBPACK_MODULE_REFERENCE__13_ns_asiSafe1__._ãŽ
// Import the app and document modules.
// Import the userland code.
// Re-export the component (should be the default export).
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (__WEBPACK_MODULE_REFERENCE__2_5b22686f697374225d_call_directImport_asiSafe1__._(__WEBPACK_MODULE_REFERENCE__13_ns_asiSafe1__._, "default"));
// Re-export methods.
const getStaticProps = __WEBPACK_MODULE_REFERENCE__2_5b22686f697374225d_call_directImport_asiSafe1__._(__WEBPACK_MODULE_REFERENCE__13_ns_asiSafe1__._, "getStaticProps");
const getStaticPaths = __WEBPACK_MODULE_REFERENCE__2_5b22686f697374225d_call_directImport_asiSafe1__._(__WEBPACK_MODULE_REFERENCE__13_ns_asiSafe1__._, "getStaticPaths");
const getServerSideProps = __WEBPACK_MODULE_REFERENCE__2_5b22686f697374225d_call_directImport_asiSafe1__._(__WEBPACK_MODULE_REFERENCE__13_ns_asiSafe1__._, "getServerSideProps");
const config = __WEBPACK_MODULE_REFERENCE__2_5b22686f697374225d_call_directImport_asiSafe1__._(__WEBPACK_MODULE_REFERENCE__13_ns_asiSafe1__._, "config");
const reportWebVitals = __WEBPACK_MODULE_REFERENCE__2_5b22686f697374225d_call_directImport_asiSafe1__._(__WEBPACK_MODULE_REFERENCE__13_ns_asiSafe1__._, "reportWebVitals");
// Re-export legacy methods.
const unstable_getStaticProps = __WEBPACK_MODULE_REFERENCE__2_5b22686f697374225d_call_directImport_asiSafe1__._(__WEBPACK_MODULE_REFERENCE__13_ns_asiSafe1__._, "unstable_getStaticProps");
const unstable_getStaticPaths = __WEBPACK_MODULE_REFERENCE__2_5b22686f697374225d_call_directImport_asiSafe1__._(__WEBPACK_MODULE_REFERENCE__13_ns_asiSafe1__._, "unstable_getStaticPaths");
const unstable_getStaticParams = __WEBPACK_MODULE_REFERENCE__2_5b22686f697374225d_call_directImport_asiSafe1__._(__WEBPACK_MODULE_REFERENCE__13_ns_asiSafe1__._, "unstable_getStaticParams");
const unstable_getServerProps = __WEBPACK_MODULE_REFERENCE__2_5b22686f697374225d_call_directImport_asiSafe1__._(__WEBPACK_MODULE_REFERENCE__13_ns_asiSafe1__._, "unstable_getServerProps");
const unstable_getServerSideProps = __WEBPACK_MODULE_REFERENCE__2_5b22686f697374225d_call_directImport_asiSafe1__._(__WEBPACK_MODULE_REFERENCE__13_ns_asiSafe1__._, "unstable_getServerSideProps");
// Create and export the route module that will be consumed.
const routeModule = new __WEBPACK_MODULE_REFERENCE__0_5b225061676573526f7574654d6f64756c65225d_directImport_asiSafe1__._({
definition: {
kind: __WEBPACK_MODULE_REFERENCE__1_5b22526f7574654b696e64225d_asiSafe1__._.PAGES,
page: "/categories",
pathname: "/categories",
// The following aren't used in production.
bundlePath: "",
filename: ""
},
components: {
App: __WEBPACK_MODULE_REFERENCE__4_5b2264656661756c74225d_directImport_asiSafe1__._,
Document: __WEBPACK_MODULE_REFERENCE__3_5b2264656661756c74225d_directImport_asiSafe1__._
},
userland: __WEBPACK_MODULE_REFERENCE__13_ns_asiSafe1__._
});
//# sourceMappingURL=pages.js.map äç èïimport { PagesRouteModule } from "next/dist/server/future/route-modules/pages/module.compiled";
import { RouteKind } from "next/dist/server/future/route-kind";
import { hoist } from "next/dist/build/templates/helpers";
// Import the app and document modules.
import Document from "next/dist/pages/_document";
import App from "private-next-pages/_app.js";
// Import the userland code.
import * as userland from "private-next-pages/categories.js";
// Re-export the component (should be the default export).
export default hoist(userland, "default");
// Re-export methods.
export const getStaticProps = hoist(userland, "getStaticProps");
export const getStaticPaths = hoist(userland, "getStaticPaths");
export const getServerSideProps = hoist(userland, "getServerSideProps");
export const config = hoist(userland, "config");
export const reportWebVitals = hoist(userland, "reportWebVitals");
// Re-export legacy methods.
export const unstable_getStaticProps = hoist(userland, "unstable_getStaticProps");
export const unstable_getStaticPaths = hoist(userland, "unstable_getStaticPaths");
export const unstable_getStaticParams = hoist(userland, "unstable_getStaticParams");
export const unstable_getServerProps = hoist(userland, "unstable_getServerProps");
export const unstable_getServerSideProps = hoist(userland, "unstable_getServerSideProps");
// Create and export the route module that will be consumed.
export const routeModule = new PagesRouteModule({
definition: {
kind: RouteKind.PAGES,
page: "/categories",
pathname: "/categories",
// The following aren't used in production.
bundlePath: "",
filename: ""
},
components: {
App,
Document
},
userland
});
//# sourceMappingURL=pages.js.mapú 094undefined96158undefined160217undefined259307undefined309353undefined384444undefined505519/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (undefined505519undefined520524__WEBPACK_MODULE_REFERENCE__2_5b22686f697374225d_call_directImport_asiSafe1__._undefined526533__WEBPACK_MODULE_REFERENCE__13_ns_asiSafe1__._undefined546546.5);undefined570576undefined600604__WEBPACK_MODULE_REFERENCE__2_5b22686f697374225d_call_directImport_asiSafe1__._undefined606613__WEBPACK_MODULE_REFERENCE__13_ns_asiSafe1__._undefined635641undefined665669__WEBPACK_MODULE_REFERENCE__2_5b22686f697374225d_call_directImport_asiSafe1__._undefined671678__WEBPACK_MODULE_REFERENCE__13_ns_asiSafe1__._undefined700706undefined734738__WEBPACK_MODULE_REFERENCE__2_5b22686f697374225d_call_directImport_asiSafe1__._undefined740747__WEBPACK_MODULE_REFERENCE__13_ns_asiSafe1__._undefined773779undefined795799__WEBPACK_MODULE_REFERENCE__2_5b22686f697374225d_call_directImport_asiSafe1__._undefined801808__WEBPACK_MODULE_REFERENCE__13_ns_asiSafe1__._undefined822828undefined853857__WEBPACK_MODULE_REFERENCE__2_5b22686f697374225d_call_directImport_asiSafe1__._undefined859866__WEBPACK_MODULE_REFERENCE__13_ns_asiSafe1__._undefined918924undefined957961__WEBPACK_MODULE_REFERENCE__2_5b22686f697374225d_call_directImport_asiSafe1__._undefined963970__WEBPACK_MODULE_REFERENCE__13_ns_asiSafe1__._undefined10011007undefined10401044__WEBPACK_MODULE_REFERENCE__2_5b22686f697374225d_call_directImport_asiSafe1__._undefined10461053__WEBPACK_MODULE_REFERENCE__13_ns_asiSafe1__._undefined10841090undefined11241128__WEBPACK_MODULE_REFERENCE__2_5b22686f697374225d_call_directImport_asiSafe1__._undefined11301137__WEBPACK_MODULE_REFERENCE__13_ns_asiSafe1__._undefined11691175undefined12081212__WEBPACK_MODULE_REFERENCE__2_5b22686f697374225d_call_directImport_asiSafe1__._undefined12141221__WEBPACK_MODULE_REFERENCE__13_ns_asiSafe1__._undefined12521258undefined12951299__WEBPACK_MODULE_REFERENCE__2_5b22686f697374225d_call_directImport_asiSafe1__._undefined13011308__WEBPACK_MODULE_REFERENCE__13_ns_asiSafe1__._undefined14041410undefined14351450__WEBPACK_MODULE_REFERENCE__0_5b225061676573526f7574654d6f64756c65225d_directImport_asiSafe1__._undefined14861494__WEBPACK_MODULE_REFERENCE__1_5b22526f7574654b696e64225d_asiSafe1__._undefined16981697: __WEBPACK_MODULE_REFERENCE__4_5b2264656661756c74225d_directImport_asiSafe1__._undefined17161715: __WEBPACK_MODULE_REFERENCE__3_5b2264656661756c74225d_directImport_asiSafe1__._undefined17361735: __WEBPACK_MODULE_REFERENCE__13_ns_asiSafe1__._undefined`ÂÇDÏÑþ+y{¨Ù')VÍÏü"prŸóACp¯ýWÿ,lº¼é)wy¦é79fÞ= a ¥ s
À
Õ
" 9 f ònext_route_loaderkind_PAGES_page_2Fcategories_preferredRegion_absolutePagePath_private_next_pages_2Fcategories_js_absoluteAppPath_private_next_pages_2F_app_js_absoluteDocumentPath_next_2Fdist_2Fpages_2F_document_middlewareConfigBase64_e30_3D_˜(0,helpers/* hoist */.l)šcategories_namespaceObjectþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿ module_compiled.PagesRouteModuleroute_kind/* RouteKind */.x_app["default"]•(_document_default())û†buffer†source„size„maps„hashc// ESM COMPAT FLAG
__webpack_require__.r(__webpack_exports__);
// EXPORTS
__webpack_require__.d(__webpack_exports__, {
config: () => (/* binding */ config),
"default": () => (/* binding */ next_route_loaderkind_PAGES_page_2Fcategories_preferredRegion_absolutePagePath_private_next_pages_2Fcategories_js_absoluteAppPath_private_next_pages_2F_app_js_absoluteDocumentPath_next_2Fdist_2Fpages_2F_document_middlewareConfigBase64_e30_3D_),
getServerSideProps: () => (/* binding */ getServerSideProps),
getStaticPaths: () => (/* binding */ getStaticPaths),
getStaticProps: () => (/* binding */ getStaticProps),
reportWebVitals: () => (/* binding */ reportWebVitals),
routeModule: () => (/* binding */ routeModule),
unstable_getServerProps: () => (/* binding */ unstable_getServerProps),
unstable_getServerSideProps: () => (/* binding */ unstable_getServerSideProps),
unstable_getStaticParams: () => (/* binding */ unstable_getStaticParams),
unstable_getStaticPaths: () => (/* binding */ unstable_getStaticPaths),
unstable_getStaticProps: () => (/* binding */ unstable_getStaticProps)
});
// NAMESPACE OBJECT: ./pages/categories.js
var categories_namespaceObject = {};
__webpack_require__.r(categories_namespaceObject);
__webpack_require__.d(categories_namespaceObject, {
"default": () => (Categories)
});
// EXTERNAL MODULE: ./node_modules/next/dist/server/future/route-modules/pages/module.compiled.js
var module_compiled = __webpack_require__(7093);
// EXTERNAL MODULE: ./node_modules/next/dist/server/future/route-kind.js
var route_kind = __webpack_require__(5244);
// EXTERNAL MODULE: ./node_modules/next/dist/build/templates/helpers.js
var helpers = __webpack_require__(1323);
// EXTERNAL MODULE: ./node_modules/next/dist/pages/_document.js
var _document = __webpack_require__(2899);
var _document_default = /*#__PURE__*/__webpack_require__.n(_document);
// EXTERNAL MODULE: ./pages/_app.js
var _app = __webpack_require__(3414);
// EXTERNAL MODULE: external "react/jsx-runtime"
var jsx_runtime_ = __webpack_require__(997);
// EXTERNAL MODULE: external "react"
var external_react_ = __webpack_require__(6689);
// EXTERNAL MODULE: ./node_modules/next/router.js
var next_router = __webpack_require__(1163);
// EXTERNAL MODULE: ./lib/api.js
var api = __webpack_require__(7751);
// EXTERNAL MODULE: ./components/AppShell.js
var AppShell = __webpack_require__(1712);
// EXTERNAL MODULE: ./components/icons.js
var icons = __webpack_require__(349);
// EXTERNAL MODULE: ./components/ToastProvider.js
var ToastProvider = __webpack_require__(4190);
// EXTERNAL MODULE: ./components/ConfirmProvider.js
var ConfirmProvider = __webpack_require__(4407);
;// CONCATENATED MODULE: ./pages/categories.js
const ICONS = [
"\uD83C\uDF5C",
"\uD83E\uDD58",
"\uD83E\uDD6C",
"\uD83E\uDD69",
"\uD83C\uDF54",
"\uD83C\uDF55",
"☕",
"\uD83C\uDF7A",
"\uD83E\uDDCB",
"\uD83C\uDF4E",
"\uD83C\uDF6A",
"\uD83C\uDF6B",
"\uD83D\uDE97",
"\uD83D\uDE95",
"\uD83D\uDE8C",
"\uD83D\uDE87",
"⛽",
"\uD83D\uDE99",
"\uD83D\uDEF5",
"✈ï¸",
"\uD83D\uDEA2",
"\uD83D\uDED2",
"\uD83D\uDC54",
"\uD83D\uDC55",
"\uD83D\uDC56",
"\uD83D\uDC5F",
"\uD83D\uDC53",
"\uD83E\uDDE2",
"\uD83D\uDC5C",
"\uD83C\uDF92",
"\uD83D\uDC8D",
"\uD83D\uDC84",
"\uD83C\uDFE0",
"\uD83C\uDFE2",
"\uD83C\uDFE6",
"\uD83C\uDFE5",
"\uD83C\uDFE8",
"\uD83C\uDFE9",
"\uD83D\uDD27",
"\uD83D\uDD28",
"\uD83D\uDECBï¸",
"\uD83D\uDCFA",
"\uD83D\uDCBB",
"\uD83D\uDCF1",
"\uD83D\uDCDD",
"\uD83D\uDCB0",
"\uD83C\uDF81",
"\uD83D\uDCC8",
"\uD83E\uDDE7",
"\uD83D\uDCB3",
"\uD83C\uDFAF",
"\uD83D\uDCDA",
"\uD83C\uDFB5",
"\uD83C\uDFAE",
"\uD83C\uDFC3",
"âš½",
"\uD83C\uDFCA",
"\uD83D\uDEB4",
"\uD83C\uDFAD",
"\uD83C\uDFA8",
"\uD83C\uDFAC",
"\uD83D\uDCF7",
"\uD83C\uDFA5",
"\uD83D\uDCFA",
"\uD83E\uDDF8",
"\uD83D\uDC15",
"\uD83D\uDC08",
"\uD83C\uDF38",
"\uD83C\uDF3A"
];
function Categories() {
const router = (0,next_router.useRouter)();
const { showToast } = (0,ToastProvider/* useToast */.p)();
const { confirm } = (0,ConfirmProvider/* useConfirm */.N)();
const [categories, setCategories] = (0,external_react_.useState)({
expense: [],
income: []
});
const [modalOpen, setModalOpen] = (0,external_react_.useState)(false);
const [categoryType, setCategoryType] = (0,external_react_.useState)("expense");
const [loading, setLoading] = (0,external_react_.useState)(true);
const [submitting, setSubmitting] = (0,external_react_.useState)(false);
const [formError, setFormError] = (0,external_react_.useState)("");
const [formData, setFormData] = (0,external_react_.useState)({
name: "",
icon: "\uD83D\uDCDD"
});
null;
const loadCategories = async ()=>{
setLoading(true);
try {
const data = await (0,api/* getCategories */.CP)();
setCategories(data);
} catch (err) {
console.error(err);
showToast(err.message, {
tone: "error"
});
} finally{
setLoading(false);
}
};
const openAddModal = (type)=>{
setCategoryType(type);
setFormData({
name: "",
icon: "\uD83D\uDCDD"
});
setFormError("");
setModalOpen(true);
};
const closeModal = ()=>{
if (submitting) return;
setModalOpen(false);
setFormError("");
};
const handleSubmit = async (e)=>{
e.preventDefault();
if (!formData.name || !formData.icon) {
setFormError("请填写完整信æ¯");
return;
}
setSubmitting(true);
setFormError("");
try {
await (0,api/* createCategory */.k4)({
type: categoryType,
name: formData.name,
icon: formData.icon
});
closeModal();
showToast("分类已创建", {
tone: "success"
});
await loadCategories();
} catch (err) {
setFormError(err.message);
showToast(err.message, {
tone: "error"
});
} finally{
setSubmitting(false);
}
};
const handleDelete = async (id)=>{
const shouldDelete = await confirm({
title: "删除此分类?",
description: "默认分类ä¸å¯åˆ é™¤ï¼Œè‡ªå®šä¹‰åˆ†ç±»åˆ é™¤åŽå°†æ— æ³•æ¢å¤ã€‚",
confirmText: "删除"
});
if (!shouldDelete) return;
try {
await (0,api/* deleteCategory */.uu)(id);
showToast("分类已删除", {
tone: "success"
});
await loadCategories();
} catch (err) {
showToast(err.message, {
tone: "error"
});
}
};
const actions = /*#__PURE__*/ jsx_runtime_.jsx("button", {
type: "button",
className: "icon-button",
"aria-label": "设置",
onClick: ()=>router.push("/settings"),
children: /*#__PURE__*/ jsx_runtime_.jsx(icons/* Icon */.J, {
name: "settings",
size: 18
})
});
return /*#__PURE__*/ (0,jsx_runtime_.jsxs)(AppShell/* default */.Z, {
title: "分类",
subtitle: "æ•´ç†å¸¸ç”¨åˆ†ç±»ä¸Žå›¾æ ‡",
actions: actions,
compactHeader: true,
children: [
loading ? /*#__PURE__*/ jsx_runtime_.jsx("div", {
className: "card loading-state",
children: "加载中..."
}) : /*#__PURE__*/ (0,jsx_runtime_.jsxs)(jsx_runtime_.Fragment, {
children: [
/*#__PURE__*/ (0,jsx_runtime_.jsxs)("section", {
className: "card category-section category-section--refresh",
children: [
/*#__PURE__*/ (0,jsx_runtime_.jsxs)("div", {
className: "section-header",
children: [
/*#__PURE__*/ (0,jsx_runtime_.jsxs)("div", {
children: [
/*#__PURE__*/ jsx_runtime_.jsx("p", {
className: "eyebrow",
children: "支出分类"
}),
/*#__PURE__*/ jsx_runtime_.jsx("h2", {
children: "支出"
})
]
}),
/*#__PURE__*/ jsx_runtime_.jsx("button", {
type: "button",
className: "btn btn-secondary btn-inline",
onClick: ()=>openAddModal("expense"),
children: /*#__PURE__*/ (0,jsx_runtime_.jsxs)("span", {
className: "button-content",
children: [
/*#__PURE__*/ jsx_runtime_.jsx(icons/* Icon */.J, {
name: "plus",
size: 16
}),
"添加"
]
})
})
]
}),
/*#__PURE__*/ jsx_runtime_.jsx("div", {
className: "category-list category-list--chips",
children: categories.expense.map((cat)=>/*#__PURE__*/ (0,jsx_runtime_.jsxs)("div", {
className: "category-tag",
children: [
/*#__PURE__*/ jsx_runtime_.jsx("span", {
className: "cat-icon",
children: cat.icon
}),
/*#__PURE__*/ jsx_runtime_.jsx("span", {
className: "cat-name",
children: cat.name
}),
!cat.is_default && /*#__PURE__*/ jsx_runtime_.jsx("button", {
type: "button",
className: "icon-button icon-button--ghost cat-delete",
"aria-label": `删除${cat.name}`,
onClick: ()=>handleDelete(cat.id),
children: /*#__PURE__*/ jsx_runtime_.jsx(icons/* Icon */.J, {
name: "close",
size: 14
})
})
]
}, cat.id || cat.name))
})
]
}),
/*#__PURE__*/ (0,jsx_runtime_.jsxs)("section", {
className: "card category-section category-section--refresh",
children: [
/*#__PURE__*/ (0,jsx_runtime_.jsxs)("div", {
className: "section-header",
children: [
/*#__PURE__*/ (0,jsx_runtime_.jsxs)("div", {
children: [
/*#__PURE__*/ jsx_runtime_.jsx("p", {
className: "eyebrow",
children: "收入分类"
}),
/*#__PURE__*/ jsx_runtime_.jsx("h2", {
children: "æ”¶å…¥"
})
]
}),
/*#__PURE__*/ jsx_runtime_.jsx("button", {
type: "button",
className: "btn btn-secondary btn-inline",
onClick: ()=>openAddModal("income"),
children: /*#__PURE__*/ (0,jsx_runtime_.jsxs)("span", {
className: "button-content",
children: [
/*#__PURE__*/ jsx_runtime_.jsx(icons/* Icon */.J, {
name: "plus",
size: 16
}),
"添加"
]
})
})
]
}),
/*#__PURE__*/ jsx_runtime_.jsx("div", {
className: "category-list category-list--chips",
children: categories.income.map((cat)=>/*#__PURE__*/ (0,jsx_runtime_.jsxs)("div", {
className: "category-tag",
children: [
/*#__PURE__*/ jsx_runtime_.jsx("span", {
className: "cat-icon",
children: cat.icon
}),
/*#__PURE__*/ jsx_runtime_.jsx("span", {
className: "cat-name",
children: cat.name
}),
!cat.is_default && /*#__PURE__*/ jsx_runtime_.jsx("button", {
type: "button",
className: "icon-button icon-button--ghost cat-delete",
"aria-label": `删除${cat.name}`,
onClick: ()=>handleDelete(cat.id),
children: /*#__PURE__*/ jsx_runtime_.jsx(icons/* Icon */.J, {
name: "close",
size: 14
})
})
]
}, cat.id || cat.name))
})
]
}),
/*#__PURE__*/ jsx_runtime_.jsx("div", {
className: "card category-tip category-tip--refresh",
children: /*#__PURE__*/ jsx_runtime_.jsx("p", {
children: "默认分类无法删除,自定义分类å¯ä»¥åˆ é™¤ã€‚"
})
})
]
}),
modalOpen && /*#__PURE__*/ jsx_runtime_.jsx("div", {
className: "modal-overlay",
onClick: closeModal,
children: /*#__PURE__*/ (0,jsx_runtime_.jsxs)("div", {
className: "modal",
onClick: (e)=>e.stopPropagation(),
children: [
/*#__PURE__*/ (0,jsx_runtime_.jsxs)("div", {
className: "modal-header",
children: [
/*#__PURE__*/ (0,jsx_runtime_.jsxs)("div", {
children: [
/*#__PURE__*/ jsx_runtime_.jsx("p", {
className: "eyebrow",
children: "新增分类"
}),
/*#__PURE__*/ jsx_runtime_.jsx("h2", {
children: categoryType === "expense" ? "新建支出分类" : "新建收入分类"
})
]
}),
/*#__PURE__*/ jsx_runtime_.jsx("button", {
type: "button",
className: "icon-button icon-button--ghost",
"aria-label": "关闭弹窗",
onClick: closeModal,
children: /*#__PURE__*/ jsx_runtime_.jsx(icons/* Icon */.J, {
name: "close",
size: 18
})
})
]
}),
formError && /*#__PURE__*/ jsx_runtime_.jsx("div", {
className: "error-msg",
children: formError
}),
/*#__PURE__*/ (0,jsx_runtime_.jsxs)("form", {
onSubmit: handleSubmit,
children: [
/*#__PURE__*/ (0,jsx_runtime_.jsxs)("div", {
className: "form-group",
children: [
/*#__PURE__*/ jsx_runtime_.jsx("label", {
htmlFor: "category-name",
children: "分类åç§°"
}),
/*#__PURE__*/ jsx_runtime_.jsx("input", {
id: "category-name",
type: "text",
value: formData.name,
onChange: (e)=>setFormData({
...formData,
name: e.target.value
}),
placeholder: "请输入分类åç§°",
required: true,
disabled: submitting
})
]
}),
/*#__PURE__*/ (0,jsx_runtime_.jsxs)("div", {
className: "form-group",
children: [
/*#__PURE__*/ jsx_runtime_.jsx("label", {
children: "选择图标"
}),
/*#__PURE__*/ jsx_runtime_.jsx("div", {
className: "icon-grid",
style: {
display: "grid",
gridTemplateColumns: "repeat(8, minmax(0, 1fr))",
gap: "8px"
},
children: ICONS.map((icon)=>/*#__PURE__*/ jsx_runtime_.jsx("button", {
type: "button",
className: `icon-btn ${formData.icon === icon ? "active" : ""}`,
onClick: ()=>setFormData({
...formData,
icon
}),
disabled: submitting,
children: icon
}, icon))
})
]
}),
/*#__PURE__*/ jsx_runtime_.jsx("div", {
className: "modal-actions",
children: /*#__PURE__*/ jsx_runtime_.jsx("button", {
type: "submit",
className: "btn btn-primary",
disabled: submitting,
children: submitting ? /*#__PURE__*/ (0,jsx_runtime_.jsxs)("span", {
className: "button-content",
children: [
/*#__PURE__*/ jsx_runtime_.jsx(icons/* Icon */.J, {
name: "spinner",
size: 16,
className: "is-spinning"
}),
"ä¿å­˜ä¸­..."
]
}) : "ä¿å­˜"
})
})
]
})
]
})
})
]
});
}
;// CONCATENATED MODULE: ./node_modules/next/dist/build/webpack/loaders/next-route-loader/index.js?kind=PAGES&page=%2Fcategories&preferredRegion=&absolutePagePath=private-next-pages%2Fcategories.js&absoluteAppPath=private-next-pages%2F_app.js&absoluteDocumentPath=next%2Fdist%2Fpages%2F_document&middlewareConfigBase64=e30%3D!
// Import the app and document modules.
// Import the userland code.
// Re-export the component (should be the default export).
/* harmony default export */ const next_route_loaderkind_PAGES_page_2Fcategories_preferredRegion_absolutePagePath_private_next_pages_2Fcategories_js_absoluteAppPath_private_next_pages_2F_app_js_absoluteDocumentPath_next_2Fdist_2Fpages_2F_document_middlewareConfigBase64_e30_3D_ = ((0,helpers/* hoist */.l)(categories_namespaceObject, "default"));
// Re-export methods.
const getStaticProps = (0,helpers/* hoist */.l)(categories_namespaceObject, "getStaticProps");
const getStaticPaths = (0,helpers/* hoist */.l)(categories_namespaceObject, "getStaticPaths");
const getServerSideProps = (0,helpers/* hoist */.l)(categories_namespaceObject, "getServerSideProps");
const config = (0,helpers/* hoist */.l)(categories_namespaceObject, "config");
const reportWebVitals = (0,helpers/* hoist */.l)(categories_namespaceObject, "reportWebVitals");
// Re-export legacy methods.
const unstable_getStaticProps = (0,helpers/* hoist */.l)(categories_namespaceObject, "unstable_getStaticProps");
const unstable_getStaticPaths = (0,helpers/* hoist */.l)(categories_namespaceObject, "unstable_getStaticPaths");
const unstable_getStaticParams = (0,helpers/* hoist */.l)(categories_namespaceObject, "unstable_getStaticParams");
const unstable_getServerProps = (0,helpers/* hoist */.l)(categories_namespaceObject, "unstable_getServerProps");
const unstable_getServerSideProps = (0,helpers/* hoist */.l)(categories_namespaceObject, "unstable_getServerSideProps");
// Create and export the route module that will be consumed.
const routeModule = new module_compiled.PagesRouteModule({
definition: {
kind: route_kind/* RouteKind */.x.PAGES,
page: "/categories",
pathname: "/categories",
// The following aren't used in production.
bundlePath: "",
filename: ""
},
components: {
App: _app["default"],
Document: (_document_default())
},
userland: categories_namespaceObject
});
//# sourceMappingURL=pages.js.map ”{"finalSource":true}ƒmapbufferedMap `
ConcatSourceRawSource
// ESM COMPAT FLAG
__webpack_require__.r(__webpack_exports__);
// EXPORTS
__webpack_require__.d(__webpack_exports__, {
config: () => (/* binding */ config),
"default": () => (/* binding */ next_route_loaderkind_PAGES_page_2Fcategories_preferredRegion_absolutePagePath_private_next_pages_2Fcategories_js_absoluteAppPath_private_next_pages_2F_app_js_absoluteDocumentPath_next_2Fdist_2Fpages_2F_document_middlewareConfigBase64_e30_3D_),
getServerSideProps: () => (/* binding */ getServerSideProps),
getStaticPaths: () => (/* binding */ getStaticPaths),
getStaticProps: () => (/* binding */ getStaticProps),
reportWebVitals: () => (/* binding */ reportWebVitals),
routeModule: () => (/* binding */ routeModule),
unstable_getServerProps: () => (/* binding */ unstable_getServerProps),
unstable_getServerSideProps: () => (/* binding */ unstable_getServerSideProps),
unstable_getStaticParams: () => (/* binding */ unstable_getStaticParams),
unstable_getStaticPaths: () => (/* binding */ unstable_getStaticPaths),
unstable_getStaticProps: () => (/* binding */ unstable_getStaticProps)
});
// NAMESPACE OBJECT: ./pages/categories.js
var categories_namespaceObject = {};
__webpack_require__.r(categories_namespaceObject);
__webpack_require__.d(categories_namespaceObject, {
"default": () => (Categories)
});
// EXTERNAL MODULE: ./node_modules/next/dist/server/future/route-modules/pages/module.compiled.js
var module_compiled = __webpack_require__(7093);
// EXTERNAL MODULE: ./node_modules/next/dist/server/future/route-kind.js
var route_kind = __webpack_require__(5244);
// EXTERNAL MODULE: ./node_modules/next/dist/build/templates/helpers.js
var helpers = __webpack_require__(1323);
// EXTERNAL MODULE: ./node_modules/next/dist/pages/_document.js
var _document = __webpack_require__(2899);
var _document_default = /*#__PURE__*/__webpack_require__.n(_document);
// EXTERNAL MODULE: ./pages/_app.js
var _app = __webpack_require__(3414);
// EXTERNAL MODULE: external "react/jsx-runtime"
var jsx_runtime_ = __webpack_require__(997);
// EXTERNAL MODULE: external "react"
var external_react_ = __webpack_require__(6689);
// EXTERNAL MODULE: ./node_modules/next/router.js
var next_router = __webpack_require__(1163);
// EXTERNAL MODULE: ./lib/api.js
var api = __webpack_require__(7751);
// EXTERNAL MODULE: ./components/AppShell.js
var AppShell = __webpack_require__(1712);
// EXTERNAL MODULE: ./components/icons.js
var icons = __webpack_require__(349);
// EXTERNAL MODULE: ./components/ToastProvider.js
var ToastProvider = __webpack_require__(4190);
// EXTERNAL MODULE: ./components/ConfirmProvider.js
var ConfirmProvider = __webpack_require__(4407);
;// CONCATENATED MODULE: ./pages/categories.js

ReplaceSourceReplaceSourceRawSource€Limport { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
import { useState, useEffect } from "react";
import { useRouter } from "next/router";
import { isLoggedIn, getCategories, createCategory, deleteCategory } from "../lib/api";
import AppShell from "../components/AppShell";
import { Icon } from "../components/icons";
import { useToast } from "../components/ToastProvider";
import { useConfirm } from "../components/ConfirmProvider";
const ICONS = [
"\uD83C\uDF5C",
"\uD83E\uDD58",
"\uD83E\uDD6C",
"\uD83E\uDD69",
"\uD83C\uDF54",
"\uD83C\uDF55",
"☕",
"\uD83C\uDF7A",
"\uD83E\uDDCB",
"\uD83C\uDF4E",
"\uD83C\uDF6A",
"\uD83C\uDF6B",
"\uD83D\uDE97",
"\uD83D\uDE95",
"\uD83D\uDE8C",
"\uD83D\uDE87",
"⛽",
"\uD83D\uDE99",
"\uD83D\uDEF5",
"✈ï¸",
"\uD83D\uDEA2",
"\uD83D\uDED2",
"\uD83D\uDC54",
"\uD83D\uDC55",
"\uD83D\uDC56",
"\uD83D\uDC5F",
"\uD83D\uDC53",
"\uD83E\uDDE2",
"\uD83D\uDC5C",
"\uD83C\uDF92",
"\uD83D\uDC8D",
"\uD83D\uDC84",
"\uD83C\uDFE0",
"\uD83C\uDFE2",
"\uD83C\uDFE6",
"\uD83C\uDFE5",
"\uD83C\uDFE8",
"\uD83C\uDFE9",
"\uD83D\uDD27",
"\uD83D\uDD28",
"\uD83D\uDECBï¸",
"\uD83D\uDCFA",
"\uD83D\uDCBB",
"\uD83D\uDCF1",
"\uD83D\uDCDD",
"\uD83D\uDCB0",
"\uD83C\uDF81",
"\uD83D\uDCC8",
"\uD83E\uDDE7",
"\uD83D\uDCB3",
"\uD83C\uDFAF",
"\uD83D\uDCDA",
"\uD83C\uDFB5",
"\uD83C\uDFAE",
"\uD83C\uDFC3",
"âš½",
"\uD83C\uDFCA",
"\uD83D\uDEB4",
"\uD83C\uDFAD",
"\uD83C\uDFA8",
"\uD83C\uDFAC",
"\uD83D\uDCF7",
"\uD83C\uDFA5",
"\uD83D\uDCFA",
"\uD83E\uDDF8",
"\uD83D\uDC15",
"\uD83D\uDC08",
"\uD83C\uDF38",
"\uD83C\uDF3A"
];
export default function Categories() {
const router = useRouter();
const { showToast } = useToast();
const { confirm } = useConfirm();
const [categories, setCategories] = useState({
expense: [],
income: []
});
const [modalOpen, setModalOpen] = useState(false);
const [categoryType, setCategoryType] = useState("expense");
const [loading, setLoading] = useState(true);
const [submitting, setSubmitting] = useState(false);
const [formError, setFormError] = useState("");
const [formData, setFormData] = useState({
name: "",
icon: "\uD83D\uDCDD"
});
null;
const loadCategories = async ()=>{
setLoading(true);
try {
const data = await getCategories();
setCategories(data);
} catch (err) {
console.error(err);
showToast(err.message, {
tone: "error"
});
} finally{
setLoading(false);
}
};
const openAddModal = (type)=>{
setCategoryType(type);
setFormData({
name: "",
icon: "\uD83D\uDCDD"
});
setFormError("");
setModalOpen(true);
};
const closeModal = ()=>{
if (submitting) return;
setModalOpen(false);
setFormError("");
};
const handleSubmit = async (e)=>{
e.preventDefault();
if (!formData.name || !formData.icon) {
setFormError("请填写完整信æ¯");
return;
}
setSubmitting(true);
setFormError("");
try {
await createCategory({
type: categoryType,
name: formData.name,
icon: formData.icon
});
closeModal();
showToast("分类已创建", {
tone: "success"
});
await loadCategories();
} catch (err) {
setFormError(err.message);
showToast(err.message, {
tone: "error"
});
} finally{
setSubmitting(false);
}
};
const handleDelete = async (id)=>{
const shouldDelete = await confirm({
title: "删除此分类?",
description: "默认分类ä¸å¯åˆ é™¤ï¼Œè‡ªå®šä¹‰åˆ†ç±»åˆ é™¤åŽå°†æ— æ³•æ¢å¤ã€‚",
confirmText: "删除"
});
if (!shouldDelete) return;
try {
await deleteCategory(id);
showToast("分类已删除", {
tone: "success"
});
await loadCategories();
} catch (err) {
showToast(err.message, {
tone: "error"
});
}
};
const actions = /*#__PURE__*/ _jsx("button", {
type: "button",
className: "icon-button",
"aria-label": "设置",
onClick: ()=>router.push("/settings"),
children: /*#__PURE__*/ _jsx(Icon, {
name: "settings",
size: 18
})
});
return /*#__PURE__*/ _jsxs(AppShell, {
title: "分类",
subtitle: "æ•´ç†å¸¸ç”¨åˆ†ç±»ä¸Žå›¾æ ‡",
actions: actions,
compactHeader: true,
children: [
loading ? /*#__PURE__*/ _jsx("div", {
className: "card loading-state",
children: "加载中..."
}) : /*#__PURE__*/ _jsxs(_Fragment, {
children: [
/*#__PURE__*/ _jsxs("section", {
className: "card category-section category-section--refresh",
children: [
/*#__PURE__*/ _jsxs("div", {
className: "section-header",
children: [
/*#__PURE__*/ _jsxs("div", {
children: [
/*#__PURE__*/ _jsx("p", {
className: "eyebrow",
children: "支出分类"
}),
/*#__PURE__*/ _jsx("h2", {
children: "支出"
})
]
}),
/*#__PURE__*/ _jsx("button", {
type: "button",
className: "btn btn-secondary btn-inline",
onClick: ()=>openAddModal("expense"),
children: /*#__PURE__*/ _jsxs("span", {
className: "button-content",
children: [
/*#__PURE__*/ _jsx(Icon, {
name: "plus",
size: 16
}),
"添加"
]
})
})
]
}),
/*#__PURE__*/ _jsx("div", {
className: "category-list category-list--chips",
children: categories.expense.map((cat)=>/*#__PURE__*/ _jsxs("div", {
className: "category-tag",
children: [
/*#__PURE__*/ _jsx("span", {
className: "cat-icon",
children: cat.icon
}),
/*#__PURE__*/ _jsx("span", {
className: "cat-name",
children: cat.name
}),
!cat.is_default && /*#__PURE__*/ _jsx("button", {
type: "button",
className: "icon-button icon-button--ghost cat-delete",
"aria-label": `删除${cat.name}`,
onClick: ()=>handleDelete(cat.id),
children: /*#__PURE__*/ _jsx(Icon, {
name: "close",
size: 14
})
})
]
}, cat.id || cat.name))
})
]
}),
/*#__PURE__*/ _jsxs("section", {
className: "card category-section category-section--refresh",
children: [
/*#__PURE__*/ _jsxs("div", {
className: "section-header",
children: [
/*#__PURE__*/ _jsxs("div", {
children: [
/*#__PURE__*/ _jsx("p", {
className: "eyebrow",
children: "收入分类"
}),
/*#__PURE__*/ _jsx("h2", {
children: "æ”¶å…¥"
})
]
}),
/*#__PURE__*/ _jsx("button", {
type: "button",
className: "btn btn-secondary btn-inline",
onClick: ()=>openAddModal("income"),
children: /*#__PURE__*/ _jsxs("span", {
className: "button-content",
children: [
/*#__PURE__*/ _jsx(Icon, {
name: "plus",
size: 16
}),
"添加"
]
})
})
]
}),
/*#__PURE__*/ _jsx("div", {
className: "category-list category-list--chips",
children: categories.income.map((cat)=>/*#__PURE__*/ _jsxs("div", {
className: "category-tag",
children: [
/*#__PURE__*/ _jsx("span", {
className: "cat-icon",
children: cat.icon
}),
/*#__PURE__*/ _jsx("span", {
className: "cat-name",
children: cat.name
}),
!cat.is_default && /*#__PURE__*/ _jsx("button", {
type: "button",
className: "icon-button icon-button--ghost cat-delete",
"aria-label": `删除${cat.name}`,
onClick: ()=>handleDelete(cat.id),
children: /*#__PURE__*/ _jsx(Icon, {
name: "close",
size: 14
})
})
]
}, cat.id || cat.name))
})
]
}),
/*#__PURE__*/ _jsx("div", {
className: "card category-tip category-tip--refresh",
children: /*#__PURE__*/ _jsx("p", {
children: "默认分类无法删除,自定义分类å¯ä»¥åˆ é™¤ã€‚"
})
})
]
}),
modalOpen && /*#__PURE__*/ _jsx("div", {
className: "modal-overlay",
onClick: closeModal,
children: /*#__PURE__*/ _jsxs("div", {
className: "modal",
onClick: (e)=>e.stopPropagation(),
children: [
/*#__PURE__*/ _jsxs("div", {
className: "modal-header",
children: [
/*#__PURE__*/ _jsxs("div", {
children: [
/*#__PURE__*/ _jsx("p", {
className: "eyebrow",
children: "新增分类"
}),
/*#__PURE__*/ _jsx("h2", {
children: categoryType === "expense" ? "新建支出分类" : "新建收入分类"
})
]
}),
/*#__PURE__*/ _jsx("button", {
type: "button",
className: "icon-button icon-button--ghost",
"aria-label": "关闭弹窗",
onClick: closeModal,
children: /*#__PURE__*/ _jsx(Icon, {
name: "close",
size: 18
})
})
]
}),
formError && /*#__PURE__*/ _jsx("div", {
className: "error-msg",
children: formError
}),
/*#__PURE__*/ _jsxs("form", {
onSubmit: handleSubmit,
children: [
/*#__PURE__*/ _jsxs("div", {
className: "form-group",
children: [
/*#__PURE__*/ _jsx("label", {
htmlFor: "category-name",
children: "分类åç§°"
}),
/*#__PURE__*/ _jsx("input", {
id: "category-name",
type: "text",
value: formData.name,
onChange: (e)=>setFormData({
...formData,
name: e.target.value
}),
placeholder: "请输入分类åç§°",
required: true,
disabled: submitting
})
]
}),
/*#__PURE__*/ _jsxs("div", {
className: "form-group",
children: [
/*#__PURE__*/ _jsx("label", {
children: "选择图标"
}),
/*#__PURE__*/ _jsx("div", {
className: "icon-grid",
style: {
display: "grid",
gridTemplateColumns: "repeat(8, minmax(0, 1fr))",
gap: "8px"
},
children: ICONS.map((icon)=>/*#__PURE__*/ _jsx("button", {
type: "button",
className: `icon-btn ${formData.icon === icon ? "active" : ""}`,
onClick: ()=>setFormData({
...formData,
icon
}),
disabled: submitting,
children: icon
}, icon))
})
]
}),
/*#__PURE__*/ _jsx("div", {
className: "modal-actions",
children: /*#__PURE__*/ _jsx("button", {
type: "submit",
className: "btn btn-primary",
disabled: submitting,
children: submitting ? /*#__PURE__*/ _jsxs("span", {
className: "button-content",
children: [
/*#__PURE__*/ _jsx(Icon, {
name: "spinner",
size: 16,
className: "is-spinning"
}),
"ä¿å­˜ä¸­..."
]
}) : "ä¿å­˜"
})
})
]
})
]
})
})
]
});
}
æ085undefined87130undefined132171undefined173259undefined261306undefined308350undefined352406undefined408466undefined18241838undefined18821890__WEBPACK_MODULE_REFERENCE__7_5b22757365526f75746572225d_call_directImport_asiSafe1__._undefined19211928__WEBPACK_MODULE_REFERENCE__11_5b22757365546f617374225d_call_directImport_asiSafe1__._undefined19571966__WEBPACK_MODULE_REFERENCE__12_5b22757365436f6e6669726d225d_call_directImport_asiSafe1__._undefined20112018__WEBPACK_MODULE_REFERENCE__6_5b227573655374617465225d_call_directImport_asiSafe1__._undefined21082115__WEBPACK_MODULE_REFERENCE__6_5b227573655374617465225d_call_directImport_asiSafe1__._undefined21692176__WEBPACK_MODULE_REFERENCE__6_5b227573655374617465225d_call_directImport_asiSafe1__._undefined22242231__WEBPACK_MODULE_REFERENCE__6_5b227573655374617465225d_call_directImport_asiSafe1__._undefined22802287__WEBPACK_MODULE_REFERENCE__6_5b227573655374617465225d_call_directImport_asiSafe1__._undefined23352342__WEBPACK_MODULE_REFERENCE__6_5b227573655374617465225d_call_directImport_asiSafe1__._undefined23852392__WEBPACK_MODULE_REFERENCE__6_5b227573655374617465225d_call_directImport_asiSafe1__._undefined25712583__WEBPACK_MODULE_REFERENCE__8_5b2267657443617465676f72696573225d_call_directImport_asiSafe1__._undefined34343447__WEBPACK_MODULE_REFERENCE__8_5b2263726561746543617465676f7279225d_call_directImport_asiSafe1__._undefined42094222__WEBPACK_MODULE_REFERENCE__8_5b2264656c65746543617465676f7279225d_call_directImport_asiSafe1__._undefined45044507__WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._undefined46864689__WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._undefined46914694__WEBPACK_MODULE_REFERENCE__10_5b2249636f6e225d_directImport_asiSafe1__._undefined47944798__WEBPACK_MODULE_REFERENCE__5_5b226a737873225d_call_directImport_asiSafe1__._undefined48004807__WEBPACK_MODULE_REFERENCE__9_5b2264656661756c74225d_directImport_asiSafe1__._undefined49754978__WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._undefined51045108__WEBPACK_MODULE_REFERENCE__5_5b226a737873225d_call_directImport_asiSafe1__._undefined51105118__WEBPACK_MODULE_REFERENCE__5_5b22467261676d656e74225d_directImport_asiSafe1__._undefined51855189__WEBPACK_MODULE_REFERENCE__5_5b226a737873225d_call_directImport_asiSafe1__._undefined53685372__WEBPACK_MODULE_REFERENCE__5_5b226a737873225d_call_directImport_asiSafe1__._undefined55385542__WEBPACK_MODULE_REFERENCE__5_5b226a737873225d_call_directImport_asiSafe1__._undefined56635666__WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._undefined59165919__WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._undefined61716174__WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._undefined64696473__WEBPACK_MODULE_REFERENCE__5_5b226a737873225d_call_directImport_asiSafe1__._undefined66766679__WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._undefined66816684__WEBPACK_MODULE_REFERENCE__10_5b2249636f6e225d_directImport_asiSafe1__._undefined71577160__WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._undefined73387342__WEBPACK_MODULE_REFERENCE__5_5b226a737873225d_call_directImport_asiSafe1__._undefined75307533__WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._undefined77897792__WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._undefined80678070__WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._undefined84868489__WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._undefined84918494__WEBPACK_MODULE_REFERENCE__10_5b2249636f6e225d_directImport_asiSafe1__._undefined89428946__WEBPACK_MODULE_REFERENCE__5_5b226a737873225d_call_directImport_asiSafe1__._undefined91259129__WEBPACK_MODULE_REFERENCE__5_5b226a737873225d_call_directImport_asiSafe1__._undefined92959299__WEBPACK_MODULE_REFERENCE__5_5b226a737873225d_call_directImport_asiSafe1__._undefined94209423__WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._undefined96739676__WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_dir
;// CONCATENATED MODULE: ./node_modules/next/dist/build/webpack/loaders/next-route-loader/index.js?kind=PAGES&page=%2Fcategories&preferredRegion=&absolutePagePath=private-next-pages%2Fcategories.js&absoluteAppPath=private-next-pages%2F_app.js&absoluteDocumentPath=next%2Fdist%2Fpages%2F_document&middlewareConfigBase64=e30%3D!
úûïimport { PagesRouteModule } from "next/dist/server/future/route-modules/pages/module.compiled";
import { RouteKind } from "next/dist/server/future/route-kind";
import { hoist } from "next/dist/build/templates/helpers";
// Import the app and document modules.
import Document from "next/dist/pages/_document";
import App from "private-next-pages/_app.js";
// Import the userland code.
import * as userland from "private-next-pages/categories.js";
// Re-export the component (should be the default export).
export default hoist(userland, "default");
// Re-export methods.
export const getStaticProps = hoist(userland, "getStaticProps");
export const getStaticPaths = hoist(userland, "getStaticPaths");
export const getServerSideProps = hoist(userland, "getServerSideProps");
export const config = hoist(userland, "config");
export const reportWebVitals = hoist(userland, "reportWebVitals");
// Re-export legacy methods.
export const unstable_getStaticProps = hoist(userland, "unstable_getStaticProps");
export const unstable_getStaticPaths = hoist(userland, "unstable_getStaticPaths");
export const unstable_getStaticParams = hoist(userland, "unstable_getStaticParams");
export const unstable_getServerProps = hoist(userland, "unstable_getServerProps");
export const unstable_getServerSideProps = hoist(userland, "unstable_getServerSideProps");
// Create and export the route module that will be consumed.
export const routeModule = new PagesRouteModule({
definition: {
kind: RouteKind.PAGES,
page: "/categories",
pathname: "/categories",
// The following aren't used in production.
bundlePath: "",
filename: ""
},
components: {
App,
Document
},
userland
});
//# sourceMappingURL=pages.js.mapú 094undefined96158undefined160217undefined259307undefined309353undefined384444undefined505519/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (undefined505519undefined520524__WEBPACK_MODULE_REFERENCE__2_5b22686f697374225d_call_directImport_asiSafe1__._undefined526533__WEBPACK_MODULE_REFERENCE__13_ns_asiSafe1__._undefined546546.5);undefined570576undefined600604__WEBPACK_MODULE_REFERENCE__2_5b22686f697374225d_call_directImport_asiSafe1__._undefined606613__WEBPACK_MODULE_REFERENCE__13_ns_asiSafe1__._undefined635641undefined665669__WEBPACK_MODULE_REFERENCE__2_5b22686f697374225d_call_directImport_asiSafe1__._undefined671678__WEBPACK_MODULE_REFERENCE__13_ns_asiSafe1__._undefined700706undefined734738__WEBPACK_MODULE_REFERENCE__2_5b22686f697374225d_call_directImport_asiSafe1__._undefined740747__WEBPACK_MODULE_REFERENCE__13_ns_asiSafe1__._undefined773779undefined795799__WEBPACK_MODULE_REFERENCE__2_5b22686f697374225d_call_directImport_asiSafe1__._undefined801808__WEBPACK_MODULE_REFERENCE__13_ns_asiSafe1__._undefined822828undefined853857__WEBPACK_MODULE_REFERENCE__2_5b22686f697374225d_call_directImport_asiSafe1__._undefined859866__WEBPACK_MODULE_REFERENCE__13_ns_asiSafe1__._undefined918924undefined957961__WEBPACK_MODULE_REFERENCE__2_5b22686f697374225d_call_directImport_asiSafe1__._undefined963970__WEBPACK_MODULE_REFERENCE__13_ns_asiSafe1__._undefined10011007undefined10401044__WEBPACK_MODULE_REFERENCE__2_5b22686f697374225d_call_directImport_asiSafe1__._undefined10461053__WEBPACK_MODULE_REFERENCE__13_ns_asiSafe1__._undefined10841090undefined11241128__WEBPACK_MODULE_REFERENCE__2_5b22686f697374225d_call_directImport_asiSafe1__._undefined11301137__WEBPACK_MODULE_REFERENCE__13_ns_asiSafe1__._undefined11691175undefined12081212__WEBPACK_MODULE_REFERENCE__2_5b22686f697374225d_call_directImport_asiSafe1__._undefined12141221__WEBPACK_MODULE_REFERENCE__13_ns_asiSafe1__._undefined12521258undefined12951299__WEBPACK_MODULE_REFERENCE__2_5b22686f697374225d_call_directImport_asiSafe1__._undefined13011308__WEBPACK_MODULE_REFERENCE__13_ns_asiSafe1__._undefined14041410undefined14351450__WEBPACK_MODULE_REFERENCE__0_5b225061676573526f7574654d6f64756c65225d_directImport_asiSafe1__._undefined14861494__WEBPACK_MODULE_REFERENCE__1_5b22526f7574654b696e64225d_asiSafe1__._undefined16981697: __WEBPACK_MODULE_REFERENCE__4_5b2264656661756c74225d_directImport_asiSafe1__._undefined17161715: __WEBPACK_MODULE_REFERENCE__3_5b2264656661756c74225d_directImport_asiSafe1__._undefined17361735: __WEBPACK_MODULE_REFERENCE__13_ns_asiSafe1__._undefinedX169194next_route_loaderkind_PAGES_page_2Fcategories_preferredRegion_absolutePagePath_private_next_pages_2Fcategories_js_absoluteAppPath_private_next_pages_2F_app_js_absoluteDocumentPath_next_2Fdist_2Fpages_2F_document_middlewareConfigBase64_e30_3D_undefined199277(0,helpers/* hoist */.l)undefined279324categories_namespaceObjectundefined385463(0,helpers/* hoist */.l)undefined465510categories_namespaceObjectundefined555633(0,helpers/* hoist */.l)undefined635680categories_namespaceObjectundefined729807(0,helpers/* hoist */.l)undefined809854categories_namespaceObjectundefined895973(0,helpers/* hoist */.l)undefined9751020categories_namespaceObjectundefined10581136(0,helpers/* hoist */.l)undefined11381183categories_namespaceObjectundefined12671345(0,helpers/* hoist */.l)undefined13471392categories_namespaceObjectundefined14551533(0,helpers/* hoist */.l)undefined15351580categories_namespaceObjectundefined16441722(0,helpers/* hoist */.l)undefined17241769categories_namespaceObjectundefined18331911(0,helpers/* hoist */.l)undefined19131958categories_namespaceObjectundefined20252103(0,helpers/* hoist */.l)undefined21052150categories_namespaceObjectundefined22702365module_compiled.PagesRouteModuleundefined24012469route_kind/* RouteKind */.xundefined26752752_app["default"]undefined27732850(_document_default())undefined28732918categories_namespaceObjectundefined
/***/ }) †buffer†source„size„maps„hashzc/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
// ESM COMPAT FLAG
__webpack_require__.r(__webpack_exports__);
// EXPORTS
__webpack_require__.d(__webpack_exports__, {
config: () => (/* binding */ config),
"default": () => (/* binding */ next_route_loaderkind_PAGES_page_2Fcategories_preferredRegion_absolutePagePath_private_next_pages_2Fcategories_js_absoluteAppPath_private_next_pages_2F_app_js_absoluteDocumentPath_next_2Fdist_2Fpages_2F_document_middlewareConfigBase64_e30_3D_),
getServerSideProps: () => (/* binding */ getServerSideProps),
getStaticPaths: () => (/* binding */ getStaticPaths),
getStaticProps: () => (/* binding */ getStaticProps),
reportWebVitals: () => (/* binding */ reportWebVitals),
routeModule: () => (/* binding */ routeModule),
unstable_getServerProps: () => (/* binding */ unstable_getServerProps),
unstable_getServerSideProps: () => (/* binding */ unstable_getServerSideProps),
unstable_getStaticParams: () => (/* binding */ unstable_getStaticParams),
unstable_getStaticPaths: () => (/* binding */ unstable_getStaticPaths),
unstable_getStaticProps: () => (/* binding */ unstable_getStaticProps)
});
// NAMESPACE OBJECT: ./pages/categories.js
var categories_namespaceObject = {};
__webpack_require__.r(categories_namespaceObject);
__webpack_require__.d(categories_namespaceObject, {
"default": () => (Categories)
});
// EXTERNAL MODULE: ./node_modules/next/dist/server/future/route-modules/pages/module.compiled.js
var module_compiled = __webpack_require__(7093);
// EXTERNAL MODULE: ./node_modules/next/dist/server/future/route-kind.js
var route_kind = __webpack_require__(5244);
// EXTERNAL MODULE: ./node_modules/next/dist/build/templates/helpers.js
var helpers = __webpack_require__(1323);
// EXTERNAL MODULE: ./node_modules/next/dist/pages/_document.js
var _document = __webpack_require__(2899);
var _document_default = /*#__PURE__*/__webpack_require__.n(_document);
// EXTERNAL MODULE: ./pages/_app.js
var _app = __webpack_require__(3414);
// EXTERNAL MODULE: external "react/jsx-runtime"
var jsx_runtime_ = __webpack_require__(997);
// EXTERNAL MODULE: external "react"
var external_react_ = __webpack_require__(6689);
// EXTERNAL MODULE: ./node_modules/next/router.js
var next_router = __webpack_require__(1163);
// EXTERNAL MODULE: ./lib/api.js
var api = __webpack_require__(7751);
// EXTERNAL MODULE: ./components/AppShell.js
var AppShell = __webpack_require__(1712);
// EXTERNAL MODULE: ./components/icons.js
var icons = __webpack_require__(349);
// EXTERNAL MODULE: ./components/ToastProvider.js
var ToastProvider = __webpack_require__(4190);
// EXTERNAL MODULE: ./components/ConfirmProvider.js
var ConfirmProvider = __webpack_require__(4407);
;// CONCATENATED MODULE: ./pages/categories.js
const ICONS = [
"\uD83C\uDF5C",
"\uD83E\uDD58",
"\uD83E\uDD6C",
"\uD83E\uDD69",
"\uD83C\uDF54",
"\uD83C\uDF55",
"☕",
"\uD83C\uDF7A",
"\uD83E\uDDCB",
"\uD83C\uDF4E",
"\uD83C\uDF6A",
"\uD83C\uDF6B",
"\uD83D\uDE97",
"\uD83D\uDE95",
"\uD83D\uDE8C",
"\uD83D\uDE87",
"⛽",
"\uD83D\uDE99",
"\uD83D\uDEF5",
"✈ï¸",
"\uD83D\uDEA2",
"\uD83D\uDED2",
"\uD83D\uDC54",
"\uD83D\uDC55",
"\uD83D\uDC56",
"\uD83D\uDC5F",
"\uD83D\uDC53",
"\uD83E\uDDE2",
"\uD83D\uDC5C",
"\uD83C\uDF92",
"\uD83D\uDC8D",
"\uD83D\uDC84",
"\uD83C\uDFE0",
"\uD83C\uDFE2",
"\uD83C\uDFE6",
"\uD83C\uDFE5",
"\uD83C\uDFE8",
"\uD83C\uDFE9",
"\uD83D\uDD27",
"\uD83D\uDD28",
"\uD83D\uDECBï¸",
"\uD83D\uDCFA",
"\uD83D\uDCBB",
"\uD83D\uDCF1",
"\uD83D\uDCDD",
"\uD83D\uDCB0",
"\uD83C\uDF81",
"\uD83D\uDCC8",
"\uD83E\uDDE7",
"\uD83D\uDCB3",
"\uD83C\uDFAF",
"\uD83D\uDCDA",
"\uD83C\uDFB5",
"\uD83C\uDFAE",
"\uD83C\uDFC3",
"âš½",
"\uD83C\uDFCA",
"\uD83D\uDEB4",
"\uD83C\uDFAD",
"\uD83C\uDFA8",
"\uD83C\uDFAC",
"\uD83D\uDCF7",
"\uD83C\uDFA5",
"\uD83D\uDCFA",
"\uD83E\uDDF8",
"\uD83D\uDC15",
"\uD83D\uDC08",
"\uD83C\uDF38",
"\uD83C\uDF3A"
];
function Categories() {
const router = (0,next_router.useRouter)();
const { showToast } = (0,ToastProvider/* useToast */.p)();
const { confirm } = (0,ConfirmProvider/* useConfirm */.N)();
const [categories, setCategories] = (0,external_react_.useState)({
expense: [],
income: []
});
const [modalOpen, setModalOpen] = (0,external_react_.useState)(false);
const [categoryType, setCategoryType] = (0,external_react_.useState)("expense");
const [loading, setLoading] = (0,external_react_.useState)(true);
const [submitting, setSubmitting] = (0,external_react_.useState)(false);
const [formError, setFormError] = (0,external_react_.useState)("");
const [formData, setFormData] = (0,external_react_.useState)({
name: "",
icon: "\uD83D\uDCDD"
});
null;
const loadCategories = async ()=>{
setLoading(true);
try {
const data = await (0,api/* getCategories */.CP)();
setCategories(data);
} catch (err) {
console.error(err);
showToast(err.message, {
tone: "error"
});
} finally{
setLoading(false);
}
};
const openAddModal = (type)=>{
setCategoryType(type);
setFormData({
name: "",
icon: "\uD83D\uDCDD"
});
setFormError("");
setModalOpen(true);
};
const closeModal = ()=>{
if (submitting) return;
setModalOpen(false);
setFormError("");
};
const handleSubmit = async (e)=>{
e.preventDefault();
if (!formData.name || !formData.icon) {
setFormError("请填写完整信æ¯");
return;
}
setSubmitting(true);
setFormError("");
try {
await (0,api/* createCategory */.k4)({
type: categoryType,
name: formData.name,
icon: formData.icon
});
closeModal();
showToast("分类已创建", {
tone: "success"
});
await loadCategories();
} catch (err) {
setFormError(err.message);
showToast(err.message, {
tone: "error"
});
} finally{
setSubmitting(false);
}
};
const handleDelete = async (id)=>{
const shouldDelete = await confirm({
title: "删除此分类?",
description: "默认分类ä¸å¯åˆ é™¤ï¼Œè‡ªå®šä¹‰åˆ†ç±»åˆ é™¤åŽå°†æ— æ³•æ¢å¤ã€‚",
confirmText: "删除"
});
if (!shouldDelete) return;
try {
await (0,api/* deleteCategory */.uu)(id);
showToast("分类已删除", {
tone: "success"
});
await loadCategories();
} catch (err) {
showToast(err.message, {
tone: "error"
});
}
};
const actions = /*#__PURE__*/ jsx_runtime_.jsx("button", {
type: "button",
className: "icon-button",
"aria-label": "设置",
onClick: ()=>router.push("/settings"),
children: /*#__PURE__*/ jsx_runtime_.jsx(icons/* Icon */.J, {
name: "settings",
size: 18
})
});
return /*#__PURE__*/ (0,jsx_runtime_.jsxs)(AppShell/* default */.Z, {
title: "分类",
subtitle: "æ•´ç†å¸¸ç”¨åˆ†ç±»ä¸Žå›¾æ ‡",
actions: actions,
compactHeader: true,
children: [
loading ? /*#__PURE__*/ jsx_runtime_.jsx("div", {
className: "card loading-state",
children: "加载中..."
}) : /*#__PURE__*/ (0,jsx_runtime_.jsxs)(jsx_runtime_.Fragment, {
children: [
/*#__PURE__*/ (0,jsx_runtime_.jsxs)("section", {
className: "card category-section category-section--refresh",
children: [
/*#__PURE__*/ (0,jsx_runtime_.jsxs)("div", {
className: "section-header",
children: [
/*#__PURE__*/ (0,jsx_runtime_.jsxs)("div", {
children: [
/*#__PURE__*/ jsx_runtime_.jsx("p", {
className: "eyebrow",
children: "支出分类"
}),
/*#__PURE__*/ jsx_runtime_.jsx("h2", {
children: "支出"
})
]
}),
/*#__PURE__*/ jsx_runtime_.jsx("button", {
type: "button",
className: "btn btn-secondary btn-inline",
onClick: ()=>openAddModal("expense"),
children: /*#__PURE__*/ (0,jsx_runtime_.jsxs)("span", {
className: "button-content",
children: [
/*#__PURE__*/ jsx_runtime_.jsx(icons/* Icon */.J, {
name: "plus",
size: 16
}),
"添加"
]
})
})
]
}),
/*#__PURE__*/ jsx_runtime_.jsx("div", {
className: "category-list category-list--chips",
children: categories.expense.map((cat)=>/*#__PURE__*/ (0,jsx_runtime_.jsxs)("div", {
className: "category-tag",
children: [
/*#__PURE__*/ jsx_runtime_.jsx("span", {
className: "cat-icon",
children: cat.icon
}),
/*#__PURE__*/ jsx_runtime_.jsx("span", {
className: "cat-name",
children: cat.name
}),
!cat.is_default && /*#__PURE__*/ jsx_runtime_.jsx("button", {
type: "button",
className: "icon-button icon-button--ghost cat-delete",
"aria-label": `删除${cat.name}`,
onClick: ()=>handleDelete(cat.id),
children: /*#__PURE__*/ jsx_runtime_.jsx(icons/* Icon */.J, {
name: "close",
size: 14
})
})
]
}, cat.id || cat.name))
})
]
}),
/*#__PURE__*/ (0,jsx_runtime_.jsxs)("section", {
className: "card category-section category-section--refresh",
children: [
/*#__PURE__*/ (0,jsx_runtime_.jsxs)("div", {
className: "section-header",
children: [
/*#__PURE__*/ (0,jsx_runtime_.jsxs)("div", {
children: [
/*#__PURE__*/ jsx_runtime_.jsx("p", {
className: "eyebrow",
children: "收入分类"
}),
/*#__PURE__*/ jsx_runtime_.jsx("h2", {
children: "æ”¶å…¥"
})
]
}),
/*#__PURE__*/ jsx_runtime_.jsx("button", {
type: "button",
className: "btn btn-secondary btn-inline",
onClick: ()=>openAddModal("income"),
children: /*#__PURE__*/ (0,jsx_runtime_.jsxs)("span", {
className: "button-content",
children: [
/*#__PURE__*/ jsx_runtime_.jsx(icons/* Icon */.J, {
name: "plus",
size: 16
}),
"添加"
]
})
})
]
}),
/*#__PURE__*/ jsx_runtime_.jsx("div", {
className: "category-list category-list--chips",
children: categories.income.map((cat)=>/*#__PURE__*/ (0,jsx_runtime_.jsxs)("div", {
className: "category-tag",
children: [
/*#__PURE__*/ jsx_runtime_.jsx("span", {
className: "cat-icon",
children: cat.icon
}),
/*#__PURE__*/ jsx_runtime_.jsx("span", {
className: "cat-name",
children: cat.name
}),
!cat.is_default && /*#__PURE__*/ jsx_runtime_.jsx("button", {
type: "button",
className: "icon-button icon-button--ghost cat-delete",
"aria-label": `删除${cat.name}`,
onClick: ()=>handleDelete(cat.id),
children: /*#__PURE__*/ jsx_runtime_.jsx(icons/* Icon */.J, {
name: "close",
size: 14
})
})
]
}, cat.id || cat.name))
})
]
}),
/*#__PURE__*/ jsx_runtime_.jsx("div", {
className: "card category-tip category-tip--refresh",
children: /*#__PURE__*/ jsx_runtime_.jsx("p", {
children: "默认分类无法删除,自定义分类å¯ä»¥åˆ é™¤ã€‚"
})
})
]
}),
modalOpen && /*#__PURE__*/ jsx_runtime_.jsx("div", {
className: "modal-overlay",
onClick: closeModal,
children: /*#__PURE__*/ (0,jsx_runtime_.jsxs)("div", {
className: "modal",
onClick: (e)=>e.stopPropagation(),
children: [
/*#__PURE__*/ (0,jsx_runtime_.jsxs)("div", {
className: "modal-header",
children: [
/*#__PURE__*/ (0,jsx_runtime_.jsxs)("div", {
children: [
/*#__PURE__*/ jsx_runtime_.jsx("p", {
className: "eyebrow",
children: "新增分类"
}),
/*#__PURE__*/ jsx_runtime_.jsx("h2", {
children: categoryType === "expense" ? "新建支出分类" : "新建收入分类"
})
]
}),
/*#__PURE__*/ jsx_runtime_.jsx("button", {
type: "button",
className: "icon-button icon-button--ghost",
"aria-label": "关闭弹窗",
onClick: closeModal,
children: /*#__PURE__*/ jsx_runtime_.jsx(icons/* Icon */.J, {
name: "close",
size: 18
})
})
]
}),
formError && /*#__PURE__*/ jsx_runtime_.jsx("div", {
className: "error-msg",
children: formError
}),
/*#__PURE__*/ (0,jsx_runtime_.jsxs)("form", {
onSubmit: handleSubmit,
children: [
/*#__PURE__*/ (0,jsx_runtime_.jsxs)("div", {
className: "form-group",
children: [
/*#__PURE__*/ jsx_runtime_.jsx("label", {
htmlFor: "category-name",
children: "分类åç§°"
}),
/*#__PURE__*/ jsx_runtime_.jsx("input", {
id: "category-name",
type: "text",
value: formData.name,
onChange: (e)=>setFormData({
...formData,
name: e.target.value
}),
placeholder: "请输入分类åç§°",
required: true,
disabled: submitting
})
]
}),
/*#__PURE__*/ (0,jsx_runtime_.jsxs)("div", {
className: "form-group",
children: [
/*#__PURE__*/ jsx_runtime_.jsx("label", {
children: "选择图标"
}),
/*#__PURE__*/ jsx_runtime_.jsx("div", {
className: "icon-grid",
style: {
display: "grid",
gridTemplateColumns: "repeat(8, minmax(0, 1fr))",
gap: "8px"
},
children: ICONS.map((icon)=>/*#__PURE__*/ jsx_runtime_.jsx("button", {
type: "button",
className: `icon-btn ${formData.icon === icon ? "active" : ""}`,
onClick: ()=>setFormData({
...formData,
icon
}),
disabled: submitting,
children: icon
}, icon))
})
]
}),
/*#__PURE__*/ jsx_runtime_.jsx("div", {
className: "modal-actions",
children: /*#__PURE__*/ jsx_runtime_.jsx("button", {
type: "submit",
className: "btn btn-primary",
disabled: submitting,
children: submitting ? /*#__PURE__*/ (0,jsx_runtime_.jsxs)("span", {
className: "button-content",
children: [
/*#__PURE__*/ jsx_runtime_.jsx(icons/* Icon */.J, {
name: "spinner",
size: 16,
className: "is-spinning"
}),
"ä¿å­˜ä¸­..."
]
}) : "ä¿å­˜"
})
})
]
})
]
})
})
]
});
}
;// CONCATENATED MODULE: ./node_modules/next/dist/build/webpack/loaders/next-route-loader/index.js?kind=PAGES&page=%2Fcategories&preferredRegion=&absolutePagePath=private-next-pages%2Fcategories.js&absoluteAppPath=private-next-pages%2F_app.js&absoluteDocumentPath=next%2Fdist%2Fpages%2F_document&middlewareConfigBase64=e30%3D!
// Import the app and document modules.
// Import the userland code.
// Re-export the component (should be the default export).
/* harmony default export */ const next_route_loaderkind_PAGES_page_2Fcategories_preferredRegion_absolutePagePath_private_next_pages_2Fcategories_js_absoluteAppPath_private_next_pages_2F_app_js_absoluteDocumentPath_next_2Fdist_2Fpages_2F_document_middlewareConfigBase64_e30_3D_ = ((0,helpers/* hoist */.l)(categories_namespaceObject, "default"));
// Re-export methods.
const getStaticProps = (0,helpers/* hoist */.l)(categories_namespaceObject, "getStaticProps");
const getStaticPaths = (0,helpers/* hoist */.l)(categories_namespaceObject, "getStaticPaths");
const getServerSideProps = (0,helpers/* hoist */.l)(categories_namespaceObject, "getServerSideProps");
const config = (0,helpers/* hoist */.l)(categories_namespaceObject, "config");
const reportWebVitals = (0,helpers/* hoist */.l)(categories_namespaceObject, "reportWebVitals");
// Re-export legacy methods.
const unstable_getStaticProps = (0,helpers/* hoist */.l)(categories_namespaceObject, "unstable_getStaticProps");
const unstable_getStaticPaths = (0,helpers/* hoist */.l)(categories_namespaceObject, "unstable_getStaticPaths");
const unstable_getStaticParams = (0,helpers/* hoist */.l)(categories_namespaceObject, "unstable_getStaticParams");
const unstable_getServerProps = (0,helpers/* hoist */.l)(categories_namespaceObject, "unstable_getServerProps");
const unstable_getServerSideProps = (0,helpers/* hoist */.l)(categories_namespaceObject, "unstable_getServerSideProps");
// Create and export the route module that will be consumed.
const routeModule = new module_compiled.PagesRouteModule({
definition: {
kind: route_kind/* RouteKind */.x.PAGES,
page: "/categories",
pathname: "/categories",
// The following aren't used in production.
bundlePath: "",
filename: ""
},
components: {
App: _app["default"],
Document: (_document_default())
},
userland: categories_namespaceObject
});
//# sourceMappingURL=pages.js.map
/***/ }) ”{"finalSource":true}ƒmapbufferedMap `ConcatSourceRawSourceQ/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
þ
// ESM COMPAT FLAG
__webpack_require__.r(__webpack_exports__);
// EXPORTS
__webpack_require__.d(__webpack_exports__, {
config: () => (/* binding */ config),
"default": () => (/* binding */ next_route_loaderkind_PAGES_page_2Fcategories_preferredRegion_absolutePagePath_private_next_pages_2Fcategories_js_absoluteAppPath_private_next_pages_2F_app_js_absoluteDocumentPath_next_2Fdist_2Fpages_2F_document_middlewareConfigBase64_e30_3D_),
getServerSideProps: () => (/* binding */ getServerSideProps),
getStaticPaths: () => (/* binding */ getStaticPaths),
getStaticProps: () => (/* binding */ getStaticProps),
reportWebVitals: () => (/* binding */ reportWebVitals),
routeModule: () => (/* binding */ routeModule),
unstable_getServerProps: () => (/* binding */ unstable_getServerProps),
unstable_getServerSideProps: () => (/* binding */ unstable_getServerSideProps),
unstable_getStaticParams: () => (/* binding */ unstable_getStaticParams),
unstable_getStaticPaths: () => (/* binding */ unstable_getStaticPaths),
unstable_getStaticProps: () => (/* binding */ unstable_getStaticProps)
});
// NAMESPACE OBJECT: ./pages/categories.js
var categories_namespaceObject = {};
__webpack_require__.r(categories_namespaceObject);
__webpack_require__.d(categories_namespaceObject, {
"default": () => (Categories)
});
// EXTERNAL MODULE: ./node_modules/next/dist/server/future/route-modules/pages/module.compiled.js
var module_compiled = __webpack_require__(7093);
// EXTERNAL MODULE: ./node_modules/next/dist/server/future/route-kind.js
var route_kind = __webpack_require__(5244);
// EXTERNAL MODULE: ./node_modules/next/dist/build/templates/helpers.js
var helpers = __webpack_require__(1323);
// EXTERNAL MODULE: ./node_modules/next/dist/pages/_document.js
var _document = __webpack_require__(2899);
var _document_default = /*#__PURE__*/__webpack_require__.n(_document);
// EXTERNAL MODULE: ./pages/_app.js
var _app = __webpack_require__(3414);
// EXTERNAL MODULE: external "react/jsx-runtime"
var jsx_runtime_ = __webpack_require__(997);
// EXTERNAL MODULE: external "react"
var external_react_ = __webpack_require__(6689);
// EXTERNAL MODULE: ./node_modules/next/router.js
var next_router = __webpack_require__(1163);
// EXTERNAL MODULE: ./lib/api.js
var api = __webpack_require__(7751);
// EXTERNAL MODULE: ./components/AppShell.js
var AppShell = __webpack_require__(1712);
// EXTERNAL MODULE: ./components/icons.js
var icons = __webpack_require__(349);
// EXTERNAL MODULE: ./components/ToastProvider.js
var ToastProvider = __webpack_require__(4190);
// EXTERNAL MODULE: ./components/ConfirmProvider.js
var ConfirmProvider = __webpack_require__(4407);
;// CONCATENATED MODULE: ./pages/categories.js

ReplaceSourceReplaceSourceRawSource€Limport { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
import { useState, useEffect } from "react";
import { useRouter } from "next/router";
import { isLoggedIn, getCategories, createCategory, deleteCategory } from "../lib/api";
import AppShell from "../components/AppShell";
import { Icon } from "../components/icons";
import { useToast } from "../components/ToastProvider";
import { useConfirm } from "../components/ConfirmProvider";
const ICONS = [
"\uD83C\uDF5C",
"\uD83E\uDD58",
"\uD83E\uDD6C",
"\uD83E\uDD69",
"\uD83C\uDF54",
"\uD83C\uDF55",
"☕",
"\uD83C\uDF7A",
"\uD83E\uDDCB",
"\uD83C\uDF4E",
"\uD83C\uDF6A",
"\uD83C\uDF6B",
"\uD83D\uDE97",
"\uD83D\uDE95",
"\uD83D\uDE8C",
"\uD83D\uDE87",
"⛽",
"\uD83D\uDE99",
"\uD83D\uDEF5",
"✈ï¸",
"\uD83D\uDEA2",
"\uD83D\uDED2",
"\uD83D\uDC54",
"\uD83D\uDC55",
"\uD83D\uDC56",
"\uD83D\uDC5F",
"\uD83D\uDC53",
"\uD83E\uDDE2",
"\uD83D\uDC5C",
"\uD83C\uDF92",
"\uD83D\uDC8D",
"\uD83D\uDC84",
"\uD83C\uDFE0",
"\uD83C\uDFE2",
"\uD83C\uDFE6",
"\uD83C\uDFE5",
"\uD83C\uDFE8",
"\uD83C\uDFE9",
"\uD83D\uDD27",
"\uD83D\uDD28",
"\uD83D\uDECBï¸",
"\uD83D\uDCFA",
"\uD83D\uDCBB",
"\uD83D\uDCF1",
"\uD83D\uDCDD",
"\uD83D\uDCB0",
"\uD83C\uDF81",
"\uD83D\uDCC8",
"\uD83E\uDDE7",
"\uD83D\uDCB3",
"\uD83C\uDFAF",
"\uD83D\uDCDA",
"\uD83C\uDFB5",
"\uD83C\uDFAE",
"\uD83C\uDFC3",
"âš½",
"\uD83C\uDFCA",
"\uD83D\uDEB4",
"\uD83C\uDFAD",
"\uD83C\uDFA8",
"\uD83C\uDFAC",
"\uD83D\uDCF7",
"\uD83C\uDFA5",
"\uD83D\uDCFA",
"\uD83E\uDDF8",
"\uD83D\uDC15",
"\uD83D\uDC08",
"\uD83C\uDF38",
"\uD83C\uDF3A"
];
export default function Categories() {
const router = useRouter();
const { showToast } = useToast();
const { confirm } = useConfirm();
const [categories, setCategories] = useState({
expense: [],
income: []
});
const [modalOpen, setModalOpen] = useState(false);
const [categoryType, setCategoryType] = useState("expense");
const [loading, setLoading] = useState(true);
const [submitting, setSubmitting] = useState(false);
const [formError, setFormError] = useState("");
const [formData, setFormData] = useState({
name: "",
icon: "\uD83D\uDCDD"
});
null;
const loadCategories = async ()=>{
setLoading(true);
try {
const data = await getCategories();
setCategories(data);
} catch (err) {
console.error(err);
showToast(err.message, {
tone: "error"
});
} finally{
setLoading(false);
}
};
const openAddModal = (type)=>{
setCategoryType(type);
setFormData({
name: "",
icon: "\uD83D\uDCDD"
});
setFormError("");
setModalOpen(true);
};
const closeModal = ()=>{
if (submitting) return;
setModalOpen(false);
setFormError("");
};
const handleSubmit = async (e)=>{
e.preventDefault();
if (!formData.name || !formData.icon) {
setFormError("请填写完整信æ¯");
return;
}
setSubmitting(true);
setFormError("");
try {
await createCategory({
type: categoryType,
name: formData.name,
icon: formData.icon
});
closeModal();
showToast("分类已创建", {
tone: "success"
});
await loadCategories();
} catch (err) {
setFormError(err.message);
showToast(err.message, {
tone: "error"
});
} finally{
setSubmitting(false);
}
};
const handleDelete = async (id)=>{
const shouldDelete = await confirm({
title: "删除此分类?",
description: "默认分类ä¸å¯åˆ é™¤ï¼Œè‡ªå®šä¹‰åˆ†ç±»åˆ é™¤åŽå°†æ— æ³•æ¢å¤ã€‚",
confirmText: "删除"
});
if (!shouldDelete) return;
try {
await deleteCategory(id);
showToast("分类已删除", {
tone: "success"
});
await loadCategories();
} catch (err) {
showToast(err.message, {
tone: "error"
});
}
};
const actions = /*#__PURE__*/ _jsx("button", {
type: "button",
className: "icon-button",
"aria-label": "设置",
onClick: ()=>router.push("/settings"),
children: /*#__PURE__*/ _jsx(Icon, {
name: "settings",
size: 18
})
});
return /*#__PURE__*/ _jsxs(AppShell, {
title: "分类",
subtitle: "æ•´ç†å¸¸ç”¨åˆ†ç±»ä¸Žå›¾æ ‡",
actions: actions,
compactHeader: true,
children: [
loading ? /*#__PURE__*/ _jsx("div", {
className: "card loading-state",
children: "加载中..."
}) : /*#__PURE__*/ _jsxs(_Fragment, {
children: [
/*#__PURE__*/ _jsxs("section", {
className: "card category-section category-section--refresh",
children: [
/*#__PURE__*/ _jsxs("div", {
className: "section-header",
children: [
/*#__PURE__*/ _jsxs("div", {
children: [
/*#__PURE__*/ _jsx("p", {
className: "eyebrow",
children: "支出分类"
}),
/*#__PURE__*/ _jsx("h2", {
children: "支出"
})
]
}),
/*#__PURE__*/ _jsx("button", {
type: "button",
className: "btn btn-secondary btn-inline",
onClick: ()=>openAddModal("expense"),
children: /*#__PURE__*/ _jsxs("span", {
className: "button-content",
children: [
/*#__PURE__*/ _jsx(Icon, {
name: "plus",
size: 16
}),
"添加"
]
})
})
]
}),
/*#__PURE__*/ _jsx("div", {
className: "category-list category-list--chips",
children: categories.expense.map((cat)=>/*#__PURE__*/ _jsxs("div", {
className: "category-tag",
children: [
/*#__PURE__*/ _jsx("span", {
className: "cat-icon",
children: cat.icon
}),
/*#__PURE__*/ _jsx("span", {
className: "cat-name",
children: cat.name
}),
!cat.is_default && /*#__PURE__*/ _jsx("button", {
type: "button",
className: "icon-button icon-button--ghost cat-delete",
"aria-label": `删除${cat.name}`,
onClick: ()=>handleDelete(cat.id),
children: /*#__PURE__*/ _jsx(Icon, {
name: "close",
size: 14
})
})
]
}, cat.id || cat.name))
})
]
}),
/*#__PURE__*/ _jsxs("section", {
className: "card category-section category-section--refresh",
children: [
/*#__PURE__*/ _jsxs("div", {
className: "section-header",
children: [
/*#__PURE__*/ _jsxs("div", {
children: [
/*#__PURE__*/ _jsx("p", {
className: "eyebrow",
children: "收入分类"
}),
/*#__PURE__*/ _jsx("h2", {
children: "æ”¶å…¥"
})
]
}),
/*#__PURE__*/ _jsx("button", {
type: "button",
className: "btn btn-secondary btn-inline",
onClick: ()=>openAddModal("income"),
children: /*#__PURE__*/ _jsxs("span", {
className: "button-content",
children: [
/*#__PURE__*/ _jsx(Icon, {
name: "plus",
size: 16
}),
"添加"
]
})
})
]
}),
/*#__PURE__*/ _jsx("div", {
className: "category-list category-list--chips",
children: categories.income.map((cat)=>/*#__PURE__*/ _jsxs("div", {
className: "category-tag",
children: [
/*#__PURE__*/ _jsx("span", {
className: "cat-icon",
children: cat.icon
}),
/*#__PURE__*/ _jsx("span", {
className: "cat-name",
children: cat.name
}),
!cat.is_default && /*#__PURE__*/ _jsx("button", {
type: "button",
className: "icon-button icon-button--ghost cat-delete",
"aria-label": `删除${cat.name}`,
onClick: ()=>handleDelete(cat.id),
children: /*#__PURE__*/ _jsx(Icon, {
name: "close",
size: 14
})
})
]
}, cat.id || cat.name))
})
]
}),
/*#__PURE__*/ _jsx("div", {
className: "card category-tip category-tip--refresh",
children: /*#__PURE__*/ _jsx("p", {
children: "默认分类无法删除,自定义分类å¯ä»¥åˆ é™¤ã€‚"
})
})
]
}),
modalOpen && /*#__PURE__*/ _jsx("div", {
className: "modal-overlay",
onClick: closeModal,
children: /*#__PURE__*/ _jsxs("div", {
className: "modal",
onClick: (e)=>e.stopPropagation(),
children: [
/*#__PURE__*/ _jsxs("div", {
className: "modal-header",
children: [
/*#__PURE__*/ _jsxs("div", {
children: [
/*#__PURE__*/ _jsx("p", {
className: "eyebrow",
children: "新增分类"
}),
/*#__PURE__*/ _jsx("h2", {
children: categoryType === "expense" ? "新建支出分类" : "新建收入分类"
})
]
}),
/*#__PURE__*/ _jsx("button", {
type: "button",
className: "icon-button icon-button--ghost",
"aria-label": "关闭弹窗",
onClick: closeModal,
children: /*#__PURE__*/ _jsx(Icon, {
name: "close",
size: 18
})
})
]
}),
formError && /*#__PURE__*/ _jsx("div", {
className: "error-msg",
children: formError
}),
/*#__PURE__*/ _jsxs("form", {
onSubmit: handleSubmit,
children: [
/*#__PURE__*/ _jsxs("div", {
className: "form-group",
children: [
/*#__PURE__*/ _jsx("label", {
htmlFor: "category-name",
children: "分类åç§°"
}),
/*#__PURE__*/ _jsx("input", {
id: "category-name",
type: "text",
value: formData.name,
onChange: (e)=>setFormData({
...formData,
name: e.target.value
}),
placeholder: "请输入分类åç§°",
required: true,
disabled: submitting
})
]
}),
/*#__PURE__*/ _jsxs("div", {
className: "form-group",
children: [
/*#__PURE__*/ _jsx("label", {
children: "选择图标"
}),
/*#__PURE__*/ _jsx("div", {
className: "icon-grid",
style: {
display: "grid",
gridTemplateColumns: "repeat(8, minmax(0, 1fr))",
gap: "8px"
},
children: ICONS.map((icon)=>/*#__PURE__*/ _jsx("button", {
type: "button",
className: `icon-btn ${formData.icon === icon ? "active" : ""}`,
onClick: ()=>setFormData({
...formData,
icon
}),
disabled: submitting,
children: icon
}, icon))
})
]
}),
/*#__PURE__*/ _jsx("div", {
className: "modal-actions",
children: /*#__PURE__*/ _jsx("button", {
type: "submit",
className: "btn btn-primary",
disabled: submitting,
children: submitting ? /*#__PURE__*/ _jsxs("span", {
className: "button-content",
children: [
/*#__PURE__*/ _jsx(Icon, {
name: "spinner",
size: 16,
className: "is-spinning"
}),
"ä¿å­˜ä¸­..."
]
}) : "ä¿å­˜"
})
})
]
})
]
})
})
]
});
}
æ085undefined87130undefined132171undefined173259undefined261306undefined308350undefined352406undefined408466undefined18241838undefined18821890__WEBPACK_MODULE_REFERENCE__7_5b22757365526f75746572225d_call_directImport_asiSafe1__._undefined19211928__WEBPACK_MODULE_REFERENCE__11_5b22757365546f617374225d_call_directImport_asiSafe1__._undefined19571966__WEBPACK_MODULE_REFERENCE__12_5b22757365436f6e6669726d225d_call_directImport_asiSafe1__._undefined20112018__WEBPACK_MODULE_REFERENCE__6_5b227573655374617465225d_call_directImport_asiSafe1__._undefined21082115__WEBPACK_MODULE_REFERENCE__6_5b227573655374617465225d_call_directImport_asiSafe1__._undefined21692176__WEBPACK_MODULE_REFERENCE__6_5b227573655374617465225d_call_directImport_asiSafe1__._undefined22242231__WEBPACK_MODULE_REFERENCE__6_5b227573655374617465225d_call_directImport_asiSafe1__._undefined22802287__WEBPACK_MODULE_REFERENCE__6_5b227573655374617465225d_call_directImport_asiSafe1__._undefined23352342__WEBPACK_MODULE_REFERENCE__6_5b227573655374617465225d_call_directImport_asiSafe1__._undefined23852392__WEBPACK_MODULE_REFERENCE__6_5b227573655374617465225d_call_directImport_asiSafe1__._undefined25712583__WEBPACK_MODULE_REFERENCE__8_5b2267657443617465676f72696573225d_call_directImport_asiSafe1__._undefined34343447__WEBPACK_MODULE_REFERENCE__8_5b2263726561746543617465676f7279225d_call_directImport_asiSafe1__._undefined42094222__WEBPACK_MODULE_REFERENCE__8_5b2264656c65746543617465676f7279225d_call_directImport_asiSafe1__._undefined45044507__WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._undefined46864689__WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._undefined46914694__WEBPACK_MODULE_REFERENCE__10_5b2249636f6e225d_directImport_asiSafe1__._undefined47944798__WEBPACK_MODULE_REFERENCE__5_5b226a737873225d_call_directImport_asiSafe1__._undefined48004807__WEBPACK_MODULE_REFERENCE__9_5b2264656661756c74225d_directImport_asiSafe1__._undefined49754978__WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._undefined51045108__WEBPACK_MODULE_REFERENCE__5_5b226a737873225d_call_directImport_asiSafe1__._undefined51105118__WEBPACK_MODULE_REFERENCE__5_5b22467261676d656e74225d_directImport_asiSafe1__._undefined51855189__WEBPACK_MODULE_REFERENCE__5_5b226a737873225d_call_directImport_asiSafe1__._undefined53685372__WEBPACK_MODULE_REFERENCE__5_5b226a737873225d_call_directImport_asiSafe1__._undefined55385542__WEBPACK_MODULE_REFERENCE__5_5b226a737873225d_call_directImport_asiSafe1__._undefined56635666__WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._undefined59165919__WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._undefined61716174__WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._undefined64696473__WEBPACK_MODULE_REFERENCE__5_5b226a737873225d_call_directImport_asiSafe1__._undefined66766679__WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._undefined66816684__WEBPACK_MODULE_REFERENCE__10_5b2249636f6e225d_directImport_asiSafe1__._undefined71577160__WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._undefined73387342__WEBPACK_MODULE_REFERENCE__5_5b226a737873225d_call_directImport_asiSafe1__._undefined75307533__WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._undefined77897792__WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._undefined80678070__WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._undefined84868489__WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._undefined84918494__WEBPACK_MODULE_REFERENCE__10_5b2249636f6e225d_directImport_asiSafe1__._undefined89428946__WEBPACK_MODULE_REFERENCE__5_5b226a737873225d_call_directImport_asiSafe1__._undefined91259129__WEBPACK_MODULE_REFERENCE__5_5b226a737873225d_call_directImport_asiSafe1__._undefined92959299__WEBPACK_MODULE_REFERENCE__5_5b226a737873225d_call_directImport_asiSafe1__._undefined94209423__WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_directImport_asiSafe1__._undefined96739676__WEBPACK_MODULE_REFERENCE__5_5b226a7378225d_dir
;// CONCATENATED MODULE: ./node_modules/next/dist/build/webpack/loaders/next-route-loader/index.js?kind=PAGES&page=%2Fcategories&preferredRegion=&absolutePagePath=private-next-pages%2Fcategories.js&absoluteAppPath=private-next-pages%2F_app.js&absoluteDocumentPath=next%2Fdist%2Fpages%2F_document&middlewareConfigBase64=e30%3D!
úûïimport { PagesRouteModule } from "next/dist/server/future/route-modules/pages/module.compiled";
import { RouteKind } from "next/dist/server/future/route-kind";
import { hoist } from "next/dist/build/templates/helpers";
// Import the app and document modules.
import Document from "next/dist/pages/_document";
import App from "private-next-pages/_app.js";
// Import the userland code.
import * as userland from "private-next-pages/categories.js";
// Re-export the component (should be the default export).
export default hoist(userland, "default");
// Re-export methods.
export const getStaticProps = hoist(userland, "getStaticProps");
export const getStaticPaths = hoist(userland, "getStaticPaths");
export const getServerSideProps = hoist(userland, "getServerSideProps");
export const config = hoist(userland, "config");
export const reportWebVitals = hoist(userland, "reportWebVitals");
// Re-export legacy methods.
export const unstable_getStaticProps = hoist(userland, "unstable_getStaticProps");
export const unstable_getStaticPaths = hoist(userland, "unstable_getStaticPaths");
export const unstable_getStaticParams = hoist(userland, "unstable_getStaticParams");
export const unstable_getServerProps = hoist(userland, "unstable_getServerProps");
export const unstable_getServerSideProps = hoist(userland, "unstable_getServerSideProps");
// Create and export the route module that will be consumed.
export const routeModule = new PagesRouteModule({
definition: {
kind: RouteKind.PAGES,
page: "/categories",
pathname: "/categories",
// The following aren't used in production.
bundlePath: "",
filename: ""
},
components: {
App,
Document
},
userland
});
//# sourceMappingURL=pages.js.mapú 094undefined96158undefined160217undefined259307undefined309353undefined384444undefined505519/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (undefined505519undefined520524__WEBPACK_MODULE_REFERENCE__2_5b22686f697374225d_call_directImport_asiSafe1__._undefined526533__WEBPACK_MODULE_REFERENCE__13_ns_asiSafe1__._undefined546546.5);undefined570576undefined600604__WEBPACK_MODULE_REFERENCE__2_5b22686f697374225d_call_directImport_asiSafe1__._undefined606613__WEBPACK_MODULE_REFERENCE__13_ns_asiSafe1__._undefined635641undefined665669__WEBPACK_MODULE_REFERENCE__2_5b22686f697374225d_call_directImport_asiSafe1__._undefined671678__WEBPACK_MODULE_REFERENCE__13_ns_asiSafe1__._undefined700706undefined734738__WEBPACK_MODULE_REFERENCE__2_5b22686f697374225d_call_directImport_asiSafe1__._undefined740747__WEBPACK_MODULE_REFERENCE__13_ns_asiSafe1__._undefined773779undefined795799__WEBPACK_MODULE_REFERENCE__2_5b22686f697374225d_call_directImport_asiSafe1__._undefined801808__WEBPACK_MODULE_REFERENCE__13_ns_asiSafe1__._undefined822828undefined853857__WEBPACK_MODULE_REFERENCE__2_5b22686f697374225d_call_directImport_asiSafe1__._undefined859866__WEBPACK_MODULE_REFERENCE__13_ns_asiSafe1__._undefined918924undefined957961__WEBPACK_MODULE_REFERENCE__2_5b22686f697374225d_call_directImport_asiSafe1__._undefined963970__WEBPACK_MODULE_REFERENCE__13_ns_asiSafe1__._undefined10011007undefined10401044__WEBPACK_MODULE_REFERENCE__2_5b22686f697374225d_call_directImport_asiSafe1__._undefined10461053__WEBPACK_MODULE_REFERENCE__13_ns_asiSafe1__._undefined10841090undefined11241128__WEBPACK_MODULE_REFERENCE__2_5b22686f697374225d_call_directImport_asiSafe1__._undefined11301137__WEBPACK_MODULE_REFERENCE__13_ns_asiSafe1__._undefined11691175undefined12081212__WEBPACK_MODULE_REFERENCE__2_5b22686f697374225d_call_directImport_asiSafe1__._undefined12141221__WEBPACK_MODULE_REFERENCE__13_ns_asiSafe1__._undefined12521258undefined12951299__WEBPACK_MODULE_REFERENCE__2_5b22686f697374225d_call_directImport_asiSafe1__._undefined13011308__WEBPACK_MODULE_REFERENCE__13_ns_asiSafe1__._undefined14041410undefined14351450__WEBPACK_MODULE_REFERENCE__0_5b225061676573526f7574654d6f64756c65225d_directImport_asiSafe1__._undefined14861494__WEBPACK_MODULE_REFERENCE__1_5b22526f7574654b696e64225d_asiSafe1__._undefined16981697: __WEBPACK_MODULE_REFERENCE__4_5b2264656661756c74225d_directImport_asiSafe1__._undefined17161715: __WEBPACK_MODULE_REFERENCE__3_5b2264656661756c74225d_directImport_asiSafe1__._undefined17361735: __WEBPACK_MODULE_REFERENCE__13_ns_asiSafe1__._undefinedX169194next_route_loaderkind_PAGES_page_2Fcategories_preferredRegion_absolutePagePath_private_next_pages_2Fcategories_js_absoluteAppPath_private_next_pages_2F_app_js_absoluteDocumentPath_next_2Fdist_2Fpages_2F_document_middlewareConfigBase64_e30_3D_undefined199277(0,helpers/* hoist */.l)undefined279324categories_namespaceObjectundefined385463(0,helpers/* hoist */.l)undefined465510categories_namespaceObjectundefined555633(0,helpers/* hoist */.l)undefined635680categories_namespaceObjectundefined729807(0,helpers/* hoist */.l)undefined809854categories_namespaceObjectundefined895973(0,helpers/* hoist */.l)undefined9751020categories_namespaceObjectundefined10581136(0,helpers/* hoist */.l)undefined11381183categories_namespaceObjectundefined12671345(0,helpers/* hoist */.l)undefined13471392categories_namespaceObjectundefined14551533(0,helpers/* hoist */.l)undefined15351580categories_namespaceObjectundefined16441722(0,helpers/* hoist */.l)undefined17241769categories_namespaceObjectundefined18331911(0,helpers/* hoist */.l)undefined19131958categories_namespaceObjectundefined20252103(0,helpers/* hoist */.l)undefined21052150categories_namespaceObjectundefined22702365module_compiled.PagesRouteModuleundefined24012469route_kind/* RouteKind */.xundefined26752752_app["default"]undefined27732850(_document_default())undefined28732918categories_namespaceObjectundefined RawSource
/***/ }),
/***/ 2785:
 "«webpack/lib/util/registerExternalSerializerœwebpack-sources/ConcatSource«webpack/lib/util/registerExternalSerializer™webpack-sources/RawSource/***/ ((module) => {
Qmodule.exports = require("next/dist/compiled/next-server/pages.runtime.prod.js"); 
/***/ }) åq/***/ ((module) => {
module.exports = require("next/dist/compiled/next-server/pages.runtime.prod.js");
/***/ }) æé ê/***/ ((module) => {
õQmodule.exports = require("next/dist/compiled/next-server/pages.runtime.prod.js");ôõ,
/***/ 6689:
 ó«webpack/lib/util/registerExternalSerializerœwebpack-sources/ConcatSource«webpack/lib/util/registerExternalSerializer™webpack-sources/RawSource/***/ ((module) => {
"module.exports = require("react"); 
/***/ }) ÛB/***/ ((module) => {
module.exports = require("react");
/***/ }) Üß àöì"module.exports = require("react");ëì,
/***/ 6405:
 ÷«webpack/lib/util/registerExternalSerializerœwebpack-sources/ConcatSource«webpack/lib/util/registerExternalSerializer™webpack-sources/RawSource/***/ ((module) => {
&module.exports = require("react-dom"); 
/***/ }) ÒF/***/ ((module) => {
module.exports = require("react-dom");
/***/ }) ÓÖ ×íã&module.exports = require("react-dom");âã,
/***/ 997:
 ÿ«webpack/lib/util/registerExternalSerializerœwebpack-sources/ConcatSource«webpack/lib/util/registerExternalSerializer™webpack-sources/RawSource/***/ ((module) => {
.module.exports = require("react/jsx-runtime"); 
/***/ }) ÉN/***/ ((module) => {
module.exports = require("react/jsx-runtime");
/***/ }) ÊÍ ÎäÚ.module.exports = require("react/jsx-runtime");ÙÚ,
/***/ 2048:
 ð«webpack/lib/util/registerExternalSerializerœwebpack-sources/ConcatSource«webpack/lib/util/registerExternalSerializer™webpack-sources/RawSource/***/ ((module) => {
module.exports = require("fs"); 
/***/ }) À?/***/ ((module) => {
module.exports = require("fs");
/***/ }) ÁÄ ÅÛÑmodule.exports = require("fs");ÐÑ,
/***/ 5315:
 ò«webpack/lib/util/registerExternalSerializerœwebpack-sources/ConcatSource«webpack/lib/util/registerExternalSerializer™webpack-sources/RawSource/***/ ((module) => {
!module.exports = require("path"); 
/***/ }) ·A/***/ ((module) => {
module.exports = require("path");
/***/ }) ¸» ¼ÒÈ!module.exports = require("path");ÇÈ,
/***/ 6162:
 ô«webpack/lib/util/registerExternalSerializerœwebpack-sources/ConcatSource«webpack/lib/util/registerExternalSerializer™webpack-sources/RawSource/***/ ((module) => {
#module.exports = require("stream"); 
/***/ }) ®C/***/ ((module) => {
module.exports = require("stream");
/***/ }) ¯² ³É¿#module.exports = require("stream");¾¿,
/***/ 1568:
 ò«webpack/lib/util/registerExternalSerializerœwebpack-sources/ConcatSource«webpack/lib/util/registerExternalSerializer™webpack-sources/RawSource/***/ ((module) => {
!module.exports = require("zlib"); 
/***/ }) ¥A/***/ ((module) => {
module.exports = require("zlib");
/***/ }) ¦© ªÀ!module.exports = require("zlib");µt
};
;
// load runtime
var __webpack_require__ = require("../webpack-runtime.js");
__webpack_require__.C(exports);
Àvar __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId))
var __webpack_exports__ = __webpack_require__.X(0, [899,342,261], () => (__webpack_exec__(3686)));
,module.exports = __webpack_exports__;
})(); ¼h"use strict";
(() => {
var exports = {};
exports.id = 161;
exports.ids = [161,660];
exports.modules = {
/***/ 3686:
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
// ESM COMPAT FLAG
__webpack_require__.r(__webpack_exports__);
// EXPORTS
__webpack_require__.d(__webpack_exports__, {
config: () => (/* binding */ config),
"default": () => (/* binding */ next_route_loaderkind_PAGES_page_2Fcategories_preferredRegion_absolutePagePath_private_next_pages_2Fcategories_js_absoluteAppPath_private_next_pages_2F_app_js_absoluteDocumentPath_next_2Fdist_2Fpages_2F_document_middlewareConfigBase64_e30_3D_),
getServerSideProps: () => (/* binding */ getServerSideProps),
getStaticPaths: () => (/* binding */ getStaticPaths),
getStaticProps: () => (/* binding */ getStaticProps),
reportWebVitals: () => (/* binding */ reportWebVitals),
routeModule: () => (/* binding */ routeModule),
unstable_getServerProps: () => (/* binding */ unstable_getServerProps),
unstable_getServerSideProps: () => (/* binding */ unstable_getServerSideProps),
unstable_getStaticParams: () => (/* binding */ unstable_getStaticParams),
unstable_getStaticPaths: () => (/* binding */ unstable_getStaticPaths),
unstable_getStaticProps: () => (/* binding */ unstable_getStaticProps)
});
// NAMESPACE OBJECT: ./pages/categories.js
var categories_namespaceObject = {};
__webpack_require__.r(categories_namespaceObject);
__webpack_require__.d(categories_namespaceObject, {
"default": () => (Categories)
});
// EXTERNAL MODULE: ./node_modules/next/dist/server/future/route-modules/pages/module.compiled.js
var module_compiled = __webpack_require__(7093);
// EXTERNAL MODULE: ./node_modules/next/dist/server/future/route-kind.js
var route_kind = __webpack_require__(5244);
// EXTERNAL MODULE: ./node_modules/next/dist/build/templates/helpers.js
var helpers = __webpack_require__(1323);
// EXTERNAL MODULE: ./node_modules/next/dist/pages/_document.js
var _document = __webpack_require__(2899);
var _document_default = /*#__PURE__*/__webpack_require__.n(_document);
// EXTERNAL MODULE: ./pages/_app.js
var _app = __webpack_require__(3414);
// EXTERNAL MODULE: external "react/jsx-runtime"
var jsx_runtime_ = __webpack_require__(997);
// EXTERNAL MODULE: external "react"
var external_react_ = __webpack_require__(6689);
// EXTERNAL MODULE: ./node_modules/next/router.js
var next_router = __webpack_require__(1163);
// EXTERNAL MODULE: ./lib/api.js
var api = __webpack_require__(7751);
// EXTERNAL MODULE: ./components/AppShell.js
var AppShell = __webpack_require__(1712);
// EXTERNAL MODULE: ./components/icons.js
var icons = __webpack_require__(349);
// EXTERNAL MODULE: ./components/ToastProvider.js
var ToastProvider = __webpack_require__(4190);
// EXTERNAL MODULE: ./components/ConfirmProvider.js
var ConfirmProvider = __webpack_require__(4407);
;// CONCATENATED MODULE: ./pages/categories.js
const ICONS = [
"\uD83C\uDF5C",
"\uD83E\uDD58",
"\uD83E\uDD6C",
"\uD83E\uDD69",
"\uD83C\uDF54",
"\uD83C\uDF55",
"☕",
"\uD83C\uDF7A",
"\uD83E\uDDCB",
"\uD83C\uDF4E",
"\uD83C\uDF6A",
"\uD83C\uDF6B",
"\uD83D\uDE97",
"\uD83D\uDE95",
"\uD83D\uDE8C",
"\uD83D\uDE87",
"⛽",
"\uD83D\uDE99",
"\uD83D\uDEF5",
"✈ï¸",
"\uD83D\uDEA2",
"\uD83D\uDED2",
"\uD83D\uDC54",
"\uD83D\uDC55",
"\uD83D\uDC56",
"\uD83D\uDC5F",
"\uD83D\uDC53",
"\uD83E\uDDE2",
"\uD83D\uDC5C",
"\uD83C\uDF92",
"\uD83D\uDC8D",
"\uD83D\uDC84",
"\uD83C\uDFE0",
"\uD83C\uDFE2",
"\uD83C\uDFE6",
"\uD83C\uDFE5",
"\uD83C\uDFE8",
"\uD83C\uDFE9",
"\uD83D\uDD27",
"\uD83D\uDD28",
"\uD83D\uDECBï¸",
"\uD83D\uDCFA",
"\uD83D\uDCBB",
"\uD83D\uDCF1",
"\uD83D\uDCDD",
"\uD83D\uDCB0",
"\uD83C\uDF81",
"\uD83D\uDCC8",
"\uD83E\uDDE7",
"\uD83D\uDCB3",
"\uD83C\uDFAF",
"\uD83D\uDCDA",
"\uD83C\uDFB5",
"\uD83C\uDFAE",
"\uD83C\uDFC3",
"âš½",
"\uD83C\uDFCA",
"\uD83D\uDEB4",
"\uD83C\uDFAD",
"\uD83C\uDFA8",
"\uD83C\uDFAC",
"\uD83D\uDCF7",
"\uD83C\uDFA5",
"\uD83D\uDCFA",
"\uD83E\uDDF8",
"\uD83D\uDC15",
"\uD83D\uDC08",
"\uD83C\uDF38",
"\uD83C\uDF3A"
];
function Categories() {
const router = (0,next_router.useRouter)();
const { showToast } = (0,ToastProvider/* useToast */.p)();
const { confirm } = (0,ConfirmProvider/* useConfirm */.N)();
const [categories, setCategories] = (0,external_react_.useState)({
expense: [],
income: []
});
const [modalOpen, setModalOpen] = (0,external_react_.useState)(false);
const [categoryType, setCategoryType] = (0,external_react_.useState)("expense");
const [loading, setLoading] = (0,external_react_.useState)(true);
const [submitting, setSubmitting] = (0,external_react_.useState)(false);
const [formError, setFormError] = (0,external_react_.useState)("");
const [formData, setFormData] = (0,external_react_.useState)({
name: "",
icon: "\uD83D\uDCDD"
});
null;
const loadCategories = async ()=>{
setLoading(true);
try {
const data = await (0,api/* getCategories */.CP)();
setCategories(data);
} catch (err) {
console.error(err);
showToast(err.message, {
tone: "error"
});
} finally{
setLoading(false);
}
};
const openAddModal = (type)=>{
setCategoryType(type);
setFormData({
name: "",
icon: "\uD83D\uDCDD"
});
setFormError("");
setModalOpen(true);
};
const closeModal = ()=>{
if (submitting) return;
setModalOpen(false);
setFormError("");
};
const handleSubmit = async (e)=>{
e.preventDefault();
if (!formData.name || !formData.icon) {
setFormError("请填写完整信æ¯");
return;
}
setSubmitting(true);
setFormError("");
try {
await (0,api/* createCategory */.k4)({
type: categoryType,
name: formData.name,
icon: formData.icon
});
closeModal();
showToast("分类已创建", {
tone: "success"
});
await loadCategories();
} catch (err) {
setFormError(err.message);
showToast(err.message, {
tone: "error"
});
} finally{
setSubmitting(false);
}
};
const handleDelete = async (id)=>{
const shouldDelete = await confirm({
title: "删除此分类?",
description: "默认分类ä¸å¯åˆ é™¤ï¼Œè‡ªå®šä¹‰åˆ†ç±»åˆ é™¤åŽå°†æ— æ³•æ¢å¤ã€‚",
confirmText: "删除"
});
if (!shouldDelete) return;
try {
await (0,api/* deleteCategory */.uu)(id);
showToast("分类已删除", {
tone: "success"
});
await loadCategories();
} catch (err) {
showToast(err.message, {
tone: "error"
});
}
};
const actions = /*#__PURE__*/ jsx_runtime_.jsx("button", {
type: "button",
className: "icon-button",
"aria-label": "设置",
onClick: ()=>router.push("/settings"),
children: /*#__PURE__*/ jsx_runtime_.jsx(icons/* Icon */.J, {
name: "settings",
size: 18
})
});
return /*#__PURE__*/ (0,jsx_runtime_.jsxs)(AppShell/* default */.Z, {
title: "分类",
subtitle: "æ•´ç†å¸¸ç”¨åˆ†ç±»ä¸Žå›¾æ ‡",
actions: actions,
compactHeader: true,
children: [
loading ? /*#__PURE__*/ jsx_runtime_.jsx("div", {
className: "card loading-state",
children: "加载中..."
}) : /*#__PURE__*/ (0,jsx_runtime_.jsxs)(jsx_runtime_.Fragment, {
children: [
/*#__PURE__*/ (0,jsx_runtime_.jsxs)("section", {
className: "card category-section category-section--refresh",
children: [
/*#__PURE__*/ (0,jsx_runtime_.jsxs)("div", {
className: "section-header",