summaryrefslogtreecommitdiffstats
path: root/lua/inbox/view.lua
blob: cfe256c91c72901adc9b6e6b719e87b07eddf0af (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
local config = require("inbox.config")
local email = require("inbox.email")
local indexers = require("inbox.indexers")
local utils = require("inbox.utils")

local M = {}

---@param bufnr integer
function M.initialize(bufnr, maildir)
	if bufnr == 0 then
		bufnr = vim.api.nvim_get_current_buf()
	end

	if not vim.api.nvim_buf_is_valid(bufnr) then
		return
	end

	-- vim.api.nvim_clear_autocmds({ buffer = bufnr, group = "Inbox" })

	for k, v in pairs(config.buf_options) do
		vim.api.nvim_buf_set_option(bufnr, k, v)
	end

	local winid = vim.api.nvim_get_current_win()
	for k, v in pairs(config.win_options) do
		vim.api.nvim_set_option_value(k, v, { scope = "local", win = winid })
	end

	local bufname = string.format("maildir://%s", maildir)
	vim.api.nvim_buf_set_name(bufnr, bufname)

	M.render_buffer(bufnr)

	-- TODO: setup keymaps
end

---@param bufnr integer
function M.render_buffer(bufnr)
	if bufnr == 0 then
		bufnr = vim.api.nvim_get_current_buf()
	end

	if not vim.api.nvim_buf_is_valid(bufnr) then
		return false
	end

	local function render_buffer_async_callback(entries)
		-- TODO: sort entries?

		utils.render_table({ {} }, email.summary_widths)

		local summaries = {}

		-- local signs
		for _, entry in ipairs(entries) do
			local cols = email.sanitize_summary(entry)

			-- TODO: format signs
			-- local _ = email.tags
			-- table.insert(signs, email.tags)

			table.insert(summaries, cols)
		end

		-- TODO: configurable table columns and column widths

		local lines, _ = utils.render_table(summaries, email.summary_widths)

		-- TODO: setup highlights
		-- TODO: setup signs (tags)

		vim.bo[bufnr].modifiable = true
		vim.api.nvim_buf_set_lines(bufnr, 0, -1, true, lines)
		vim.bo[bufnr].modifiable = false
		vim.bo[bufnr].modified = false

		local winid = vim.api.nvim_get_current_win()

		for k, v in pairs(config.win_options) do
			vim.api.nvim_set_option_value(k, v, { scope = "local", win = winid })
		end

		local winbar = utils.render_row({ "Date", "From", "Subject" }, email.summary_widths)
		local offset = vim.fn.getwininfo(winid)[1].textoff + 1
		vim.api.nvim_set_option_value("winbar", string.rep(" ", offset) .. winbar, { scope = "local", win = winid })
	end

	-- TODO: cache entries

	local indexer = indexers.get_indexer()

	local bufname = vim.api.nvim_buf_get_name(bufnr)
	local maildir = bufname:gsub("maildir://", "")

	indexer.index(render_buffer_async_callback, { folder = maildir })
end

return M