From e3c81e895a07239945d577d33c07060e0e663027 Mon Sep 17 00:00:00 2001 From: Barrett Ruth Date: Sat, 7 Mar 2026 18:12:55 -0500 Subject: [PATCH] feat(credentials): re-prompt on bad credentials and improve cancel UX Problem: After a failed login attempt, the user had to re-run `:CP login` manually. Cancel messages lacked context, and credential prompts in `submit.lua` used raw platform IDs instead of display names. Solution: `prompt_and_login` now recurses after failure so the user is re-prompted until they cancel or succeed. `submit.lua` extracts the scraper call into `do_submit` and re-prompts via `prompt_credentials` on `bad_credentials`. Username prompts show ` to cancel`, and cancel messages include the platform display name. --- lua/cp/credentials.lua | 7 ++++--- lua/cp/submit.lua | 25 +++++++++++++++++-------- 2 files changed, 21 insertions(+), 11 deletions(-) diff --git a/lua/cp/credentials.lua b/lua/cp/credentials.lua index f644ecf..78d260f 100644 --- a/lua/cp/credentials.lua +++ b/lua/cp/credentials.lua @@ -14,16 +14,16 @@ local STATUS_MESSAGES = { ---@param platform string ---@param display string local function prompt_and_login(platform, display) - vim.ui.input({ prompt = '[cp.nvim]: ' .. display .. ' username: ' }, function(username) + vim.ui.input({ prompt = '[cp.nvim]: ' .. display .. ' username ( to cancel): ' }, function(username) if not username or username == '' then - logger.log('Cancelled', { level = vim.log.levels.WARN }) + logger.log(display .. ' login cancelled', { level = vim.log.levels.WARN }) return end vim.fn.inputsave() local password = vim.fn.inputsecret('[cp.nvim]: ' .. display .. ' password: ') vim.fn.inputrestore() if not password or password == '' then - logger.log('Cancelled', { level = vim.log.levels.WARN }) + logger.log(display .. ' login cancelled', { level = vim.log.levels.WARN }) return end @@ -50,6 +50,7 @@ local function prompt_and_login(platform, display) display .. ' login failed: ' .. (constants.LOGIN_ERRORS[err] or err), { level = vim.log.levels.ERROR } ) + prompt_and_login(platform, display) end end) end) diff --git a/lua/cp/submit.lua b/lua/cp/submit.lua index 68b9b90..0b203c8 100644 --- a/lua/cp/submit.lua +++ b/lua/cp/submit.lua @@ -19,13 +19,14 @@ local function prompt_credentials(platform, callback) callback(saved) return end - vim.ui.input({ prompt = platform .. ' username: ' }, function(username) + local display = constants.PLATFORM_DISPLAY_NAMES[platform] or platform + vim.ui.input({ prompt = '[cp.nvim]: ' .. display .. ' username ( to cancel): ' }, function(username) if not username or username == '' then logger.log('Submit cancelled', { level = vim.log.levels.WARN }) return end vim.fn.inputsave() - local password = vim.fn.inputsecret(platform .. ' password: ') + local password = vim.fn.inputsecret('[cp.nvim]: ' .. display .. ' password: ') vim.fn.inputrestore() vim.cmd.redraw() if not password or password == '' then @@ -86,7 +87,7 @@ function M.submit(opts) end end - prompt_credentials(platform, function(creds) + local function do_submit(creds) vim.cmd.update() require('cp.scraper').submit( @@ -112,16 +113,24 @@ function M.submit(opts) local err = result and result.error or 'unknown error' if err == 'bad_credentials' or err:match('^Login failed') then cache.clear_credentials(platform) + logger.log( + 'Submit failed: ' .. (constants.LOGIN_ERRORS[err] or err), + { level = vim.log.levels.ERROR } + ) + prompt_credentials(platform, do_submit) + else + logger.log( + 'Submit failed: ' .. (constants.LOGIN_ERRORS[err] or err), + { level = vim.log.levels.ERROR } + ) end - logger.log( - 'Submit failed: ' .. (constants.LOGIN_ERRORS[err] or err), - { level = vim.log.levels.ERROR } - ) end end) end ) - end) + end + + prompt_credentials(platform, do_submit) end return M