From e5c832c065bb5d3c3a9e590fce4e3d6b761be3c7 Mon Sep 17 00:00:00 2001 From: Xiaoqi_Weng <50273091+zjnbwxq@users.noreply.github.com> Date: Thu, 17 Oct 2024 10:50:07 +0100 Subject: [PATCH 01/10] Add Obsidian integration feature --- .../src/atoms/settings/integration.ts | 4 +++ .../ui/platform-icon/collections/obsidian.tsx | 18 ++++++++++ .../src/components/ui/platform-icon/icons.ts | 1 + .../src/hooks/biz/useEntryActions.tsx | 35 +++++++++++++++++++ locales/app/ar-DZ.json | 3 ++ locales/app/ar-IQ.json | 3 ++ locales/app/ar-KW.json | 5 ++- locales/app/ar-MA.json | 5 ++- locales/app/de.json | 3 ++ locales/app/en.json | 3 ++ locales/app/es.json | 3 ++ locales/app/zh-CN.json | 3 ++ locales/app/zh-HK.json | 9 +++-- locales/app/zh-TW.json | 3 ++ locales/settings/ar-DZ.json | 5 +++ locales/settings/ar-IQ.json | 5 +++ locales/settings/ar-KW.json | 5 +++ locales/settings/ar-MA.json | 7 +++- locales/settings/de.json | 5 +++ locales/settings/en.json | 5 +++ locales/settings/es.json | 7 +++- locales/settings/zh-CN.json | 5 +++ locales/settings/zh-HK.json | 7 +++- locales/settings/zh-TW.json | 7 +++- packages/shared/src/interface/settings.ts | 4 +++ 25 files changed, 151 insertions(+), 9 deletions(-) create mode 100644 apps/renderer/src/components/ui/platform-icon/collections/obsidian.tsx diff --git a/apps/renderer/src/atoms/settings/integration.ts b/apps/renderer/src/atoms/settings/integration.ts index dff5ec8dac..f54a02ace6 100644 --- a/apps/renderer/src/atoms/settings/integration.ts +++ b/apps/renderer/src/atoms/settings/integration.ts @@ -19,6 +19,10 @@ export const createDefaultSettings = (): IntegrationSettings => ({ enableOmnivore: false, omnivoreEndpoint: "", omnivoreToken: "", + + // obsidian + enableObsidian: false, + obsidianVaultPath: "", }) export const { diff --git a/apps/renderer/src/components/ui/platform-icon/collections/obsidian.tsx b/apps/renderer/src/components/ui/platform-icon/collections/obsidian.tsx new file mode 100644 index 0000000000..0b90a91bb0 --- /dev/null +++ b/apps/renderer/src/components/ui/platform-icon/collections/obsidian.tsx @@ -0,0 +1,18 @@ +import type { SVGProps } from "react" + +export function SimpleIconsObsidian(props: SVGProps) { + return ( + + + + ) +} diff --git a/apps/renderer/src/components/ui/platform-icon/icons.ts b/apps/renderer/src/components/ui/platform-icon/icons.ts index a6aa151f77..084815395f 100644 --- a/apps/renderer/src/components/ui/platform-icon/icons.ts +++ b/apps/renderer/src/components/ui/platform-icon/icons.ts @@ -1,5 +1,6 @@ export * from "./collections/eagle" export * from "./collections/instapaper" +export * from "./collections/obsidian" export * from "./collections/omnivore" export * from "./collections/readwise" export * from "./collections/rss3" diff --git a/apps/renderer/src/hooks/biz/useEntryActions.tsx b/apps/renderer/src/hooks/biz/useEntryActions.tsx index d4d9dc0c27..56638697aa 100644 --- a/apps/renderer/src/hooks/biz/useEntryActions.tsx +++ b/apps/renderer/src/hooks/biz/useEntryActions.tsx @@ -25,6 +25,7 @@ import { mountLottie } from "~/components/ui/lottie-container" import { SimpleIconsEagle, SimpleIconsInstapaper, + SimpleIconsObsidian, SimpleIconsOmnivore, SimpleIconsReadwise, } from "~/components/ui/platform-icon/icons" @@ -171,6 +172,8 @@ export const useEntryActions = ({ const enableOmnivore = useIntegrationSettingKey("enableOmnivore") const omnivoreToken = useIntegrationSettingKey("omnivoreToken") const omnivoreEndpoint = useIntegrationSettingKey("omnivoreEndpoint") + const enableObsidian = useIntegrationSettingKey("enableObsidian") + const obsidianVaultPath = useIntegrationSettingKey("obsidianVaultPath") const checkEagle = useQuery({ queryKey: ["check-eagle"], @@ -370,6 +373,32 @@ export const useEntryActions = ({ } }, }, + { + name: t("entry_actions.save_to_obsidian"), + icon: , + key: "saveToObsidian", + hide: !enableObsidian || !obsidianVaultPath || !populatedEntry.entries.url, + onClick: async () => { + try { + await tipcClient?.saveToObsidian({ + url: populatedEntry.entries.url, + title: populatedEntry.entries.title || "", + content: populatedEntry.entries.content || "", + author: populatedEntry.entries.author || "", + publishedAt: populatedEntry.entries.publishedAt || "", + }) + + toast.success(t("entry_actions.saved_to_obsidian"), { + duration: 3000, + }) + } catch (error) { + console.error("Failed to save to Obsidian:", error) + toast.error(t("entry_actions.failed_to_save_to_obsidian"), { + duration: 3000, + }) + } + }, + }, { key: "tip", shortcut: shortcuts.entry.tip.key, @@ -534,6 +563,8 @@ export const useEntryActions = ({ enableInstapaper, instapaperPassword, instapaperUsername, + enableObsidian, + obsidianVaultPath, feed?.ownerUserId, type, showSourceContent, @@ -543,6 +574,10 @@ export const useEntryActions = ({ showSourceContentModal, read, unread, + enableOmnivore, + isInbox, + omnivoreEndpoint, + omnivoreToken, ]) return { diff --git a/locales/app/ar-DZ.json b/locales/app/ar-DZ.json index 905440e258..9c600cef43 100644 --- a/locales/app/ar-DZ.json +++ b/locales/app/ar-DZ.json @@ -18,15 +18,18 @@ "entry_actions.copy_link": "نسخ الرابط", "entry_actions.failed_to_save_to_eagle": "فشل في الحفظ إلى Eagle.", "entry_actions.failed_to_save_to_instapaper": "فشل في الحفظ إلى Instapaper.", + "entry_actions.failed_to_save_to_obsidian": "فشل في الحفظ إلى Obsidian.", "entry_actions.failed_to_save_to_readwise": "فشل في الحفظ إلى Readwise.", "entry_actions.mark_as_read": "تحديد كمقروء", "entry_actions.mark_as_unread": "تحديد كغير مقروء", "entry_actions.open_in_browser": "فتح في المتصفح", "entry_actions.save_media_to_eagle": "حفظ الوسائط إلى Eagle", "entry_actions.save_to_instapaper": "حفظ إلى Instapaper", + "entry_actions.save_to_obsidian": "حفظ إلى Obsidian", "entry_actions.save_to_readwise": "حفظ إلى Readwise", "entry_actions.saved_to_eagle": "تم الحفظ إلى Eagle.", "entry_actions.saved_to_instapaper": "تم الحفظ إلى Instapaper.", + "entry_actions.saved_to_obsidian": "تم الحفظ إلى Obsidian.", "entry_actions.saved_to_readwise": "تم الحفظ إلى Readwise.", "entry_actions.share": "مشاركة", "entry_actions.star": "تمييز بنجمة", diff --git a/locales/app/ar-IQ.json b/locales/app/ar-IQ.json index ff40bd3839..119219896f 100644 --- a/locales/app/ar-IQ.json +++ b/locales/app/ar-IQ.json @@ -18,15 +18,18 @@ "entry_actions.copy_link": "نسخ الرابط", "entry_actions.failed_to_save_to_eagle": "فشل في الحفظ إلى Eagle.", "entry_actions.failed_to_save_to_instapaper": "فشل في الحفظ إلى Instapaper.", + "entry_actions.failed_to_save_to_obsidian": "فشل في الحفظ إلى Obsidian.", "entry_actions.failed_to_save_to_readwise": "فشل في الحفظ إلى Readwise.", "entry_actions.mark_as_read": "تحديد كمقروء", "entry_actions.mark_as_unread": "تحديد كغير مقروء", "entry_actions.open_in_browser": "فتح في المتصفح", "entry_actions.save_media_to_eagle": "حفظ الوسائط إلى Eagle", "entry_actions.save_to_instapaper": "حفظ إلى Instapaper", + "entry_actions.save_to_obsidian": "حفظ إلى Obsidian", "entry_actions.save_to_readwise": "حفظ إلى Readwise", "entry_actions.saved_to_eagle": "تم الحفظ إلى Eagle.", "entry_actions.saved_to_instapaper": "تم الحفظ إلى Instapaper.", + "entry_actions.saved_to_obsidian": "تم الحفظ إلى Obsidian.", "entry_actions.saved_to_readwise": "تم الحفظ إلى Readwise.", "entry_actions.share": "مشاركة", "entry_actions.star": "إضافة إلى المفضلة", diff --git a/locales/app/ar-KW.json b/locales/app/ar-KW.json index aab60292e4..bd37b84805 100644 --- a/locales/app/ar-KW.json +++ b/locales/app/ar-KW.json @@ -18,15 +18,18 @@ "entry_actions.copy_link": "نسخ الرابط", "entry_actions.failed_to_save_to_eagle": "فشل في الحفظ إلى Eagle.", "entry_actions.failed_to_save_to_instapaper": "فشل في الحفظ إلى Instapaper.", + "entry_actions.failed_to_save_to_obsidian": "فشل في الحفظ إلى Obsidian", "entry_actions.failed_to_save_to_readwise": "فشل في الحفظ إلى Readwise.", "entry_actions.mark_as_read": "وضع علامة كمقروء", "entry_actions.mark_as_unread": "وضع علامة كغير مقروء", "entry_actions.open_in_browser": "فتح في المتصفح", "entry_actions.save_media_to_eagle": "حفظ الوسائط إلى Eagle", "entry_actions.save_to_instapaper": "حفظ إلى Instapaper", + "entry_actions.save_to_obsidian": "حفظ إلى Obsidian", "entry_actions.save_to_readwise": "حفظ إلى Readwise", "entry_actions.saved_to_eagle": "تم الحفظ إلى Eagle.", "entry_actions.saved_to_instapaper": "تم الحفظ إلى Instapaper.", + "entry_actions.saved_to_obsidian": "تم الحفظ إلى Obsidian.", "entry_actions.saved_to_readwise": "تم الحفظ إلى Readwise.", "entry_actions.share": "مشاركة", "entry_actions.star": "تفضيل", @@ -132,7 +135,7 @@ "search.options.all": "الكل", "search.options.entries": "إدخالات", "search.options.feeds": "تغذيات", - "search.options.search_type": "نوع البحث", + "search.options.search_type": "نوع ال��حث", "search.placeholder": "بحث...", "search.result_count_local_mode": "(وضع محلي)", "search.tooltip.local_search": "يغطي هذا البحث البيانات المتاحة محليًا. حاول إعادة الجلب لتضمين أحدث البيانات.", diff --git a/locales/app/ar-MA.json b/locales/app/ar-MA.json index 070752538c..5e5f5c780d 100644 --- a/locales/app/ar-MA.json +++ b/locales/app/ar-MA.json @@ -18,16 +18,19 @@ "entry_actions.copy_link": "نسخ الرابط", "entry_actions.failed_to_save_to_eagle": "فشل الحفظ إلى Eagle.", "entry_actions.failed_to_save_to_instapaper": "فشل الحفظ إلى Instapaper.", + "entry_actions.failed_to_save_to_obsidian": "فشل الحفظ في Obsidian", "entry_actions.failed_to_save_to_readwise": "فشل الحفظ إلى Readwise.", "entry_actions.mark_as_read": "وضع علامة كمقروء", "entry_actions.mark_as_unread": "وضع علامة كغير مقروء", "entry_actions.open_in_browser": "فتح في المتصفح", "entry_actions.save_media_to_eagle": "حفظ الوسائط إلى Eagle", "entry_actions.save_to_instapaper": "حفظ إلى Instapaper", + "entry_actions.save_to_obsidian": "حفظ في Obsidian", "entry_actions.save_to_readwise": "حفظ إلى Readwise", "entry_actions.saved_to_eagle": "تم الحفظ إلى Eagle.", "entry_actions.saved_to_instapaper": "تم الحفظ إلى Instapaper.", - "entry_actions.saved_to_readwise": "تم الحفظ إلى Readwise.", + "entry_actions.saved_to_obsidian": "تم الحفظ في Obsidian", + "entry_actions.saved_to_readwise": "تم الحفظ في Readwise.", "entry_actions.share": "مشاركة", "entry_actions.star": "إضافة إلى المفضلة", "entry_actions.starred": "مضاف إلى المفضلة.", diff --git a/locales/app/de.json b/locales/app/de.json index 83c2154250..b9729efefd 100644 --- a/locales/app/de.json +++ b/locales/app/de.json @@ -18,15 +18,18 @@ "entry_actions.copy_link": "Link kopieren", "entry_actions.failed_to_save_to_eagle": "Speichern in Eagle fehlgeschlagen.", "entry_actions.failed_to_save_to_instapaper": "Speichern in Instapaper fehlgeschlagen.", + "entry_actions.failed_to_save_to_obsidian": "Speichern in Obsidian fehlgeschlagen", "entry_actions.failed_to_save_to_readwise": "Speichern in Readwise fehlgeschlagen.", "entry_actions.mark_as_read": "Als gelesen markieren", "entry_actions.mark_as_unread": "Als ungelesen markieren", "entry_actions.open_in_browser": "Im Browser öffnen", "entry_actions.save_media_to_eagle": "Medien in Eagle speichern", "entry_actions.save_to_instapaper": "In Instapaper speichern", + "entry_actions.save_to_obsidian": "In Obsidian speichern", "entry_actions.save_to_readwise": "In Readwise speichern", "entry_actions.saved_to_eagle": "In Eagle gespeichert.", "entry_actions.saved_to_instapaper": "In Instapaper gespeichert.", + "entry_actions.saved_to_obsidian": "In Obsidian gespeichert", "entry_actions.saved_to_readwise": "In Readwise gespeichert.", "entry_actions.share": "Teilen", "entry_actions.star": "Favorisieren", diff --git a/locales/app/en.json b/locales/app/en.json index c5795ae412..120ddab741 100644 --- a/locales/app/en.json +++ b/locales/app/en.json @@ -56,6 +56,7 @@ "entry_actions.copy_title": "Copy Title", "entry_actions.failed_to_save_to_eagle": "Failed to save to Eagle.", "entry_actions.failed_to_save_to_instapaper": "Failed to save to Instapaper.", + "entry_actions.failed_to_save_to_obsidian": "Failed to save to Obsidian", "entry_actions.failed_to_save_to_omnivore": "Failed to save to Omnivore.", "entry_actions.failed_to_save_to_readwise": "Failed to save to Readwise.", "entry_actions.mark_as_read": "Mark as Read", @@ -64,10 +65,12 @@ "entry_actions.recent_reader": "Recent reader:", "entry_actions.save_media_to_eagle": "Save Media To Eagle", "entry_actions.save_to_instapaper": "Save To Instapaper", + "entry_actions.save_to_obsidian": "Save to Obsidian", "entry_actions.save_to_omnivore": "Save To Omnivore", "entry_actions.save_to_readwise": "Save To Readwise", "entry_actions.saved_to_eagle": "Saved To Eagle.", "entry_actions.saved_to_instapaper": "Saved To Instapaper.", + "entry_actions.saved_to_obsidian": "Saved to Obsidian", "entry_actions.saved_to_omnivore": "Saved To Omnivore.", "entry_actions.saved_to_readwise": "Saved To Readwise.", "entry_actions.share": "Share", diff --git a/locales/app/es.json b/locales/app/es.json index 6b5a071cc2..2f8a00a7b1 100644 --- a/locales/app/es.json +++ b/locales/app/es.json @@ -16,12 +16,15 @@ "discover.select_placeholder": "Seleccionar", "early_access": "Versión de acceso anticipado", "entry_actions.copy_link": "Copiar enlace", + "entry_actions.failed_to_save_to_obsidian": "Error al guardar en Obsidian", "entry_actions.mark_as_read": "Marcar como leído", "entry_actions.mark_as_unread": "Marcar como no leído", "entry_actions.open_in_browser": "Abrir en el navegador", "entry_actions.save_media_to_eagle": "Guardar medios en Eagle", "entry_actions.save_to_instapaper": "Guardar en Instapaper", + "entry_actions.save_to_obsidian": "Guardar en Obsidian", "entry_actions.save_to_readwise": "Guardar en Readwise", + "entry_actions.saved_to_obsidian": "Guardado en Obsidian", "entry_actions.share": "Compartir", "entry_actions.star": "Agregar a favoritos", "entry_actions.tip": "Dar propina", diff --git a/locales/app/zh-CN.json b/locales/app/zh-CN.json index 46051116af..b488719a8f 100644 --- a/locales/app/zh-CN.json +++ b/locales/app/zh-CN.json @@ -56,6 +56,7 @@ "entry_actions.copy_title": "复制标题", "entry_actions.failed_to_save_to_eagle": "保存到 Eagle 失败", "entry_actions.failed_to_save_to_instapaper": "保存到 Instapaper 失败", + "entry_actions.failed_to_save_to_obsidian": "保存到 Obsidian 失败", "entry_actions.failed_to_save_to_omnivore": "保存到 Omnivore 失败", "entry_actions.failed_to_save_to_readwise": "保存到 Readwise 失败", "entry_actions.mark_as_read": "标记为已读", @@ -64,10 +65,12 @@ "entry_actions.recent_reader": "最近阅读者:", "entry_actions.save_media_to_eagle": "保存到 Eagle", "entry_actions.save_to_instapaper": "保存到 Instapaper", + "entry_actions.save_to_obsidian": "保存到 Obsidian", "entry_actions.save_to_omnivore": "保存到 Omnivore", "entry_actions.save_to_readwise": "保存到 Readwise", "entry_actions.saved_to_eagle": "保存到 Eagle", "entry_actions.saved_to_instapaper": "保存到 Instapaper.", + "entry_actions.saved_to_obsidian": "已保存到 Obsidian", "entry_actions.saved_to_omnivore": "保存到 Omnivore.", "entry_actions.saved_to_readwise": "保存到 Readwise.", "entry_actions.share": "分享", diff --git a/locales/app/zh-HK.json b/locales/app/zh-HK.json index bbfb31ce67..6a115b88c3 100644 --- a/locales/app/zh-HK.json +++ b/locales/app/zh-HK.json @@ -56,6 +56,7 @@ "entry_actions.copy_title": "複製標題", "entry_actions.failed_to_save_to_eagle": "無法保存至 Eagle", "entry_actions.failed_to_save_to_instapaper": "無法保存至 Instapaper", + "entry_actions.failed_to_save_to_obsidian": "儲存至 Obsidian 失敗", "entry_actions.failed_to_save_to_omnivore": "無法保存至 Omnivore", "entry_actions.failed_to_save_to_readwise": "無法保存至 Readwise", "entry_actions.mark_as_read": "標記為已讀", @@ -64,12 +65,14 @@ "entry_actions.recent_reader": "最近閱讀者:", "entry_actions.save_media_to_eagle": "保存媒體至 Eagle", "entry_actions.save_to_instapaper": "保存至 Instapaper", + "entry_actions.save_to_obsidian": "儲存至 Obsidian", "entry_actions.save_to_omnivore": "保存至 Omnivore", - "entry_actions.save_to_readwise": "保存至 Readwise", + "entry_actions.save_to_readwise": "儲存至 Readwise", "entry_actions.saved_to_eagle": "已保存至 Eagle", "entry_actions.saved_to_instapaper": "已保存至 Instapaper", + "entry_actions.saved_to_obsidian": "已儲存至 Obsidian", "entry_actions.saved_to_omnivore": "已保存至 Omnivore", - "entry_actions.saved_to_readwise": "已保存至 Readwise", + "entry_actions.saved_to_readwise": "已儲存至 Readwise", "entry_actions.share": "分享", "entry_actions.star": "收藏", "entry_actions.starred": "已收藏", @@ -198,7 +201,7 @@ "sidebar.add_more_feeds": "添加訂閱源", "sidebar.category_remove_dialog.cancel": "取消", "sidebar.category_remove_dialog.continue": "繼續", - "sidebar.category_remove_dialog.description": "此操作將刪除你的分類,但其中的訂閱源將保留並按網站分組。", + "sidebar.category_remove_dialog.description": "此操作將刪除你的分類,但其中的訂閱源將留並按網站分組。", "sidebar.category_remove_dialog.title": "刪除分類", "sidebar.feed_actions.claim": "認領", "sidebar.feed_actions.claim_feed": "認領訂閱源", diff --git a/locales/app/zh-TW.json b/locales/app/zh-TW.json index 7b9814a044..184fd72b70 100644 --- a/locales/app/zh-TW.json +++ b/locales/app/zh-TW.json @@ -56,6 +56,7 @@ "entry_actions.copy_title": "複製標題", "entry_actions.failed_to_save_to_eagle": "無法儲存到 Eagle。", "entry_actions.failed_to_save_to_instapaper": "無法儲存到 Instapaper。", + "entry_actions.failed_to_save_to_obsidian": "儲存到 Obsidian 失敗", "entry_actions.failed_to_save_to_omnivore": "無法儲存到 Omnivore。", "entry_actions.failed_to_save_to_readwise": "無法儲存到 Readwise。", "entry_actions.mark_as_read": "標記為已讀", @@ -64,10 +65,12 @@ "entry_actions.recent_reader": "最近閲讀者:", "entry_actions.save_media_to_eagle": "儲存媒體至 Eagle", "entry_actions.save_to_instapaper": "儲存到 Instapaper", + "entry_actions.save_to_obsidian": "儲存到 Obsidian", "entry_actions.save_to_omnivore": "儲存到 Omnivore", "entry_actions.save_to_readwise": "儲存到 Readwise", "entry_actions.saved_to_eagle": "已儲存至 Eagle。", "entry_actions.saved_to_instapaper": "已儲存至 Instapaper。", + "entry_actions.saved_to_obsidian": "已儲存到 Obsidian", "entry_actions.saved_to_omnivore": "已儲存至 Omnivore。", "entry_actions.saved_to_readwise": "已儲存至 Readwise。", "entry_actions.share": "分享", diff --git a/locales/settings/ar-DZ.json b/locales/settings/ar-DZ.json index 1e14e55a03..112fccbb86 100644 --- a/locales/settings/ar-DZ.json +++ b/locales/settings/ar-DZ.json @@ -109,6 +109,11 @@ "integration.instapaper.password.label": "كلمة مرور Instapaper", "integration.instapaper.title": "Instapaper", "integration.instapaper.username.label": "اسم مستخدم Instapaper", + "integration.obsidian.enable.description": "عرض زر 'حفظ إلى Obsidian' عند توفره.", + "integration.obsidian.enable.label": "تمكين", + "integration.obsidian.title": "Obsidian", + "integration.obsidian.vaultPath.description": "المسار إلى خزنة Obsidian الخاصة بك.", + "integration.obsidian.vaultPath.label": "مسار خزنة Obsidian", "integration.readwise.enable.description": "عرض زر 'حفظ إلى Readwise' عند توفره.", "integration.readwise.enable.label": "تمكين", "integration.readwise.title": "Readwise", diff --git a/locales/settings/ar-IQ.json b/locales/settings/ar-IQ.json index d9edd18292..450588d705 100644 --- a/locales/settings/ar-IQ.json +++ b/locales/settings/ar-IQ.json @@ -115,6 +115,11 @@ "integration.instapaper.password.label": "كلمة مرور Instapaper", "integration.instapaper.title": "Instapaper", "integration.instapaper.username.label": "اسم مستخدم Instapaper", + "integration.obsidian.enable.description": "عرض زر 'حفظ إلى Obsidian' عند توفره.", + "integration.obsidian.enable.label": "تمكين", + "integration.obsidian.title": "Obsidian", + "integration.obsidian.vaultPath.description": "المسار إلى خزنة Obsidian الخاصة بك.", + "integration.obsidian.vaultPath.label": "مسار خزنة Obsidian", "integration.readwise.enable.description": "عرض زر 'حفظ إلى Readwise' عند توفره.", "integration.readwise.enable.label": "تمكين", "integration.readwise.title": "Readwise", diff --git a/locales/settings/ar-KW.json b/locales/settings/ar-KW.json index 69e3ca75f3..1cbccb9464 100644 --- a/locales/settings/ar-KW.json +++ b/locales/settings/ar-KW.json @@ -115,6 +115,11 @@ "integration.instapaper.password.label": "كلمة مرور Instapaper", "integration.instapaper.title": "Instapaper", "integration.instapaper.username.label": "اسم مستخدم Instapaper", + "integration.obsidian.enable.description": "عرض زر 'حفظ إلى Obsidian' عند توفره.", + "integration.obsidian.enable.label": "تمكين", + "integration.obsidian.title": "Obsidian", + "integration.obsidian.vaultPath.description": "المسار إلى خزنة Obsidian الخاصة بك.", + "integration.obsidian.vaultPath.label": "مسار خزنة Obsidian", "integration.readwise.enable.description": "عرض زر 'حفظ إلى Readwise' عند توفره.", "integration.readwise.enable.label": "تمكين", "integration.readwise.title": "Readwise", diff --git a/locales/settings/ar-MA.json b/locales/settings/ar-MA.json index 51d9d736ae..bfcf15a37b 100644 --- a/locales/settings/ar-MA.json +++ b/locales/settings/ar-MA.json @@ -109,11 +109,16 @@ "integration.instapaper.password.label": "كلمة مرور Instapaper", "integration.instapaper.title": "Instapaper", "integration.instapaper.username.label": "اسم مستخدم Instapaper", + "integration.obsidian.enable.description": "عرض زر 'حفظ في Obsidian' إلا كان متوفر.", + "integration.obsidian.enable.label": "تشغيل", + "integration.obsidian.title": "Obsidian", + "integration.obsidian.vaultPath.description": "المسار لخزنة Obsidian ديالك.", + "integration.obsidian.vaultPath.label": "مسار خزنة Obsidian", "integration.readwise.enable.description": "عرض زر 'حفظ إلى Readwise' إلا كان متوفر.", "integration.readwise.enable.label": "تشغيل", "integration.readwise.title": "Readwise", "integration.readwise.token.description": "يمكنك الحصول عليه هنا: ", - "integration.readwise.token.label": "رمز الوصول إلى Readwise", + "integration.readwise.token.label": "رمز الوصول لـ Readwise", "integration.sidebar_title": "التكامل", "integration.tip": "نصيحة: البيانات الحساسة ديالك كتحفظ محليا وما كتترفعش للسيرفر.", "integration.title": "التكامل", diff --git a/locales/settings/de.json b/locales/settings/de.json index 5e9d5f5f5c..1fca15b4a1 100644 --- a/locales/settings/de.json +++ b/locales/settings/de.json @@ -121,6 +121,11 @@ "integration.instapaper.password.label": "Instapaper Passwort", "integration.instapaper.title": "Instapaper", "integration.instapaper.username.label": "Instapaper Benutzername", + "integration.obsidian.enable.description": "Zeige den Button „In Obsidian speichern, wenn erfügbar.", + "integration.obsidian.enable.label": "Aktivieren", + "integration.obsidian.title": "Obsidian", + "integration.obsidian.vaultPath.description": "Der Pfad zu Ihrem Obsidian Vault.", + "integration.obsidian.vaultPath.label": "Obsidian Vault-Pfad", "integration.readwise.enable.description": "Zeige den Button „Zu Readwise speichern“, wenn verfügbar.", "integration.readwise.enable.label": "Aktivieren", "integration.readwise.title": "Readwise", diff --git a/locales/settings/en.json b/locales/settings/en.json index c92397535e..afc005d02d 100644 --- a/locales/settings/en.json +++ b/locales/settings/en.json @@ -128,6 +128,11 @@ "integration.instapaper.password.label": "Instapaper Password", "integration.instapaper.title": "Instapaper", "integration.instapaper.username.label": "Instapaper Username", + "integration.obsidian.enable.description": "Display 'Save to Obsidian' button when available.", + "integration.obsidian.enable.label": "Enable", + "integration.obsidian.title": "Obsidian", + "integration.obsidian.vaultPath.description": "The path to your Obsidian vault.", + "integration.obsidian.vaultPath.label": "Obsidian Vault Path", "integration.omnivore.enable.description": "Display 'Save to Omnivore' button when available.", "integration.omnivore.enable.label": "Enable", "integration.omnivore.endpoint.description": "Omnivore Official Endpoint is: ", diff --git a/locales/settings/es.json b/locales/settings/es.json index 01a85409b0..8fe9153438 100644 --- a/locales/settings/es.json +++ b/locales/settings/es.json @@ -109,7 +109,12 @@ "integration.instapaper.password.label": "Contraseña de Instapaper", "integration.instapaper.title": "Instapaper", "integration.instapaper.username.label": "Usuario de Instapaper", - "integration.readwise.enable.description": "Mostrar el botón 'Guardar en Readwise' cuando esté disponible.", + "integration.obsidian.enable.description": "Mostrar el botón 'Guardar en Obsidian' cuando esté disponible.", + "integration.obsidian.enable.label": "Habilitar", + "integration.obsidian.title": "Obsidian", + "integration.obsidian.vaultPath.description": "La ruta a tu bóveda de Obsidian.", + "integration.obsidian.vaultPath.label": "Ruta de la bóveda de Obsidian", + "integration.readwise.enable.description": "Mostrar el bot��n 'Guardar en Readwise' cuando esté disponible.", "integration.readwise.enable.label": "Habilitar", "integration.readwise.title": "Readwise", "integration.readwise.token.description": "Puedes obtenerlo aquí: ", diff --git a/locales/settings/zh-CN.json b/locales/settings/zh-CN.json index 7487ab6b61..f37d41a697 100644 --- a/locales/settings/zh-CN.json +++ b/locales/settings/zh-CN.json @@ -128,6 +128,11 @@ "integration.instapaper.password.label": "密码", "integration.instapaper.title": "Instapaper", "integration.instapaper.username.label": "Instapaper 用户名", + "integration.obsidian.enable.description": "显示保存到Obsidian按钮(如果可用)", + "integration.obsidian.enable.label": "启用", + "integration.obsidian.title": "Obsidian", + "integration.obsidian.vaultPath.description": "你的 Obsidian 仓库的路径", + "integration.obsidian.vaultPath.label": "Obsidian 仓库路径", "integration.omnivore.enable.description": "显示\"保存到 Omnivore\"按钮(如果可用)", "integration.omnivore.enable.label": "启用", "integration.omnivore.endpoint.description": "Omnivore 官方接口", diff --git a/locales/settings/zh-HK.json b/locales/settings/zh-HK.json index 3834b30222..19d6ddeb5e 100644 --- a/locales/settings/zh-HK.json +++ b/locales/settings/zh-HK.json @@ -128,6 +128,11 @@ "integration.instapaper.password.label": "Instapaper 密碼", "integration.instapaper.title": "Instapaper", "integration.instapaper.username.label": "Instapaper 用戶名", + "integration.obsidian.enable.description": "顯示「儲存至 Obsidian」按鈕(如果可用)", + "integration.obsidian.enable.label": "啟用", + "integration.obsidian.title": "Obsidian", + "integration.obsidian.vaultPath.description": "你的 Obsidian 儲存庫的路徑", + "integration.obsidian.vaultPath.label": "Obsidian 儲存庫路徑", "integration.omnivore.enable.description": "顯示\"保存到 Omnivore\"按钮(如果可用)。", "integration.omnivore.enable.label": "啟用", "integration.omnivore.endpoint.description": "Omnivore 官方端口", @@ -230,7 +235,7 @@ "wallet.power.dailyClaim": "你可以每日領取 {{amount}} 免費的 Power,用於在 Follow 上贊助 RSS 條目。", "wallet.power.description": "Power 是一個 ERC-20 代幣,基於 {{blockchainName}} 區塊鏈。", "wallet.sidebar_title": "Power", - "wallet.transactions.amount": "數量", + "wallet.transactions.amount": "數���", "wallet.transactions.date": "日期", "wallet.transactions.from": "來自", "wallet.transactions.noTransactions": "無交易記錄", diff --git a/locales/settings/zh-TW.json b/locales/settings/zh-TW.json index 46685389bc..c52891032e 100644 --- a/locales/settings/zh-TW.json +++ b/locales/settings/zh-TW.json @@ -125,11 +125,16 @@ "integration.instapaper.password.label": "密碼", "integration.instapaper.title": "Instapaper", "integration.instapaper.username.label": "Instapaper 使用者", + "integration.obsidian.enable.description": "顯示「儲存到 Obsidian」按鈕(如果可用)", + "integration.obsidian.enable.label": "啟用", + "integration.obsidian.title": "Obsidian", + "integration.obsidian.vaultPath.description": "您的 Obsidian 儲存庫的路徑", + "integration.obsidian.vaultPath.label": "Obsidian 儲存庫路徑", "integration.readwise.enable.description": "顯示「儲存到 Readwise」按钮(如果可用)。", "integration.readwise.enable.label": "啟用", "integration.readwise.title": "Readwise", "integration.readwise.token.description": "您可以在這裡取得", - "integration.readwise.token.label": "Readwise 存取令牌", + "integration.readwise.token.label": "Readwise 存取權杖", "integration.sidebar_title": "整合功能", "integration.tip": "提示:您的敏感資料儲存於本機,不會上傳到伺服器。", "integration.title": "整合功能", diff --git a/packages/shared/src/interface/settings.ts b/packages/shared/src/interface/settings.ts index 397cc831c0..a6316103f2 100644 --- a/packages/shared/src/interface/settings.ts +++ b/packages/shared/src/interface/settings.ts @@ -56,4 +56,8 @@ export interface IntegrationSettings { enableOmnivore: boolean omnivoreEndpoint: string omnivoreToken: string + + // obsidian + enableObsidian: boolean + obsidianVaultPath: string } From 0a6edb58fe2d2bd8d4c23e32a45ae0bc14bdbb99 Mon Sep 17 00:00:00 2001 From: Xiaoqi_Weng <50273091+zjnbwxq@users.noreply.github.com> Date: Thu, 17 Oct 2024 11:01:00 +0100 Subject: [PATCH 02/10] 1 --- locales/settings/zh-TW.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/locales/settings/zh-TW.json b/locales/settings/zh-TW.json index c52891032e..1ffefef2f5 100644 --- a/locales/settings/zh-TW.json +++ b/locales/settings/zh-TW.json @@ -134,7 +134,7 @@ "integration.readwise.enable.label": "啟用", "integration.readwise.title": "Readwise", "integration.readwise.token.description": "您可以在這裡取得", - "integration.readwise.token.label": "Readwise 存取權杖", + "integration.readwise.token.label": "Readwise 令牌", "integration.sidebar_title": "整合功能", "integration.tip": "提示:您的敏感資料儲存於本機,不會上傳到伺服器。", "integration.title": "整合功能", From 66ec4d432771e920a7b3512c55f5827c1c7b593f Mon Sep 17 00:00:00 2001 From: Xiaoqi_Weng <50273091+zjnbwxq@users.noreply.github.com> Date: Fri, 18 Oct 2024 05:12:03 +0100 Subject: [PATCH 03/10] 1 --- apps/main/src/tipc/app.ts | 41 +++++++++++ .../src/hooks/biz/useEntryActions.tsx | 73 ++++++++++++++----- .../src/modules/settings/tabs/integration.tsx | 19 +++++ 3 files changed, 114 insertions(+), 19 deletions(-) diff --git a/apps/main/src/tipc/app.ts b/apps/main/src/tipc/app.ts index 58761890f5..f7bde23790 100644 --- a/apps/main/src/tipc/app.ts +++ b/apps/main/src/tipc/app.ts @@ -1,3 +1,4 @@ +import fs from "node:fs/promises" import path from "node:path" import { getRendererHandlers } from "@egoist/tipc/main" @@ -225,6 +226,46 @@ export const appRoute = { }), clearAllData: t.procedure.action(clearAllData), + + saveToObsidian: t.procedure + .input<{ + url: string + title: string + content: string + author: string + publishedAt: string + vaultPath: string + }>() + .action(async ({ input }) => { + try { + const { url, title, content, author, publishedAt, vaultPath } = input + + const safeTitle = (title || "untitled").trim() + const fileName = `${safeTitle + .replaceAll(/[^a-z0-9]/gi, "_") + .toLowerCase() + .slice(0, 100)}.md` + const filePath = path.join(vaultPath, fileName) + + const markdown = `--- +url: ${url} +author: ${author} +publishedAt: ${publishedAt} +--- + +# ${title} + +${content} +` + + await fs.writeFile(filePath, markdown, "utf-8") + return { success: true } + } catch (error) { + console.error("Failed to save to Obsidian:", error) + const errorMessage = error instanceof Error ? error.message : String(error) + return { success: false, error: errorMessage } + } + }), } interface Sender extends Electron.WebContents { diff --git a/apps/renderer/src/hooks/biz/useEntryActions.tsx b/apps/renderer/src/hooks/biz/useEntryActions.tsx index 56638697aa..9b20c65dd0 100644 --- a/apps/renderer/src/hooks/biz/useEntryActions.tsx +++ b/apps/renderer/src/hooks/biz/useEntryActions.tsx @@ -175,6 +175,45 @@ export const useEntryActions = ({ const enableObsidian = useIntegrationSettingKey("enableObsidian") const obsidianVaultPath = useIntegrationSettingKey("obsidianVaultPath") + // 检查 Obsidian 功能是否启用 + const obsidianEnabledQuery = useQuery({ + queryKey: ["obsidian-enabled"], + queryFn: () => { + return !!enableObsidian && !!obsidianVaultPath + }, + refetchOnWindowFocus: false, + refetchOnMount: false, + staleTime: Infinity, + }) + + // Obsidian 保存操作 + const saveToObsidian = useMutation({ + mutationKey: ["save-to-obsidian"], + mutationFn: async (data: { + url: string + title: string + content: string + author: string + publishedAt: string + vaultPath: string + }) => { + if (!obsidianEnabledQuery.data) { + throw new Error("Obsidian feature is not enabled") + } + return await tipcClient?.saveToObsidian(data) + }, + onSuccess: () => { + toast.success(t("entry_actions.saved_to_obsidian"), { + duration: 3000, + }) + }, + onError: () => { + toast.error(t("entry_actions.failed_to_save_to_obsidian"), { + duration: 3000, + }) + }, + }) + const checkEagle = useQuery({ queryKey: ["check-eagle"], enabled: ELECTRON && enableEagle && !!entry?.entries.url && view !== undefined, @@ -377,26 +416,18 @@ export const useEntryActions = ({ name: t("entry_actions.save_to_obsidian"), icon: , key: "saveToObsidian", - hide: !enableObsidian || !obsidianVaultPath || !populatedEntry.entries.url, - onClick: async () => { - try { - await tipcClient?.saveToObsidian({ - url: populatedEntry.entries.url, - title: populatedEntry.entries.title || "", - content: populatedEntry.entries.content || "", - author: populatedEntry.entries.author || "", - publishedAt: populatedEntry.entries.publishedAt || "", - }) + hide: !obsidianEnabledQuery.data || !populatedEntry?.entries?.url, + onClick: () => { + if (!populatedEntry?.entries?.url || !obsidianVaultPath) return - toast.success(t("entry_actions.saved_to_obsidian"), { - duration: 3000, - }) - } catch (error) { - console.error("Failed to save to Obsidian:", error) - toast.error(t("entry_actions.failed_to_save_to_obsidian"), { - duration: 3000, - }) - } + saveToObsidian.mutate({ + url: populatedEntry.entries.url, + title: populatedEntry.entries.title || "", + content: populatedEntry.entries.content || "", + author: populatedEntry.entries.author || "", + publishedAt: populatedEntry.entries.publishedAt || "", + vaultPath: obsidianVaultPath, + }) }, }, { @@ -578,9 +609,13 @@ export const useEntryActions = ({ isInbox, omnivoreEndpoint, omnivoreToken, + obsidianEnabledQuery.data, + saveToObsidian, ]) return { items, + saveToObsidian, + obsidianEnabled: obsidianEnabledQuery.data, } } diff --git a/apps/renderer/src/modules/settings/tabs/integration.tsx b/apps/renderer/src/modules/settings/tabs/integration.tsx index 0d54800235..90f61b9da3 100644 --- a/apps/renderer/src/modules/settings/tabs/integration.tsx +++ b/apps/renderer/src/modules/settings/tabs/integration.tsx @@ -7,6 +7,7 @@ import { Divider } from "~/components/ui/divider" import { SimpleIconsEagle, SimpleIconsInstapaper, + SimpleIconsObsidian, SimpleIconsOmnivore, SimpleIconsReadwise, } from "~/components/ui/platform-icon/icons" @@ -151,6 +152,24 @@ export const SettingIntegration = () => { ), }), + { + type: "title", + value: ( + + + {t("integration.obsidian.title")} + + ), + }, + defineSettingItem("enableObsidian", { + label: t("integration.obsidian.enable.label"), + description: t("integration.obsidian.enable.description"), + }), + defineSettingItem("obsidianVaultPath", { + label: t("integration.obsidian.vaultPath.label"), + vertical: true, + description: t("integration.obsidian.vaultPath.description"), + }), BottomTip, ]} From cb7eb6e4f453e8bc20c0de58c5e5b563c67b2cb5 Mon Sep 17 00:00:00 2001 From: Xiaoqi_Weng <50273091+zjnbwxq@users.noreply.github.com> Date: Fri, 18 Oct 2024 05:53:40 +0100 Subject: [PATCH 04/10] clean the chinese commits --- apps/renderer/src/hooks/biz/useEntryActions.tsx | 2 -- 1 file changed, 2 deletions(-) diff --git a/apps/renderer/src/hooks/biz/useEntryActions.tsx b/apps/renderer/src/hooks/biz/useEntryActions.tsx index 9b20c65dd0..5f8379e8ba 100644 --- a/apps/renderer/src/hooks/biz/useEntryActions.tsx +++ b/apps/renderer/src/hooks/biz/useEntryActions.tsx @@ -175,7 +175,6 @@ export const useEntryActions = ({ const enableObsidian = useIntegrationSettingKey("enableObsidian") const obsidianVaultPath = useIntegrationSettingKey("obsidianVaultPath") - // 检查 Obsidian 功能是否启用 const obsidianEnabledQuery = useQuery({ queryKey: ["obsidian-enabled"], queryFn: () => { @@ -186,7 +185,6 @@ export const useEntryActions = ({ staleTime: Infinity, }) - // Obsidian 保存操作 const saveToObsidian = useMutation({ mutationKey: ["save-to-obsidian"], mutationFn: async (data: { From dcee3cb334104906e05c46ffb52ecf7d75c40665 Mon Sep 17 00:00:00 2001 From: Xiaoqi_Weng <50273091+zjnbwxq@users.noreply.github.com> Date: Fri, 18 Oct 2024 07:22:34 +0100 Subject: [PATCH 05/10] edited --- locales/settings/es.json | 2 +- locales/settings/zh-HK.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/locales/settings/es.json b/locales/settings/es.json index 8fe9153438..bee8eb5b13 100644 --- a/locales/settings/es.json +++ b/locales/settings/es.json @@ -114,7 +114,7 @@ "integration.obsidian.title": "Obsidian", "integration.obsidian.vaultPath.description": "La ruta a tu bóveda de Obsidian.", "integration.obsidian.vaultPath.label": "Ruta de la bóveda de Obsidian", - "integration.readwise.enable.description": "Mostrar el bot��n 'Guardar en Readwise' cuando esté disponible.", + "integration.readwise.enable.description": "Mostrar el botón 'Guardar en Readwise' cuando esté disponible.", "integration.readwise.enable.label": "Habilitar", "integration.readwise.title": "Readwise", "integration.readwise.token.description": "Puedes obtenerlo aquí: ", diff --git a/locales/settings/zh-HK.json b/locales/settings/zh-HK.json index 19d6ddeb5e..83b7de0c0f 100644 --- a/locales/settings/zh-HK.json +++ b/locales/settings/zh-HK.json @@ -235,7 +235,7 @@ "wallet.power.dailyClaim": "你可以每日領取 {{amount}} 免費的 Power,用於在 Follow 上贊助 RSS 條目。", "wallet.power.description": "Power 是一個 ERC-20 代幣,基於 {{blockchainName}} 區塊鏈。", "wallet.sidebar_title": "Power", - "wallet.transactions.amount": "數���", + "wallet.transactions.amount": "數量", "wallet.transactions.date": "日期", "wallet.transactions.from": "來自", "wallet.transactions.noTransactions": "無交易記錄", From bb1350e441f733b25016d6db69f095d7a2c85eca Mon Sep 17 00:00:00 2001 From: Xiaoqi_Weng <50273091+zjnbwxq@users.noreply.github.com> Date: Fri, 18 Oct 2024 10:14:01 +0100 Subject: [PATCH 06/10] Update useEntryActions.tsx --- apps/renderer/src/hooks/biz/useEntryActions.tsx | 9 --------- 1 file changed, 9 deletions(-) diff --git a/apps/renderer/src/hooks/biz/useEntryActions.tsx b/apps/renderer/src/hooks/biz/useEntryActions.tsx index 5f8379e8ba..979ee1f0d9 100644 --- a/apps/renderer/src/hooks/biz/useEntryActions.tsx +++ b/apps/renderer/src/hooks/biz/useEntryActions.tsx @@ -175,15 +175,6 @@ export const useEntryActions = ({ const enableObsidian = useIntegrationSettingKey("enableObsidian") const obsidianVaultPath = useIntegrationSettingKey("obsidianVaultPath") - const obsidianEnabledQuery = useQuery({ - queryKey: ["obsidian-enabled"], - queryFn: () => { - return !!enableObsidian && !!obsidianVaultPath - }, - refetchOnWindowFocus: false, - refetchOnMount: false, - staleTime: Infinity, - }) const saveToObsidian = useMutation({ mutationKey: ["save-to-obsidian"], From e0453f9a50e91968f4934578ff055937bef4fbc6 Mon Sep 17 00:00:00 2001 From: zjnbwxq Date: Fri, 18 Oct 2024 09:15:18 +0000 Subject: [PATCH 07/10] chore: auto-fix linting and formatting issues --- apps/renderer/src/hooks/biz/useEntryActions.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/apps/renderer/src/hooks/biz/useEntryActions.tsx b/apps/renderer/src/hooks/biz/useEntryActions.tsx index 979ee1f0d9..9c0f03c759 100644 --- a/apps/renderer/src/hooks/biz/useEntryActions.tsx +++ b/apps/renderer/src/hooks/biz/useEntryActions.tsx @@ -175,7 +175,6 @@ export const useEntryActions = ({ const enableObsidian = useIntegrationSettingKey("enableObsidian") const obsidianVaultPath = useIntegrationSettingKey("obsidianVaultPath") - const saveToObsidian = useMutation({ mutationKey: ["save-to-obsidian"], mutationFn: async (data: { From b1d7d33a48236557c07fca33c94967c64bf3cd22 Mon Sep 17 00:00:00 2001 From: Stephen Zhou <38493346+hyoban@users.noreply.github.com> Date: Mon, 21 Oct 2024 10:25:40 +0800 Subject: [PATCH 08/10] update --- .../src/hooks/biz/useEntryActions.tsx | 22 +++++++++---------- 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/apps/renderer/src/hooks/biz/useEntryActions.tsx b/apps/renderer/src/hooks/biz/useEntryActions.tsx index 9c0f03c759..4c0696dedd 100644 --- a/apps/renderer/src/hooks/biz/useEntryActions.tsx +++ b/apps/renderer/src/hooks/biz/useEntryActions.tsx @@ -174,6 +174,7 @@ export const useEntryActions = ({ const omnivoreEndpoint = useIntegrationSettingKey("omnivoreEndpoint") const enableObsidian = useIntegrationSettingKey("enableObsidian") const obsidianVaultPath = useIntegrationSettingKey("obsidianVaultPath") + const isObsidianEnabled = enableObsidian && !!obsidianVaultPath const saveToObsidian = useMutation({ mutationKey: ["save-to-obsidian"], @@ -185,7 +186,7 @@ export const useEntryActions = ({ publishedAt: string vaultPath: string }) => { - if (!obsidianEnabledQuery.data) { + if (!isObsidianEnabled) { throw new Error("Obsidian feature is not enabled") } return await tipcClient?.saveToObsidian(data) @@ -404,7 +405,7 @@ export const useEntryActions = ({ name: t("entry_actions.save_to_obsidian"), icon: , key: "saveToObsidian", - hide: !obsidianEnabledQuery.data || !populatedEntry?.entries?.url, + hide: !isObsidianEnabled || !populatedEntry?.entries?.url, onClick: () => { if (!populatedEntry?.entries?.url || !obsidianVaultPath) return @@ -582,28 +583,25 @@ export const useEntryActions = ({ enableInstapaper, instapaperPassword, instapaperUsername, - enableObsidian, - obsidianVaultPath, + enableOmnivore, + omnivoreToken, + omnivoreEndpoint, + isObsidianEnabled, + isInbox, feed?.ownerUserId, type, showSourceContent, + obsidianVaultPath, + saveToObsidian, openTipModal, collect, uncollect, showSourceContentModal, read, unread, - enableOmnivore, - isInbox, - omnivoreEndpoint, - omnivoreToken, - obsidianEnabledQuery.data, - saveToObsidian, ]) return { items, - saveToObsidian, - obsidianEnabled: obsidianEnabledQuery.data, } } From 7fe25f120879960899c17dc97abee7bd0a96abf5 Mon Sep 17 00:00:00 2001 From: Stephen Zhou <38493346+hyoban@users.noreply.github.com> Date: Mon, 21 Oct 2024 10:45:19 +0800 Subject: [PATCH 09/10] update --- apps/main/src/tipc/app.ts | 15 ++++++------ .../src/hooks/biz/useEntryActions.tsx | 24 +++++++++---------- 2 files changed, 19 insertions(+), 20 deletions(-) diff --git a/apps/main/src/tipc/app.ts b/apps/main/src/tipc/app.ts index f7bde23790..d932e86ff9 100644 --- a/apps/main/src/tipc/app.ts +++ b/apps/main/src/tipc/app.ts @@ -1,4 +1,5 @@ -import fs from "node:fs/promises" +import fs from "node:fs" +import fsp from "node:fs/promises" import path from "node:path" import { getRendererHandlers } from "@egoist/tipc/main" @@ -240,12 +241,12 @@ export const appRoute = { try { const { url, title, content, author, publishedAt, vaultPath } = input - const safeTitle = (title || "untitled").trim() - const fileName = `${safeTitle - .replaceAll(/[^a-z0-9]/gi, "_") - .toLowerCase() - .slice(0, 100)}.md` + const fileName = `${(title || publishedAt).trim().slice(0, 20)}.md` const filePath = path.join(vaultPath, fileName) + const exists = fs.existsSync(filePath) + if (exists) { + return { success: false, error: "File already exists" } + } const markdown = `--- url: ${url} @@ -258,7 +259,7 @@ publishedAt: ${publishedAt} ${content} ` - await fs.writeFile(filePath, markdown, "utf-8") + await fsp.writeFile(filePath, markdown, "utf-8") return { success: true } } catch (error) { console.error("Failed to save to Obsidian:", error) diff --git a/apps/renderer/src/hooks/biz/useEntryActions.tsx b/apps/renderer/src/hooks/biz/useEntryActions.tsx index 4c0696dedd..1d8d19794a 100644 --- a/apps/renderer/src/hooks/biz/useEntryActions.tsx +++ b/apps/renderer/src/hooks/biz/useEntryActions.tsx @@ -186,20 +186,18 @@ export const useEntryActions = ({ publishedAt: string vaultPath: string }) => { - if (!isObsidianEnabled) { - throw new Error("Obsidian feature is not enabled") - } return await tipcClient?.saveToObsidian(data) }, - onSuccess: () => { - toast.success(t("entry_actions.saved_to_obsidian"), { - duration: 3000, - }) - }, - onError: () => { - toast.error(t("entry_actions.failed_to_save_to_obsidian"), { - duration: 3000, - }) + onSuccess: (data) => { + if (data?.success) { + toast.success(t("entry_actions.saved_to_obsidian"), { + duration: 3000, + }) + } else { + toast.error(`${t("entry_actions.failed_to_save_to_obsidian")}: ${data?.error}`, { + duration: 3000, + }) + } }, }) @@ -407,7 +405,7 @@ export const useEntryActions = ({ key: "saveToObsidian", hide: !isObsidianEnabled || !populatedEntry?.entries?.url, onClick: () => { - if (!populatedEntry?.entries?.url || !obsidianVaultPath) return + if (!isObsidianEnabled || !populatedEntry?.entries?.url) return saveToObsidian.mutate({ url: populatedEntry.entries.url, From 6d0684784b7daa2ad9600602f91dc4665f01e2e3 Mon Sep 17 00:00:00 2001 From: Stephen Zhou <38493346+hyoban@users.noreply.github.com> Date: Mon, 21 Oct 2024 10:46:59 +0800 Subject: [PATCH 10/10] update --- locales/app/ar-KW.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/locales/app/ar-KW.json b/locales/app/ar-KW.json index 1027c61fd0..4913cd44db 100644 --- a/locales/app/ar-KW.json +++ b/locales/app/ar-KW.json @@ -134,7 +134,7 @@ "search.options.all": "الكل", "search.options.entries": "إدخالات", "search.options.feeds": "تغذيات", - "search.options.search_type": "نوع ال��حث", + "search.options.search_type": "نوع البحث", "search.placeholder": "بحث...", "search.result_count_local_mode": "(وضع محلي)", "search.tooltip.local_search": "يغطي هذا البحث البيانات المتاحة محليًا. حاول إعادة الجلب لتضمين أحدث البيانات.",