license login feature
This commit is contained in:
@@ -0,0 +1,132 @@
|
||||
pragma ComponentBehavior: Bound
|
||||
|
||||
import QtQuick
|
||||
import QtQuick.Controls 2.15
|
||||
import QtWebEngine
|
||||
|
||||
// Вход в аккаунт Microsoft — то же самое, что делает официальный лаунчер:
|
||||
// страница входа показывается внутри приложения, а лаунчер ждёт, когда браузер
|
||||
// уйдёт на redirect_uri с кодом авторизации в адресе.
|
||||
Dialog {
|
||||
id: msLogin
|
||||
|
||||
required property var backend
|
||||
|
||||
// Окно ничего не знает про тосты главного окна: о неудаче сообщает сигналом.
|
||||
signal failed(string message)
|
||||
|
||||
// Код уже отдан backend — второй раз по тому же адресу не реагируем:
|
||||
// WebEngineView успевает сообщить об urlChanged несколько раз.
|
||||
property bool codeTaken: false
|
||||
|
||||
anchors.centerIn: parent
|
||||
modal: true
|
||||
width: 560
|
||||
height: 680
|
||||
padding: 0
|
||||
closePolicy: Popup.NoAutoClose
|
||||
|
||||
function openAt(url) {
|
||||
codeTaken = false
|
||||
web.url = url
|
||||
open()
|
||||
}
|
||||
|
||||
// Разбор адреса живёт в C++: правила совпадения должны совпадать с теми,
|
||||
// по которым сервис строит сам redirect_uri.
|
||||
function handleUrl(url) {
|
||||
if (codeTaken)
|
||||
return
|
||||
const info = backend.inspectMicrosoftRedirect(String(url))
|
||||
if (!info.matched)
|
||||
return
|
||||
|
||||
codeTaken = true
|
||||
close()
|
||||
if (info.code !== "") {
|
||||
backend.finishMicrosoftLogin(info.code)
|
||||
} else {
|
||||
backend.cancelMicrosoftLogin()
|
||||
msLogin.failed(info.error !== "" ? info.error : "Вход в Microsoft не завершён")
|
||||
}
|
||||
}
|
||||
|
||||
background: Rectangle {
|
||||
color: "#1e1e1e"
|
||||
radius: 10
|
||||
border.color: "#91B315"
|
||||
border.width: 1
|
||||
}
|
||||
|
||||
header: Item {
|
||||
implicitHeight: 52
|
||||
Text {
|
||||
anchors.centerIn: parent
|
||||
text: "Вход в аккаунт Microsoft"
|
||||
color: "#ffffff"
|
||||
font.pixelSize: 17
|
||||
font.bold: true
|
||||
}
|
||||
Rectangle {
|
||||
anchors.bottom: parent.bottom
|
||||
width: parent.width
|
||||
height: 1
|
||||
color: "#333333"
|
||||
}
|
||||
}
|
||||
|
||||
contentItem: Item {
|
||||
// Профиль без storageName — значит без диска: куки живут только пока
|
||||
// работает лаунчер и в общий браузер не попадают. За выбор аккаунта в
|
||||
// пределах сессии отвечает prompt=select_account в адресе входа.
|
||||
WebEngineProfilePrototype {
|
||||
id: msProfile
|
||||
}
|
||||
|
||||
WebEngineView {
|
||||
id: web
|
||||
anchors.fill: parent
|
||||
anchors.margins: 12
|
||||
|
||||
profile: msProfile.instance()
|
||||
|
||||
onUrlChanged: msLogin.handleUrl(url)
|
||||
}
|
||||
|
||||
BusyIndicator {
|
||||
anchors.centerIn: parent
|
||||
running: web.loading
|
||||
visible: running
|
||||
}
|
||||
}
|
||||
|
||||
footer: Item {
|
||||
implicitHeight: 60
|
||||
Rectangle {
|
||||
anchors.top: parent.top
|
||||
width: parent.width
|
||||
height: 1
|
||||
color: "#333333"
|
||||
}
|
||||
Button {
|
||||
anchors.centerIn: parent
|
||||
text: "Отмена"
|
||||
width: 110; height: 36
|
||||
contentItem: Text {
|
||||
text: parent.text
|
||||
color: "#ffffff"
|
||||
horizontalAlignment: Text.AlignHCenter
|
||||
verticalAlignment: Text.AlignVCenter
|
||||
}
|
||||
background: Rectangle {
|
||||
color: parent.pressed ? "#444444" : "#333333"
|
||||
radius: 6
|
||||
}
|
||||
onClicked: {
|
||||
msLogin.codeTaken = true
|
||||
msLogin.close()
|
||||
msLogin.backend.cancelMicrosoftLogin()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user