import { FunctionComponent } from "preact"; import { SNComponent } from "@standardnotes/snjs"; import { PreferencesSegment, Subtitle, Title } from "@/preferences/components"; import { Switch } from "@/components/Switch"; import { WebApplication } from "@/ui_models/application"; import { useEffect, useRef, useState } from "preact/hooks"; import { Button } from "@/components/Button"; const ExtensionVersions: FunctionComponent<{ installedVersion: string, latestVersion: string | undefined, }> = ({ installedVersion, latestVersion }) => { return ( <> Installed version {installedVersion} {latestVersion && <>(latest is {latestVersion})} ); }; const AutoUpdateLocal: FunctionComponent<{ autoupdateDisabled: boolean, toggleAutoupdate: () => void }> = ({ autoupdateDisabled, toggleAutoupdate }) => (
Autoupdate local installation
); const UseHosted: FunctionComponent<{ offlineOnly: boolean, toggleOfllineOnly: () => void }> = ({ offlineOnly, toggleOfllineOnly }) => (
Use hosted when local is unavailable
); const RenameExtension: FunctionComponent<{ extensionName: string, changeName: (newName: string) => void }> = ({ extensionName, changeName }) => { const [isRenaming, setIsRenaming] = useState(false); const [newExtensionName, setNewExtensionName] = useState(extensionName); const inputRef = useRef(null); useEffect(() => { if (isRenaming) { inputRef.current.focus(); } }, [inputRef, isRenaming]); const startRenaming = () => { setNewExtensionName(extensionName); setIsRenaming(true); }; const cancelRename = () => { setNewExtensionName(extensionName); setIsRenaming(false); }; const confirmRename = () => { if (newExtensionName == undefined || newExtensionName === '') { return; } changeName(newExtensionName); setIsRenaming(false); }; return (
setNewExtensionName((input as HTMLInputElement)?.value)} />
{isRenaming ? <> Confirm
Cancel : Rename }
); }; export const ExtensionItem: FunctionComponent<{ application: WebApplication, extension: SNComponent, first: boolean, latestVersion: string | undefined, uninstall: (extension: SNComponent) => void, toggleActivate: (extension: SNComponent) => void, }> = ({ application, extension, first, uninstall, toggleActivate, latestVersion }) => { const [autoupdateDisabled, setAutoupdateDisabled] = useState(extension.autoupdateDisabled ?? false); const [offlineOnly, setOfflineOnly] = useState(extension.offlineOnly ?? false); const [extensionName, setExtensionName] = useState(extension.name); const toggleAutoupdate = () => { const newAutoupdateValue = !autoupdateDisabled; setAutoupdateDisabled(newAutoupdateValue); application .changeAndSaveItem(extension.uuid, (m: any) => { if (m.content == undefined) m.content = {}; m.content.autoupdateDisabled = newAutoupdateValue; }) .then((item) => { const component = (item as SNComponent); setAutoupdateDisabled(component.autoupdateDisabled); }) .catch(e => { console.error(e); }); }; const toggleOffllineOnly = () => { const newOfflineOnly = !offlineOnly; setOfflineOnly(newOfflineOnly); application .changeAndSaveItem(extension.uuid, (m: any) => { if (m.content == undefined) m.content = {}; m.content.offlineOnly = newOfflineOnly; }) .then((item) => { const component = (item as SNComponent); setOfflineOnly(component.offlineOnly); }) .catch(e => { console.error(e); }); }; const changeExtensionName = (newName: string) => { setExtensionName(newName); application .changeAndSaveItem(extension.uuid, (m: any) => { if (m.content == undefined) m.content = {}; m.content.name = newName; }) .then((item) => { const component = (item as SNComponent); setExtensionName(component.name); }); }; const localInstallable = extension.package_info.download_url; const isExternal = !extension.package_info.identifier.startsWith('org.standardnotes.'); const installedVersion = extension.package_info.version; const isEditorOrTags = ['editor-stack', 'tags-list'].includes(extension.area); return ( {first && <> Extensions
}
{localInstallable && } {localInstallable && } {isEditorOrTags || isExternal && <>
{isEditorOrTags && ( <> {extension.active ?
} ); };