From 7c2b8fe5453c73f7fd6e1ab322c4996438b2f446 Mon Sep 17 00:00:00 2001 From: Mo Date: Thu, 30 Jun 2022 13:49:03 -0500 Subject: [PATCH] chore: improve preferences folder hierarchies (#1186) --- packages/web/package.json | 1 + .../Panes/Extensions/ExtensionItemProps.tsx | 11 ---- .../Advanced/AdvancedSection.tsx} | 16 ++--- .../Advanced}/OfflineSubscription.tsx | 0 .../Packages/ConfirmCustomPackage.tsx} | 10 +-- .../Advanced/Packages/PackageEntry.tsx} | 22 +++++-- .../Packages/PackageEntrySubInfo.tsx} | 4 +- .../Packages/Provider/PackageProvider.ts} | 12 ++-- .../Advanced/Packages/Section.tsx} | 62 ++++++++++++------- .../Packages/Types/AnyPackageType.ts} | 2 +- .../Preferences/Panes/General/General.tsx | 6 +- .../Preferences/Panes/Security/Security.tsx | 4 +- .../TwoFactorAuth/AuthAppInfoPopup.tsx | 0 .../{ => Security}/TwoFactorAuth/Bullet.tsx | 0 .../TwoFactorAuth/CopyButton.tsx | 0 .../{ => Security}/TwoFactorAuth/MfaProps.ts | 0 .../TwoFactorAuth/SaveSecretKey.tsx | 0 .../TwoFactorAuth/ScanQRCode.tsx | 0 .../TwoFactorAuth/TwoFactorActivation.ts | 0 .../TwoFactorAuth/TwoFactorActivationView.tsx | 0 .../TwoFactorAuth/TwoFactorAuth.ts | 0 .../TwoFactorAuthView/TwoFactorAuthView.tsx | 0 .../TwoFactorDescription.tsx | 0 .../TwoFactorAuthView/TwoFactorSwitch.tsx | 0 .../TwoFactorAuthView/TwoFactorTitle.tsx | 0 .../TwoFactorAuth/TwoFactorAuthWrapper.tsx | 0 .../TwoFactorAuth/TwoFactorSuccess.tsx | 0 .../TwoFactorAuth/Verification.tsx | 0 .../TwoFactorAuth/download-secret-key.tsx | 0 .../Components/Preferences/PreferencesMenu.ts | 8 +-- .../Preferences/PreferencesProps.tsx | 2 +- 31 files changed, 88 insertions(+), 72 deletions(-) delete mode 100644 packages/web/src/javascripts/Components/Preferences/Panes/Extensions/ExtensionItemProps.tsx rename packages/web/src/javascripts/Components/Preferences/Panes/{Account/Advanced.tsx => General/Advanced/AdvancedSection.tsx} (67%) rename packages/web/src/javascripts/Components/Preferences/Panes/{Account => General/Advanced}/OfflineSubscription.tsx (100%) rename packages/web/src/javascripts/Components/Preferences/Panes/{Extensions/ConfirmCustomExtension.tsx => General/Advanced/Packages/ConfirmCustomPackage.tsx} (86%) rename packages/web/src/javascripts/Components/Preferences/Panes/{Extensions/ExtensionItem.tsx => General/Advanced/Packages/PackageEntry.tsx} (74%) rename packages/web/src/javascripts/Components/Preferences/Panes/{Extensions/ExtensionInfoCell.tsx => General/Advanced/Packages/PackageEntrySubInfo.tsx} (92%) rename packages/web/src/javascripts/Components/Preferences/Panes/{Extensions/ExtensionsLatestVersions.ts => General/Advanced/Packages/Provider/PackageProvider.ts} (77%) rename packages/web/src/javascripts/Components/Preferences/Panes/{Extensions/Extensions.tsx => General/Advanced/Packages/Section.tsx} (68%) rename packages/web/src/javascripts/Components/Preferences/Panes/{Extensions/AnyExtension.ts => General/Advanced/Packages/Types/AnyPackageType.ts} (52%) rename packages/web/src/javascripts/Components/Preferences/Panes/{ => Security}/TwoFactorAuth/AuthAppInfoPopup.tsx (100%) rename packages/web/src/javascripts/Components/Preferences/Panes/{ => Security}/TwoFactorAuth/Bullet.tsx (100%) rename packages/web/src/javascripts/Components/Preferences/Panes/{ => Security}/TwoFactorAuth/CopyButton.tsx (100%) rename packages/web/src/javascripts/Components/Preferences/Panes/{ => Security}/TwoFactorAuth/MfaProps.ts (100%) rename packages/web/src/javascripts/Components/Preferences/Panes/{ => Security}/TwoFactorAuth/SaveSecretKey.tsx (100%) rename packages/web/src/javascripts/Components/Preferences/Panes/{ => Security}/TwoFactorAuth/ScanQRCode.tsx (100%) rename packages/web/src/javascripts/Components/Preferences/Panes/{ => Security}/TwoFactorAuth/TwoFactorActivation.ts (100%) rename packages/web/src/javascripts/Components/Preferences/Panes/{ => Security}/TwoFactorAuth/TwoFactorActivationView.tsx (100%) rename packages/web/src/javascripts/Components/Preferences/Panes/{ => Security}/TwoFactorAuth/TwoFactorAuth.ts (100%) rename packages/web/src/javascripts/Components/Preferences/Panes/{ => Security}/TwoFactorAuth/TwoFactorAuthView/TwoFactorAuthView.tsx (100%) rename packages/web/src/javascripts/Components/Preferences/Panes/{ => Security}/TwoFactorAuth/TwoFactorAuthView/TwoFactorDescription.tsx (100%) rename packages/web/src/javascripts/Components/Preferences/Panes/{ => Security}/TwoFactorAuth/TwoFactorAuthView/TwoFactorSwitch.tsx (100%) rename packages/web/src/javascripts/Components/Preferences/Panes/{ => Security}/TwoFactorAuth/TwoFactorAuthView/TwoFactorTitle.tsx (100%) rename packages/web/src/javascripts/Components/Preferences/Panes/{ => Security}/TwoFactorAuth/TwoFactorAuthWrapper.tsx (100%) rename packages/web/src/javascripts/Components/Preferences/Panes/{ => Security}/TwoFactorAuth/TwoFactorSuccess.tsx (100%) rename packages/web/src/javascripts/Components/Preferences/Panes/{ => Security}/TwoFactorAuth/Verification.tsx (100%) rename packages/web/src/javascripts/Components/Preferences/Panes/{ => Security}/TwoFactorAuth/download-secret-key.tsx (100%) diff --git a/packages/web/package.json b/packages/web/package.json index cf8a8368a..72976048a 100644 --- a/packages/web/package.json +++ b/packages/web/package.json @@ -15,6 +15,7 @@ "prebuild": "yarn clean", "build": "webpack --config web.webpack.prod.js && yarn tsc", "lint": "eslint src/javascripts", + "format": "prettier --write src/javascripts", "tsc": "tsc --project tsconfig.json", "test": "jest --config jest.config.js --coverage", "upgrade:snjs": "ncu -u '@standardnotes/*'" diff --git a/packages/web/src/javascripts/Components/Preferences/Panes/Extensions/ExtensionItemProps.tsx b/packages/web/src/javascripts/Components/Preferences/Panes/Extensions/ExtensionItemProps.tsx deleted file mode 100644 index c8419a7f6..000000000 --- a/packages/web/src/javascripts/Components/Preferences/Panes/Extensions/ExtensionItemProps.tsx +++ /dev/null @@ -1,11 +0,0 @@ -import { WebApplication } from '@/Application/Application' -import { AnyExtension } from './AnyExtension' - -export interface ExtensionItemProps { - application: WebApplication - extension: AnyExtension - first: boolean - latestVersion: string | undefined - uninstall: (extension: AnyExtension) => void - toggleActivate?: (extension: AnyExtension) => void -} diff --git a/packages/web/src/javascripts/Components/Preferences/Panes/Account/Advanced.tsx b/packages/web/src/javascripts/Components/Preferences/Panes/General/Advanced/AdvancedSection.tsx similarity index 67% rename from packages/web/src/javascripts/Components/Preferences/Panes/Account/Advanced.tsx rename to packages/web/src/javascripts/Components/Preferences/Panes/General/Advanced/AdvancedSection.tsx index 343e49c6e..ed9ff7836 100644 --- a/packages/web/src/javascripts/Components/Preferences/Panes/Account/Advanced.tsx +++ b/packages/web/src/javascripts/Components/Preferences/Panes/General/Advanced/AdvancedSection.tsx @@ -1,29 +1,29 @@ import { FunctionComponent } from 'react' -import OfflineSubscription from '@/Components/Preferences/Panes/Account/OfflineSubscription' +import OfflineSubscription from '@/Components/Preferences/Panes/General/Advanced/OfflineSubscription' import { WebApplication } from '@/Application/Application' import { observer } from 'mobx-react-lite' import { ViewControllerManager } from '@/Services/ViewControllerManager' -import Extensions from '@/Components/Preferences/Panes/Extensions/Extensions' -import { ExtensionsLatestVersions } from '@/Components/Preferences/Panes/Extensions/ExtensionsLatestVersions' +import PackagesPreferencesSection from '@/Components/Preferences/Panes/General/Advanced/Packages/Section' +import { PackageProvider } from '@/Components/Preferences/Panes/General/Advanced/Packages/Provider/PackageProvider' import AccordionItem from '@/Components/Shared/AccordionItem' -import PreferencesGroup from '../../PreferencesComponents/PreferencesGroup' -import PreferencesSegment from '../../PreferencesComponents/PreferencesSegment' +import PreferencesGroup from '../../../PreferencesComponents/PreferencesGroup' +import PreferencesSegment from '../../../PreferencesComponents/PreferencesSegment' type Props = { application: WebApplication viewControllerManager: ViewControllerManager - extensionsLatestVersions: ExtensionsLatestVersions + extensionsLatestVersions: PackageProvider } const Advanced: FunctionComponent = ({ application, viewControllerManager, extensionsLatestVersions }) => { return ( - +
- void }> = ({ component, callback }) => { const fields = [ @@ -66,4 +66,4 @@ const ConfirmCustomExtension: FunctionComponent<{ ) } -export default ConfirmCustomExtension +export default ConfirmCustomPackage diff --git a/packages/web/src/javascripts/Components/Preferences/Panes/Extensions/ExtensionItem.tsx b/packages/web/src/javascripts/Components/Preferences/Panes/General/Advanced/Packages/PackageEntry.tsx similarity index 74% rename from packages/web/src/javascripts/Components/Preferences/Panes/Extensions/ExtensionItem.tsx rename to packages/web/src/javascripts/Components/Preferences/Panes/General/Advanced/Packages/PackageEntry.tsx index 47b11b79e..0f30c09a5 100644 --- a/packages/web/src/javascripts/Components/Preferences/Panes/Extensions/ExtensionItem.tsx +++ b/packages/web/src/javascripts/Components/Preferences/Panes/General/Advanced/Packages/PackageEntry.tsx @@ -3,9 +3,10 @@ import { ComponentMutator, SNComponent } from '@standardnotes/snjs' import { SubtitleLight } from '@/Components/Preferences/PreferencesComponents/Content' import Switch from '@/Components/Switch/Switch' import Button from '@/Components/Button/Button' -import ExtensionInfoCell from './ExtensionInfoCell' -import { ExtensionItemProps } from './ExtensionItemProps' -import PreferencesSegment from '../../PreferencesComponents/PreferencesSegment' +import PackageEntrySubInfo from './PackageEntrySubInfo' +import PreferencesSegment from '../../../../PreferencesComponents/PreferencesSegment' +import { WebApplication } from '@/Application/Application' +import { AnyPackageType } from './Types/AnyPackageType' const UseHosted: FunctionComponent<{ offlineOnly: boolean @@ -17,7 +18,16 @@ const UseHosted: FunctionComponent<{
) -const ExtensionItem: FunctionComponent = ({ application, extension, uninstall }) => { +interface PackageEntryProps { + application: WebApplication + extension: AnyPackageType + first: boolean + latestVersion: string | undefined + uninstall: (extension: AnyPackageType) => void + toggleActivate?: (extension: AnyPackageType) => void +} + +const PackageEntry: FunctionComponent = ({ application, extension, uninstall }) => { const [offlineOnly, setOfflineOnly] = useState(extension instanceof SNComponent ? extension.offlineOnly : false) const [extensionName, setExtensionName] = useState(extension.displayName) @@ -56,7 +66,7 @@ const ExtensionItem: FunctionComponent = ({ application, ext return ( - +
@@ -71,4 +81,4 @@ const ExtensionItem: FunctionComponent = ({ application, ext ) } -export default ExtensionItem +export default PackageEntry diff --git a/packages/web/src/javascripts/Components/Preferences/Panes/Extensions/ExtensionInfoCell.tsx b/packages/web/src/javascripts/Components/Preferences/Panes/General/Advanced/Packages/PackageEntrySubInfo.tsx similarity index 92% rename from packages/web/src/javascripts/Components/Preferences/Panes/Extensions/ExtensionInfoCell.tsx rename to packages/web/src/javascripts/Components/Preferences/Panes/General/Advanced/Packages/PackageEntrySubInfo.tsx index 13cd176c5..899236bd9 100644 --- a/packages/web/src/javascripts/Components/Preferences/Panes/Extensions/ExtensionInfoCell.tsx +++ b/packages/web/src/javascripts/Components/Preferences/Panes/General/Advanced/Packages/PackageEntrySubInfo.tsx @@ -6,7 +6,7 @@ type Props = { isThirdParty: boolean } -const ExtensionInfoCell: FunctionComponent = ({ extensionName, changeName, isThirdParty }) => { +const PackageEntrySubInfo: FunctionComponent = ({ extensionName, changeName, isThirdParty }) => { const [isRenaming, setIsRenaming] = useState(false) const [newExtensionName, setNewExtensionName] = useState(extensionName) @@ -73,4 +73,4 @@ const ExtensionInfoCell: FunctionComponent = ({ extensionName, changeName ) } -export default ExtensionInfoCell +export default PackageEntrySubInfo diff --git a/packages/web/src/javascripts/Components/Preferences/Panes/Extensions/ExtensionsLatestVersions.ts b/packages/web/src/javascripts/Components/Preferences/Panes/General/Advanced/Packages/Provider/PackageProvider.ts similarity index 77% rename from packages/web/src/javascripts/Components/Preferences/Panes/Extensions/ExtensionsLatestVersions.ts rename to packages/web/src/javascripts/Components/Preferences/Panes/General/Advanced/Packages/Provider/PackageProvider.ts index 30f73b636..dbae56519 100644 --- a/packages/web/src/javascripts/Components/Preferences/Panes/Extensions/ExtensionsLatestVersions.ts +++ b/packages/web/src/javascripts/Components/Preferences/Panes/General/Advanced/Packages/Provider/PackageProvider.ts @@ -1,13 +1,13 @@ import { WebApplication } from '@/Application/Application' import { ClientDisplayableError, FeatureDescription } from '@standardnotes/snjs' import { makeAutoObservable, observable } from 'mobx' -import { AnyExtension } from './AnyExtension' +import { AnyPackageType } from '../Types/AnyPackageType' import { ComponentChecksumsType } from '@standardnotes/components-meta' import RawComponentChecksumsFile from '@standardnotes/components-meta/dist/zips/checksums.json' const ComponentChecksums = RawComponentChecksumsFile as ComponentChecksumsType -export class ExtensionsLatestVersions { - static async load(application: WebApplication): Promise { +export class PackageProvider { + static async load(application: WebApplication): Promise { const response = await application.getAvailableSubscriptions() if (response instanceof ClientDisplayableError) { @@ -18,16 +18,16 @@ export class ExtensionsLatestVersions { collectFeatures(response.PLUS_PLAN?.features as FeatureDescription[], versionMap) collectFeatures(response.PRO_PLAN?.features as FeatureDescription[], versionMap) - return new ExtensionsLatestVersions(versionMap) + return new PackageProvider(versionMap) } constructor(private readonly latestVersionsMap: Map) { - makeAutoObservable(this, { + makeAutoObservable(this, { latestVersionsMap: observable.ref, }) } - getVersion(extension: AnyExtension): string | undefined { + getVersion(extension: AnyPackageType): string | undefined { return this.latestVersionsMap.get(extension.package_info.identifier) } } diff --git a/packages/web/src/javascripts/Components/Preferences/Panes/Extensions/Extensions.tsx b/packages/web/src/javascripts/Components/Preferences/Panes/General/Advanced/Packages/Section.tsx similarity index 68% rename from packages/web/src/javascripts/Components/Preferences/Panes/Extensions/Extensions.tsx rename to packages/web/src/javascripts/Components/Preferences/Panes/General/Advanced/Packages/Section.tsx index 7ea78c800..698ed009a 100644 --- a/packages/web/src/javascripts/Components/Preferences/Panes/Extensions/Extensions.tsx +++ b/packages/web/src/javascripts/Components/Preferences/Panes/General/Advanced/Packages/Section.tsx @@ -3,26 +3,34 @@ import Button from '@/Components/Button/Button' import DecoratedInput from '@/Components/Input/DecoratedInput' import { WebApplication } from '@/Application/Application' import { FunctionComponent, useEffect, useRef, useState } from 'react' -import { Title } from '@/Components/Preferences/PreferencesComponents/Content' +import { Subtitle } from '@/Components/Preferences/PreferencesComponents/Content' import { observer } from 'mobx-react-lite' -import { ExtensionsLatestVersions } from './ExtensionsLatestVersions' -import ExtensionItem from './ExtensionItem' -import ConfirmCustomExtension from './ConfirmCustomExtension' -import { AnyExtension } from './AnyExtension' -import PreferencesSegment from '../../PreferencesComponents/PreferencesSegment' +import { PackageProvider } from './Provider/PackageProvider' +import PackageEntry from './PackageEntry' +import ConfirmCustomPackage from './ConfirmCustomPackage' +import { AnyPackageType } from './Types/AnyPackageType' +import PreferencesSegment from '../../../../PreferencesComponents/PreferencesSegment' const loadExtensions = (application: WebApplication) => - application.items.getItems([ContentType.ActionsExtension, ContentType.Component, ContentType.Theme]) as AnyExtension[] + application.items.getItems([ + ContentType.ActionsExtension, + ContentType.Component, + ContentType.Theme, + ]) as AnyPackageType[] type Props = { application: WebApplication - extensionsLatestVersions: ExtensionsLatestVersions + extensionsLatestVersions: PackageProvider className?: string } -const Extensions: FunctionComponent = ({ application, extensionsLatestVersions, className = '' }) => { +const PackagesPreferencesSection: FunctionComponent = ({ + application, + extensionsLatestVersions, + className = '', +}) => { const [customUrl, setCustomUrl] = useState('') - const [confirmableExtension, setConfirmableExtension] = useState(undefined) + const [confirmableExtension, setConfirmableExtension] = useState(undefined) const [extensions, setExtensions] = useState(loadExtensions(application)) const confirmableEnd = useRef(null) @@ -33,7 +41,7 @@ const Extensions: FunctionComponent = ({ application, extensionsLatestVer } }, [confirmableExtension, confirmableEnd]) - const uninstallExtension = async (extension: AnyExtension) => { + const uninstallExtension = async (extension: AnyPackageType) => { application.alertService .confirm( 'Are you sure you want to uninstall this extension? Note that extensions managed by your subscription will automatically be re-installed on application restart.', @@ -69,7 +77,7 @@ const Extensions: FunctionComponent = ({ application, extensionsLatestVer } const confirmExtension = async () => { - await application.mutator.insertItem(confirmableExtension as AnyExtension) + await application.mutator.insertItem(confirmableExtension as AnyPackageType) application.sync.sync().catch(console.error) setExtensions(loadExtensions(application)) } @@ -95,7 +103,7 @@ const Extensions: FunctionComponent = ({ application, extensionsLatestVer {visibleExtensions .sort((e1, e2) => e1.displayName?.toLowerCase().localeCompare(e2.displayName?.toLowerCase())) .map((extension, i) => ( - = ({ application, extensionsLatestVer
{!confirmableExtension && ( - Install Custom Extension - { - setCustomUrl(value) - }} + Install External Package +
+ { + setCustomUrl(value) + }} + /> +
+