Files
minecraft-launcher/MicrosoftLoginDialog.qml
T

133 lines
4.0 KiB
QML
Raw Normal View History

2026-09-01 22:25:23 +03:00
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()
}
}
}
}