diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index aca4b48c..e335248b 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -18,6 +18,7 @@ use std::path::PathBuf; use std::str::FromStr; use std::time::Duration; use std::{fs, panic}; +use tauri::path::BaseDirectory; use tauri::{AppHandle, Emitter, RunEvent, State, WebviewWindow, is_dev}; use tauri::{Listener, Runtime}; use tauri::{Manager, WindowEvent}; @@ -82,6 +83,7 @@ struct AppMetaData { name: String, app_data_dir: String, app_log_dir: String, + vendored_plugin_dir: String, feature_updater: bool, feature_license: bool, } @@ -90,12 +92,15 @@ struct AppMetaData { async fn cmd_metadata(app_handle: AppHandle) -> YaakResult { let app_data_dir = app_handle.path().app_data_dir()?; let app_log_dir = app_handle.path().app_log_dir()?; + let vendored_plugin_dir = + app_handle.path().resolve("vendored/plugins", BaseDirectory::Resource)?; Ok(AppMetaData { is_dev: is_dev(), version: app_handle.package_info().version.to_string(), name: app_handle.package_info().name.to_string(), app_data_dir: app_data_dir.to_string_lossy().to_string(), app_log_dir: app_log_dir.to_string_lossy().to_string(), + vendored_plugin_dir: vendored_plugin_dir.to_string_lossy().to_string(), feature_license: cfg!(feature = "license"), feature_updater: cfg!(feature = "updater"), }) diff --git a/src-web/components/Settings/SettingsPlugins.tsx b/src-web/components/Settings/SettingsPlugins.tsx index 2c458f03..532e5bbd 100644 --- a/src-web/components/Settings/SettingsPlugins.tsx +++ b/src-web/components/Settings/SettingsPlugins.tsx @@ -15,6 +15,7 @@ import { useDebouncedValue } from '../../hooks/useDebouncedValue'; import { useInstallPlugin } from '../../hooks/useInstallPlugin'; import { usePluginInfo } from '../../hooks/usePluginInfo'; import { usePluginsKey, useRefreshPlugins } from '../../hooks/usePlugins'; +import { appInfo } from '../../lib/appInfo'; import { showConfirmDelete } from '../../lib/confirm'; import { minPromiseMillis } from '../../lib/minPromiseMillis'; import { Button } from '../core/Button'; @@ -32,11 +33,21 @@ import { TabContent, Tabs } from '../core/Tabs/Tabs'; import { EmptyStateText } from '../EmptyStateText'; import { SelectFile } from '../SelectFile'; +function isPluginBundled(plugin: Plugin, vendoredPluginDir: string): boolean { + const normalizedDir = plugin.directory.replace(/\\/g, '/'); + const normalizedVendoredDir = vendoredPluginDir.replace(/\\/g, '/'); + return ( + normalizedDir.includes(normalizedVendoredDir) || + normalizedDir.includes('vendored/plugins') || + normalizedDir.includes('/plugins/') + ); +} + export function SettingsPlugins() { const [directory, setDirectory] = useState(null); const plugins = useAtomValue(pluginsAtom); - const bundledPlugins = plugins.filter((p) => p.url == null); - const installedPlugins = plugins.filter((p) => p.url != null); + const bundledPlugins = plugins.filter((p) => isPluginBundled(p, appInfo.vendoredPluginDir)); + const installedPlugins = plugins.filter((p) => !isPluginBundled(p, appInfo.vendoredPluginDir)); const createPlugin = useInstallPlugin(); const refreshPlugins = useRefreshPlugins(); const [tab, setTab] = useState(); @@ -66,7 +77,7 @@ export function SettingsPlugins() {
- +
- +
@@ -328,9 +339,7 @@ function PluginSearch() { ); } -function InstalledPlugins() { - const plugins = useAtomValue(pluginsAtom).filter((p) => p.url != null); - +function InstalledPlugins({ plugins }: { plugins: Plugin[] }) { return plugins.length === 0 ? (
@@ -359,9 +368,7 @@ function InstalledPlugins() { ); } -function BundledPlugins() { - const plugins = useAtomValue(pluginsAtom).filter((p) => p.url == null); - +function BundledPlugins({ plugins }: { plugins: Plugin[] }) { return plugins.length === 0 ? (
No bundled plugins found. diff --git a/src-web/lib/appInfo.ts b/src-web/lib/appInfo.ts index a44276de..90000b13 100644 --- a/src-web/lib/appInfo.ts +++ b/src-web/lib/appInfo.ts @@ -7,6 +7,7 @@ export interface AppInfo { name: string; appDataDir: string; appLogDir: string; + vendoredPluginDir: string; identifier: string; featureLicense: boolean; featureUpdater: boolean;