diff options
| author | Bobby <[email protected]> | 2025-12-24 13:50:07 +0530 |
|---|---|---|
| committer | Bobby <[email protected]> | 2025-12-24 13:50:07 +0530 |
| commit | b77d75f05fb2059389c05f6c01484e0cd12e796e (patch) | |
| tree | e3c5521bf9ed3fcffd59960053d651091496a7ea /utils/email | |
| parent | 81ab367f440d6f85297b2013d0c1aa57fda7e9cd (diff) | |
| download | lain-b77d75f05fb2059389c05f6c01484e0cd12e796e.tar.xz lain-b77d75f05fb2059389c05f6c01484e0cd12e796e.zip | |
feat: introduce email folder synchronization and management, refactor email services, and update UI styles
Diffstat (limited to 'utils/email')
| -rw-r--r-- | utils/email/folders.go | 132 |
1 files changed, 132 insertions, 0 deletions
diff --git a/utils/email/folders.go b/utils/email/folders.go index 3acffae..1ae2bf4 100644 --- a/utils/email/folders.go +++ b/utils/email/folders.go @@ -1,11 +1,32 @@ package email import ( + "lain/models" "lain/types" + "net/url" + "strings" "github.com/emersion/go-imap" + "github.com/gofiber/fiber/v2" ) +func GetDisplayName(imapName string) string { + if strings.Contains(imapName, "/") { + parts := strings.Split(imapName, "/") + lastPart := parts[len(parts)-1] + if strings.ToLower(lastPart) == "inbox" { + return "Inbox" + } + return lastPart + } + + if strings.ToLower(imapName) == "inbox" { + return "Inbox" + } + + return imapName +} + func FetchFolders(client *types.EmailClient) ([]types.IMAPFolder, error) { mailboxes := make(chan *imap.MailboxInfo, 10) done := make(chan error, 1) @@ -28,3 +49,114 @@ func FetchFolders(client *types.EmailClient) ([]types.IMAPFolder, error) { return folders, nil } + +func GetFolderType(folderName string, iconMap map[string]types.FolderIconVariant) string { + nameLower := strings.ToLower(folderName) + + if strings.Contains(folderName, "/") { + parts := strings.Split(folderName, "/") + nameLower = strings.ToLower(parts[len(parts)-1]) + } + + for iconType := range iconMap { + if iconType == "default" { + continue + } + if strings.Contains(nameLower, iconType) { + return iconType + } + } + + return "default" +} + +func SortFolders(folders []models.Folder) { + for i := 0; i < len(folders)-1; i++ { + for j := 0; j < len(folders)-i-1; j++ { + if folders[j].SortOrder > folders[j+1].SortOrder { + folders[j], folders[j+1] = folders[j+1], folders[j] + } else if folders[j].SortOrder == folders[j+1].SortOrder { + if strings.ToLower(folders[j].IMAPName) > strings.ToLower(folders[j+1].IMAPName) { + folders[j], folders[j+1] = folders[j+1], folders[j] + } + } + } + } +} + +func GetSortOrder(folderName string, index int) int { + nameLower := strings.ToLower(folderName) + + if nameLower == "inbox" { + return 0 + } + if strings.Contains(nameLower, "draft") { + return 1 + } + if strings.Contains(nameLower, "sent") { + return 2 + } + if strings.Contains(nameLower, "archive") { + return 3 + } + if strings.Contains(nameLower, "trash") || strings.Contains(nameLower, "deleted") { + return 4 + } + if strings.Contains(nameLower, "spam") || strings.Contains(nameLower, "junk") { + return 5 + } + + if strings.Contains(folderName, "/") { + parts := strings.Split(folderName, "/") + baseOrder := GetSortOrder(parts[0], index) + return baseOrder + 1000 + (index * 10) + } + + return 100 + index +} + +func CopyFolderMap(folder fiber.Map) fiber.Map { + copy := fiber.Map{} + for k, v := range folder { + if k == "Subfolders" { + if subfolders, ok := v.([]fiber.Map); ok { + subfoldersCopy := make([]fiber.Map, len(subfolders)) + for i, sf := range subfolders { + subfoldersCopy[i] = CopyFolderMap(sf) + } + copy[k] = subfoldersCopy + } + } else { + copy[k] = v + } + } + return copy +} + +func IsVirtualFolder(folderName string) bool { + return strings.HasPrefix(folderName, "Virtual") || strings.Contains(folderName, "/Virtual") +} + +func UpdateActiveFolder(folders []fiber.Map, activeFolder string) []fiber.Map { + decodedActive, _ := url.QueryUnescape(activeFolder) + activeLower := strings.ToLower(decodedActive) + + foldersCopy := make([]fiber.Map, len(folders)) + for i, f := range folders { + foldersCopy[i] = CopyFolderMap(f) + } + + var updateActive func([]fiber.Map) + updateActive = func(folderList []fiber.Map) { + for i := range folderList { + imapNameLower := strings.ToLower(folderList[i]["IMAPName"].(string)) + folderList[i]["Active"] = imapNameLower == activeLower + if subfolders, ok := folderList[i]["Subfolders"].([]fiber.Map); ok && len(subfolders) > 0 { + updateActive(subfolders) + } + } + } + + updateActive(foldersCopy) + return foldersCopy +} |
