133 lines
4.0 KiB
QML
133 lines
4.0 KiB
QML
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 : Loc.t.auth.msa.error.incomplete)
|
|
}
|
|
}
|
|
|
|
background: Rectangle {
|
|
color: "#1e1e1e"
|
|
radius: 10
|
|
border.color: "#91B315"
|
|
border.width: 1
|
|
}
|
|
|
|
header: Item {
|
|
implicitHeight: 52
|
|
Text {
|
|
anchors.centerIn: parent
|
|
text: Loc.t.auth.msa.title.signIn
|
|
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: Loc.t.common.button.cancel
|
|
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()
|
|
}
|
|
}
|
|
}
|
|
}
|