Skip to content
Snippets Groups Projects
Select Git revision
  • b2c7fc04145cae3aed572a04c69d8dc3a16b77cd
  • master default protected
  • nightly/20250722.0
  • beta/202507211539
  • stable/20250718.0
  • nightly/20250718.0
  • nightly/20250714.0
  • beta/202507141552
  • beta/202506161038
  • stable/20250613.0
  • nightly/20250613.0
  • beta/202506101658
  • stable/20250610.0
  • nightly/20250610.0
  • beta/202506091027
  • beta/202506061543
  • nightly/20250605.0
  • beta/202506051039
  • beta/202506051002
  • beta/202506041611
  • beta/202506041335
  • beta/202505231812
22 results

UsernameTextEdit.qml

Blame
  • Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    UsernameTextEdit.qml 4.33 KiB
    /*
     * Copyright (C) 2022 Savoir-faire Linux Inc.
     *
     * This program is free software; you can redistribute it and/or modify
     * it under the terms of the GNU General Public License as published by
     * the Free Software Foundation; either version 3 of the License, or
     * (at your option) any later version.
     *
     * This program is distributed in the hope that it will be useful,
     * but WITHOUT ANY WARRANTY; without even the implied warranty of
     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     * GNU General Public License for more details.
     *
     * You should have received a copy of the GNU General Public License
     * along with this program.  If not, see <https://www.gnu.org/licenses/>.
     */
    
    import QtQuick
    
    import net.jami.Adapters 1.1
    import net.jami.Constants 1.1
    import net.jami.Models 1.1
    
    ModalTextEdit {
        id: root
    
        prefixIconSrc: {
            switch(nameRegistrationState){
            case UsernameLineEdit.NameRegistrationState.FREE:
                return JamiResources.circled_green_check_svg
            case UsernameLineEdit.NameRegistrationState.INVALID:
            case UsernameLineEdit.NameRegistrationState.TAKEN:
                return JamiResources.circled_red_cross_svg
            case UsernameLineEdit.NameRegistrationState.BLANK:
            default:
                return JamiResources.person_24dp_svg
            }
        }
        prefixIconColor: {
            switch(nameRegistrationState){
            case UsernameLineEdit.NameRegistrationState.FREE:
                return "#009980"
            case UsernameLineEdit.NameRegistrationState.INVALID:
            case UsernameLineEdit.NameRegistrationState.TAKEN:
                return "#CC0022"
            case UsernameLineEdit.NameRegistrationState.BLANK:
            default:
                return JamiTheme.editLineColor
            }
        }
        suffixIconSrc: JamiResources.outline_info_24dp_svg
        suffixIconColor: JamiTheme.buttonTintedBlue
    
        property string infohash: CurrentAccount.uri
        property string registeredName: CurrentAccount.registeredName
        property bool hasRegisteredName: registeredName !== ''
    
        infoTipText: JamiStrings.usernameToolTip
        placeholderText: JamiStrings.chooseAUsername
        staticText: hasRegisteredName ? registeredName : infohash
    
        enum NameRegistrationState { BLANK, INVALID, TAKEN, FREE, SEARCHING }
        property int nameRegistrationState: UsernameLineEdit.NameRegistrationState.BLANK
    
        validator: RegularExpressionValidator { regularExpression: /[A-z0-9_]{0,32}/ }
        inputIsValid: dynamicText.length === 0
                      || nameRegistrationState === UsernameLineEdit.NameRegistrationState.FREE
    
        Connections {
            target: CurrentAccount
    
            function onRegisteredNameChanged() {
                root.editMode = false
            }
        }
    
        Connections {
            id: registeredNameFoundConnection
    
            target: NameDirectory
            enabled: dynamicText.length !== 0
    
            function onRegisteredNameFound(status, address, name) {
                if (dynamicText === name) {
                    switch(status) {
                    case NameDirectory.LookupStatus.NOT_FOUND:
                        nameRegistrationState = UsernameLineEdit.NameRegistrationState.FREE
                        break
                    case NameDirectory.LookupStatus.ERROR:
                    case NameDirectory.LookupStatus.INVALID_NAME:
                    case NameDirectory.LookupStatus.INVALID:
                        nameRegistrationState = UsernameLineEdit.NameRegistrationState.INVALID
                        break
                    case NameDirectory.LookupStatus.SUCCESS:
                        nameRegistrationState = UsernameLineEdit.NameRegistrationState.TAKEN
                        break
                    }
                }
            }
        }
    
        Timer {
            id: lookupTimer
    
            repeat: false
            interval: JamiTheme.usernameLineEditlookupInterval
    
            onTriggered: {
                if (dynamicText.length !== 0) {
                    nameRegistrationState = UsernameLineEdit.NameRegistrationState.SEARCHING
                    NameDirectory.lookupName(CurrentAccount.id, dynamicText)
                } else {
                    nameRegistrationState = UsernameLineEdit.NameRegistrationState.BLANK
                }
            }
        }
        onDynamicTextChanged: lookupTimer.restart()
    
        function startEditing() {
            if (!hasRegisteredName) {
                root.editMode = true
                forceActiveFocus()
                nameRegistrationState = UsernameLineEdit.NameRegistrationState.BLANK
            }
        }
    }