diff --git a/lua/leetcode-ui/group/page/problems.lua b/lua/leetcode-ui/group/page/problems.lua index 8e0cfcd..aaa2e66 100644 --- a/lua/leetcode-ui/group/page/problems.lua +++ b/lua/leetcode-ui/group/page/problems.lua @@ -33,12 +33,19 @@ local daily = Button("Daily", { on_press = cmd.qot, }) +local top_interview = Button("Top Interview", { + icon = "🔝", + sc = "t", + on_press = cmd.top_interview_150, +}) + local back = BackButton("menu") page:insert(Buttons({ list, random, daily, + top_interview, back, })) diff --git a/lua/leetcode/api/problems.lua b/lua/leetcode/api/problems.lua index 9049bb8..23d2085 100644 --- a/lua/leetcode/api/problems.lua +++ b/lua/leetcode/api/problems.lua @@ -110,6 +110,25 @@ function Problems.question_of_today(cb) }) end +function Problems.top_interview_150(cb) + local query = queries.study_plan_detail + + utils.query(query, { slug = "top-interview-150"}, { + callback = function(res, err) + if err then + return cb(nil, err) + end + local title_slugs = {} + for _, v in ipairs(res.data["studyPlanV2Detail"]["planSubGroups"]) do + for _, q in ipairs(v["questions"]) do + table.insert(title_slugs, q.title_slug) + end + end + return cb(title_slugs) + end + }) +end + function Problems.translated_titles(cb) local query = queries.translations diff --git a/lua/leetcode/api/queries.lua b/lua/leetcode/api/queries.lua index b835620..02b8276 100644 --- a/lua/leetcode/api/queries.lua +++ b/lua/leetcode/api/queries.lua @@ -178,5 +178,17 @@ queries.session_progress = [[ } } ]] + + queries.study_plan_detail = [[ + query studyPlanDetail($slug: String!) { + studyPlanV2Detail(planSlug: $slug) { + planSubGroups { + questions { + title_slug: titleSlug + } + } + } + } + ]] return queries diff --git a/lua/leetcode/api/question.lua b/lua/leetcode/api/question.lua index f76f561..65b17a3 100644 --- a/lua/leetcode/api/question.lua +++ b/lua/leetcode/api/question.lua @@ -34,6 +34,21 @@ function question.by_title_slug(title_slug) return q end +function question.get_top150() + local variables = { + slug = "top-interview-150" + } + local query = queries.top150 + + local res, err = utils.query(query, variables) + if not res or err then + return log.err(err) + end + + local q = res.data.studyPlanV2Detail.planSubGroups + +end + ---@param filters? table function question.random(filters) local variables = { diff --git a/lua/leetcode/cache/problemlist.lua b/lua/leetcode/cache/problemlist.lua index 13cbf0d..4b556ac 100644 --- a/lua/leetcode/cache/problemlist.lua +++ b/lua/leetcode/cache/problemlist.lua @@ -142,4 +142,12 @@ function Problemlist.delete() return pcall(path.rm, file) end +---@return lc.cache.Question +function Problemlist.get_by_title_slugs(title_slugs) + local problems = Problemlist.get() + return vim.tbl_filter(function(e) + return vim.tbl_contains(title_slugs, e.title_slug) + end, problems) +end + return Problemlist diff --git a/lua/leetcode/command/init.lua b/lua/leetcode/command/init.lua index a04d172..1474289 100644 --- a/lua/leetcode/command/init.lua +++ b/lua/leetcode/command/init.lua @@ -612,6 +612,21 @@ function cmd.setup() }) end +function cmd.top_interview_150() + require("leetcode.utils").auth_guard() + + local problems = require("leetcode.api.problems") + + problems.top_interview_150(function(slugs, err) + if err then + return log.err(err) + end + local p = require("leetcode.cache.problemlist").get_by_title_slugs(slugs) + local picker = require("leetcode.picker") + picker.question(p) + end) +end + cmd.commands = { cmd.menu, @@ -668,6 +683,9 @@ cmd.commands = { cmd.fix, _private = true, }, + top_interview = { + cmd.top_interview_150, + }, } return cmd