1717
1818import Combine
1919
20+ private let ALLOW_CONTESTED_USERNAMES_WITHOUT_INVITE = false
21+
2022struct CreateUsernameUIState {
2123 var lengthRule : UsernameValidationRuleResult
2224 var allowedCharactersRule : UsernameValidationRuleResult
2325 var costRule : UsernameValidationRuleResult
2426 var usernameBlockedRule : UsernameValidationRuleResult
27+ var contestedAllowed : Bool
2528 var hasInvite : Bool
2629 var isInvitationMixed : Bool
2730 var isInvitationForContested : Bool
2831 var requiredDash : UInt64
2932 var canContinue : Bool
3033
31- init ( lengthRule: UsernameValidationRuleResult , allowedCharactersRule: UsernameValidationRuleResult , costRule: UsernameValidationRuleResult , usernameBlockedRule: UsernameValidationRuleResult , hasInvite: Bool , isInvitationMixed: Bool , isInvitationForContested: Bool , requiredDash: UInt64 , canContinue: Bool ) {
34+ init ( lengthRule: UsernameValidationRuleResult , allowedCharactersRule: UsernameValidationRuleResult , costRule: UsernameValidationRuleResult , usernameBlockedRule: UsernameValidationRuleResult , contestedAllowed : Bool , hasInvite: Bool , isInvitationMixed: Bool , isInvitationForContested: Bool , requiredDash: UInt64 , canContinue: Bool ) {
3235 self . lengthRule = lengthRule
3336 self . allowedCharactersRule = allowedCharactersRule
3437 self . costRule = costRule
3538 self . usernameBlockedRule = usernameBlockedRule
39+ self . contestedAllowed = contestedAllowed
3640 self . hasInvite = hasInvite
3741 self . isInvitationMixed = isInvitationMixed
3842 self . isInvitationForContested = isInvitationForContested
@@ -45,6 +49,7 @@ struct CreateUsernameUIState {
4549 self . allowedCharactersRule = . empty
4650 self . costRule = . hidden
4751 self . usernameBlockedRule = . hidden
52+ self . contestedAllowed = ALLOW_CONTESTED_USERNAMES_WITHOUT_INVITE
4853 self . hasInvite = false
4954 self . isInvitationMixed = false
5055 self . isInvitationForContested = false
@@ -173,6 +178,7 @@ class CreateUsernameViewModel: ObservableObject {
173178 uiState. isInvitationMixed = await isInvitationMixed ( assetLockTx: tx)
174179 uiState. isInvitationForContested = await invitationAmount ( assetLockTx: tx) >= DWDP_MIN_BALANCE_FOR_CONTESTED_USERNAME
175180 uiState. hasInvite = true
181+ uiState. contestedAllowed = uiState. isInvitationForContested
176182 uiState. costRule = . hidden
177183 }
178184 }
@@ -219,23 +225,33 @@ class CreateUsernameViewModel: ObservableObject {
219225 let hasInvite = uiState. hasInvite
220226 let isMixed = uiState. isInvitationMixed
221227 let isContested = uiState. isInvitationForContested
228+ let contestedAllowed = uiState. contestedAllowed
222229
223230 uiState = CreateUsernameUIState ( )
224231 uiState. hasInvite = hasInvite
225232 uiState. isInvitationMixed = isMixed
226233 uiState. isInvitationForContested = isContested
234+ uiState. contestedAllowed = contestedAllowed
227235 return
228236 }
229237
230238 let isContestable = isUsernameContestable ( username: username)
231- let isContested = isContestable // TODO: MOCK_DASHPAY
239+ // Disable contested usernames if no invite and the constant is false
240+ let isContested = if ALLOW_CONTESTED_USERNAMES_WITHOUT_INVITE {
241+ isContestable // TODO: MOCK_DASHPAY
242+ } else {
243+ uiState. hasInvite ? isContestable : false
244+ }
232245 let lengthValid = isLengthValid ( username: username)
233246 let allowedCharactersRuleValid = allowedCharactersRuleValid ( username: username)
234247 let requiredCost = isContested ? DWDP_MIN_BALANCE_FOR_CONTESTED_USERNAME : DWDP_MIN_BALANCE_TO_CREATE_USERNAME
235248 let balance = DWEnvironment . sharedInstance ( ) . currentWallet. balance
236249 let hasEnoughBalance = balance >= requiredCost
237250 let isAffordable = uiState. isInvitationForContested || ( uiState. hasInvite && !isContested) || hasEnoughBalance
238- let criteriaValid = if uiState. hasInvite && !uiState. isInvitationForContested {
251+
252+ // Treat no-invite scenario like non-contested invite for validation rules
253+ let shouldUseRelaxedValidation = ( uiState. hasInvite && !uiState. isInvitationForContested) || ( !uiState. hasInvite && !ALLOW_CONTESTED_USERNAMES_WITHOUT_INVITE)
254+ let criteriaValid = if shouldUseRelaxedValidation {
239255 lengthValid || allowedCharactersRuleValid
240256 } else {
241257 lengthValid && allowedCharactersRuleValid
@@ -248,6 +264,7 @@ class CreateUsernameViewModel: ObservableObject {
248264 allowedCharactersRule: allowedCharactersRuleValid ? . valid : . invalid,
249265 costRule: costRule,
250266 usernameBlockedRule: canContinue && isContested ? . loading : . hidden,
267+ contestedAllowed: uiState. contestedAllowed,
251268 hasInvite: uiState. hasInvite,
252269 isInvitationMixed: uiState. isInvitationMixed,
253270 isInvitationForContested: uiState. isInvitationForContested,
@@ -305,7 +322,8 @@ class CreateUsernameViewModel: ObservableObject {
305322 }
306323
307324 private func isLengthValid( username: String ) -> Bool {
308- let minLength = uiState. hasInvite && !uiState. isInvitationForContested ? DW_MIN_USERNAME_NONCONTESTED_LENGTH : DW_MIN_USERNAME_LENGTH
325+ let shouldUseRelaxedMinLength = ( uiState. hasInvite && !uiState. isInvitationForContested) || ( !uiState. hasInvite && !ALLOW_CONTESTED_USERNAMES_WITHOUT_INVITE)
326+ let minLength = shouldUseRelaxedMinLength ? DW_MIN_USERNAME_NONCONTESTED_LENGTH : DW_MIN_USERNAME_LENGTH
309327
310328 return username. count >= minLength && username. count <= DW_MAX_USERNAME_LENGTH
311329 }
@@ -315,7 +333,8 @@ class CreateUsernameViewModel: ObservableObject {
315333 let containsDigits = username. rangeOfCharacter ( from: . decimalDigits) != nil
316334 let startsOrEndsWithHyphen = username. first == " - " || username. last == " - "
317335
318- if uiState. hasInvite && !uiState. isInvitationForContested {
336+ let shouldUseRelaxedCharacterRules = ( uiState. hasInvite && !uiState. isInvitationForContested) || ( !uiState. hasInvite && !ALLOW_CONTESTED_USERNAMES_WITHOUT_INVITE)
337+ if shouldUseRelaxedCharacterRules {
319338 return !hasIllegalCharacters && containsDigits && !startsOrEndsWithHyphen
320339 }
321340
0 commit comments