Page Menu
Home
Phorge
Search
Configure Global Search
Log In
Files
F2698194
UserPage.qml
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Award Token
Flag For Later
Size
8 KB
Referenced Files
None
Subscribers
None
UserPage.qml
View Options
/*
* This file is part of kazv.
* SPDX-FileCopyrightText: 2020-2023 tusooa <tusooa@kazv.moe>
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
import
QtQuick
2.2
import
QtQuick
.
Layouts
1.15
import
QtQuick
.
Controls
2.15
import
org
.
kde
.
kirigami
2.20
as
Kirigami
import
moe
.
kazv
.
mxc
.
kazv
0.0
as
MK
import
'.'
as
Kazv
import
'device-mgmt'
as
KazvDM
import
'matrix-helpers.js'
as
Helpers
Kirigami
.
ScrollablePage
{
id: userPage
property
string
userId:
''
property
var
user:
({})
property
var
room
property
var
roomName:
Helpers
.
roomNameOrHeroes
(
room
,
l10n
)
property
var
editingPowerLevel:
false
property
var
submittingPowerLevel:
false
property
var
powerLevelsLoaded:
false
property
var
userPowerLevel:
room
.
userPowerLevel
(
userId
)
property
var
kickingUser:
false
property
var
canKickUser:
!
(
user
.
membership
===
'ban'
||
user
.
membership
===
'leave'
)
property
var
banningUser:
false
property
var
unbanningUser:
false
Connections
{
target:
room
function
onPowerLevelsChanged
()
{
userPage
.
userPowerLevel
=
room
.
userPowerLevel
(
userPage
.
userId
);
}
}
title:
user
.
name
||
userId
property
var
ensureMemberEvent:
Kazv
.
AsyncHandler
{
trigger:
()
=>
room
.
ensureStateEvent
(
'm.room.member'
,
userId
)
}
property
var
ensurePowerLevels:
Kazv
.
AsyncHandler
{
trigger:
()
=>
room
.
ensureStateEvent
(
'm.room.power_levels'
,
''
)
onResolved:
{
if
(
success
)
{
userPage
.
powerLevelsLoaded
=
true
;
}
}
}
Component.onCompleted:
{
userPage
.
ensureMemberEvent
.
call
();
userPage
.
ensurePowerLevels
.
call
();
}
property
var
setPowerLevel:
Kazv
.
AsyncHandler
{
trigger:
()
=>
{
userPage
.
submittingPowerLevel
=
true
;
return
room
.
setUserPowerLevel
(
userPage
.
userId
,
parseInt
(
newPowerLevel
.
text
));
}
onResolved:
{
if
(
!
success
)
{
showPassiveNotification
(
l10n
.
get
(
'user-page-set-power-level-failed-prompt'
,
{
errorCode:
data
.
errorCode
,
errorMsg:
data
.
error
}));
}
else
{
userPage
.
editingPowerLevel
=
false
;
}
userPage
.
submittingPowerLevel
=
false
;
}
}
property
var
kickUser:
Kazv
.
AsyncHandler
{
trigger:
()
=>
{
userPage
.
kickingUser
=
true
;
return
room
.
kickUser
(
userPage
.
userId
,
kickUserReasonInput
.
text
);
}
onResolved:
{
if
(
!
success
)
{
showPassiveNotification
(
l10n
.
get
(
'user-page-kick-user-failed-prompt'
,
{
errorCode:
data
.
errorCode
,
errorMsg:
data
.
error
}));
}
else
{
kickUserReasonInput
.
text
=
''
;
}
userPage
.
kickingUser
=
false
;
}
}
property
var
banUser:
Kazv
.
AsyncHandler
{
trigger:
()
=>
{
userPage
.
banningUser
=
true
;
return
room
.
banUser
(
userPage
.
userId
,
banUserReasonInput
.
text
);
}
onResolved:
{
if
(
!
success
)
{
showPassiveNotification
(
l10n
.
get
(
'user-page-ban-user-failed-prompt'
,
{
errorCode:
data
.
errorCode
,
errorMsg:
data
.
error
}));
}
else
{
banUserReasonInput
.
text
=
''
;
}
userPage
.
banningUser
=
false
;
}
}
property
var
unbanUser:
Kazv
.
AsyncHandler
{
trigger:
()
=>
{
userPage
.
unbanningUser
=
true
;
return
room
.
unbanUser
(
userPage
.
userId
);
}
onResolved:
{
if
(
!
success
)
{
showPassiveNotification
(
l10n
.
get
(
'user-page-unban-user-failed-prompt'
,
{
errorCode:
data
.
errorCode
,
errorMsg:
data
.
error
}));
}
userPage
.
unbanningUser
=
false
;
}
}
ColumnLayout
{
Kirigami
.
Avatar
{
id: avatar
objectName:
'avatar'
Layout.alignment:
Qt
.
AlignHCenter
Layout.preferredHeight:
Kirigami
.
Units
.
iconSizes
.
enormous
Layout.preferredWidth:
Kirigami
.
Units
.
iconSizes
.
enormous
source:
userPage
.
user
.
avatarMxcUri
?
matrixSdk
.
mxcUriToHttp
(
userPage
.
user
.
avatarMxcUri
)
:
''
sourceSize.width:
Kirigami
.
Units
.
iconSizes
.
enormous
sourceSize.height:
Kirigami
.
Units
.
iconSizes
.
enormous
}
RowLayout
{
visible:
!
userPage
.
editingPowerLevel
Label
{
objectName:
'powerLevelLabel'
Layout.fillWidth:
true
text:
l10n
.
get
(
'user-page-power-level'
,
{
powerLevel:
userPage
.
userPowerLevel
})
}
Button
{
objectName:
'editPowerLevelButton'
text:
l10n
.
get
(
'user-page-edit-power-level-action'
)
enabled:
userPage
.
powerLevelsLoaded
onClicked:
{
userPage
.
editingPowerLevel
=
true
;
}
}
}
RowLayout
{
visible:
userPage
.
editingPowerLevel
TextField
{
objectName:
'newPowerLevelInput'
id: newPowerLevel
Layout.fillWidth:
true
text:
`
$
{
userPage
.
userPowerLevel
}
`
readOnly:
userPage
.
submittingPowerLevel
}
Button
{
objectName:
'savePowerLevelButton'
text:
l10n
.
get
(
'user-page-save-power-level-action'
)
onClicked:
{
setPowerLevel
.
call
();
}
enabled:
!
userPage
.
submittingPowerLevel
}
Button
{
objectName:
'discardPowerLevelButton'
text:
l10n
.
get
(
'user-page-discard-power-level-action'
)
enabled:
!
userPage
.
submittingPowerLevel
onClicked:
{
userPage
.
editingPowerLevel
=
false
;
newPowerLevel
.
text
=
`
$
{
userPage
.
userPowerLevel
}
`
;
}
}
}
ColumnLayout
{
Kirigami
.
PromptDialog
{
id: kickUserReasonDialog
objectName:
'kickUserReasonDialog'
title:
l10n
.
get
(
'user-page-kick-user-confirm-dialog-title'
)
standardButtons:
Kirigami
.
Dialog
.
Ok
|
Kirigami
.
Dialog
.
Cancel
onAccepted:
{
userPage
.
kickUser
.
call
()
}
ColumnLayout
{
Label
{
Layout.fillWidth:
true
text:
l10n
.
get
(
'user-page-kick-user-confirm-dialog-content'
,
{
userId:
userPage
.
user
.
userId
,
name:
userPage
.
user
.
name
,
roomName:
userPage
.
roomName
,
})
wrapMode:
Text
.
Wrap
}
Kirigami
.
FormLayout
{
Layout.fillWidth:
true
TextField
{
Layout.fillWidth:
true
id: kickUserReasonInput
objectName:
'kickUserReasonInput'
readOnly:
userPage
.
kickingUser
Kirigami.FormData.label:
l10n
.
get
(
'user-page-kick-user-reason-prompt'
)
}
}
}
}
Button
{
objectName:
'kickUserButton'
Layout.fillWidth:
true
enabled:
!
userPage
.
kickingUser
text:
l10n
.
get
(
'user-page-kick-user-action'
)
visible:
userPage
.
canKickUser
onClicked:
{
kickUserReasonDialog
.
open
()
}
}
}
RowLayout
{
Kirigami
.
PromptDialog
{
id: banUserReasonDialog
objectName:
'banUserReasonDialog'
title:
l10n
.
get
(
'user-page-ban-user-confirm-dialog-title'
)
standardButtons:
Kirigami
.
Dialog
.
Ok
|
Kirigami
.
Dialog
.
Cancel
onAccepted:
{
userPage
.
banUser
.
call
()
}
ColumnLayout
{
Label
{
Layout.fillWidth:
true
text:
l10n
.
get
(
'user-page-ban-user-confirm-dialog-content'
,
{
userId:
userPage
.
user
.
userId
,
name:
userPage
.
user
.
name
,
roomName:
userPage
.
roomName
,
})
wrapMode:
Text
.
Wrap
}
Kirigami
.
FormLayout
{
Layout.fillWidth:
true
TextField
{
Layout.fillWidth:
true
id: banUserReasonInput
objectName:
'banUserReasonInput'
readOnly:
userPage
.
banningUser
Kirigami.FormData.label:
l10n
.
get
(
'user-page-ban-user-reason-prompt'
)
}
}
}
}
Button
{
objectName:
'banUserButton'
Layout.fillWidth:
true
enabled:
!
userPage
.
banningUser
text:
l10n
.
get
(
'user-page-ban-user-action'
)
visible:
!
unbanUserButton
.
visible
onClicked:
{
banUserReasonDialog
.
open
()
}
}
Button
{
id: unbanUserButton
objectName:
'unbanUserButton'
Layout.fillWidth:
true
enabled:
!
userPage
.
unbanningUser
text:
l10n
.
get
(
'user-page-unban-user-action'
)
visible:
user
.
membership
===
"ban"
onClicked:
{
userPage
.
unbanUser
.
call
()
}
}
}
KazvDM
.
DeviceList
{
Layout.fillWidth:
true
Layout.fillHeight:
true
Layout.minimumHeight:
childrenRect
.
height
userId:
userPage
.
userId
devices:
matrixSdk
.
devicesOfUser
(
userId
)
}
}
}
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Fri, Jul 18, 8:10 AM (1 d, 18 h)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
241952
Default Alt Text
UserPage.qml (8 KB)
Attached To
Mode
rK kazv
Attached
Detach File
Event Timeline
Log In to Comment