add new tasks
This commit is contained in:
103
src/mail/app.py
103
src/mail/app.py
@@ -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")
|
||||
|
||||
Reference in New Issue
Block a user