Skip to content

Commit e244ba0

Browse files
author
djmaze
committed
Much better fix for #175
And added some comments to it, to prevent more screw ups
1 parent 11547b5 commit e244ba0

File tree

6 files changed

+83
-75
lines changed

6 files changed

+83
-75
lines changed

dev/Common/Cache.js

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -181,19 +181,20 @@ export class MessageFlagsCache
181181
static initMessage(message) {
182182
if (message) {
183183
const uid = message.uid,
184-
flags = this.getFor(message.folder, uid);
184+
flags = this.getFor(message.folder, uid),
185+
thread = message.threads;
185186

186187
if (isArray(flags)) {
187188
message.flags(flags);
188189
}
189190

190-
if (message.threads.length) {
191-
const unseenSubUid = message.threads.find(sSubUid =>
192-
(uid !== sSubUid) && !this.hasFlag(message.folder, sSubUid, '\\seen')
191+
if (thread.length) {
192+
const unseenSubUid = thread.find(iSubUid =>
193+
(uid !== iSubUid) && !this.hasFlag(message.folder, iSubUid, '\\seen')
193194
);
194195

195-
const flaggedSubUid = message.threads.find(sSubUid =>
196-
(uid !== sSubUid) && this.hasFlag(message.folder, sSubUid, '\\flagged')
196+
const flaggedSubUid = thread.find(iSubUid =>
197+
(uid !== iSubUid) && this.hasFlag(message.folder, iSubUid, '\\flagged')
197198
);
198199

199200
message.hasUnseenSubMessage(!!unseenSubUid);

dev/Remote/User/Fetch.js

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ class RemoteUserFetch extends AbstractFetchRemote {
3535
Offset: 0,
3636
Limit: SettingsUserStore.messagesPerPage(),
3737
Search: '',
38-
UidNext: getFolderInboxName() === sFolderFullName ? getFolderUidNext(sFolderFullName) : '',
38+
UidNext: getFolderUidNext(sFolderFullName), // Used to check for new messages
3939
Sort: FolderUserStore.sortMode(),
4040
Hash: folderHash + SettingsGet('AccountHash')
4141
}, params);
@@ -104,11 +104,10 @@ class RemoteUserFetch extends AbstractFetchRemote {
104104
* @param {Array=} list = []
105105
*/
106106
folderInformation(fCallback, folder, list = []) {
107-
let request = true;
107+
let fetch = !arrayLength(list);
108108
const uids = [];
109109

110-
if (arrayLength(list)) {
111-
request = false;
110+
if (!fetch) {
112111
list.forEach(messageListItem => {
113112
if (!MessageFlagsCache.getFor(messageListItem.folder, messageListItem.uid)) {
114113
uids.push(messageListItem.uid);
@@ -122,17 +121,14 @@ class RemoteUserFetch extends AbstractFetchRemote {
122121
});
123122
}
124123
});
125-
126-
if (uids.length) {
127-
request = true;
128-
}
124+
fetch = uids.length;
129125
}
130126

131-
if (request) {
127+
if (fetch) {
132128
this.request('FolderInformation', fCallback, {
133129
Folder: folder,
134-
FlagsUids: isArray(uids) ? uids : [],
135-
UidNext: getFolderInboxName() === folder ? getFolderUidNext(folder) : 0
130+
FlagsUids: uids,
131+
UidNext: getFolderUidNext(folder) // Used to check for new messages
136132
});
137133
} else if (SettingsUserStore.useThreads()) {
138134
rl.app.reloadFlagsCurrentMessageListAndMessageFromCache();

dev/Stores/User/Message.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -412,7 +412,7 @@ export const MessageUserStore = new class {
412412
message.folder === json.Folder
413413
) {
414414
const threads = message.threads();
415-
if (message.uid != json.Uid && 1 < threads.length && threads.includes(json.Uid)) {
415+
if (message.uid != json.Uid && threads.includes(json.Uid)) {
416416
message = oMessage ? null : MessageModel.reviveFromJson(json);
417417
if (message) {
418418
message.threads(threads);

snappymail/v/0.0.0/app/libraries/MailSo/Mail/MailClient.php

Lines changed: 40 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -544,13 +544,13 @@ protected function initFolderValues(string $sFolderName) : array
544544
$aFolderStatus = $this->oImapClient->FolderStatus($sFolderName, $aTypes);
545545

546546
return [
547-
$aFolderStatus[FolderResponseStatus::MESSAGES] ?: 0,
547+
\max(0, $aFolderStatus[FolderResponseStatus::MESSAGES] ?: 0),
548548

549-
$aFolderStatus[FolderResponseStatus::UNSEEN] ?: 0,
549+
\max(0, $aFolderStatus[FolderResponseStatus::UNSEEN] ?: 0),
550550

551-
$aFolderStatus[FolderResponseStatus::UIDNEXT] ?: 0,
551+
\max(0, $aFolderStatus[FolderResponseStatus::UIDNEXT] ?: 0),
552552

553-
$aFolderStatus[FolderResponseStatus::HIGHESTMODSEQ] ?: 0,
553+
\max(0, $aFolderStatus[FolderResponseStatus::HIGHESTMODSEQ] ?: 0),
554554

555555
$aFolderStatus[FolderResponseStatus::APPENDLIMIT] ?: $this->oImapClient->AppendLimit(),
556556

@@ -575,11 +575,15 @@ public function GenerateFolderHash(string $sFolder, int $iCount, int $iUidNext,
575575
);
576576
}
577577

578+
/**
579+
* Returns list of new messages since $iPrevUidNext
580+
* Currently only for INBOX
581+
*/
578582
private function getFolderNextMessageInformation(string $sFolderName, int $iPrevUidNext, int $iCurrentUidNext) : array
579583
{
580584
$aNewMessages = array();
581585

582-
if ($iPrevUidNext && $iPrevUidNext != $iCurrentUidNext)
586+
if ($iPrevUidNext && $iPrevUidNext != $iCurrentUidNext && 'INBOX' === $sFolderName && \MailSo\Config::$CheckNewMessages)
583587
{
584588
$this->oImapClient->FolderSelect($sFolderName);
585589

@@ -611,22 +615,15 @@ private function getFolderNextMessageInformation(string $sFolderName, int $iPrev
611615
\MailSo\Mime\Enumerations\Parameter::CHARSET
612616
);
613617

614-
$sCharset = '';
615-
if (\strlen($sContentTypeCharset))
616-
{
617-
$sCharset = $sContentTypeCharset;
618-
}
619-
620-
if (\strlen($sCharset))
621-
{
622-
$oHeaders->SetParentCharset($sCharset);
618+
if ($sContentTypeCharset) {
619+
$oHeaders->SetParentCharset($sContentTypeCharset);
623620
}
624621

625622
$aNewMessages[] = array(
626623
'Folder' => $sFolderName,
627624
'Uid' => $iUid,
628-
'Subject' => $oHeaders->ValueByName(\MailSo\Mime\Enumerations\Header::SUBJECT, !\strlen($sCharset)),
629-
'From' => $oHeaders->GetAsEmailCollection(\MailSo\Mime\Enumerations\Header::FROM_, !\strlen($sCharset))
625+
'Subject' => $oHeaders->ValueByName(\MailSo\Mime\Enumerations\Header::SUBJECT, !$sContentTypeCharset),
626+
'From' => $oHeaders->GetAsEmailCollection(\MailSo\Mime\Enumerations\Header::FROM_, !$sContentTypeCharset)
630627
);
631628
}
632629
}
@@ -677,8 +674,7 @@ public function FolderInformation(string $sFolderName, int $iPrevUidNext = 0, ar
677674
'HighestModSeq' => $iHighestModSeq,
678675
'AppendLimit' => $iAppendLimit,
679676
'MailboxId' => $sMailboxId,
680-
'NewMessages' => 'INBOX' === $sFolderName && \MailSo\Config::$CheckNewMessages ?
681-
$this->getFolderNextMessageInformation($sFolderName, $iPrevUidNext, $iUidNext) : array()
677+
'NewMessages' => $this->getFolderNextMessageInformation($sFolderName, $iPrevUidNext, $iUidNext)
682678
);
683679
}
684680

@@ -1017,7 +1013,7 @@ public function MessageList(\MailSo\Mail\MessageListParams $oParams) : MessageCo
10171013

10181014
$oMessageCollection->UidNext = $iUidNext;
10191015

1020-
if (!$oParams->iThreadUid && $oParams->iPrevUidNext && 'INBOX' === $oParams->sFolderName)
1016+
if (!$oParams->iThreadUid)
10211017
{
10221018
$oMessageCollection->NewMessages = $this->getFolderNextMessageInformation(
10231019
$oParams->sFolderName, $oParams->iPrevUidNext, $iUidNext);
@@ -1033,14 +1029,12 @@ public function MessageList(\MailSo\Mail\MessageListParams $oParams) : MessageCo
10331029
$bUseThreads = false;
10341030
}
10351031

1036-
if (0 < $iMessageRealCount && !$bMessageListOptimization)
1032+
if ($iMessageRealCount && !$bMessageListOptimization)
10371033
{
1038-
$aUids = $this->GetUids($oParams->oCacher, '',
1039-
$oMessageCollection->FolderName, $oMessageCollection->FolderHash, $bUseSortIfSupported, $oParams->sSort);
1040-
10411034
if ($bUseThreads) {
10421035
$aAllThreads = $this->MessageListThreadsMap($oMessageCollection->FolderName, $oMessageCollection->FolderHash, $oParams->oCacher);
1043-
if (0 < $oParams->iThreadUid)
1036+
1037+
if ($oParams->iThreadUid)
10441038
{
10451039
$aUids = [$oParams->iThreadUid];
10461040
// Only show the selected thread messages
@@ -1053,13 +1047,20 @@ public function MessageList(\MailSo\Mail\MessageListParams $oParams) : MessageCo
10531047
}
10541048
else
10551049
{
1056-
// Show all threads
1057-
// $aUids = array();
1058-
// \array_walk_recursive($aAllThreads, function($a) use (&$aUids) { $aUids[] = $a; });
1050+
$aUids = $this->GetUids($oParams->oCacher, '',
1051+
$oMessageCollection->FolderName, $oMessageCollection->FolderHash, $bUseSortIfSupported, $oParams->sSort);
1052+
// Remove all threaded UID's except the most recent of each thread
1053+
foreach ($aAllThreads as $aMap) {
1054+
unset($aMap[\array_key_last($aMap)]);
1055+
$aUids = \array_diff($aUids, $aMap);
1056+
}
10591057
}
1058+
} else {
1059+
$aUids = $this->GetUids($oParams->oCacher, '',
1060+
$oMessageCollection->FolderName, $oMessageCollection->FolderHash, $bUseSortIfSupported, $oParams->sSort);
10601061
}
10611062

1062-
if (\strlen($sSearch) && \is_array($aUids))
1063+
if ($aUids && \strlen($sSearch))
10631064
{
10641065
$aSearchedUids = $this->GetUids($oParams->oCacher, $sSearch,
10651066
$oMessageCollection->FolderName, $oMessageCollection->FolderHash);
@@ -1084,26 +1085,19 @@ public function MessageList(\MailSo\Mail\MessageListParams $oParams) : MessageCo
10841085
$aUids = \array_unique($aNewUids);
10851086
unset($aNewUids);
10861087
}
1087-
else
1088-
{
1089-
$aUids = array();
1090-
}
10911088
}
10921089

1093-
if (\is_array($aUids))
1094-
{
1095-
$oMessageCollection->MessageCount = $iMessageRealCount;
1096-
$oMessageCollection->MessageUnseenCount = $iMessageUnseenCount;
1097-
$oMessageCollection->MessageResultCount = \count($aUids);
1090+
$oMessageCollection->MessageCount = $iMessageRealCount;
1091+
$oMessageCollection->MessageUnseenCount = $iMessageUnseenCount;
1092+
$oMessageCollection->MessageResultCount = \count($aUids);
10981093

1099-
if (\count($aUids))
1100-
{
1101-
$aRequestUids = \array_slice($aUids, $oParams->iOffset, $oParams->iLimit);
1102-
$this->MessageListByRequestIndexOrUids($oMessageCollection, $aRequestUids, true);
1103-
}
1094+
if (\count($aUids))
1095+
{
1096+
$aRequestUids = \array_slice($aUids, $oParams->iOffset, $oParams->iLimit);
1097+
$this->MessageListByRequestIndexOrUids($oMessageCollection, $aRequestUids, true);
11041098
}
11051099
}
1106-
else if (0 < $iMessageRealCount)
1100+
else if ($iMessageRealCount)
11071101
{
11081102
if ($this->oLogger)
11091103
{
@@ -1148,11 +1142,12 @@ public function MessageList(\MailSo\Mail\MessageListParams $oParams) : MessageCo
11481142
}
11491143
}
11501144

1151-
if ($bUseThreads && !$oParams->iThreadUid && $aAllThreads)
1145+
if ($aAllThreads && !$oParams->iThreadUid)
11521146
{
11531147
foreach ($oMessageCollection as $oMessage) {
11541148
$iUid = $oMessage->Uid();
1155-
// Find thread
1149+
// Find thread and set it.
1150+
// Used by GUI to delete/move the whole thread or other features
11561151
foreach ($aAllThreads as $aMap) {
11571152
if (\in_array($iUid, $aMap)) {
11581153
$oMessage->SetThreads($aMap);

snappymail/v/0.0.0/app/libraries/MailSo/Mail/MessageListParams.php

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,29 @@ class MessageListParams
1515
{
1616
public
1717
$sFolderName, // string
18-
$iOffset = 0, // int
19-
$iLimit = 10, // int
2018
$sSearch = '', // string
21-
$iPrevUidNext = 0, // int
2219
$oCacher = null, // ?\MailSo\Cache\CacheClient
2320
$bUseSortIfSupported = false, // bool
2421
$bUseThreads = false, // bool
25-
$iThreadUid = 0, // int
2622
$sSort = ''; // string
23+
24+
protected
25+
$iOffset = 0,
26+
$iLimit = 10,
27+
$iPrevUidNext = 0, // used to check for new messages
28+
$iThreadUid = 0;
29+
30+
public function __get($k)
31+
{
32+
return \property_exists($this, $k) ? $this->$k : null;
33+
}
34+
35+
public function __set($k, $v)
36+
{
37+
if ('i' === $k[0]) {
38+
$this->$k = \max(0, (int) $v);
39+
}
40+
// \MailSo\Base\Validator::RangeInt($oParams->iOffset, 0)
41+
// \MailSo\Base\Validator::RangeInt($oParams->iLimit, 0, 999)
42+
}
2743
}

snappymail/v/0.0.0/app/libraries/RainLoop/Actions/Messages.php

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -26,29 +26,29 @@ public function DoMessageList() : array
2626

2727
// $oParams->sHash = (string) $aValues['Hash'];
2828
$oParams->sFolderName = (string) $aValues['Folder'];
29-
$oParams->iLimit = (int) $aValues['Limit'];
30-
$oParams->iOffset = (int) $aValues['Offset'];
29+
$oParams->iLimit = $aValues['Limit'];
30+
$oParams->iOffset = $aValues['Offset'];
3131
$oParams->sSearch = (string) $aValues['Search'];
3232
$oParams->sSort = (string) $aValues['Sort'];
3333
if (isset($aValues['UidNext'])) {
34-
$oParams->iPrevUidNext = (int) $aValues['UidNext'];
34+
$oParams->iPrevUidNext = $aValues['UidNext'];
3535
}
3636
$oParams->bUseThreads = !empty($aValues['UseThreads']);
3737
if ($oParams->bUseThreads && isset($aValues['ThreadUid'])) {
38-
$oParams->iThreadUid = (int) $aValues['ThreadUid'];
38+
$oParams->iThreadUid = $aValues['ThreadUid'];
3939
}
4040
}
4141
else
4242
{
4343
$oParams->sFolderName = $this->GetActionParam('Folder', '');
44-
$oParams->iOffset = (int) $this->GetActionParam('Offset', 0);
45-
$oParams->iLimit = (int) $this->GetActionParam('Limit', 10);
44+
$oParams->iOffset = $this->GetActionParam('Offset', 0);
45+
$oParams->iLimit = $this->GetActionParam('Limit', 10);
4646
$oParams->sSearch = $this->GetActionParam('Search', '');
4747
$oParams->sSort = $this->GetActionParam('Sort', '');
48-
$oParams->iPrevUidNext = (int) $this->GetActionParam('UidNext', 0);
48+
$oParams->iPrevUidNext = $this->GetActionParam('UidNext', 0);
4949
$oParams->bUseThreads = !empty($this->GetActionParam('UseThreads', '0'));
5050
if ($oParams->bUseThreads) {
51-
$oParams->iThreadUid = (int) $this->GetActionParam('ThreadUid', '');
51+
$oParams->iThreadUid = $this->GetActionParam('ThreadUid', '');
5252
}
5353
}
5454

0 commit comments

Comments
 (0)