import QtQuick import QtQuick.Controls import QtQuick.Layouts import QtQuick.Dialogs import QtCore import PageEnum 1.0 import Style 1.0 import "./" import "../Controls2" import "../Controls2/TextTypes" import "../Config" PageType { id: root Connections { target: ImportController function onQrDecodingFinished() { if (Qt.platform.os === "ios") { PageController.closePage() } PageController.goToPage(PageEnum.PageSetupWizardViewConfig) } } ListViewType { id: listView anchors.fill: parent header: ColumnLayout { width: listView.width HeaderTypeWithButton { id: moreButton property bool isVisible: SettingsController.getInstallationUuid() !== "" || PageController.isStartPageVisible() Layout.fillWidth: true Layout.topMargin: 24 + PageController.safeAreaTopMargin Layout.rightMargin: 16 Layout.leftMargin: 16 headerText: qsTr("Connection") actionButtonImage: isVisible ? "qrc:/images/controls/more-vertical.svg" : "" actionButtonFunction: function() { moreActionsDrawer.openTriggered() } DrawerType2 { id: moreActionsDrawer parent: root anchors.fill: parent expandedHeight: root.height * 0.5 expandedStateContent: ColumnLayout { anchors.top: parent.top anchors.left: parent.left anchors.right: parent.right spacing: 0 BaseHeaderType { Layout.fillWidth: true Layout.topMargin: 32 Layout.leftMargin: 16 Layout.rightMargin: 16 headerText: qsTr("Settings") } SwitcherType { id: switcher Layout.fillWidth: true Layout.topMargin: 16 Layout.leftMargin: 16 Layout.rightMargin: 16 text: qsTr("Enable logs") visible: PageController.isStartPageVisible() checked: SettingsController.isLoggingEnabled onToggled: function() { if (checked !== SettingsController.isLoggingEnabled) { SettingsController.isLoggingEnabled = checked } } } LabelWithButtonType { Layout.fillWidth: true text: qsTr("Export client logs") rightImageSource: "qrc:/images/controls/chevron-right.svg" visible: PageController.isStartPageVisible() clickedFunction: function() { var fileName = "" if (GC.isMobile()) { fileName = "AmneziaVPN.log" } else { fileName = SystemController.getFileName(qsTr("Save"), qsTr("Logs files (*.log)"), StandardPaths.standardLocations(StandardPaths.DocumentsLocation) + "/AmneziaVPN", true, ".log") } if (fileName !== "") { PageController.showBusyIndicator(true) SettingsController.exportLogsFile(fileName) PageController.showBusyIndicator(false) PageController.showNotificationMessage(qsTr("Logs file saved")) } } } LabelWithButtonType { id: supportUuid Layout.fillWidth: true Layout.topMargin: 16 text: qsTr("Support tag") descriptionText: SettingsController.getInstallationUuid() descriptionOnTop: true rightImageSource: "qrc:/images/controls/copy.svg" rightImageColor: AmneziaStyle.color.paleGray visible: SettingsController.getInstallationUuid() !== "" clickedFunction: function() { GC.copyToClipBoard(descriptionText) PageController.showNotificationMessage(qsTr("Copied")) if (!GC.isMobile()) { this.rightButton.forceActiveFocus() } } } } } } ParagraphTextType { objectName: "insertKeyLabel" Layout.fillWidth: true Layout.topMargin: 32 Layout.rightMargin: 16 Layout.leftMargin: 16 Layout.bottomMargin: 24 text: qsTr("Insert the key, add a configuration file or scan the QR-code") } TextFieldWithHeaderType { id: textKey Layout.fillWidth: true Layout.rightMargin: 16 Layout.leftMargin: 16 headerText: qsTr("Insert key") buttonText: qsTr("Insert") clickedFunc: function() { textField.text = "" textField.paste() } } BasicButtonType { id: continueButton Layout.fillWidth: true Layout.topMargin: 16 Layout.rightMargin: 16 Layout.leftMargin: 16 visible: textKey.textField.text !== "" text: qsTr("Continue") function isValidUrl(text) { try { var u = new URL(text) return u.protocol === "http:" || u.protocol === "https:" } catch(e) { return false } } clickedFunc: function() { if (isValidUrl(textKey.textField.text)) { ImportController.httpGet(textKey.textField.text) return } if (ImportController.extractConfigFromData(textKey.textField.text)) { PageController.goToPage(PageEnum.PageSetupWizardViewConfig) } } } ParagraphTextType { Layout.fillWidth: true Layout.topMargin: 32 Layout.rightMargin: 16 Layout.leftMargin: 16 Layout.bottomMargin: 24 color: AmneziaStyle.color.charcoalGray text: qsTr("Other connection options") } } model: variants delegate: ColumnLayout { width: listView.width CardWithIconsType { Layout.fillWidth: true Layout.rightMargin: 16 Layout.leftMargin: 16 Layout.bottomMargin: 16 visible: isVisible headerText: title bodyText: description showRecommendedBadge: featuredAmneziaConnection recommendedText: featuredAmneziaConnection ? qsTr("Recommended") : "" rightImageSource: "qrc:/images/controls/chevron-right.svg" leftImageSource: imageSource onClicked: { handler() } Keys.onEnterPressed: this.clicked() Keys.onReturnPressed: this.clicked() } } footer: ColumnLayout { width: listView.width BasicButtonType { id: siteLink2 Layout.topMargin: 24 Layout.bottomMargin: 16 Layout.alignment: Qt.AlignHCenter implicitHeight: 32 visible: Qt.platform.os !== "ios" && !IsMacOsNeBuild defaultColor: AmneziaStyle.color.transparent hoveredColor: AmneziaStyle.color.translucentWhite pressedColor: AmneziaStyle.color.sheerWhite disabledColor: AmneziaStyle.color.mutedGray textColor: AmneziaStyle.color.goldenApricot text: qsTr("Site Amnezia") rightImageSource: "qrc:/images/controls/external-link.svg" clickedFunc: function() { Qt.openUrlExternally(LanguageUiController.getCurrentSiteUrl()) } } } } property list variants: [ amneziaVpn, selfHostVpn, backupRestore, fileOpen, qrScan, restorePurchases, siteLink ] QtObject { id: amneziaVpn property string title: qsTr("VPN by Amnezia") property string description: qsTr("The easiest way to connect to the VPN") property string imageSource: "qrc:/images/controls/amnezia.svg" property bool featuredAmneziaConnection: true property bool isVisible: true property var handler: function() { PageController.showBusyIndicator(true) var result = SubscriptionUiController.fillAvailableServices() PageController.showBusyIndicator(false) if (result) { PageController.goToPage(PageEnum.PageSetupWizardApiServicesList) } } } QtObject { id: selfHostVpn property bool featuredAmneziaConnection: false property string title: qsTr("Self-hosted VPN") property string description: qsTr("Configure Amnezia VPN on your own server") property string imageSource: "qrc:/images/controls/server.svg" property bool isVisible: true property var handler: function() { PageController.goToPage(PageEnum.PageSetupWizardCredentials) } } QtObject { id: backupRestore property bool featuredAmneziaConnection: false property string title: qsTr("Restore from backup") property string description: qsTr("") property string imageSource: "qrc:/images/controls/archive-restore.svg" property bool isVisible: PageController.isStartPageVisible() property var handler: function() { var filePath = SystemController.getFileName(qsTr("Open backup file"), qsTr("Backup files (*.backup)")) if (filePath !== "") { PageController.showBusyIndicator(true) SettingsController.restoreAppConfig(filePath) PageController.showBusyIndicator(false) } } } QtObject { id: fileOpen property bool featuredAmneziaConnection: false property string title: qsTr("File with connection settings") property string description: qsTr("") property string imageSource: "qrc:/images/controls/folder-search-2.svg" property bool isVisible: true property var handler: function() { var nameFilter = "Config files (*.vpn *.ovpn *.conf *.json)" var fileName = SystemController.getFileName(qsTr("Open config file"), nameFilter) if (fileName !== "") { if (ImportController.extractConfigFromFile(fileName)) { PageController.goToPage(PageEnum.PageSetupWizardViewConfig) } } } } QtObject { id: qrScan property bool featuredAmneziaConnection: false property string title: qsTr("QR code") property string description: qsTr("") property string imageSource: "qrc:/images/controls/scan-line.svg" property bool isVisible: SettingsController.isCameraPresent() property var handler: function() { ImportController.startDecodingQr() if (Qt.platform.os === "ios") { PageController.goToPage(PageEnum.PageSetupWizardQrReader) } } } QtObject { id: restorePurchases property bool featuredAmneziaConnection: false property string title: qsTr("Restore purchases") property string description: qsTr("") property string imageSource: "qrc:/images/controls/refresh-cw.svg" property bool isVisible: Qt.platform.os === "ios" || IsMacOsNeBuild property var handler: function() { PageController.showBusyIndicator(true) SubscriptionUiController.restoreServiceFromAppStore() PageController.showBusyIndicator(false) } } QtObject { id: siteLink property bool featuredAmneziaConnection: false property string title: qsTr("I have nothing") property string description: qsTr("") property string imageSource: "qrc:/images/controls/help-circle.svg" property bool isVisible: PageController.isStartPageVisible() && Qt.platform.os !== "ios" && !IsMacOsNeBuild property var handler: function() { Qt.openUrlExternally(LanguageUiController.getCurrentSiteUrl()) } } }