Skip to content

Commit

Permalink
feat: add feed refresh functionality
Browse files Browse the repository at this point in the history
  • Loading branch information
electh committed Feb 3, 2025
1 parent 269f12e commit 4cd43a8
Show file tree
Hide file tree
Showing 6 changed files with 65 additions and 3 deletions.
9 changes: 9 additions & 0 deletions src/api/miniflux.js
Original file line number Diff line number Diff line change
Expand Up @@ -300,6 +300,15 @@ class miniFluxAPI {
throw error;
}
}

async refreshFeed(feedId) {
try {
await this.client.put(`/v1/feeds/${feedId}/refresh`);
} catch (error) {
console.error("刷新订阅源失败:", error);
throw error;
}
}
}

export default new miniFluxAPI();
2 changes: 1 addition & 1 deletion src/components/ArticleList/components/ArticleCard.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -150,7 +150,7 @@ export default function ArticleCard({ article }) {
<div className="flex flex-col gap-1 flex-1">
<h3
className={cn(
"card-title text-base font-semibold line-clamp-2 text-wrap break-words",
"card-title text-base font-semibold line-clamp-2 text-wrap break-words break-all",
article.status === "read"
? "text-content2-foreground"
: "text-foreground",
Expand Down
28 changes: 27 additions & 1 deletion src/components/ArticleList/components/MenuButton.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import {
DropdownMenu,
DropdownTrigger,
} from "@heroui/react";
import { EllipsisVertical, FilePen, FolderPen, Trash2 } from "lucide-react";
import { EllipsisVertical, FilePen, FolderPen, Trash2, RefreshCw } from "lucide-react";
import { useParams } from "react-router-dom";
import RenameModal from "./RenameModal";
import UnsubscribeModal from "./UnsubscribeModal";
Expand All @@ -16,10 +16,29 @@ import {
unsubscribeModalOpen,
} from "@/stores/modalStore.js";
import { useTranslation } from "react-i18next";
import { toast } from "sonner";
import minifluxAPI from "@/api/miniflux.js";
import { forceSync } from "@/stores/syncStore.js";

export default function MenuButton() {
const { feedId, categoryId } = useParams();
const { t } = useTranslation();

const handleRefresh = () => {
if (!feedId) return;

return toast.promise(
(async () => {
await minifluxAPI.refreshFeed(feedId);
await forceSync();
})(),
{
loading: t("common.refreshing"),
success: t("common.success"),
}
);
};

return (
<>
<Dropdown>
Expand All @@ -36,6 +55,13 @@ export default function MenuButton() {
</DropdownTrigger>
{feedId && (
<DropdownMenu aria-label="Feed Actions">
<DropdownItem
key="refresh"
onPress={handleRefresh}
startContent={<RefreshCw className="size-4" />}
>
{t("articleList.refreshFeed")}
</DropdownItem>
<DropdownItem
key="edit"
onPress={() => editFeedModalOpen.set(true)}
Expand Down
2 changes: 2 additions & 0 deletions src/i18n/locales/en-US.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ export default {
save: "Save",
delete: "Delete",
edit: "Edit",
refreshing: "Refreshing...",
copy: "Copy",
copied: "Copied",
copyFailed: "Copy failed",
Expand Down Expand Up @@ -100,6 +101,7 @@ export default {
all: "All",
unsubscribe: "Unsubscribe",
unsubscribeDescription: "Unsubscribe from",
refreshFeed: "Refresh feed",
editFeed: "Edit feed",
renameCategory: {
title: "Rename category",
Expand Down
2 changes: 2 additions & 0 deletions src/i18n/locales/zh-CN.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ export default {
save: "保存",
delete: "删除",
edit: "编辑",
refreshing: "刷新中...",
copy: "复制",
copied: "已复制",
copyFailed: "复制失败",
Expand Down Expand Up @@ -99,6 +100,7 @@ export default {
all: "全部",
unsubscribe: "取消订阅",
unsubscribeDescription: "取消订阅",
refreshFeed: "刷新订阅",
editFeed: "编辑订阅",
renameCategory: {
title: "重命名分类",
Expand Down
25 changes: 24 additions & 1 deletion src/main.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import { HeroUIProvider } from "@heroui/react";
import { RouterProvider } from "react-router";
import { Toaster } from "sonner";
import SplashScreen from "@/components/SplashScreen";
import { Loader2 } from "lucide-react";

// 初始化主题
initTheme();
Expand All @@ -25,6 +26,28 @@ createRoot(document.getElementById("root")).render(
v7_skipActionErrorRevalidation: true,
}}
/>
<Toaster theme="system" richColors position="bottom-center" />
<Toaster
theme="system"
position="bottom-center"
toastOptions={{
unstyled: true,
classNames: {
toast:
"flex gap-1 items-center w-full bg-background border p-3 rounded-xl shadow-lg bg-gradient-to-b from-white/5 from-1% to-transparent to-20%",
title: "text-sm font-medium",
loading:
"text-default-500 bg-default-100 border-default-300 shadow-black/10",
info: "text-default-500 bg-default-100 border-default-300 shadow-black/10",
success:
"text-success bg-success-50 border-success-200 shadow-success/20",
error: "text-danger bg-danger-50 border-danger-200 shadow-danger/20",
warning:
"text-warning bg-warning-50 border-warning-200 shadow-warning/20",
},
}}
icons={{
loading: <Loader2 className="h-4 w-4 animate-spin" />,
}}
/>
</HeroUIProvider>,
);

0 comments on commit 4cd43a8

Please sign in to comment.