import { PluginSettings, SyncGroup } from "@/types/pluginSettings"; import React from "react"; import { SettingItem } from "./SettingItem"; import settingsService from "@/core/settingsService"; import statusStoreManager from "@/core/statusStoreManager"; export type Props = { settings: PluginSettings; onChange: (key: keyof PluginSettings, value: unknown) => void; }; export const SynchronizationSettings: React.FC = ({ settings, onChange, }) => { const handleExport = async () => { await settingsService.syncToExternalFile(true); alert("Plugin settings exported successfully."); }; const handleImport = async () => { await settingsService.loadFromExternalFile(true); alert("Plugin settings imported successfully."); }; const handleDataExport = async () => { try { await statusStoreManager.getNonMarkdownStore().exportToVault(); alert("Non-Markdown status data exported to vault."); } catch (e) { alert(`Export failed: ${e.message}`); } }; const handleDataImport = async () => { try { await statusStoreManager.getNonMarkdownStore().importFromVault(); alert("Non-Markdown status data imported from vault."); } catch (e) { alert(`Import failed: ${e.message}`); } }; const toggleGroup = (group: SyncGroup) => { const currentGroups = [...(settings.syncGroups || [])]; const index = currentGroups.indexOf(group); if (index === -1) { currentGroups.push(group); } else { currentGroups.splice(index, 1); } onChange("syncGroups", currentGroups); }; const syncGroups: { id: SyncGroup; label: string; description: string }[] = [ { id: "templates", label: "Templates", description: "Status templates and their enabled status.", }, { id: "customStatuses", label: "Custom Statuses", description: "Standalone custom statuses.", }, { id: "statusColors", label: "Status Colors", description: "Custom colors for all statuses.", }, { id: "uiAppearance", label: "UI & Appearance", description: "Icons, frames, status bar, and toolbar styles.", }, { id: "workflow", label: "Workflow Rules", description: "Multi-status, strict mode, and overview popups.", }, { id: "storage", label: "Storage & Tagging", description: "Frontmatter keys, mappings, and tag prefix.", }, { id: "features", label: "Features & Limits", description: "Quick commands, experiments, and vault limits.", }, ]; return (

Multi-device Synchronization

Keep your plugin settings and data in sync across devices using files in your vault.

Settings Synchronization

Save plugin configuration to a JSON file.

onChange( "enableExternalStatusSync", e.target.checked, ) } /> onChange("externalStatusSyncPath", e.target.value) } placeholder="_note-status-sync.json" />
Selective Synchronization

Choose which groups of settings should be included in the synchronization.

{syncGroups.map((group) => (
toggleGroup(group.id)} >
{}} // Handled by parent div onClick style={{ marginRight: "8px" }} /> {group.label}
{group.description}
))}

Non-Markdown Data Synchronization

Statuses for non-Markdown files (PDFs, images, etc.) are stored in a special data file. Enable this to keep them in sync across devices.

onChange("enableNonMarkdownSync", e.target.checked) } /> onChange("nonMarkdownSyncPath", e.target.value) } placeholder="_note-status-data.json" />
); };