add new tasks

This commit is contained in:
Bendt
2025-12-18 15:40:03 -05:00
parent a63aadffcb
commit 0ed7800575
16 changed files with 1095 additions and 39 deletions

View File

@@ -59,6 +59,7 @@ class EmailViewerApp(App):
current_message_index: Reactive[int] = reactive(0)
highlighted_message_index: Reactive[int] = reactive(0)
folder = reactive("INBOX")
current_account: Reactive[str] = reactive("") # Empty string = default account
header_expanded = reactive(False)
reload_needed = reactive(True)
message_store = MessageStore()
@@ -233,7 +234,9 @@ class EmailViewerApp(App):
async def load_message_content(self, message_id: int) -> None:
"""Worker to load message content asynchronously."""
content_container = self.query_one(ContentContainer)
content_container.display_content(message_id)
folder = self.folder if self.folder else None
account = self.current_account if self.current_account else None
content_container.display_content(message_id, folder=folder, account=account)
metadata = self.message_store.get_metadata(message_id)
if metadata:
@@ -259,8 +262,12 @@ class EmailViewerApp(App):
if "Seen" in flags:
return # Already read
# Mark as read via himalaya
_, success = await himalaya_client.mark_as_read(message_id)
# Mark as read via himalaya with current folder/account
folder = self.folder if self.folder else None
account = self.current_account if self.current_account else None
_, success = await himalaya_client.mark_as_read(
message_id, folder=folder, account=account
)
if success:
# Update the envelope flags in the store
@@ -285,6 +292,16 @@ class EmailViewerApp(App):
if event.list_view.index is None:
return
# Handle folder selection
if event.list_view.id == "folders_list":
self._handle_folder_selected(event)
return
# Handle account selection
if event.list_view.id == "accounts_list":
self._handle_account_selected(event)
return
# Only handle selection from the envelopes list
if event.list_view.id != "envelopes_list":
return
@@ -307,6 +324,45 @@ class EmailViewerApp(App):
# Focus the main content panel after selecting a message
self.action_focus_4()
def _handle_folder_selected(self, event: ListView.Selected) -> None:
"""Handle folder selection from the folders list."""
try:
list_item = event.item
label = list_item.query_one(Label)
folder_name = str(label.renderable).strip()
if folder_name and folder_name != self.folder:
self.folder = folder_name
self.show_status(f"Switching to folder: {folder_name}")
# Clear current state and reload
self.current_message_id = 0
self.current_message_index = 0
self.selected_messages.clear()
self.reload_needed = True
except Exception as e:
logging.error(f"Error selecting folder: {e}")
def _handle_account_selected(self, event: ListView.Selected) -> None:
"""Handle account selection from the accounts list."""
try:
list_item = event.item
label = list_item.query_one(Label)
account_name = str(label.renderable).strip()
if account_name and account_name != self.current_account:
self.current_account = account_name
self.folder = "INBOX" # Reset to INBOX when switching accounts
self.show_status(f"Switching to account: {account_name}")
# Clear current state and reload
self.current_message_id = 0
self.current_message_index = 0
self.selected_messages.clear()
# Refresh folders for new account
self.fetch_folders()
self.reload_needed = True
except Exception as e:
logging.error(f"Error selecting account: {e}")
def on_list_view_highlighted(self, event: ListView.Highlighted) -> None:
"""Called when an item in the list view is highlighted (e.g., via arrow keys)."""
if event.list_view.index is None:
@@ -349,8 +405,12 @@ class EmailViewerApp(App):
try:
msglist.loading = True
# Use the Himalaya client to fetch envelopes
envelopes, success = await himalaya_client.list_envelopes()
# Use the Himalaya client to fetch envelopes with current folder/account
folder = self.folder if self.folder else None
account = self.current_account if self.current_account else None
envelopes, success = await himalaya_client.list_envelopes(
folder=folder, account=account
)
if success:
self.reload_needed = False
@@ -407,14 +467,19 @@ class EmailViewerApp(App):
try:
folders_list.loading = True
# Use the Himalaya client to fetch folders
folders, success = await himalaya_client.list_folders()
# Use the Himalaya client to fetch folders for current account
account = self.current_account if self.current_account else None
folders, success = await himalaya_client.list_folders(account=account)
if success and folders:
for folder in folders:
folder_name = str(folder["name"]).strip()
# Skip INBOX since we already added it
if folder_name.upper() == "INBOX":
continue
item = ListItem(
Label(
str(folder["name"]).strip(),
folder_name,
classes="folder_name",
markup=False,
)
@@ -560,10 +625,14 @@ class EmailViewerApp(App):
)
next_id_to_select = next_id
# Delete each message
# Delete each message with current folder/account
folder = self.folder if self.folder else None
account = self.current_account if self.current_account else None
success_count = 0
for mid in message_ids_to_delete:
message, success = await himalaya_client.delete_message(mid)
message, success = await himalaya_client.delete_message(
mid, folder=folder, account=account
)
if success:
success_count += 1
else:
@@ -629,8 +698,13 @@ class EmailViewerApp(App):
)
next_id_to_select = next_id
# Archive messages with current folder/account
folder = self.folder if self.folder else None
account = self.current_account if self.current_account else None
message, success = await himalaya_client.archive_messages(
[str(mid) for mid in message_ids_to_archive]
[str(mid) for mid in message_ids_to_archive],
folder=folder,
account=account,
)
if success:
@@ -671,7 +745,12 @@ class EmailViewerApp(App):
next_id, _ = self.message_store.find_prev_valid_id(current_idx)
next_id_to_select = next_id
message, success = await himalaya_client.archive_messages([str(current_id)])
# Archive with current folder/account
folder = self.folder if self.folder else None
account = self.current_account if self.current_account else None
message, success = await himalaya_client.archive_messages(
[str(current_id)], folder=folder, account=account
)
if success:
self.show_status(message or "Archived")