From e6441ad63044b50344520a862d7c271e6f462662 Mon Sep 17 00:00:00 2001 From: Barrett Ruth Date: Sat, 7 Mar 2026 02:20:54 -0500 Subject: [PATCH] fix(credentials): try cached credentials before prompting on login Problem: `:CP login` always prompted for username and password, even when valid credentials were already cached. Solution: if cached credentials exist, attempt `scraper.login()` with them first. On success, return immediately with no prompt. On failure, fall through to `prompt_and_login()` for fresh input. --- lua/cp/credentials.lua | 77 ++++++++++++++++++++++++++---------------- 1 file changed, 47 insertions(+), 30 deletions(-) diff --git a/lua/cp/credentials.lua b/lua/cp/credentials.lua index 5328b8a..835199f 100644 --- a/lua/cp/credentials.lua +++ b/lua/cp/credentials.lua @@ -11,6 +11,43 @@ local STATUS_MESSAGES = { installing_browser = 'Installing browser...', } +---@param platform string +---@param display string +local function prompt_and_login(platform, display) + vim.ui.input({ prompt = display .. ' username: ' }, function(username) + if not username or username == '' then + logger.log('Cancelled', { level = vim.log.levels.WARN }) + return + end + vim.fn.inputsave() + local password = vim.fn.inputsecret(display .. ' password: ') + vim.fn.inputrestore() + if not password or password == '' then + logger.log('Cancelled', { level = vim.log.levels.WARN }) + return + end + + local credentials = { username = username, password = password } + + local scraper = require('cp.scraper') + scraper.login(platform, credentials, function(ev) + vim.schedule(function() + local msg = STATUS_MESSAGES[ev.status] or ev.status + logger.log(display .. ': ' .. msg, { level = vim.log.levels.INFO, override = true }) + end) + end, function(result) + vim.schedule(function() + if result.success then + logger.log(display .. ' login successful', { level = vim.log.levels.INFO, override = true }) + else + local err = result.error or 'unknown error' + logger.log(display .. ' login failed: ' .. err, { level = vim.log.levels.ERROR }) + end + end) + end) + end) +end + ---@param platform string? function M.login(platform) platform = platform or state.get_platform() @@ -24,31 +61,12 @@ function M.login(platform) local display = constants.PLATFORM_DISPLAY_NAMES[platform] or platform - vim.ui.input({ prompt = display .. ' username: ' }, function(username) - if not username or username == '' then - logger.log('Cancelled', { level = vim.log.levels.WARN }) - return - end - vim.fn.inputsave() - local password = vim.fn.inputsecret(display .. ' password: ') - vim.fn.inputrestore() - if not password or password == '' then - logger.log('Cancelled', { level = vim.log.levels.WARN }) - return - end - - cache.load() - local existing = cache.get_credentials(platform) or {} - local credentials = { - username = username, - password = password, - } - if existing.token then - credentials.token = existing.token - end + cache.load() + local existing = cache.get_credentials(platform) or {} + if existing.username and existing.password then local scraper = require('cp.scraper') - scraper.login(platform, credentials, function(ev) + scraper.login(platform, existing, function(ev) vim.schedule(function() local msg = STATUS_MESSAGES[ev.status] or ev.status logger.log(display .. ': ' .. msg, { level = vim.log.levels.INFO, override = true }) @@ -56,17 +74,16 @@ function M.login(platform) end, function(result) vim.schedule(function() if result.success then - logger.log( - display .. ' login successful', - { level = vim.log.levels.INFO, override = true } - ) + logger.log(display .. ' login successful', { level = vim.log.levels.INFO, override = true }) else - local err = result.error or 'unknown error' - logger.log(display .. ' login failed: ' .. err, { level = vim.log.levels.ERROR }) + prompt_and_login(platform, display) end end) end) - end) + return + end + + prompt_and_login(platform, display) end ---@param platform string?