From 1d6405025baaf3a6b4010ed7f17f8cde391086c0 Mon Sep 17 00:00:00 2001 From: pebble-fish Date: Mon, 2 Feb 2026 14:47:14 +0000 Subject: [PATCH 1/3] suggest username when taken --- public/src/client/register.js | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/public/src/client/register.js b/public/src/client/register.js index f989901e7b..5a3b384ee9 100644 --- a/public/src/client/register.js +++ b/public/src/client/register.js @@ -114,6 +114,13 @@ define('forum/register', [ $('#username').trigger('focus'); }; + // helper to build suggestion + function suggestUsername(name) { + name = (name || '').trim(); + if (!name) { return ''; } + return name + '0'; + } + function validateUsername(username, callback) { callback = callback || function () {}; @@ -135,7 +142,16 @@ define('forum/register', [ if (results.every(obj => obj.status === 'rejected')) { showSuccess(usernameInput, username_notify, successIcon); } else { - showError(usernameInput, username_notify, '[[error:username-taken]]'); + // showError(usernameInput, username_notify, '[[error:username-taken]]'); + const suggestion = suggestUsername(username); + const msg = suggestion + ? `That username is taken. Try "${suggestion}".` + : 'That username is taken.'; + showError(usernameInput, username_notify, msg); + if (suggestion) { + usernameInput.val(suggestion); + $('#yourUsername').text(slugify(suggestion)); + } } callback(); From 1b8d077745af4a576f6685e592c03114eec9786c Mon Sep 17 00:00:00 2001 From: pebble-fish Date: Mon, 2 Feb 2026 14:52:46 +0000 Subject: [PATCH 2/3] suggest username when taken --- public/src/client/register.js | 73 ++++++++++++++++++++++++++++++----- 1 file changed, 63 insertions(+), 10 deletions(-) diff --git a/public/src/client/register.js b/public/src/client/register.js index 5a3b384ee9..057fc94be3 100644 --- a/public/src/client/register.js +++ b/public/src/client/register.js @@ -114,12 +114,51 @@ define('forum/register', [ $('#username').trigger('focus'); }; - // helper to build suggestion + // helper to build suggestion (task 2) function suggestUsername(name) { name = (name || '').trim(); if (!name) { return ''; } return name + '0'; } + // (task 4) + async function usernameExists(userslug) { + try { + await api.head(`/users/bySlug/${userslug}`, {}); + return true; + } catch (e) { + return false; + } + } + + async function groupExists(groupname) { + try { + await api.head(`/groups/${groupname}`, {}); + return true; + } catch (e) { + return false; + } + } + + async function findUniqueUsername(base, maxTries) { + base = (base || '').trim(); + if (!base) return ''; + maxTries = maxTries || 20; + for (let k = 1; k <= maxTries; k++) { + const candidate = `${base}${k}`; + const slug = slugify(candidate); + if (candidate.length > ajaxify.data.maximumUsernameLength) { + break; + } + const [userTaken, groupTaken] = await Promise.all([ + usernameExists(slug), + groupExists(candidate), + ]); + if (!userTaken && !groupTaken) { + return candidate; + } + } + return ''; + } function validateUsername(username, callback) { callback = callback || function () {}; @@ -143,15 +182,29 @@ define('forum/register', [ showSuccess(usernameInput, username_notify, successIcon); } else { // showError(usernameInput, username_notify, '[[error:username-taken]]'); - const suggestion = suggestUsername(username); - const msg = suggestion - ? `That username is taken. Try "${suggestion}".` - : 'That username is taken.'; - showError(usernameInput, username_notify, msg); - if (suggestion) { - usernameInput.val(suggestion); - $('#yourUsername').text(slugify(suggestion)); - } + // (task 2) + // const suggestion = suggestUsername(username); + // const msg = suggestion + // ? `That username is taken. Try "${suggestion}".` + // : 'That username is taken.'; + // showError(usernameInput, username_notify, msg); + // if (suggestion) { + // usernameInput.val(suggestion); + // $('#yourUsername').text(slugify(suggestion)); + // } + findUniqueUsername(username, 30).then((suggestion) => { + if (suggestion) { + showError(usernameInput, username_notify, `That username is taken. Try "${suggestion}".`); + usernameInput.val(suggestion); + $('#yourUsername').text(slugify(suggestion)); + } else { + showError(usernameInput, username_notify, '[[error:username-taken]]'); + } + }).finally(() => { + callback(); + }); + + return; } callback(); From 42023595861d501493062ee70dde8d3b830fbc39 Mon Sep 17 00:00:00 2001 From: pebble-fish Date: Mon, 2 Feb 2026 16:10:18 +0000 Subject: [PATCH 3/3] reverted things to task 3 --- public/src/client/register.js | 72 +++++------------------------------ 1 file changed, 10 insertions(+), 62 deletions(-) diff --git a/public/src/client/register.js b/public/src/client/register.js index 057fc94be3..3488df80a7 100644 --- a/public/src/client/register.js +++ b/public/src/client/register.js @@ -120,45 +120,6 @@ define('forum/register', [ if (!name) { return ''; } return name + '0'; } - // (task 4) - async function usernameExists(userslug) { - try { - await api.head(`/users/bySlug/${userslug}`, {}); - return true; - } catch (e) { - return false; - } - } - - async function groupExists(groupname) { - try { - await api.head(`/groups/${groupname}`, {}); - return true; - } catch (e) { - return false; - } - } - - async function findUniqueUsername(base, maxTries) { - base = (base || '').trim(); - if (!base) return ''; - maxTries = maxTries || 20; - for (let k = 1; k <= maxTries; k++) { - const candidate = `${base}${k}`; - const slug = slugify(candidate); - if (candidate.length > ajaxify.data.maximumUsernameLength) { - break; - } - const [userTaken, groupTaken] = await Promise.all([ - usernameExists(slug), - groupExists(candidate), - ]); - if (!userTaken && !groupTaken) { - return candidate; - } - } - return ''; - } function validateUsername(username, callback) { callback = callback || function () {}; @@ -182,29 +143,16 @@ define('forum/register', [ showSuccess(usernameInput, username_notify, successIcon); } else { // showError(usernameInput, username_notify, '[[error:username-taken]]'); - // (task 2) - // const suggestion = suggestUsername(username); - // const msg = suggestion - // ? `That username is taken. Try "${suggestion}".` - // : 'That username is taken.'; - // showError(usernameInput, username_notify, msg); - // if (suggestion) { - // usernameInput.val(suggestion); - // $('#yourUsername').text(slugify(suggestion)); - // } - findUniqueUsername(username, 30).then((suggestion) => { - if (suggestion) { - showError(usernameInput, username_notify, `That username is taken. Try "${suggestion}".`); - usernameInput.val(suggestion); - $('#yourUsername').text(slugify(suggestion)); - } else { - showError(usernameInput, username_notify, '[[error:username-taken]]'); - } - }).finally(() => { - callback(); - }); - - return; + const suggestion = suggestUsername(username); + const msg = suggestion ? + `That username is taken. Try "${suggestion}".` : + 'That username is taken.'; + + showError(usernameInput, username_notify, msg); + if (suggestion) { + usernameInput.val(suggestion); + $('#yourUsername').text(slugify(suggestion)); + } } callback();