425 Commits

Author SHA1 Message Date
Burak Kaan Köse
b64cc44531 Bumping some nugets. 2024-08-26 11:30:29 +02:00
Burak Kaan Köse
1b51982551 Merge pull request #335 from bkaankose/code-quality/tabbed-commandbar
Code Quality: TabbedCommandBar
2024-08-26 01:14:29 +02:00
Aleh Khantsevich
10c94efa57 Fix priority button size 2024-08-26 00:58:41 +02:00
Aleh Khantsevich
c84316e974 Added translations for discard/send buttons in composer 2024-08-26 00:31:12 +02:00
Aleh Khantsevich
7e4d1fbf49 Replace custom pivot + command bar with tabbed commandbar 2024-08-25 23:52:55 +02:00
Burak Kaan Köse
31c7c8b46f Remove unused namespace. 2024-08-25 21:45:13 +02:00
Burak Kaan Köse
8cdb6646c4 Fixed account re-ordering issues with merged accounts. 2024-08-25 19:51:19 +02:00
Burak Kaan Köse
43a51e5f2f Per-session ImapSynchronizer protocol log based on accounts. 2024-08-25 10:32:07 +02:00
Burak Kaan Köse
d0b54ea44b Prevent delay between mail addings and better folder init cancellation. 2024-08-25 02:01:08 +02:00
Burak Kaan Köse
c8fce82dc1 Fix merged accounts report progress for incorrect account during synchronization. 2024-08-24 21:09:20 +02:00
Burak Kaan Köse
3ffccaa7e5 Fixed non-updating UI for thread items. 2024-08-24 18:12:20 +02:00
Burak Kaan Köse
3f7e7a1474 Generalized sender-from name for IMAP synchronizer. 2024-08-24 17:35:46 +02:00
Burak Kaan Köse
d30c15464b Fix account folder layout is not updated if there is a change after the synchronization. 2024-08-24 17:22:47 +02:00
Burak Kaan Köse
2a1f748469 Fix for to,cc and bcc fields are cut out in rendering page. 2024-08-24 17:22:03 +02:00
Burak Kaan Köse
74b429b1bf Applying default xaml styler configs. 2024-08-24 16:16:56 +02:00
Burak Kaan Köse
7afe1b517c Ignore task bar pinning errors. 2024-08-24 16:10:14 +02:00
Burak Kaan Köse
fcdcf5692f Fix indentation. 2024-08-24 16:06:36 +02:00
Burak Kaan Köse
735baa67ed Default XamlStyler config for the solution. 2024-08-24 16:06:14 +02:00
Burak Kaan Köse
ac00caf83e AccountContact comments. 2024-08-24 16:06:06 +02:00
Burak Kaan Köse
2ccda353e9 Debug log messages on updating flag changes. 2024-08-24 15:54:35 +02:00
Burak Kaan Köse
4257ca54b7 Fix updating folder on name changes for imap. 2024-08-24 15:54:12 +02:00
Burak Kaan Köse
20dd2ef98d Min log level to Debug for debug builds. 2024-08-24 15:53:46 +02:00
Burak Kaan Köse
8be52c9ddd Capitilize first letter of folder names if all capital for IMAP. 2024-08-24 15:38:52 +02:00
Burak Kaan Köse
3bea6619fa Enable all folder sync for gmail. 2024-08-24 15:38:23 +02:00
Burak Kaan Köse
0e5fb11c52 Fix for missing folder update changes for gmail. 2024-08-24 15:26:08 +02:00
Burak Kaan Köse
fc47f7701d Always focus to first line on editor focus. 2024-08-24 15:13:02 +02:00
Burak Kaan Köse
3e4ccf8de4 Merge pull request #331 from bkaankose/feature/ContactPictures
Account contact pictures
2024-08-24 12:55:04 +02:00
Burak Kaan Köse
8abb3c709b More logging for App.xaml.cs 2024-08-24 12:54:39 +02:00
Burak Kaan Köse
5263900620 Async cancellation support for contact picture loading. 2024-08-24 01:57:36 +02:00
Burak Kaan Köse
54ee9e5072 Remove redundant IsKnown property. 2024-08-24 01:57:19 +02:00
Burak Kaan Köse
20f4857405 Root contact concept. 2024-08-24 00:14:32 +02:00
Burak Kaan Köse
55110dd39d Merge pull request #333 from bkaankose/l10n_main
New Crowdin updates
2024-08-23 15:04:04 +02:00
Burak Kaan Köse
07d8111df9 New translations resources.json (Indonesian) 2024-08-23 15:03:46 +02:00
Burak Kaan Köse
a701b97f1e New translations resources.json (Portuguese, Brazilian) 2024-08-23 15:03:45 +02:00
Burak Kaan Köse
b025537d62 New translations resources.json (Galician) 2024-08-23 15:03:44 +02:00
Burak Kaan Köse
e68bc2de65 New translations resources.json (Chinese Simplified) 2024-08-23 15:03:43 +02:00
Burak Kaan Köse
d0b1c93382 New translations resources.json (Ukrainian) 2024-08-23 15:03:42 +02:00
Burak Kaan Köse
a08fa9eabf New translations resources.json (Turkish) 2024-08-23 15:03:40 +02:00
Burak Kaan Köse
65ef130bda New translations resources.json (Russian) 2024-08-23 15:03:39 +02:00
Burak Kaan Köse
32471a71e5 New translations resources.json (Polish) 2024-08-23 15:03:38 +02:00
Burak Kaan Köse
ca80f01907 New translations resources.json (Dutch) 2024-08-23 15:03:37 +02:00
Burak Kaan Köse
b1fae57922 New translations resources.json (Japanese) 2024-08-23 15:03:36 +02:00
Burak Kaan Köse
dea01dda2d New translations resources.json (Italian) 2024-08-23 15:03:35 +02:00
Burak Kaan Köse
9777619259 New translations resources.json (Finnish) 2024-08-23 15:03:34 +02:00
Burak Kaan Köse
6db0f84f8f New translations resources.json (Greek) 2024-08-23 15:03:32 +02:00
Burak Kaan Köse
84e382fcc5 New translations resources.json (German) 2024-08-23 15:03:31 +02:00
Burak Kaan Köse
eceed1b934 New translations resources.json (Danish) 2024-08-23 15:03:30 +02:00
Burak Kaan Köse
e7b5cd74a4 New translations resources.json (Czech) 2024-08-23 15:03:29 +02:00
Burak Kaan Köse
a98930791c New translations resources.json (Catalan) 2024-08-23 15:03:28 +02:00
Burak Kaan Köse
67b0389097 New translations resources.json (Spanish) 2024-08-23 15:03:27 +02:00
Burak Kaan Köse
ff30595fb4 New translations resources.json (French) 2024-08-23 15:03:26 +02:00
Burak Kaan Köse
d272b62c45 Remove commented code. 2024-08-23 14:54:30 +02:00
Burak Kaan Köse
c1973023d0 Fix for webview2 not focusing properly issue. 2024-08-23 03:00:22 +02:00
Burak Kaan Köse
ef4689619e Displaying contact picture for rendering page and small adjustments for addresses UI. 2024-08-23 02:23:52 +02:00
Burak Kaan Köse
9ed297a49d New contact picture display for address fields. 2024-08-23 02:23:27 +02:00
Burak Kaan Köse
9950729080 New contact retrival method. 2024-08-23 02:07:50 +02:00
Burak Kaan Köse
36eec9d061 Remove obsolete code. 2024-08-23 02:07:32 +02:00
Burak Kaan Köse
fd3a977009 Creating contract on profile update. 2024-08-23 02:07:25 +02:00
Burak Kaan Köse
ff88832cca Asynchronously load correct contact data for composer. 2024-08-23 02:06:58 +02:00
Burak Kaan Köse
d69b72b77d Fixed not-scrollable address infos for to,cc and bcc fields. 2024-08-23 02:06:28 +02:00
Burak Kaan Köse
d9bd9e996b Fix for duplicating incorrect address info in rendering page. 2024-08-23 02:05:15 +02:00
Burak Kaan Köse
f45580be70 Adding contact details for loaded mails and fixing background notification actions. 2024-08-23 01:07:00 +02:00
Burak Kaan Köse
0fbeb11304 Merge pull request #329 from bkaankose/feature/NewStartup
Handling app termination and reworked dialog messages.
2024-08-22 18:41:38 +02:00
Burak Kaan Köse
6a70c13b57 Merge pull request #330 from bkaankose/fix/editor-full-height
Make Jodit fill all available height of webview
2024-08-22 14:01:25 +02:00
Aleh Khantsevich
f797520e56 Make Jodit fill all available height of webview 2024-08-22 01:59:09 +02:00
Burak Kaan Köse
d060db3c96 Fixing an issue where doing folder config on account does not refresh the folder list. 2024-08-22 01:20:08 +02:00
Burak Kaan Köse
298344c2ab Remove async from adding attachments. 2024-08-22 00:57:46 +02:00
Burak Kaan Köse
53dbeadabb Prevent asking users for startup launch if they already did that. 2024-08-22 00:52:41 +02:00
Burak Kaan Köse
93087d7aa7 Ask for enable startup on first launch. 2024-08-22 00:51:10 +02:00
Burak Kaan Köse
c304517fc2 Revert debug code. 2024-08-21 23:30:57 +02:00
Burak Kaan Köse
af13e034c3 New resource strings for app closing handlers. 2024-08-21 23:22:32 +02:00
Burak Kaan Köse
e6b9d59160 Potential crash for imap. 2024-08-21 23:16:46 +02:00
Burak Kaan Köse
bd9cbe30c5 Fixed crashing issue with disposing composing page. 2024-08-21 23:14:59 +02:00
Burak Kaan Köse
f627226da9 Server termination and refactoring message dialogs. 2024-08-21 22:42:52 +02:00
Burak Kaan Köse
bab3272970 Fix couple potential crash issues due to unsupported APIs. 2024-08-21 19:50:14 +02:00
Burak Kaan Köse
003085db7e Merge pull request #328 from bkaankose/hotfix/LogsArchive
Fixing sharing logs
2024-08-21 13:58:39 +02:00
Burak Kaan Köse
8f98bd37c7 Implemented log archive. 2024-08-21 13:54:24 +02:00
Burak Kaan Köse
6971ef1ede Remove imap protocol log sharing since it's already moved to a separate dialog when error occurs during setup. 2024-08-21 13:49:38 +02:00
Burak Kaan Köse
0baac3dc49 Addressing some Outlook sending issues due to API delay. 2024-08-21 13:15:50 +02:00
Burak Kaan Köse
16feb8602d Getting rid of ARM32 and preperation for beta 1.8.3. 2024-08-21 03:54:36 +02:00
Burak Kaan Köse
d623129d56 Merge pull request #325 from bkaankose/features/mail-list-splitter
Mail List splitter
2024-08-19 21:21:28 +02:00
Aleh Khantsevich
9cc4c33bb1 Fix multiselect and hide sizer 2024-08-19 21:16:58 +02:00
Burak Kaan Köse
c087b40d4a Renaming event handlers and fixing the search box margin issue. 2024-08-19 21:07:21 +02:00
Aleh Khantsevich
a82e074bd4 Fix merge conflicts 2024-08-19 20:50:14 +02:00
Burak Kaan Köse
3365c099bb Missing comments. 2024-08-19 20:43:26 +02:00
Aleh Khantsevich
d8705de26f Replaced setting with reset button 2024-08-19 20:41:55 +02:00
Burak Kaan Köse
3af181e736 Merge pull request #324 from bkaankose/feature/Aliases
E-mail Aliases Support
2024-08-19 20:37:58 +02:00
Burak Kaan Köse
ba6c01b7c6 Missing comments. 2024-08-19 19:16:54 +02:00
Burak Kaan Köse
7a7cdcb041 Remove json.net dependency to STJson 2024-08-19 19:16:47 +02:00
Burak Kaan Köse
09e52bf199 Remove not implemented comment. 2024-08-19 19:05:54 +02:00
Burak Kaan Köse
a8c39a1587 Fixing send draft issue with OutlookSynchronizer. 2024-08-19 19:02:33 +02:00
Aleh Khantsevich
68536d6c34 Fix padding in narrow state 2024-08-19 18:49:35 +02:00
Aleh Khantsevich
f57c27e755 Fix multiple items selected 2024-08-19 17:15:59 +02:00
Aleh Khantsevich
9a97a27c8a Init 2024-08-19 16:26:15 +02:00
Burak Kaan Köse
07bb90dda9 Refactoring outlook draft creation and sending. 2024-08-19 03:44:16 +02:00
Burak Kaan Köse
3bb156f4da Handling of OutlookSynchronizer alias. 2024-08-18 22:45:23 +02:00
Burak Kaan Köse
e13e0efcc6 Bump some nugets. 2024-08-18 22:44:55 +02:00
Burak Kaan Köse
3ae0a94159 Remove folder init progress bar in mail list page. 2024-08-18 22:27:31 +02:00
Burak Kaan Köse
eec67ec7dc Fixed an issue where re-loading messages with attachments break the included attachment encodings. 2024-08-18 22:25:29 +02:00
Burak Kaan Köse
cf51853eec Removed non-mandatory reply-to validation. 2024-08-18 01:11:23 +02:00
Burak Kaan Köse
67838b28a4 Syntactic sugar. 2024-08-18 01:06:21 +02:00
Burak Kaan Köse
bf68e3b7d5 Fix sending draft issue. 2024-08-18 01:05:43 +02:00
Burak Kaan Köse
91ed0bb8bd Ability to select alias in composer page. 2024-08-17 22:55:58 +02:00
Burak Kaan Köse
55fe791c2a Handling of missing mime downloads and mail processed messages. 2024-08-17 20:19:01 +02:00
Burak Kaan Köse
747efac2ec Reworked aliases. 2024-08-17 19:54:52 +02:00
Burak Kaan Köse
a87df2e9f6 Fixed an issue where deleting account navigates back to mail list of the next account. 2024-08-17 19:54:44 +02:00
Burak Kaan Köse
2e4a664744 More detailed ImapImplementation for ID extension. 2024-08-17 19:53:50 +02:00
Tiktack
579a22ea45 Remove self from reply all when no other recepients (#319) 2024-08-17 15:00:25 +02:00
Burak Kaan Köse
abff850427 Managing account aliases and profile synchronization for outlook and gmail. 2024-08-17 03:43:37 +02:00
Burak Kaan Köse
f1154058ba Fix ascending download for messages. QQ server issue will be handled later. 2024-08-17 00:03:45 +02:00
Burak Kaan Köse
cf9f308b7f Updating aliases during profile sync for Gmail. 2024-08-16 01:29:31 +02:00
Burak Kaan Köse
1791df236c Remove unused extension class. 2024-08-16 01:03:00 +02:00
Burak Kaan Köse
7211f94f08 Try - catch for outlook profile sync. 2024-08-16 00:40:10 +02:00
Burak Kaan Köse
7b0343c87f Added sender name comment for gmail. 2024-08-16 00:37:50 +02:00
Burak Kaan Köse
b80f0276b4 Sender Name and Profile Picture synchronization for Outlook 2024-08-16 00:37:38 +02:00
Burak Kaan Köse
8f66fcbb00 Activated contact service for Gmail to retrieve profile picture and sender name. 2024-08-15 23:57:45 +02:00
Burak Kaan Köse
fe449ee1f3 Comments for alias entity. 2024-08-15 16:13:18 +02:00
Burak Kaan Köse
34d6d95186 Including ReplyToAddress for alias. 2024-08-15 16:11:12 +02:00
Burak Kaan Köse
05ddc0660a Creating MailAccountAlias entity. 2024-08-15 16:02:02 +02:00
Burak Kaan Köse
c6047a8428 Version bump 2024-08-13 23:40:09 +02:00
Burak Kaan Köse
bc4838578e Handling null client connection while sending server response. 2024-08-13 22:57:36 +02:00
Burak Kaan Köse
548996405a Fix incorrect accounts' mails are going to different accounts. 2024-08-13 22:54:36 +02:00
Burak Kaan Köse
a9a5f0bd14 Ascending downloading of mails since some servers require it. 2024-08-13 22:54:14 +02:00
Burak Kaan Köse
ec05ff6123 Optional splash screen. 2024-08-13 19:26:24 +02:00
Burak Kaan Köse
10c7ab421b Setting exception on connection failure. 2024-08-13 16:14:25 +02:00
Burak Kaan Köse
a8a5cc53ea Merge branch 'main' of https://github.com/bkaankose/Wino-Mail 2024-08-13 16:13:25 +02:00
Burak Kaan Köse
8fe48ca438 Fixed an issue where reconnecting doesn't await the handle in the second attempt. 2024-08-13 16:12:34 +02:00
Tiktack
cbd5a515a9 Fix account signature preferences during draft creation (#314)
* Pass account ID instead of account to draft creation method, since account object can be stale.

* Configure await
2024-08-12 00:56:26 +02:00
Tiktack
5912adff93 Embedded images replaced with cid linked resources. (#313)
* Added logic to replace embedded images with linked resources

* Added alt text for images and replaced NewtonSoft with Text.Json

* Fix draft mime preparation

* Fix crashes for signatures without images.

---------

Co-authored-by: Burak Kaan Köse <bkaankose@outlook.com>
2024-08-11 23:58:54 +02:00
Burak Kaan Köse
983bc21448 Removing server init from the app init. Making sure server connection is established before doing a request. Handling Connecting state. 2024-08-11 15:25:40 +02:00
Burak Kaan Köse
6d08368462 Hiding reconnect flyout on clicking reconnect. 2024-08-11 15:18:23 +02:00
Burak Kaan Köse
cde7bb3524 Merged main. 2024-08-10 14:35:26 +02:00
Burak Kaan Köse
133dc91561 Prevent crashes on invalid Uri for protocol activation. 2024-08-10 14:35:01 +02:00
Tiktack
f408f59beb Improve mailto links handling (#310)
* Refactor draft creation

* try scoped namespace

* Refactor mailto protocol and revert namespaces

* Remove useless account query

* Fix typo and CC/BCC in replies

* Replace convert with existing extension

* Small fixes

* Fix CC/Bcc in replies to automatically show if needed.

* Fixed body parameter position from mailto parameters

* Fixed issue with ReplyAll self not removed
2024-08-10 14:33:02 +02:00
Burak Kaan Köse
8763bf11ab Fix typo. 2024-08-09 14:23:51 +02:00
Burak Kaan Köse
99592a52be Unregistration condition. 2024-08-09 02:02:11 +02:00
Burak Kaan Köse
25a8a52573 Remove SessionConnectedTask 2024-08-09 01:51:21 +02:00
Burak Kaan Köse
5901344459 Remove SessionConntectedTask. 2024-08-09 01:24:55 +02:00
Burak Kaan Köse
b07ae4bc42 New Crowdin updates (#303)
* New translations resources.json (French)

* New translations resources.json (Spanish)

* New translations resources.json (Catalan)

* New translations resources.json (Czech)

* New translations resources.json (Danish)

* New translations resources.json (German)

* New translations resources.json (Greek)

* New translations resources.json (Finnish)

* New translations resources.json (Italian)

* New translations resources.json (Japanese)

* New translations resources.json (Dutch)

* New translations resources.json (Polish)

* New translations resources.json (Russian)

* New translations resources.json (Turkish)

* New translations resources.json (Ukrainian)

* New translations resources.json (Chinese Simplified)

* New translations resources.json (Galician)

* New translations resources.json (Portuguese, Brazilian)

* New translations resources.json (Indonesian)
2024-08-05 01:07:55 +02:00
Burak Kaan Köse
0d9e61480a Fix typo. 2024-08-05 01:07:02 +02:00
Burak Kaan Köse
baaea96b1d Add Italian languge. 2024-08-05 01:06:19 +02:00
Burak Kaan Köse
e156cb5c2e New Crowdin updates (#302)
* New translations resources.json (French)

* New translations resources.json (Spanish)

* New translations resources.json (Catalan)

* New translations resources.json (Czech)

* New translations resources.json (Danish)

* New translations resources.json (German)

* New translations resources.json (Greek)

* New translations resources.json (Finnish)

* New translations resources.json (Italian)

* New translations resources.json (Japanese)

* New translations resources.json (Dutch)

* New translations resources.json (Polish)

* New translations resources.json (Russian)

* New translations resources.json (Turkish)

* New translations resources.json (Ukrainian)

* New translations resources.json (Chinese Simplified)

* New translations resources.json (Galician)

* New translations resources.json (Portuguese, Brazilian)

* New translations resources.json (Indonesian)
2024-08-05 01:02:19 +02:00
Burak Kaan Köse
ff77b2b3dc Full trust Wino Server implementation. (#295)
* Separation of messages. Introducing Wino.Messages library.

* Wino.Server and Wino.Packaging projects. Enabling full trust for UWP and app service connection manager basics.

* Remove debug code.

* Enable generating assembly info to deal with unsupported os platform warnings.

* Fix server-client connection.

* UIMessage communication. Single instancing for server and re-connection mechanism on suspension.

* Removed IWinoSynchronizerFactory from UWP project.

* Removal of background task service from core.

* Delegating changes to UI and triggering new background synchronization.

* Fix build error.

* Moved core lib messages to Messaging project.

* Better client-server communication. Handling of requests in the server. New synchronizer factory in the server.

* WAM broker and MSAL token caching for OutlookAuthenticator. Handling account creation for Outlook.

* WinoServerResponse basics.

* Delegating protocol activation for Gmail authenticator.

* Adding margin to searchbox to match action bar width.

* Move libraries into lib folder.

* Storing base64 encoded mime on draft creation instead of MimeMessage object. Fixes serialization/deserialization issue with S.T.Json

* Scrollbar adjustments

* WınoExpander for thread expander layout ıssue.

* Handling synchronizer state changes.

* Double init on background activation.

* FIxing packaging issues and new Wino Mail launcher protocol for activation from full thrust process.

* Remove debug deserialization.

* Remove debug code.

* Making sure the server connection is established when the app is launched.

* Thrust -> Trust string replacement...

* Rename package to Wino Mail

* Enable translated values in the server.

* Fixed an issue where toast activation can't find the clicked mail after the folder is initialized.

* Revert debug code.

* Change server background sync to every 3 minute and Inbox only synchronization.

* Revert google auth changes.

* App preferences page.

* Changing tray icon visibility on preference change.

* Start the server with invisible tray icon if set to invisible.

* Reconnect button on the title bar.

* Handling of toast actions.

* Enable x86 build for server during packaging.

* Get rid of old background tasks and v180 migration.

* Terminate client when Exit clicked in server.

* Introducing SynchronizationSource to prevent notifying UI after server tick synchronization.

* Remove confirmAppClose restricted capability and unused debug code in manifest.

* Closing the reconnect info popup when reconnect is clicked.

* Custom RetryHandler for OutlookSynchronizer and separating client/server logs.

* Running server on Windows startup.

* Fix startup exe.

* Fix for expander list view item paddings.

* Force full sync on app launch instead of Inbox.

* Fix draft creation.

* Fix an issue with custom folder sync logic.

* Reporting back account sync progress from server.

* Fix sending drafts and missing notifications for imap.

* Changing imap folder sync requirements.

* Retain file  count is set to 3.

* Disabled swipe gestures temporarily due to native crash
 with SwipeControl

* Save all attachments implementation.

* Localization for save all attachments button.

* Fix logging dates for logs.

* Fixing ARM64 build.

* Add ARM64 build config to packaging project.

* Comment out OutOfProcPDB for ARM64.

* Hnadling GONE response for Outlook folder synchronization.
2024-08-05 00:36:26 +02:00
Burak Kaan Köse
4dc225184d Bump version 1.7.8 2024-07-24 14:04:36 +02:00
Burak Kaan Köse
49a0266224 Fix an issue with rendering drafts and replies. 2024-07-24 13:18:05 +02:00
Burak Kaan Köse
7a62d96b91 Bump client version. 2024-07-23 21:39:56 +02:00
Tiktack
641454fa14 Fixed broken build after compoer fonts merge (#288) 2024-07-18 21:02:03 +02:00
Tiktack
cf2f0ec936 Ability to set composer default font (#287)
* Added ability to set Composer font

* Added missing translations and refactoring

* Remove unused methods

* Small fixes
2024-07-18 20:04:11 +02:00
Burak Kaan Köse
76375c9471 Remove calendar project from UWP sln. 2024-07-16 13:24:36 +02:00
Burak Kaan Köse
0894c56c19 Fix for prune non single draft items. 2024-07-15 00:58:20 +02:00
Burak Kaan Köse
7de89ffe57 Fixing an issue with thread creation and selected items notifications. 2024-07-15 00:00:38 +02:00
Burak Kaan Köse
e0c01343a8 Fix unread badge icon for taskbar after re-calculating unread items. 2024-07-11 15:50:37 +02:00
Burak Kaan Köse
48ed4f971c Merge branch 'main' of https://github.com/bkaankose/Wino-Mail 2024-07-09 19:17:28 +02:00
Burak Kaan Köse
9e8c8a019e Remove old patch note. 2024-07-09 19:17:25 +02:00
Burak Kaan Köse
96f4ca2cc9 1.7.6 Release 2024-07-09 19:17:14 +02:00
Burak Kaan Köse
fad59604f9 New Crowdin updates (#274)
* New translations resources.json (French)

* New translations resources.json (Spanish)

* New translations resources.json (Catalan)

* New translations resources.json (Czech)

* New translations resources.json (Danish)

* New translations resources.json (German)

* New translations resources.json (Greek)

* New translations resources.json (Italian)

* New translations resources.json (Japanese)

* New translations resources.json (Dutch)

* New translations resources.json (Polish)

* New translations resources.json (Russian)

* New translations resources.json (Turkish)

* New translations resources.json (Ukrainian)

* New translations resources.json (Chinese Simplified)

* New translations resources.json (Galician)

* New translations resources.json (Portuguese, Brazilian)

* New translations resources.json (Indonesian)
2024-07-09 19:08:21 +02:00
Burak Kaan Köse
ac0e8da0ba Fix crash on signature dialog. 2024-07-09 19:01:22 +02:00
Burak Kaan Köse
fc5c3fd73e Fix recursive issue with merged account folder menu items. 2024-07-09 01:29:58 +02:00
Burak Kaan Köse
536fbb23a1 Folder operations, Gmail folder sync improvements and rework of menu items. (#273)
* New rename folder dialog keys.

* Insfra work for folder operations and rename folder code.

* RenameFolder for Gmail.

* Fixed input dialog to take custom take for primary button.

* Missing rename for DS call.

* Outlook to throw exception in case of error.

* Implemented rename folder functionality for Outlook.

* Remove default primary text from input dialog.

* Fixed an issue where outlook folder rename does not work.

* Disable vertical scroll for composing page editor items.

* Fixing some issues with imap folder sync.

* fix copy pasta

* TODO folder update/removed overrides for shell.

* New rename folder dialog keys.

* Insfra work for folder operations and rename folder code.

* RenameFolder for Gmail.

* Fixed input dialog to take custom take for primary button.

* Missing rename for DS call.

* Outlook to throw exception in case of error.

* Implemented rename folder functionality for Outlook.

* Remove default primary text from input dialog.

* Fixed an issue where outlook folder rename does not work.

* Disable vertical scroll for composing page editor items.

* Fixing some issues with imap folder sync.

* fix copy pasta

* TODO folder update/removed overrides for shell.

* New rename folder dialog keys.

* Insfra work for folder operations and rename folder code.

* RenameFolder for Gmail.

* Fixed input dialog to take custom take for primary button.

* Missing rename for DS call.

* Outlook to throw exception in case of error.

* Implemented rename folder functionality for Outlook.

* Remove default primary text from input dialog.

* Fixed an issue where outlook folder rename does not work.

* Disable vertical scroll for composing page editor items.

* Fixing some issues with imap folder sync.

* fix copy pasta

* TODO folder update/removed overrides for shell.

* New rename folder dialog keys.

* Fixed an issue where redundant older updates causing pivots to be re-created.

* New empty folder request

* New rename folder dialog keys.

* Insfra work for folder operations and rename folder code.

* RenameFolder for Gmail.

* Fixed input dialog to take custom take for primary button.

* Missing rename for DS call.

* Outlook to throw exception in case of error.

* Implemented rename folder functionality for Outlook.

* Remove default primary text from input dialog.

* Fixed an issue where outlook folder rename does not work.

* Fixing some issues with imap folder sync.

* fix copy pasta

* TODO folder update/removed overrides for shell.

* New rename folder dialog keys.

* New rename folder dialog keys.

* New rename folder dialog keys.

* Fixed an issue where redundant older updates causing pivots to be re-created.

* New empty folder request

* Enable empty folder on base sync.

* Move updates on event listeners.

* Remove folder UI messages.

* Reworked folder synchronization for gmail.

* Loading folders on the fly as the selected account changed instead of relying on cached menu items.

* Merged account folder items, re-navigating to existing rendering page.

* - Reworked merged account menu system.
- Reworked unread item count loadings.
- Fixed back button visibility.
- Instant rendering of mails if renderer is active.
- Animation fixes.
- Menu item re-load crash/hang fixes.

* Handle folder renaming on the UI.

* Empty folder for all synchronizers.

* New execution delay mechanism and handling folder mark as read for all synchronizers.

* Revert UI changes on failure for IMAP.

* Remove duplicate translation keys.

* Cleanup.
2024-07-09 01:05:16 +02:00
Burak Kaan Köse
ac01006398 Handle BAD respose on first try for ID command for IMAP. 2024-07-07 20:16:41 +02:00
Burak Kaan Köse
ade8654cc4 Change default font to Arial for composer. 2024-07-07 19:57:15 +02:00
Burak Kaan Köse
8e03f26fb5 Replace web view editor icon and tooltip. 2024-07-07 19:57:07 +02:00
Burak Kaan Köse
dab51bef7b NRE on invoke script. 2024-07-07 18:09:13 +02:00
Burak Kaan Köse
bea7fb5fe5 Merge branch 'main' of https://github.com/bkaankose/Wino-Mail 2024-07-07 18:08:19 +02:00
Tiktack
d6b3240506 Migrate from Quill to Jodit (#264)
* Refactored JS folder.
Removed useless files

* Add border to signature webview ( Fix for light theme)

* migrated quill to jodit(links not working)

* Removed quill subfolder

* removed table styles and fixed trigger color

* disable addaptive toolbar

* Remove direction button

* MinHeight, Toolbar toggle, style for combobox

* Added reference mail to replies and forward

* Command bar in compose page
Fixed align behaviour with Jodit

* Fix theme toggle in composer

* switch cc and to in mail chain

* default selected value for aligment

* make CC/To/From to be mailto links

* Added drag and drop for images
Fixed dropzones visual states
Corrected border radius
Fixed null reference exception when event dispatched when chromium still not initialized
2024-07-07 18:04:53 +02:00
Burak Kaan Köse
19e53d8bc8 Merge branch 'features/code-quality-js' of https://github.com/Tiktack/Wino-Mail 2024-07-07 17:56:56 +02:00
Aleh Khantsevich
5923d72803 Added drag and drop for images
Fixed dropzones visual states
Corrected border radius
Fixed null reference exception when event dispatched when chromium still not initialized
2024-07-07 01:42:12 +02:00
Aleh Khantsevich
8cde976358 make CC/To/From to be mailto links 2024-07-06 22:54:54 +02:00
Aleh Khantsevich
256a5b50ac default selected value for aligment 2024-07-06 19:34:46 +02:00
Aleh Khantsevich
8b236f68f4 switch cc and to in mail chain 2024-07-06 19:16:04 +02:00
Aleh Khantsevich
c18f6d3978 Fix theme toggle in composer 2024-07-06 18:23:44 +02:00
Aleh Khantsevich
e65733754c Command bar in compose page
Fixed align behaviour with Jodit
2024-07-06 00:52:19 +02:00
Aleh Khantsevich
4505630896 Added reference mail to replies and forward 2024-07-03 23:54:19 +02:00
Aleh Khantsevich
044804143f MinHeight, Toolbar toggle, style for combobox 2024-07-03 02:10:28 +02:00
Aleh Khantsevich
1e9d7c9b93 Remove direction button 2024-07-02 02:52:56 +02:00
Aleh Khantsevich
573fe3cad3 disable addaptive toolbar 2024-07-02 02:26:07 +02:00
Aleh Khantsevich
cd3880c85c removed table styles and fixed trigger color 2024-07-02 02:14:59 +02:00
Burak Kaan Köse
02cd8ed7ae Updated Reaadme 2024-07-01 22:48:45 +02:00
Aleh Khantsevich
3d69f96b96 Removed quill subfolder 2024-07-01 01:28:18 +02:00
Aleh Khantsevich
963a15abe7 migrated quill to jodit(links not working) 2024-07-01 00:57:07 +02:00
Burak Kaan Köse
40542f0461 Introducing new app icon. 2024-06-28 01:39:43 +02:00
Aleh Khantsevich
bfc2af71a4 Add border to signature webview ( Fix for light theme) 2024-06-27 17:03:07 +02:00
Aleh Khantsevich
35142bb61d Refactored JS folder.
Removed useless files
2024-06-27 14:17:05 +02:00
Burak Kaan Köse
39626e0df9 Couple UI Fixes (#255)
- Disabled UI navigation cache for all pages.
- Restore the renderer<>composer page animation back.
- IdlePage functionality into mail list page.
- Couple bugfixes.
2024-06-26 20:00:10 +02:00
Burak Kaan Köse
ca40730600 Merge branch 'Tiktack-features/UI-refresh' 2024-06-25 22:50:06 +02:00
Burak Kaan Köse
4158e196d6 Add visual state for moving To,CC and BCC to vertical line when the page is small enough. 2024-06-25 22:39:35 +02:00
Burak Kaan Köse
1516e800dd Merge branch 'features/UI-refresh' of https://github.com/Tiktack/Wino-Mail into Tiktack-features/UI-refresh 2024-06-25 22:20:38 +02:00
Aleh Khantsevich
0b96f69a1d Fix backgrounds 2024-06-25 00:37:09 +02:00
Aleh Khantsevich
bb418e51d4 fix compose page spacing 2024-06-24 01:38:50 +02:00
Aleh Khantsevich
5fb23ab8bf simplify xaml spacing 2024-06-24 01:36:53 +02:00
Burak Kaan Köse
117b01c48b Fix for IMAP missing Inbox folder type. 2024-06-24 01:32:07 +02:00
Aleh Khantsevich
18719815a3 Merge main 2024-06-24 01:30:20 +02:00
Aleh Khantsevich
f795595107 Fix narrowed view bug 2024-06-24 00:57:23 +02:00
Burak Kaan Köse
be3f9465eb Fix sharing wino logs. 2024-06-24 00:36:21 +02:00
Aleh Khantsevich
c598daab9b Fixed command bar open state 2024-06-24 00:20:54 +02:00
Burak Kaan Köse
438b25672f Release 1.7.4. 2024-06-23 23:32:04 +02:00
Aleh Khantsevich
1e12ddd8e2 Fix custom themes and drag/drop 2024-06-23 23:04:42 +02:00
Aleh Khantsevich
dccf55d57a Added separated zones 2024-06-23 13:32:06 +02:00
Burak Kaan Köse
3397845ccc Fixed an issue where empty listview drags focus to search bar automatically. 2024-06-22 00:43:48 +02:00
Burak Kaan Köse
82ae13ba3e Fixed Archive implementation for Gmail. 2024-06-21 23:48:03 +02:00
Burak Kaan Köse
8c830761f3 Fixed a rare issue with move function fails to re-synchronize the item properly to target folder. 2024-06-21 23:44:59 +02:00
Burak Kaan Köse
ad5c134887 Revert "Get rid of additional progress bar loading in list page under the command bar."
This reverts commit cfdd32708a.
2024-06-21 22:39:44 +02:00
Burak Kaan Köse
150bf124a9 Imap client pool improvements and implementation of MaxConcurrentClients. 2024-06-21 04:27:44 +02:00
Burak Kaan Köse
1c96c0ccbf Reworked IMAP folder synchronization logic. Gained 4x and fixed bunch of bugs around it. 2024-06-21 04:27:17 +02:00
Burak Kaan Köse
cf8ad3d697 Disable synchronization for default imap folders. 2024-06-21 04:25:32 +02:00
Burak Kaan Köse
5b723ec954 MaxConcurrentClients for IMAP model. 2024-06-21 04:25:07 +02:00
Burak Kaan Köse
633c708c33 Translation issue on save config text for missing system folder setup dialog. 2024-06-21 04:24:46 +02:00
Burak Kaan Köse
e4784108f7 Default client size for imap client pool. 2024-06-21 04:24:31 +02:00
Burak Kaan Köse
b4103a4edb Fixed an issue where setting archive folder as special folder does not update the configuration. 2024-06-21 04:24:04 +02:00
Burak Kaan Köse
cfdd32708a Get rid of additional progress bar loading in list page under the command bar. 2024-06-21 04:10:55 +02:00
Burak Kaan Köse
8e97c1e9e8 Removed old code from imap setup dialogs pages. 2024-06-21 02:58:12 +02:00
Burak Kaan Köse
e009bebfaf Fixed an issue where local draft is deleted via hover over action or delete button instead of discard button. Disabled discarding local drafts in compose page. 2024-06-21 02:11:18 +02:00
Burak Kaan Köse
d3d190989d Enabled portuguese-brazil language. 2024-06-21 01:22:03 +02:00
Burak Kaan Köse
1b36b52019 New Crowdin updates (#244)
* New translations resources.json (French)

* New translations resources.json (Spanish)

* New translations resources.json (Catalan)

* New translations resources.json (Czech)

* New translations resources.json (Danish)

* New translations resources.json (German)

* New translations resources.json (Italian)

* New translations resources.json (Japanese)

* New translations resources.json (Dutch)

* New translations resources.json (Polish)

* New translations resources.json (Russian)

* New translations resources.json (Turkish)

* New translations resources.json (Ukrainian)

* New translations resources.json (Chinese Simplified)

* New translations resources.json (Greek)

* New translations resources.json (Indonesian)

* New translations resources.json (Galician)

* New translations resources.json (Portuguese, Brazilian)
2024-06-21 01:15:26 +02:00
Burak Kaan Köse
e526e96e2d Fixed an issue where specifying imap auth method is ignored during authentication other than Auto. 2024-06-21 01:13:25 +02:00
Burak Kaan Köse
1659d74938 Release imap client only when the pool fails to provide one. 2024-06-21 00:32:45 +02:00
Burak Kaan Köse
f7161dc39b Pre-post authentication ID extension for IMAP. Some servers require it pre-auth looks like. 2024-06-18 02:22:55 +02:00
Burak Kaan Köse
d8ea41e4dd Version bump. 2024-06-18 00:33:28 +02:00
Burak Kaan Köse
fe0a03db2f Fix crash on stream flush. 2024-06-17 10:16:38 +02:00
Burak Kaan Köse
49afed7751 Reworked IMAP setup flow. Implemented easy way to share protocol log on failure if possible. 2024-06-17 02:16:06 +02:00
Burak Kaan Köse
a788b1706b Remove 'Rate' button from the shell menu. 2024-06-17 02:03:45 +02:00
Burak Kaan Köse
d57fd20ca2 Fixed a crash for IMAP when there are no sent and draft folder set. 2024-06-16 23:18:21 +02:00
Burak Kaan Köse
5ecc1b09c8 Merge pull request #223 from Tiktack/Fix/Scrollbaroverlay-signature-webview-size
Fix overlay scrollbars and signature webview size
2024-06-16 22:22:18 +02:00
Burak Kaan Köse
f1dfc9666b Merge pull request #219 from Tiktack/Bugs/AddLinkFix
Make HyperLink focusable in Signature Editor
2024-06-16 22:22:07 +02:00
Aleh Khantsevich
b503584431 Fix overlay scrollbars and signature webview size 2024-06-15 16:19:06 +02:00
Aleh Khantsevich
0dfe1c8e3a Remove semicolon 2024-06-14 01:40:05 +02:00
Aleh Khantsevich
c5630d90ec Made HyperLink focusable 2024-06-14 01:37:56 +02:00
Burak Kaan Köse
f8973a3cf7 Updated 1.7.2 patch notes. 2024-06-14 01:08:10 +02:00
Burak Kaan Köse
228be8376f Rename database to match the version. 2024-06-14 01:08:00 +02:00
Burak Kaan Köse
3fee3b0224 Fix draft and junk folder's incorrect unread badge. 2024-06-14 00:52:36 +02:00
Burak Kaan Köse
b4e705b347 Merge pull request #218 from bkaankose/l10n_main
New Crowdin updates
2024-06-14 00:40:54 +02:00
Burak Kaan Köse
51e59bebfc New translations resources.json (Indonesian) 2024-06-14 00:40:08 +02:00
Burak Kaan Köse
a56ac31f4b New translations resources.json (Greek) 2024-06-14 00:40:07 +02:00
Burak Kaan Köse
af05f081d2 New translations resources.json (Chinese Simplified) 2024-06-14 00:40:06 +02:00
Burak Kaan Köse
b97d79d261 New translations resources.json (Ukrainian) 2024-06-14 00:40:05 +02:00
Burak Kaan Köse
d227e6339f New translations resources.json (Turkish) 2024-06-14 00:40:04 +02:00
Burak Kaan Köse
74c503fea0 New translations resources.json (Russian) 2024-06-14 00:40:03 +02:00
Burak Kaan Köse
ed8b0c4d3c New translations resources.json (Polish) 2024-06-14 00:40:02 +02:00
Burak Kaan Köse
cbb17e92f0 New translations resources.json (Dutch) 2024-06-14 00:40:01 +02:00
Burak Kaan Köse
f9d64cf777 New translations resources.json (Japanese) 2024-06-14 00:40:00 +02:00
Burak Kaan Köse
7fdd6d19cf New translations resources.json (Italian) 2024-06-14 00:39:59 +02:00
Burak Kaan Köse
60ca252b63 New translations resources.json (German) 2024-06-14 00:39:58 +02:00
Burak Kaan Köse
2027837c18 New translations resources.json (Danish) 2024-06-14 00:39:57 +02:00
Burak Kaan Köse
67904568b1 New translations resources.json (Czech) 2024-06-14 00:39:56 +02:00
Burak Kaan Köse
afbc559a47 New translations resources.json (Catalan) 2024-06-14 00:39:55 +02:00
Burak Kaan Köse
67c312642c New translations resources.json (Spanish) 2024-06-14 00:39:54 +02:00
Burak Kaan Köse
89eb007e43 New translations resources.json (French) 2024-06-14 00:39:52 +02:00
Burak Kaan Köse
88c3f3204b Fix chinese translations. 2024-06-14 00:39:24 +02:00
Burak Kaan Köse
052ab98cd3 Fixing Gmail replies... 2024-06-14 00:39:18 +02:00
Burak Kaan Köse
cd01c0e31b Release 1.7.2 2024-06-14 00:23:17 +02:00
Burak Kaan Köse
c3d3228f65 Fixing signature dialog sizing issues and light theme switch. 2024-06-14 00:07:51 +02:00
Burak Kaan Köse
f04647192f Merge pull request #217 from Tiktack/features/SignaturesImprovements
Re-implemented signature page to support multiple signatures
2024-06-13 23:41:08 +02:00
Burak Kaan Köse
c00f0c9f52 Fixed an issue where notification payloads don't carry remote folder id with them. 2024-06-13 23:38:02 +02:00
Burak Kaan Köse
690e04c377 Fixed an issue where merged accounts are counting as 1 account for premium limit. 2024-06-13 22:51:29 +02:00
Burak Kaan Köse
545880dcce Fixing notification actions. 2024-06-13 22:48:33 +02:00
Aleh Khantsevich
fedf5d2203 Fixed tooltips 2024-06-13 03:13:53 +02:00
Aleh Khantsevich
5242e55826 fixed some app bar buttons 2024-06-13 02:49:54 +02:00
Aleh Khantsevich
1bf86e73a7 Fix merge conflicts 2024-06-13 01:42:19 +02:00
Aleh Khantsevich
c3fe72f561 Added scrollviewer to signatures settings 2024-06-13 01:32:32 +02:00
Aleh Khantsevich
b54555a4f7 Re-implemented signature page to support different signatures for different actions 2024-06-13 00:51:59 +02:00
Burak Kaan Köse
4c080360a7 Delay after-execution-sync for Outlook only. 2024-06-12 02:12:39 +02:00
Burak Kaan Köse
fdea15eef4 Fix gmail sending. 2024-06-12 02:12:23 +02:00
Burak Kaan Köse
5a4dd97abe Fix gmail single mime download error. 2024-06-12 00:32:04 +02:00
Burak Kaan Köse
e47e3d936b Fixing Outlook sending issue. 2024-06-11 22:48:18 +02:00
Burak Kaan Köse
0e9fd4373e Create SendDraftRequest implementation and handle missing SentFolder synchronization. 2024-06-11 14:19:08 +02:00
Burak Kaan Köse
69a10c754a Implement sending functionality for Outlook synchronizer. 2024-06-11 14:16:57 +02:00
Burak Kaan Köse
a8ba965c0d 1.7.2 release version update for manifest. 2024-06-11 14:16:30 +02:00
Burak Kaan Köse
847aed3519 Fix missing translation error on app updated background task message. 2024-06-11 14:16:16 +02:00
Burak Kaan Köse
fed9345bea Fix requiring sender name in the initial account setup dialog for IMAP. 2024-06-10 16:22:35 +02:00
Burak Kaan Köse
d71b6d0ab0 Fix #164 2024-06-09 02:59:07 +02:00
Burak Kaan Köse
40e5521fbf Merge pull request #212 from bkaankose/feature/AccountOrdering
[Feature] Account re-ordering.
2024-06-09 02:41:15 +02:00
Burak Kaan Köse
c7781d2e75 Implemented a new dialog for account re-ordering and required apis. 2024-06-09 02:37:30 +02:00
Burak Kaan Köse
0ccf67000c Merge pull request #210 from bkaankose/l10n_main
New Crowdin updates
2024-06-08 00:00:36 +02:00
Burak Kaan Köse
f4e81aca9d rebased 2024-06-08 00:00:05 +02:00
Burak Kaan Köse
2d654cf759 New translations resources.json (Indonesian) 2024-06-07 23:59:58 +02:00
Burak Kaan Köse
0b728162ae New translations resources.json (Greek) 2024-06-07 23:59:57 +02:00
Burak Kaan Köse
f52b426652 New translations resources.json (Chinese Simplified) 2024-06-07 23:59:56 +02:00
Burak Kaan Köse
ad0528d763 New translations resources.json (Ukrainian) 2024-06-07 23:59:56 +02:00
Burak Kaan Köse
263adcf2b5 New translations resources.json (Turkish) 2024-06-07 23:59:55 +02:00
Burak Kaan Köse
b201e274f1 New translations resources.json (Russian) 2024-06-07 23:59:54 +02:00
Burak Kaan Köse
c1a6a73b7d New translations resources.json (Polish) 2024-06-07 23:59:53 +02:00
Burak Kaan Köse
ed4764cc70 New translations resources.json (Dutch) 2024-06-07 23:59:52 +02:00
Burak Kaan Köse
8d84b3adbc New translations resources.json (Japanese) 2024-06-07 23:59:51 +02:00
Burak Kaan Köse
35db674c88 New translations resources.json (Italian) 2024-06-07 23:59:50 +02:00
Burak Kaan Köse
3e1850a713 New translations resources.json (German) 2024-06-07 23:59:49 +02:00
Burak Kaan Köse
8c625c0ecd New translations resources.json (Danish) 2024-06-07 23:59:48 +02:00
Burak Kaan Köse
bf1de8e7a4 Initial setup for account ordering. 2024-06-07 23:59:47 +02:00
Burak Kaan Köse
8c2dca3770 New translations resources.json (Czech) 2024-06-07 23:59:47 +02:00
Burak Kaan Köse
23adbddfb7 New translations resources.json (Catalan) 2024-06-07 23:59:46 +02:00
Burak Kaan Köse
b1b6b64e68 New translations resources.json (Spanish) 2024-06-07 23:59:45 +02:00
Burak Kaan Köse
0c7909df09 New translations resources.json (French) 2024-06-07 23:59:44 +02:00
Burak Kaan Köse
641bfd8c06 Sender name implementation. 2024-06-07 23:58:51 +02:00
Burak Kaan Köse
52140c3208 Enable ARM configuration. 2024-06-07 02:30:42 +02:00
Burak Kaan Köse
1baa9173cb Fixing the build issue that prevents Release. 2024-06-07 02:01:30 +02:00
Burak Kaan Köse
26749c2116 Update ms graph library to latest in core library. 2024-06-07 01:56:28 +02:00
Burak Kaan Köse
a1ecb9ad39 Remove redundant shell loading event. 2024-06-07 01:11:21 +02:00
Burak Kaan Köse
b398fde24e Separation of change processors. 2024-06-02 21:35:03 +02:00
Burak Kaan Köse
a5767b60fb AppCenter update and reverting back ms graph update to make app compile in Release. 2024-06-02 14:49:34 +02:00
Burak Kaan Köse
ef196c384c Initial setup for account ordering. 2024-05-30 02:34:54 +02:00
Burak Kaan Köse
920def7446 Fix #192 2024-05-30 01:41:43 +02:00
Burak Kaan Köse
bec98dcaa2 Remove unused build configurations 2024-05-30 01:14:23 +02:00
Burak Kaan Köse
747be07322 Added Indonesian and Greek languages. 2024-05-30 01:03:03 +02:00
Burak Kaan Köse
c1fc6f0bce Merge pull request #204 from bkaankose/l10n_main
New Crowdin updates
2024-05-30 00:22:19 +02:00
Burak Kaan Köse
851c42e630 New translations resources.json (Indonesian) 2024-05-30 00:21:10 +02:00
Burak Kaan Köse
4e5a4a9c17 New translations resources.json (Greek) 2024-05-30 00:21:09 +02:00
Burak Kaan Köse
df19d500de New translations resources.json (Polish) 2024-05-30 00:21:05 +02:00
Burak Kaan Köse
4fd4c9802e New translations resources.json (Italian) 2024-05-30 00:21:03 +02:00
Burak Kaan Köse
23d0eeab16 Prevent downloading existing messages for Outlook. 2024-05-25 17:00:52 +02:00
Burak Kaan Köse
b66557f3be Merge branch 'main' of https://github.com/bkaankose/Wino-Mail 2024-05-25 16:59:36 +02:00
Burak Kaan Köse
580586cab3 Upgrade core packages to latest version. 2024-05-25 16:59:32 +02:00
Burak Kaan Köse
9a97ef1dad Merge pull request #197 from bkaankose/l10n_main
New Crowdin updates
2024-05-25 12:04:33 +02:00
Burak Kaan Köse
b4f7503d85 New translations resources.json (Greek) 2024-05-25 12:03:56 +02:00
Burak Kaan Köse
b89406a89a New translations resources.json (Chinese Simplified) 2024-05-25 12:03:55 +02:00
Burak Kaan Köse
932cdae22e New translations resources.json (Ukrainian) 2024-05-25 12:03:54 +02:00
Burak Kaan Köse
34ef86cfff New translations resources.json (Turkish) 2024-05-25 12:03:53 +02:00
Burak Kaan Köse
023bace2a9 New translations resources.json (Russian) 2024-05-25 12:03:52 +02:00
Burak Kaan Köse
467b63cffb New translations resources.json (Polish) 2024-05-25 12:03:51 +02:00
Burak Kaan Köse
49ffb0fa68 New translations resources.json (Dutch) 2024-05-25 12:03:50 +02:00
Burak Kaan Köse
04984dea98 New translations resources.json (Japanese) 2024-05-25 12:03:49 +02:00
Burak Kaan Köse
78e9a768b4 New translations resources.json (Italian) 2024-05-25 12:03:48 +02:00
Burak Kaan Köse
401f877388 New translations resources.json (German) 2024-05-25 12:03:47 +02:00
Burak Kaan Köse
b3ba1aa3b9 New translations resources.json (Danish) 2024-05-25 12:03:46 +02:00
Burak Kaan Köse
ae76aebe24 New translations resources.json (Czech) 2024-05-25 12:03:45 +02:00
Burak Kaan Köse
b5e1bf2867 New translations resources.json (Catalan) 2024-05-25 12:03:44 +02:00
Burak Kaan Köse
fb3a0da54f New translations resources.json (Spanish) 2024-05-25 12:03:43 +02:00
Burak Kaan Köse
7d197f405d New translations resources.json (French) 2024-05-25 12:03:42 +02:00
Burak Kaan Köse
bc7af3a68b Merge pull request #191 from Tiktack/features/dropzone
Added attachments drag & drop support
2024-05-22 23:35:37 +02:00
Burak Kaan Köse
120e79229a New updated release notes. 2024-05-22 23:06:37 +02:00
Burak Kaan Köse
f0e4bbcda9 Update db name for new release. 2024-05-22 23:04:54 +02:00
Aleh Khantsevich
57e31c1dfb Added attachments drag & drop support 2024-05-22 02:10:14 +02:00
Burak Kaan Köse
8f2f414f5e Fixed an issue where draft unique id tracking prevents reply draft to be removed from thread until the list is refreshed. 2024-05-21 23:48:44 +02:00
Burak Kaan Köse
879f91693e Remove commented debug code. 2024-05-21 23:48:06 +02:00
Burak Kaan Köse
0c504b52e4 Hide vertical scroll in composer page 2024-05-21 23:24:06 +02:00
Burak Kaan Köse
bbaa5f9fa8 Fix invisible signature page content. 2024-05-21 23:07:15 +02:00
Burak Kaan Köse
2a9f7fde28 Added Chinese language. 2024-05-21 22:58:33 +02:00
Burak Kaan Köse
0ec7c87851 Merge pull request #187 from bkaankose/l10n_main
New Crowdin updates
2024-05-12 02:04:33 +02:00
Burak Kaan Köse
cf515abc4c New translations resources.json (Greek) 2024-05-12 02:04:22 +02:00
Burak Kaan Köse
99cab08ab7 New translations resources.json (Chinese Simplified) 2024-05-12 02:04:21 +02:00
Burak Kaan Köse
e60d40ee9c New translations resources.json (Ukrainian) 2024-05-12 02:04:21 +02:00
Burak Kaan Köse
c90fa68f16 New translations resources.json (Turkish) 2024-05-12 02:04:20 +02:00
Burak Kaan Köse
61ae86e927 New translations resources.json (Russian) 2024-05-12 02:04:19 +02:00
Burak Kaan Köse
86c995906c New translations resources.json (Polish) 2024-05-12 02:04:18 +02:00
Burak Kaan Köse
a77b88aaf6 New translations resources.json (Dutch) 2024-05-12 02:04:17 +02:00
Burak Kaan Köse
0d288f3206 New translations resources.json (Japanese) 2024-05-12 02:04:16 +02:00
Burak Kaan Köse
d9d6244931 New translations resources.json (Italian) 2024-05-12 02:04:15 +02:00
Burak Kaan Köse
4d984f0524 New translations resources.json (German) 2024-05-12 02:04:14 +02:00
Burak Kaan Köse
b456b0143b New translations resources.json (Danish) 2024-05-12 02:04:13 +02:00
Burak Kaan Köse
3ebcfd5598 New translations resources.json (Czech) 2024-05-12 02:04:12 +02:00
Burak Kaan Köse
745ea3509e New translations resources.json (Catalan) 2024-05-12 02:04:11 +02:00
Burak Kaan Köse
8f5d4e5bc2 New translations resources.json (Spanish) 2024-05-12 02:04:10 +02:00
Burak Kaan Köse
acd7d3bbac New translations resources.json (French) 2024-05-12 02:04:09 +02:00
Burak Kaan Köse
f3bd6598e7 Merge pull request #181 from Tiktack/visual-adjustments
Improved attachments UI and added filter option "Has files"
2024-05-11 01:07:00 +02:00
Burak Kaan Köse
ce48fdc445 Merge pull request #185 from Tiktack/183-ui-improvements
Search improvements
2024-05-09 03:58:50 +02:00
Burak Kaan Köse
5aea223c14 Fixed double init issue when performing search. 2024-05-09 03:40:19 +02:00
Aleh Khantsevich
1f59d3179c Added SearchPivotName trnslation resource 2024-05-09 01:11:02 +02:00
Aleh Khantsevich
1f6e1db695 Fyx typo and formating 2024-05-09 00:51:16 +02:00
Aleh Khantsevich
5b46c372ab Added search pivot 2024-05-08 23:59:50 +02:00
Aleh Khantsevich
f143d3e1c2 Changed placegolders to start from capital latter 2024-05-08 20:01:55 +02:00
Aleh Khantsevich
c7639309ef Fixed progress ring, width of empty results and message for empty results with filters 2024-05-08 19:26:47 +02:00
Aleh Khantsevich
b788531e47 Reset all filters after navigation and clear button re-initializing mail list 2024-05-08 02:05:42 +02:00
Aleh Khantsevich
00fa2ca804 Fix formating issues and styles 2024-05-05 17:41:49 +02:00
Aleh Khantsevich
74cdf09ebc Added filter option has files 2024-05-05 17:01:40 +02:00
Aleh Khantsevich
80ec12740a Fixed scrollbar 2024-05-05 02:38:51 +02:00
Aleh Khantsevich
a0002ff97b fixed attachments layout and size and added progressbar 2024-05-05 02:15:29 +02:00
Aleh Khantsevich
2cb0db02e3 Fixed crash for adding files 2024-05-04 12:33:27 +02:00
Burak Kaan Köse
bed8d71f7e Merge pull request #177 from Tiktack/fix-dark-scrollbar-webview
Fixed scrollbars in a dark theme to be accessible
2024-05-03 16:55:05 +02:00
Aleh Khantsevich
668b385a10 And fluent overlay scrollbars 2024-05-03 12:36:58 +02:00
Aleh Khantsevich
d96df469a4 Fixed scrollbars in a dark theme to be accessible 2024-05-02 20:38:00 +02:00
Burak Kaan Köse
8edbe1aa2c Merge pull request #176 from bkaankose/l10n_main
New Crowdin updates
2024-05-02 00:27:08 +02:00
Burak Kaan Köse
99ece9a61a New translations resources.json (Chinese Simplified) 2024-05-02 00:26:26 +02:00
Burak Kaan Köse
4b5253dd6b New translations resources.json (Ukrainian) 2024-05-02 00:26:25 +02:00
Burak Kaan Köse
5e10294a16 New translations resources.json (Turkish) 2024-05-02 00:26:24 +02:00
Burak Kaan Köse
226d2069d9 New translations resources.json (Russian) 2024-05-02 00:26:23 +02:00
Burak Kaan Köse
8d1365b712 New translations resources.json (Polish) 2024-05-02 00:26:22 +02:00
Burak Kaan Köse
45624d905e New translations resources.json (Dutch) 2024-05-02 00:26:21 +02:00
Burak Kaan Köse
a5d9c931ca New translations resources.json (Japanese) 2024-05-02 00:26:20 +02:00
Burak Kaan Köse
f0db2b2f6e New translations resources.json (Italian) 2024-05-02 00:26:19 +02:00
Burak Kaan Köse
cde5913ace New translations resources.json (German) 2024-05-02 00:26:18 +02:00
Burak Kaan Köse
ceea9fc501 New translations resources.json (Danish) 2024-05-02 00:26:17 +02:00
Burak Kaan Köse
eb678b4533 New translations resources.json (Czech) 2024-05-02 00:26:16 +02:00
Burak Kaan Köse
dcbe8bb3dc New translations resources.json (Catalan) 2024-05-02 00:26:15 +02:00
Burak Kaan Köse
555310a4ca New translations resources.json (Spanish) 2024-05-02 00:26:14 +02:00
Burak Kaan Köse
3a57358f58 New translations resources.json (French) 2024-05-02 00:26:13 +02:00
Burak Kaan Köse
9982ba2fec Merge pull request #175 from Tiktack/improve-unsubscribe-with-oneclick
Added support for one click unsubscribe with confirmation dialog.
2024-05-02 00:24:11 +02:00
Burak Kaan Köse
11b652f851 Introduced IUnsubscriptionService and replaced the usage in rendering page view model. 2024-05-02 00:21:29 +02:00
Burak Kaan Köse
380950a615 Merge pull request #173 from Tiktack/threading-performance
Improve performance of API Threading strategy.
2024-05-02 00:14:04 +02:00
Burak Kaan Köse
e8b07738a5 Replaced WinoMail to Wino in EN resources. 2024-05-01 23:46:56 +02:00
Aleh Khantsevich
9d1163e73e Changed mailto link to redirect to compose page. 2024-05-01 15:26:34 +02:00
Aleh Khantsevich
e2f0c73bab Added support for one click unsubscribe with confirmation dialog. 2024-05-01 14:23:23 +02:00
Aleh Khantsevich
183873afff Small fixes 2024-04-30 00:56:00 +02:00
Aleh Khantsevich
b356475741 Replace one query per one email with just one queyr for all mails 2024-04-30 00:04:59 +02:00
Burak Kaan Köse
279bae115a Merge pull request #170 from chenseanxy/main 2024-04-29 01:20:05 +02:00
Chen Xinyang
82bb5a96ad Fix message on autoconfig failure 2024-04-29 01:22:34 +03:00
Burak Kaan Köse
a4e9ffcc99 Merge pull request #169 from bkaankose/l10n_main
New Crowdin updates
2024-04-29 00:18:28 +02:00
Burak Kaan Köse
1c25427c5c New translations resources.json (Chinese Simplified) 2024-04-29 00:17:55 +02:00
Burak Kaan Köse
2ec22eb6cd New translations resources.json (Ukrainian) 2024-04-29 00:17:54 +02:00
Burak Kaan Köse
2ff508607d New translations resources.json (Turkish) 2024-04-29 00:17:53 +02:00
Burak Kaan Köse
69a34c65f7 New translations resources.json (Russian) 2024-04-29 00:17:52 +02:00
Burak Kaan Köse
f34c1520a4 New translations resources.json (Polish) 2024-04-29 00:17:51 +02:00
Burak Kaan Köse
f3fa8eec50 New translations resources.json (Dutch) 2024-04-29 00:17:50 +02:00
Burak Kaan Köse
9baa9b1dd6 New translations resources.json (Japanese) 2024-04-29 00:17:49 +02:00
Burak Kaan Köse
c1c1af1ded New translations resources.json (Italian) 2024-04-29 00:17:48 +02:00
Burak Kaan Köse
4a8c1b7de4 New translations resources.json (German) 2024-04-29 00:17:47 +02:00
Burak Kaan Köse
1f35165919 New translations resources.json (Danish) 2024-04-29 00:17:46 +02:00
Burak Kaan Köse
2e85508426 New translations resources.json (Czech) 2024-04-29 00:17:45 +02:00
Burak Kaan Köse
631b218057 New translations resources.json (Catalan) 2024-04-29 00:17:44 +02:00
Burak Kaan Köse
e8cfc88d83 New translations resources.json (Spanish) 2024-04-29 00:17:44 +02:00
Burak Kaan Köse
78502a0cd0 New translations resources.json (French) 2024-04-29 00:17:43 +02:00
Burak Kaan Köse
2bcb6a146b Merge pull request #163 from Tiktack/unread-folder-should-not-read-email-automatically
Prevent Unread folder to read All emails automatically
2024-04-28 20:42:50 +02:00
Burak Kaan Köse
ae474b5e5b Fixed 'Delete' action not deleting the item after it's been marked as read. 2024-04-28 20:38:22 +02:00
Burak Kaan Köse
babed18af0 Added hashset uniqueid mail check to prevent gmail unread folder items to be removed on next item selection. 2024-04-28 20:20:29 +02:00
Burak Kaan Köse
3fa7e3e36d Merge pull request #168 from Tiktack/language-time-page
Language & Time page
2024-04-28 18:08:39 +02:00
Burak Kaan Köse
45587d5f15 Merge pull request #161 from Tiktack/titlebar-should-be-draggable
Fixed dead zone in title bar in settings to be draggable
2024-04-28 17:52:55 +02:00
Burak Kaan Köse
e98f6997ca Merge pull request #167 from Tiktack/wino165-commandbar-issues
Fix commend bar issues
2024-04-28 17:50:02 +02:00
Aleh Khantsevich
21d1b71653 Remove seconds from reading page 2024-04-28 00:31:25 +02:00
Aleh Khantsevich
afd7b5650f Removed useless command paramter and duplicate registration 2024-04-27 16:29:26 +02:00
Aleh Khantsevich
a0687d555a Added translations. Strongly typed paramter for setting navigation.
Titles now uses translation for breadcrumb
2024-04-27 15:27:02 +02:00
Aleh Khantsevich
f543953389 Added language & time page 2024-04-27 13:50:18 +02:00
Aleh Khantsevich
2c4c7586b7 Change visible to condition for SecondaryItems 2024-04-26 14:30:00 +02:00
Aleh Khantsevich
e92921a6cc Fix commend bar issues #165 2024-04-26 01:47:46 +02:00
Aleh Khantsevich
0322bcd047 Added filter to do not update UI when unread folder changed. 2024-04-25 00:26:58 +02:00
Aleh Khantsevich
26c914be96 Fix dead zone in title bar to be draggable 2024-04-23 11:03:40 +02:00
Burak Kaan Köse
75863faf58 Merge pull request #158 from Tiktack/settings-appearance
Hide Scrollbars and add glyphs to external links
2024-04-22 12:44:22 +02:00
Aleh Khantsevich
99b3ec4ce3 Resolved suggestions 2024-04-22 01:45:44 +02:00
Aleh Khantsevich
d97ffd863b Scrollbars and glyphs
Updated ScrollViewer and added action icons in XAML files
2024-04-21 19:04:18 +02:00
559 changed files with 26873 additions and 32576 deletions

View File

@@ -25,6 +25,7 @@ I'm a big fan of Windows Mail & Calendars due to its simplicity. Personally, I f
- API integration for Outlook and Gmail
- IMAP/SMTP support for custom mail servers
- Send, receive, mark as (read,important,spam etc), move mails.
- Linked/Merged Accounts
- Toast notifications with background sync.
- Instant startup performance
- Offline use / search.
@@ -43,7 +44,7 @@ Download latest version of Wino Mail from Microsoft Store for free.
## Beta Releases
Stable releases will always be distributed on Microsoft Store. However, beta releases will be distributed in [GitHub Releases](https://github.com/bkaankose/Wino-Mail/releases). Please keep in mind that beta releases might not be for daily use, only for testing purposes and recommended for experienced users or developers.
Stable releases will always be distributed on Microsoft Store. However, beta releases will be distributed in [GitHub Releases](https://github.com/bkaankose/Wino-Mail/releases). Please keep in mind that beta releases might not be for daily use, only for testing purposes and recommended for experienced users or developers. Beta releases are also managed manually. Therefore, code in the repository might be ahead of the released Beta version at the moment. Make sure to compare versions before tryout out the Beta version.
These releases are distributed as side-loaded packages. To install them, download the **.msixbundle** file in GitHub releases and [follow the steps explained here.](https://learn.microsoft.com/en-us/windows/application-management/sideload-apps-in-windows)
@@ -52,10 +53,6 @@ These releases are distributed as side-loaded packages. To install them, downloa
Check out the [contribution guidelines](/CONTRIBUTING.md) before diving into the source code or opening an issue. There are multiple ways to contribute and all of them are explained in detail there.
#### Attention
Sources here **does not belong to the Store version of Wino Mail. It belongs to beta release as of April 17 2024.** I've been working on a big patch for couple months already and the code here includes those changes, but these changes are not yet released to Microsoft Store. Therefore, if you'd like to contribute, please validate the bug before in beta version and start working on it. I will delete this text from here once this big patch goes alive in the Store, so everything will be aligned then.
## Donate
Your donations will motivate me more to work on Wino in my spare time and cover the expenses to keep [project's website](https://www.winomail.app/) alive.

42
Settings.XamlStyler Normal file
View File

@@ -0,0 +1,42 @@
{
"AttributesTolerance": 2,
"KeepFirstAttributeOnSameLine": false,
"MaxAttributeCharactersPerLine": 0,
"MaxAttributesPerLine": 1,
"NewlineExemptionElements": "RadialGradientBrush, GradientStop, LinearGradientBrush, ScaleTransform, SkewTransform, RotateTransform, TranslateTransform, Trigger, Condition, Setter",
"SeparateByGroups": false,
"AttributeIndentation": 0,
"AttributeIndentationStyle": 1,
"RemoveDesignTimeReferences": false,
"IgnoreDesignTimeReferencePrefix": false,
"EnableAttributeReordering": true,
"AttributeOrderingRuleGroups": [
"x:Class",
"xmlns, xmlns:x",
"xmlns:*",
"x:Key, Key, x:Name, Name, x:Uid, Uid, Title",
"Grid.Row, Grid.RowSpan, Grid.Column, Grid.ColumnSpan, Canvas.Left, Canvas.Top, Canvas.Right, Canvas.Bottom",
"Width, Height, MinWidth, MinHeight, MaxWidth, MaxHeight",
"Margin, Padding, HorizontalAlignment, VerticalAlignment, HorizontalContentAlignment, VerticalContentAlignment, Panel.ZIndex",
"*:*, *",
"PageSource, PageIndex, Offset, Color, TargetName, Property, Value, StartPoint, EndPoint",
"mc:Ignorable, d:IsDataSource, d:LayoutOverrides, d:IsStaticText",
"Storyboard.*, From, To, Duration"
],
"FirstLineAttributes": "",
"OrderAttributesByName": true,
"PutEndingBracketOnNewLine": false,
"RemoveEndingTagOfEmptyElement": true,
"SpaceBeforeClosingSlash": true,
"RootElementLineBreakRule": 0,
"ReorderVSM": 2,
"ReorderGridChildren": false,
"ReorderCanvasChildren": false,
"ReorderSetters": 0,
"FormatMarkupExtension": true,
"NoNewLineMarkupExtensions": "x:Bind, Binding",
"ThicknessSeparator": 2,
"ThicknessAttributes": "Margin, Padding, BorderThickness, ThumbnailClipMargin",
"FormatOnSave": true,
"CommentPadding": 2,
}

View File

@@ -1,7 +1,6 @@
using Microsoft.Toolkit.Uwp.Notifications;
using Windows.ApplicationModel;
using Windows.ApplicationModel.Background;
using Wino.Core.Domain;
namespace Wino.BackgroundTasks
{
@@ -23,8 +22,9 @@ namespace Wino.BackgroundTasks
var versionText = string.Format("{0}.{1}.{2}.{3}", version.Major, version.Minor, version.Build, version.Revision);
builder.AddText(Translator.Notifications_WinoUpdatedTitle);
builder.AddText(string.Format(Translator.Notifications_WinoUpdatedMessage, versionText));
// TODO: Handle with Translator, but it's not initialized here yet.
builder.AddText("Wino Mail is updated!");
builder.AddText(string.Format("New version {0} is ready.", versionText));
builder.Show();

View File

@@ -1,48 +0,0 @@
using System;
using Microsoft.Extensions.DependencyInjection;
using Serilog;
using Windows.ApplicationModel.Background;
using Windows.Storage;
using Wino.Core;
using Wino.Core.Domain.Interfaces;
using Wino.Core.Services;
using Wino.Core.UWP;
using Wino.Services;
namespace Wino.BackgroundTasks
{
public sealed class SessionConnectedTask : IBackgroundTask
{
public async void Run(IBackgroundTaskInstance taskInstance)
{
var def = taskInstance.GetDeferral();
try
{
var services = new ServiceCollection();
services.RegisterCoreServices();
services.RegisterCoreUWPServices();
var providere = services.BuildServiceProvider();
var backgroundTaskService = providere.GetService<IBackgroundSynchronizer>();
var dbService = providere.GetService<IDatabaseService>();
var logInitializer = providere.GetService<ILogInitializer>();
logInitializer.SetupLogger(ApplicationData.Current.LocalFolder.Path);
await dbService.InitializeAsync();
await backgroundTaskService.RunBackgroundSynchronizationAsync(Core.Domain.Enums.BackgroundSynchronizationReason.SessionConnected);
}
catch (Exception ex)
{
Log.Error(ex, "Background synchronization failed from background task.");
}
finally
{
def.Complete();
}
}
}
}

View File

@@ -18,25 +18,6 @@
<ProjectTypeGuids>{A5A43C5B-DE2A-4C0C-9213-0A381AF9435A};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
<AllowCrossPlatformRetargeting>false</AllowCrossPlatformRetargeting>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
<PlatformTarget>x86</PlatformTarget>
<DebugSymbols>true</DebugSymbols>
@@ -57,26 +38,6 @@
<UseVSHostingProcess>false</UseVSHostingProcess>
<ErrorReport>prompt</ErrorReport>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|ARM'">
<PlatformTarget>ARM</PlatformTarget>
<DebugSymbols>true</DebugSymbols>
<OutputPath>bin\ARM\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>
<NoWarn>;2008</NoWarn>
<DebugType>full</DebugType>
<UseVSHostingProcess>false</UseVSHostingProcess>
<ErrorReport>prompt</ErrorReport>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|ARM'">
<PlatformTarget>ARM</PlatformTarget>
<OutputPath>bin\ARM\Release\</OutputPath>
<DefineConstants>TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>
<Optimize>true</Optimize>
<NoWarn>;2008</NoWarn>
<DebugType>pdbonly</DebugType>
<UseVSHostingProcess>false</UseVSHostingProcess>
<ErrorReport>prompt</ErrorReport>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|ARM64'">
<PlatformTarget>ARM64</PlatformTarget>
<DebugSymbols>true</DebugSymbols>
@@ -123,7 +84,6 @@
<ItemGroup>
<Compile Include="AppUpdatedTask.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="SessionConnectedTask.cs" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.NETCore.UniversalWindowsPlatform">

View File

@@ -8,7 +8,11 @@
public const string WinoLocalDraftHeader = "X-Wino-Draft-Id";
public const string LocalDraftStartPrefix = "localDraft_";
public const string ToastMailItemIdKey = nameof(ToastMailItemIdKey);
public const string ToastMailUniqueIdKey = nameof(ToastMailUniqueIdKey);
public const string ToastActionKey = nameof(ToastActionKey);
public const string ClientLogFile = "Client_.log";
public const string ServerLogFile = "Server_.log";
public const string LogArchiveFileName = "WinoLogs.zip";
}
}

View File

@@ -1,6 +1,6 @@
using SQLite;
using System;
using System;
using System.Collections.Generic;
using SQLite;
namespace Wino.Core.Domain.Entities
{
@@ -9,23 +9,41 @@ namespace Wino.Core.Domain.Entities
/// These values will be inserted during MIME fetch.
/// </summary>
// TODO: This can easily evolve to Contact store, just like People app in Windows 10/11.
// Do it.
public class AddressInformation : IEquatable<AddressInformation>
public class AccountContact : IEquatable<AccountContact>
{
/// <summary>
/// E-mail address of the contact.
/// </summary>
[PrimaryKey]
public string Address { get; set; }
/// <summary>
/// Display name of the contact.
/// </summary>
public string Name { get; set; }
/// <summary>
/// Base64 encoded profile image of the contact.
/// </summary>
public string Base64ContactPicture { get; set; }
/// <summary>
/// All registered accounts have their contacts registered as root.
/// Root contacts must not be overridden by any configuration.
/// They are created on account creation.
/// </summary>
public bool IsRootContact { get; set; }
public string DisplayName => Address == Name ? Address : $"{Name} <{Address}>";
public override bool Equals(object obj)
{
return Equals(obj as AddressInformation);
return Equals(obj as AccountContact);
}
public bool Equals(AddressInformation other)
public bool Equals(AccountContact other)
{
return !(other is null) &&
Address == other.Address &&
@@ -40,12 +58,12 @@ namespace Wino.Core.Domain.Entities
return hashCode;
}
public static bool operator ==(AddressInformation left, AddressInformation right)
public static bool operator ==(AccountContact left, AccountContact right)
{
return EqualityComparer<AddressInformation>.Default.Equals(left, right);
return EqualityComparer<AccountContact>.Default.Equals(left, right);
}
public static bool operator !=(AddressInformation left, AddressInformation right)
public static bool operator !=(AccountContact left, AccountContact right)
{
return !(left == right);
}

View File

@@ -8,6 +8,10 @@ namespace Wino.Core.Domain.Entities
[PrimaryKey]
public Guid Id { get; set; }
public string Name { get; set; }
public string HtmlBody { get; set; }
public Guid MailAccountId { get; set; }
}
}

View File

@@ -11,6 +11,10 @@ namespace Wino.Core.Domain.Entities
public Guid AccountId { get; set; }
/// <summary>
/// This field is ignored. DisplayName is stored in MailAccount as SenderName from now.
/// </summary>
[Ignore]
public string DisplayName { get; set; }
public string Address { get; set; }
public string IncomingServer { get; set; }
@@ -39,11 +43,11 @@ namespace Wino.Core.Domain.Entities
public string ProxyServer { get; set; }
public string ProxyServerPort { get; set; }
[Obsolete("As 1.7.0")]
public bool IncomingRequiresSSL { get; set; }
[Obsolete("As 1.7.0")]
public bool OutgoingRequresSSL { get; set; }
/// <summary>
/// Number of concurrent clients that can connect to the server.
/// Default is 5.
/// </summary>
public int MaxConcurrentClients { get; set; }
}
}

View File

@@ -20,7 +20,7 @@ namespace Wino.Core.Domain.Entities
/// IMAP is populated by user on setup dialog.
/// </summary>
public string ProfileName { get; set; }
public string SenderName { get; set; }
/// <summary>
/// Account e-mail address.
@@ -40,10 +40,19 @@ namespace Wino.Core.Domain.Entities
public string SynchronizationDeltaIdentifier { get; set; }
/// <summary>
/// Gets or sets the signature to be used for this account.
/// Null if no signature should be used.
/// TODO: Gets or sets the custom account identifier color in hex.
/// </summary>
public Guid? SignatureId { get; set; }
public string AccountColorHex { get; set; }
/// <summary>
/// Base64 encoded profile picture of the account.
/// </summary>
public string Base64ProfilePictureData { get; set; }
/// <summary>
/// Gets or sets the listing order of the account in the accounts list.
/// </summary>
public int Order { get; set; }
/// <summary>
/// Gets or sets whether the account has any reason for an interactive user action to fix continue operating.
@@ -74,5 +83,15 @@ namespace Wino.Core.Domain.Entities
/// </summary>
[Ignore]
public MailAccountPreferences Preferences { get; set; }
/// <summary>
/// Gets whether the account can perform ProfileInformation sync type.
/// </summary>
public bool IsProfileInfoSyncSupported => ProviderType == MailProviderType.Outlook || ProviderType == MailProviderType.Office365 || ProviderType == MailProviderType.Gmail;
/// <summary>
/// Gets whether the account can perform AliasInformation sync type.
/// </summary>
public bool IsAliasSyncSupported => ProviderType == MailProviderType.Gmail;
}
}

View File

@@ -0,0 +1,56 @@
using System;
using SQLite;
namespace Wino.Core.Domain.Entities
{
public class RemoteAccountAlias
{
/// <summary>
/// Display address of the alias.
/// </summary>
public string AliasAddress { get; set; }
/// <summary>
/// Address to be included in Reply-To header when alias is used for sending messages.
/// </summary>
public string ReplyToAddress { get; set; }
/// <summary>
/// Whether this alias is the primary alias for the account.
/// </summary>
public bool IsPrimary { get; set; }
/// <summary>
/// Whether the alias is verified by the server.
/// Only Gmail aliases are verified for now.
/// Non-verified alias messages might be rejected by SMTP server.
/// </summary>
public bool IsVerified { get; set; }
/// <summary>
/// Whether this alias is the root alias for the account.
/// Root alias means the first alias that was created for the account.
/// It can't be deleted or changed.
/// </summary>
public bool IsRootAlias { get; set; }
}
public class MailAccountAlias : RemoteAccountAlias
{
/// <summary>
/// Unique Id for the alias.
/// </summary>
[PrimaryKey]
public Guid Id { get; set; }
/// <summary>
/// Account id that this alias is attached to.
/// </summary>
public Guid AccountId { get; set; }
/// <summary>
/// Root aliases can't be deleted.
/// </summary>
public bool CanDelete => !IsRootAlias;
}
}

View File

@@ -25,15 +25,25 @@ namespace Wino.Core.Domain.Entities
/// </summary>
public bool IsNotificationsEnabled { get; set; }
/// <summary>
/// Gets or sets the custom account identifier color in hex.
/// </summary>
public string AccountColorHex { get; set; }
/// <summary>
/// Gets or sets whether the account has Focused inbox support.
/// Null if the account provider type doesn't support Focused inbox.
/// </summary>
public bool? IsFocusedInboxEnabled { get; set; }
/// <summary>
/// Gets or sets whether signature should be appended automatically.
/// </summary>
public bool IsSignatureEnabled { get; set; }
/// <summary>
/// Gets or sets signature for new messages. Null if signature is not needed.
/// </summary>
public Guid? SignatureIdForNewMessages { get; set; }
/// <summary>
/// Gets or sets signature for following messages. Null if signature is not needed.
/// </summary>
public Guid? SignatureIdForFollowingMessages { get; set; }
}
}

View File

@@ -1,4 +1,5 @@
using System;
using System.Collections.Generic;
using SQLite;
using Wino.Core.Domain.Enums;
using Wino.Core.Domain.Models.MailItem;
@@ -107,6 +108,12 @@ namespace Wino.Core.Domain.Entities
/// </summary>
public string DraftId { get; set; }
/// <summary>
/// Whether this mail is only created locally.
/// </summary>
[Ignore]
public bool IsLocalDraft => !string.IsNullOrEmpty(DraftId) && DraftId.StartsWith(Constants.LocalDraftStartPrefix);
/// <summary>
/// Whether this copy is draft or not.
/// </summary>
@@ -135,6 +142,15 @@ namespace Wino.Core.Domain.Entities
[Ignore]
public MailAccount AssignedAccount { get; set; }
/// <summary>
/// Contact information of the sender if exists.
/// Warning: This field is not populated by queries.
/// Services or View Models are responsible for populating this field.
/// </summary>
[Ignore]
public AccountContact SenderContact { get; set; }
public IEnumerable<Guid> GetContainingIds() => [UniqueId];
public override string ToString() => $"{Subject} <-> {Id}";
}
}

View File

@@ -67,6 +67,9 @@ namespace Wino.Core.Domain.Entities
return false;
}
public static MailItemFolder CreateMoreFolder() => new MailItemFolder() { IsSticky = true, SpecialFolderType = SpecialFolderType.More, FolderName = Translator.MoreFolderNameOverride };
public static MailItemFolder CreateCategoriesFolder() => new MailItemFolder() { IsSticky = true, SpecialFolderType = SpecialFolderType.Category, FolderName = Translator.CategoriesFolderNameOverride };
public override string ToString() => FolderName;
}
}

View File

@@ -11,6 +11,10 @@ namespace Wino.Core.Domain.Entities
public Guid AccountId { get; set; }
/// <summary>
/// Unique object storage for authenticators if needed.
/// </summary>
public string UniqueId { get; set; }
public string Address { get; set; }
public void RefreshTokens(TokenInformationBase tokenInformationBase)

View File

@@ -9,6 +9,7 @@
ManuelSetupWaiting,
TestingConnection,
AutoDiscoverySetup,
AutoDiscoveryInProgress
AutoDiscoveryInProgress,
FetchingProfileInformation
}
}

View File

@@ -11,6 +11,10 @@
Czech,
Chinese,
Spanish,
French
French,
Indonesian,
Greek,
PortugeseBrazil,
Italian
}
}

View File

@@ -1,11 +0,0 @@
namespace Wino.Core.Domain.Enums
{
public enum EditorToolbarSectionType
{
None,
Format,
Insert,
Draw,
Options
}
}

View File

@@ -5,6 +5,7 @@
All,
Unread,
Flagged,
Mentions
Mentions,
Files
}
}

View File

@@ -11,7 +11,10 @@
ChangeFlag,
AlwaysMoveTo,
MoveToFocused,
RenameFolder
Archive,
RenameFolder,
EmptyFolder,
MarkFolderRead,
}
// UI requests
@@ -44,6 +47,7 @@
DarkEditor,
LightEditor,
Print,
DiscardLocalDraft,
Navigate // For toast activation
}
}

View File

@@ -1,8 +0,0 @@
namespace Wino.Core.Domain.Enums
{
public enum MenuPaneMode
{
Visible,
Hidden
}
}

View File

@@ -1,15 +0,0 @@
namespace Wino.Core.Domain.Enums
{
public enum ReaderFont
{
Arial,
TimesNewRoman,
Verdana,
Tahoma,
CourierNew,
Georgia,
TrebuchetMS,
Calibri,
Helvetica
}
}

View File

@@ -0,0 +1,12 @@
namespace Wino.Core.Domain.Enums
{
/// <summary>
/// What should happen to server app when the client is terminated.
/// </summary>
public enum ServerBackgroundMode
{
MinimizedTray, // Still runs, tray icon is visible.
Invisible, // Still runs, tray icon is invisible.
Terminate // Server is terminated as Wino terminates.
}
}

View File

@@ -0,0 +1,11 @@
namespace Wino.Core.Domain.Enums
{
public enum StartupBehaviorResult
{
Enabled,
Disabled,
DisabledByUser,
DisabledByPolicy,
Fatal
}
}

View File

@@ -0,0 +1,12 @@
namespace Wino.Core.Domain.Enums
{
/// <summary>
/// Enumeration for the source of synchronization.
/// Right now it can either be from the client or the server.
/// </summary>
public enum SynchronizationSource
{
Client,
Server
}
}

View File

@@ -4,8 +4,10 @@
{
FoldersOnly, // Only synchronize folder metadata.
ExecuteRequests, // Run the queued requests, and then synchronize if needed.
Inbox, // Only Inbox
Inbox, // Only Inbox, Sent and Draft folders.
Custom, // Only sync folders that are specified in the options.
Full, // Synchronize everything
Full, // Synchronize all folders. This won't update profile or alias information.
UpdateProfile, // Only update profile information
Alias, // Only update alias information
}
}

View File

@@ -0,0 +1,10 @@
namespace Wino.Core.Domain.Enums
{
public enum WinoCustomMessageDialogIcon
{
Information,
Warning,
Error,
Question
}
}

View File

@@ -19,7 +19,10 @@
PersonalizationPage,
MessageListPage,
MailListPage,
ReadingPanePage,
SettingOptionsPage
ReadComposePanePage,
LanguageTimePage,
AppPreferencesPage,
SettingOptionsPage,
AliasManagementPage
}
}

View File

@@ -0,0 +1,11 @@
namespace Wino.Core.Domain.Enums
{
public enum WinoServerConnectionStatus
{
None,
Connecting,
Connected,
Disconnected,
Failed
}
}

View File

@@ -1,9 +0,0 @@
using System;
namespace Wino.Core.Domain.Exceptions
{
/// <summary>
/// An exception thrown when the background task execution policies are denied for some reason.
/// </summary>
public class BackgroundTaskExecutionRequestDeniedException : Exception { }
}

View File

@@ -4,8 +4,11 @@ namespace Wino.Core.Domain.Exceptions
{
public class ImapClientPoolException : Exception
{
public ImapClientPoolException(Exception innerException) : base(Translator.Exception_ImapClientPoolFailed, innerException)
public ImapClientPoolException(Exception innerException, string protocolLog) : base(Translator.Exception_ImapClientPoolFailed, innerException)
{
ProtocolLog = protocolLog;
}
public string ProtocolLog { get; }
}
}

View File

@@ -0,0 +1,21 @@
using System;
using Wino.Core.Domain.Models.AutoDiscovery;
namespace Wino.Core.Domain.Exceptions
{
public class ImapConnectionFailedPackage
{
public ImapConnectionFailedPackage(Exception error, string protocolLog, AutoDiscoverySettings settings)
{
Error = error;
ProtocolLog = protocolLog;
Settings = settings;
}
public AutoDiscoverySettings Settings { get; }
public Exception Error { get; }
public string ProtocolLog { get; }
public string GetErrorMessage() => Error.InnerException == null ? Error.Message : Error.InnerException.Message;
}
}

View File

@@ -0,0 +1,7 @@
namespace Wino.Core.Domain.Exceptions
{
public class MissingAliasException : System.Exception
{
public MissingAliasException() : base(Translator.Exception_MissingAlias) { }
}
}

View File

@@ -0,0 +1,12 @@
using System;
namespace Wino.Core.Domain.Exceptions
{
/// <summary>
/// All server crash types. Wino Server ideally should not throw anything else than this Exception type.
/// </summary>
public class WinoServerException : Exception
{
public WinoServerException(string message) : base(message) { }
}
}

View File

@@ -0,0 +1,20 @@
using System;
namespace Wino.Core.Domain.Extensions
{
public static class MimeExtensions
{
public static string GetBase64MimeMessage(this MimeKit.MimeMessage message)
{
using System.IO.MemoryStream memoryStream = new();
message.WriteTo(MimeKit.FormatOptions.Default, memoryStream);
byte[] buffer = memoryStream.GetBuffer();
int count = (int)memoryStream.Length;
return Convert.ToBase64String(buffer);
}
public static MimeKit.MimeMessage GetMimeMessageFromBase64(this string base64)
=> MimeKit.MimeMessage.Load(new System.IO.MemoryStream(Convert.FromBase64String(base64)));
}
}

View File

@@ -5,9 +5,17 @@ namespace Wino.Core.Domain.Interfaces
{
public interface IAccountMenuItem : IMenuItem
{
bool IsEnabled { get; set; }
double SynchronizationProgress { get; set; }
int UnreadItemCount { get; set; }
IEnumerable<MailAccount> HoldingAccounts { get; }
void UpdateAccount(MailAccount account);
}
public interface IMergedAccountMenuItem : IAccountMenuItem
{
int MergedAccountCount { get; }
MergedInbox Parameter { get; }
}
}

View File

@@ -13,5 +13,26 @@ namespace Wino.Core.Domain.Interfaces
/// Name representation of the view model that will be used to identify the startup entity on launch.
/// </summary>
string StartupEntityTitle { get; }
/// <summary>
/// E-mail addresses that this account holds.
/// </summary>
string StartupEntityAddresses { get; }
/// <summary>
/// Represents the account order in the accounts list.
/// </summary>
int Order { get; }
/// <summary>
/// Provider details of the account.
/// </summary>
IProviderDetail ProviderDetail { get; set; }
/// <summary>
/// How many accounts this provider has.
/// </summary>
int HoldingAccountCount { get; }
}
}

View File

@@ -2,6 +2,7 @@
using System.Collections.Generic;
using System.Threading.Tasks;
using Wino.Core.Domain.Entities;
using Wino.Core.Domain.Models.Accounts;
namespace Wino.Core.Domain.Interfaces
{
@@ -68,12 +69,91 @@ namespace Wino.Core.Domain.Interfaces
/// <returns>Current account synchronization modifier.</returns>
Task<string> UpdateSynchronizationIdentifierAsync(Guid accountId, string newIdentifier);
/// <summary>
/// Renames the merged inbox with the given id.
/// </summary>
/// <param name="mergedInboxId">Merged Inbox id</param>
/// <param name="newName">New name for the merged/linked inbox.</param>
Task RenameMergedAccountAsync(Guid mergedInboxId, string newName);
/// <summary>
/// Creates a new merged inbox with the given accounts.
/// </summary>
/// <param name="mergedInbox">Merged inbox properties.</param>
/// <param name="accountsToMerge">List of accounts to merge together.</param>
Task CreateMergeAccountsAsync(MergedInbox mergedInbox, IEnumerable<MailAccount> accountsToMerge);
/// <summary>
/// Updates the merged inbox with the given id with the new linked accounts.
/// </summary>
/// <param name="mergedInboxId">Updating merged inbox id.</param>
/// <param name="linkedAccountIds">List of linked account ids.</param>
Task UpdateMergedInboxAsync(Guid mergedInboxId, IEnumerable<Guid> linkedAccountIds);
/// <summary>
/// Destroys the merged inbox with the given id.
/// </summary>
/// <param name="mergedInboxId">Merged inbox id to destroy.</param>
Task UnlinkMergedInboxAsync(Guid mergedInboxId);
/// <summary>
/// Updates the account listing orders.
/// </summary>
/// <param name="accountIdOrderPair">AccountId-OrderNumber pair for all accounts.</param>
Task UpdateAccountOrdersAsync(Dictionary<Guid, int> accountIdOrderPair);
/// <summary>
/// Returns the account aliases.
/// </summary>
/// <param name="accountId">Account id.</param>
/// <returns>A list of MailAccountAlias that has e-mail aliases.</returns>
Task<List<MailAccountAlias>> GetAccountAliasesAsync(Guid accountId);
/// <summary>
/// Updated account's aliases.
/// </summary>
/// <param name="accountId">Account id to update aliases for.</param>
/// <param name="aliases">Full list of updated aliases.</param>
/// <returns></returns>
Task UpdateAccountAliasesAsync(Guid accountId, List<MailAccountAlias> aliases);
/// <summary>
/// Delete account alias.
/// </summary>
/// <param name="aliasId">Alias to remove.</param>
Task DeleteAccountAliasAsync(Guid aliasId);
/// <summary>
/// Updated profile information of the account.
/// </summary>
/// <param name="accountId">Account id to update info for.</param>
/// <param name="profileInformation">Info data.</param>
/// <returns></returns>
Task UpdateProfileInformationAsync(Guid accountId, ProfileInformation profileInformation);
/// <summary>
/// Creates a root + primary alias for the account.
/// This is only called when the account is created.
/// </summary>
/// <param name="accountId">Account id.</param>
/// <param name="address">Address to create root primary alias from.</param>
Task CreateRootAliasAsync(Guid accountId, string address);
/// <summary>
/// Will compare local-remote aliases and update the local ones or add/delete new ones.
/// </summary>
/// <param name="remoteAccountAliases">Remotely fetched basic alias info from synchronizer.</param>
/// <param name="account">Account to update remote aliases for..</param>
Task UpdateRemoteAliasInformationAsync(MailAccount account, List<RemoteAccountAlias> remoteAccountAliases);
/// <summary>
/// Gets the primary account alias for the given account id.
/// Used when creating draft messages.
/// </summary>
/// <param name="accountId">Account id.</param>
/// <returns>Primary alias for the account.</returns>
Task<MailAccountAlias> GetPrimaryAccountAliasAsync(Guid accountId);
}
}

View File

@@ -1,11 +0,0 @@
using System.Threading.Tasks;
namespace Wino.Core.Domain.Interfaces
{
public interface IAppInitializerService
{
string GetApplicationDataFolder();
Task MigrateAsync();
}
}

View File

@@ -0,0 +1,21 @@
namespace Wino.Core.Domain.Interfaces
{
/// <summary>
/// Singleton object that holds the application data folder path and the publisher shared folder path.
/// Load the values before calling any service.
/// App data folder is used for storing files.
/// Pubhlisher cache folder is only used for database file so other apps can access it in the same package by same publisher.
/// </summary>
public interface IApplicationConfiguration
{
/// <summary>
/// Application data folder.
/// </summary>
string ApplicationDataFolderPath { get; set; }
/// <summary>
/// Publisher shared folder path.
/// </summary>
string PublisherSharedFolderPath { get; set; }
}
}

View File

@@ -1,5 +1,4 @@
using System;
using System.Threading.Tasks;
using System.Threading.Tasks;
using Wino.Core.Domain.Entities;
using Wino.Core.Domain.Enums;
@@ -23,28 +22,12 @@ namespace Wino.Core.Domain.Interfaces
/// <summary>
/// Initial creation of token. Requires user interaction.
/// This will save token into database, but still returns for account creation
/// This will cache the token but still returns for account creation
/// since account address is required.
/// </summary>
/// <param name="expectedAccountAddress">Token cache might ask for regeneration of token for specific
/// account address. If one is provided and re-generation native token doesn't belong to this address
/// token saving to database won't happen.</param>
/// <returns>Freshly created TokenInformation..</returns>
Task<TokenInformation> GenerateTokenAsync(MailAccount account, bool saveToken);
/// <summary>
/// Required for external authorization on launched browser to continue.
/// Used for Gmail.
/// </summary>
/// <param name="authorizationResponseUri">Response's redirect uri.</param>
void ContinueAuthorization(Uri authorizationResponseUri);
/// <summary>
/// For external browser required authentications.
/// Canceling Gmail authentication dialog etc.
/// </summary>
void CancelAuthorization();
/// <summary>
/// ClientId in case of needed for authorization/authentication.
/// </summary>

View File

@@ -0,0 +1,6 @@
namespace Wino.Core.Domain.Interfaces
{
public interface IOutlookAuthenticator : IAuthenticator { }
public interface IGmailAuthenticator : IAuthenticator { }
public interface IImapAuthenticator : IAuthenticator { }
}

View File

@@ -5,15 +5,14 @@ namespace Wino.Core.Domain.Interfaces
public interface IBackgroundTaskService
{
/// <summary>
/// Manages background task registrations, requests access if needed, checks the statusses of them etc.
/// </summary>
/// <exception cref="BackgroundTaskExecutionRequestDeniedException">If the access request is denied for some reason.</exception>
/// <exception cref="BackgroundTaskRegistrationFailedException">If one of the requires background tasks are failed during registration.</exception>
Task HandleBackgroundTaskRegistrations();
/// <summary>
/// Unregisters all existing background tasks. Useful for migrations.
/// Unregisters all background tasks once.
/// This is used to clean up the background tasks when the app is updated.
/// </summary>
void UnregisterAllBackgroundTask();
/// <summary>
/// Registers required background tasks.
/// </summary>
Task RegisterBackgroundTasksAsync();
}
}

View File

@@ -0,0 +1,62 @@
using System.Threading;
using System.Threading.Tasks;
using MailKit;
using Wino.Core.Domain.Entities;
using Wino.Core.Domain.Enums;
using Wino.Core.Domain.Models.Accounts;
using Wino.Core.Domain.Models.MailItem;
using Wino.Core.Domain.Models.Synchronization;
namespace Wino.Core.Domain.Interfaces
{
public interface IBaseSynchronizer
{
/// <summary>
/// Account that is assigned for this synchronizer.
/// </summary>
MailAccount Account { get; }
/// <summary>
/// Synchronizer state.
/// </summary>
AccountSynchronizerState State { get; }
/// <summary>
/// Queues a single request to be executed in the next synchronization.
/// </summary>
/// <param name="request">Request to queue.</param>
void QueueRequest(IRequestBase request);
/// <summary>
/// TODO
/// </summary>
/// <returns>Whether active synchronization is stopped or not.</returns>
bool CancelActiveSynchronization();
/// <summary>
/// Performs a full synchronization with the server with given options.
/// This will also prepares batch requests for execution.
/// Requests are executed in the order they are queued and happens before the synchronization.
/// Result of the execution queue is processed during the synchronization.
/// </summary>
/// <param name="options">Options for synchronization.</param>
/// <param name="cancellationToken">Cancellation token.</param>
/// <returns>Result summary of synchronization.</returns>
Task<SynchronizationResult> SynchronizeAsync(SynchronizationOptions options, CancellationToken cancellationToken = default);
/// <summary>
/// Synchronizes profile information with the server.
/// Sender name and Profile picture are updated.
/// </summary>
/// <returns>Profile information model that holds the values.</returns>
Task<ProfileInformation> GetProfileInformationAsync();
/// <summary>
/// Downloads a single MIME message from the server and saves it to disk.
/// </summary>
/// <param name="mailItem">Mail item to download from server.</param>
/// <param name="transferProgress">Optional progress reporting for download operation.</param>
/// <param name="cancellationToken">Cancellation token.</param>
Task DownloadMissingMimeMessageAsync(IMailItem mailItem, ITransferProgress transferProgress, CancellationToken cancellationToken = default);
}
}

View File

@@ -0,0 +1,8 @@
namespace Wino.Core.Domain.Interfaces
{
/// <summary>
/// All messages that Client sends to Server and awaits a response in return.
/// For example; triggering a new synchronization request.
/// </summary>
public interface IClientMessage;
}

View File

@@ -1,9 +0,0 @@
using System.Threading.Tasks;
namespace Wino.Core.Domain.Interfaces
{
public interface IConfirmationDialog
{
Task<bool> ShowDialogAsync(string title, string message, string approveButtonTitle);
}
}

View File

@@ -0,0 +1,9 @@
using Wino.Core.Domain.Entities;
namespace Wino.Core.Domain.Interfaces
{
public interface ICreateAccountAliasDialog
{
public MailAccountAlias CreatedAccountAlias { get; set; }
}
}

View File

@@ -15,5 +15,11 @@ namespace Wino.Core.Domain.Interfaces
/// Displays preparing folders page.
/// </summary>
void ShowPreparingFolders();
/// <summary>
/// Updates account properties for the welcome imap setup dialog and starts the setup.
/// </summary>
/// <param name="account">Account properties.</param>
void StartImapConnectionSetup(MailAccount account);
}
}

View File

@@ -1,8 +1,10 @@
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Threading.Tasks;
using Wino.Core.Domain.Entities;
using Wino.Core.Domain.Enums;
using Wino.Core.Domain.Models.Accounts;
using Wino.Core.Domain.Models.Folders;
namespace Wino.Core.Domain.Interfaces
@@ -13,11 +15,10 @@ namespace Wino.Core.Domain.Interfaces
Task<byte[]> PickWindowsFileContentAsync(params object[] typeFilters);
Task<bool> ShowConfirmationDialogAsync(string question, string title, string confirmationButtonTitle);
Task<bool> ShowHardDeleteConfirmationAsync();
Task<IStoreRatingDialog> ShowRatingDialogAsync();
Task HandleSystemFolderConfigurationDialogAsync(Guid accountId, IFolderService folderService);
Task<bool> ShowCustomThemeBuilderDialogAsync();
Task ShowMessageAsync(string message, string title);
Task ShowMessageAsync(string message, string title, WinoCustomMessageDialogIcon icon);
void InfoBarMessage(string title, string message, InfoBarMessageType messageType);
void InfoBarMessage(string title, string message, InfoBarMessageType messageType, string actionButtonText, Action action);
@@ -25,12 +26,19 @@ namespace Wino.Core.Domain.Interfaces
// Custom dialogs
Task<IMailItemFolder> ShowMoveMailFolderDialogAsync(List<IMailItemFolder> availableFolders);
Task<Tuple<string, MailProviderType>> ShowNewAccountMailProviderDialogAsync(List<IProviderDetail> availableProviders);
Task<AccountCreationDialogResult> ShowNewAccountMailProviderDialogAsync(List<IProviderDetail> availableProviders);
IAccountCreationDialog GetAccountCreationDialog(MailProviderType type);
Task<string> ShowTextInputDialogAsync(string currentInput, string dialogTitle, string dialogDescription);
Task<string> ShowTextInputDialogAsync(string currentInput, string dialogTitle, string dialogDescription, string primaryButtonText);
Task<MailAccount> ShowEditAccountDialogAsync(MailAccount account);
Task<MailAccount> ShowAccountPickerDialogAsync(List<MailAccount> availableAccounts);
/// <summary>
/// Displays a dialog to the user for reordering accounts.
/// </summary>
/// <param name="availableAccounts">Available accounts in order.</param>
/// <returns>Result model that has dict of AccountId-AccountOrder.</returns>
Task ShowAccountReorderDialogAsync(ObservableCollection<IAccountProviderDetailViewModel> availableAccounts);
/// <summary>
/// Presents a dialog to the user for selecting folder.
/// </summary>
@@ -38,5 +46,23 @@ namespace Wino.Core.Domain.Interfaces
/// <param name="reason">The reason behind the picking operation
/// <returns>Selected folder structure. Null if none.</returns>
Task<IMailItemFolder> PickFolderAsync(Guid accountId, PickFolderReason reason, IFolderService folderService);
/// <summary>
/// Presents a dialog to the user for signature creation/modification.
/// </summary>
/// <returns>Signature information. Null if canceled.</returns>
Task<AccountSignature> ShowSignatureEditorDialog(AccountSignature signatureModel = null);
/// <summary>
/// Presents a dialog to the user for account alias creation/modification.
/// </summary>
/// <returns>Created alias model if not canceled.</returns>
Task<ICreateAccountAliasDialog> ShowCreateAccountAliasDialogAsync();
Task<bool> ShowWinoCustomMessageDialogAsync(string title,
string description,
string approveButtonText,
WinoCustomMessageDialogIcon? icon,
string cancelButtonText = "",
string dontAskAgainConfigurationKey = "");
}
}

View File

@@ -8,5 +8,13 @@ namespace Wino.Core.Domain.Interfaces
Task<string> CopyFileAsync(string sourceFilePath, string destinationFolderPath);
Task<Stream> GetFileStreamAsync(string folderPath, string fileName);
Task<string> GetFileContentByApplicationUriAsync(string resourcePath);
/// <summary>
/// Zips all existing logs and saves to picked destination folder.
/// </summary>
/// <param name="logsFolder">Folder path where logs are stored.</param>
/// <param name="destinationFolder">Target path to save the archive file.</param>
/// <returns>True if zip is created with at least one item, false if logs are not found.</returns>
Task<bool> SaveLogsToFolderAsync(string logsFolder, string destinationFolder);
}
}

View File

@@ -8,6 +8,7 @@ namespace Wino.Core.Domain.Interfaces
public interface IFolderMenuItem : IBaseFolderMenuItem
{
MailAccount ParentAccount { get; }
void UpdateParentAccounnt(MailAccount account);
}
public interface IMergedAccountFolderMenuItem : IBaseFolderMenuItem { }
@@ -19,6 +20,7 @@ namespace Wino.Core.Domain.Interfaces
int UnreadItemCount { get; set; }
SpecialFolderType SpecialFolderType { get; }
IEnumerable<IMailItemFolder> HandlingFolders { get; }
IEnumerable<IMenuItem> SubMenuItems { get; }
bool IsMoveTarget { get; }
bool IsSticky { get; }
bool IsSystemFolder { get; }

View File

@@ -3,6 +3,7 @@ using System.Collections.Generic;
using System.Threading.Tasks;
using Wino.Core.Domain.Entities;
using Wino.Core.Domain.Enums;
using Wino.Core.Domain.Models.Accounts;
using Wino.Core.Domain.Models.Folders;
using Wino.Core.Domain.Models.MailItem;
using Wino.Core.Domain.Models.Synchronization;
@@ -15,13 +16,10 @@ namespace Wino.Core.Domain.Interfaces
Task<MailItemFolder> GetFolderAsync(Guid folderId);
Task<MailItemFolder> GetFolderAsync(Guid accountId, string remoteFolderId);
Task<List<MailItemFolder>> GetFoldersAsync(Guid accountId);
Task<List<MailItemFolder>> GetUnreadUpdateFoldersAsync(Guid accountId);
Task SetSpecialFolderAsync(Guid folderId, SpecialFolderType type);
Task<MailItemFolder> GetSpecialFolderByAccountIdAsync(Guid accountId, SpecialFolderType type);
Task<int> GetCurrentItemCountForFolder(Guid folderId);
Task<int> GetFolderNotificationBadgeAsync(Guid folderId);
Task ChangeStickyStatusAsync(Guid folderId, bool isSticky);
Task UpdateCustomServerMailListAsync(Guid accountId, List<MailItemFolder> folders);
Task<MailAccount> UpdateSystemFolderConfigurationAsync(Guid accountId, SystemFolderConfiguration configuration);
Task ChangeFolderSynchronizationStateAsync(Guid folderId, bool isSynchronizationEnabled);
@@ -39,25 +37,6 @@ namespace Wino.Core.Domain.Interfaces
/// </summary>
Task<List<MailFolderPairMetadata>> GetMailFolderPairMetadatasAsync(string mailCopyId);
// v2
/// <summary>
/// Performs bulk update for the given folders.
/// Used in Gmail.
/// </summary>
/// <param name="accountId">Account that folders belong to.</param>
/// <param name="allFolders">Folders to update.</param>
Task BulkUpdateFolderStructureAsync(Guid accountId, List<MailItemFolder> allFolders);
/// <summary>
/// Updates Folder's delta synchronization identifier.
/// Only used in Outlook since it does per-folder sync.
/// </summary>
/// <param name="folderId">Folder id</param>
/// <param name="synchronizationIdentifier">New synchronization identifier.</param>
/// <returns>New identifier if success.</returns>
Task<string> UpdateFolderDeltaSynchronizationIdentifierAsync(Guid folderId, string synchronizationIdentifier);
/// <summary>
/// Deletes the folder for the given account by remote folder id.
/// </summary>
@@ -87,6 +66,29 @@ namespace Wino.Core.Domain.Interfaces
/// <returns>True if Inbox exists, False if not.</returns>
Task<bool> IsInboxAvailableForAccountAsync(Guid accountId);
Task TestAsync();
/// <summary>
/// Updates folder's LastSynchronizedDate to now.
/// </summary>
/// <param name="folderId">Folder to update.</param>
Task UpdateFolderLastSyncDateAsync(Guid folderId);
/// <summary>
/// Updates the given folder.
/// </summary>
/// <param name="folder">Folder to update.</param>
Task UpdateFolderAsync(MailItemFolder folder);
/// <summary>
/// Returns the active folder menu items for the given account for UI.
/// </summary>
/// <param name="accountMenuItem">Account to get folder menu items for.</param>
Task<IEnumerable<IMenuItem>> GetAccountFoldersForDisplayAsync(IAccountMenuItem accountMenuItem);
/// <summary>
/// Returns a list of unread item counts for the given account ids.
/// Every folder that is marked as show unread badge is included.
/// </summary>
/// <param name="accountIds">Account ids to get unread folder counts for.</param>
Task<List<UnreadItemCountResult>> GetUnreadItemCountResultsAsync(IEnumerable<Guid> accountIds);
}
}

View File

@@ -1,16 +1,16 @@
using System.Collections.Generic;
using Wino.Core.Domain.Enums;
using Wino.Core.Domain.Models.Reader;
namespace Wino.Core.Domain.Interfaces
{
/// <summary>
/// Service to access available fonts.
/// </summary>
public interface IFontService
{
List<ReaderFontModel> GetReaderFonts();
ReaderFontModel GetCurrentReaderFont();
int GetCurrentReaderFontSize();
void ChangeReaderFont(ReaderFont font);
void ChangeReaderFontSize(int size);
/// <summary>
/// Get available fonts. Default + installed system fonts.
/// Fonts initialized only once. To refresh fonts, restart the application.
/// </summary>
List<string> GetFonts();
}
}

View File

@@ -1,10 +1,16 @@
using System.Collections.Specialized;
using Wino.Core.Domain.Models.Launch;
namespace Wino.Core.Domain.Interfaces
namespace Wino.Core.Domain.Interfaces;
public interface ILaunchProtocolService
{
public interface ILaunchProtocolService
{
object LaunchParameter { get; set; }
NameValueCollection MailtoParameters { get; set; }
}
/// <summary>
/// Used to handle toasts.
/// </summary>
object LaunchParameter { get; set; }
/// <summary>
/// Used to handle mailto links.
/// </summary>
MailToUri MailToUri { get; set; }
}

View File

@@ -2,7 +2,7 @@
{
public interface ILogInitializer
{
void SetupLogger(string logFolderPath);
void SetupLogger(string fullLogFilePath);
void RefreshLoggingLevel();
}

View File

@@ -1,7 +1,7 @@
using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using MimeKit;
using Wino.Core.Domain.Entities;
using Wino.Core.Domain.Models.MailItem;
@@ -11,12 +11,7 @@ namespace Wino.Core.Domain.Interfaces
{
Task<MailCopy> GetSingleMailItemAsync(string mailCopyId, string remoteFolderId);
Task<MailCopy> GetSingleMailItemAsync(Guid uniqueMailId);
Task<MailCopy> CreateDraftAsync(MailAccount composerAccount, MimeMessage generatedReplyMime, MimeMessage replyingMimeMessage = null, IMailItem replyingMailItem = null);
Task<List<IMailItem>> FetchMailsAsync(MailListInitializationOptions options);
Task<List<string>> GetMailIdsByFolderIdAsync(Guid folderId);
// v2
Task<List<IMailItem>> FetchMailsAsync(MailListInitializationOptions options, CancellationToken cancellationToken = default);
/// <summary>
/// Deletes all mail copies for all folders.
@@ -48,15 +43,12 @@ namespace Wino.Core.Domain.Interfaces
/// <summary>
/// Maps new mail item with the existing local draft copy.
///
/// </summary>
/// <param name="newMailCopyId"></param>
/// <param name="newDraftId"></param>
/// <param name="newThreadId"></param>
/// <returns></returns>
Task MapLocalDraftAsync(string newMailCopyId, string newDraftId, string newThreadId);
Task<MimeMessage> CreateDraftMimeMessageAsync(Guid accountId, DraftCreationOptions options);
Task UpdateMailAsync(MailCopy mailCopy);
/// <summary>
@@ -77,5 +69,43 @@ namespace Wino.Core.Domain.Interfaces
/// <param name="uniqueMailId">Unique id of the mail item.</param>
/// <returns>Account that mail belongs to.</returns>
Task<MailAccount> GetMailAccountByUniqueIdAsync(Guid uniqueMailId);
/// <summary>
/// Checks whether the given mail copy id exists in the database.
/// Safely used for Outlook to prevent downloading the same mail twice.
/// For Gmail, it should be avoided since one mail may belong to multiple folders.
/// </summary>
/// <param name="mailCopyId">Native mail id of the message.</param>
Task<bool> IsMailExistsAsync(string mailCopyId);
/// <summary>
/// Returns all mails for given folder id.
/// </summary>
/// <param name="folderId">Folder id to get mails for</param>
Task<List<MailCopy>> GetMailsByFolderIdAsync(Guid folderId);
/// <summary>
/// Returns all unread mails for given folder id.
/// </summary>
/// <param name="folderId">Folder id to get unread mails for.</param>
Task<List<MailCopy>> GetUnreadMailsByFolderIdAsync(Guid folderId);
/// <summary>
/// Checks whether the mail exists in the folder.
/// When deciding Create or Update existing mail, we need to check if the mail exists in the folder.
/// </summary>
/// <param name="mailCopyId">MailCopy id</param>
/// <param name="folderId">Folder's local id.</param>
/// <returns>Whether mail exists in the folder or not.</returns>
Task<bool> IsMailExistsAsync(string mailCopyId, Guid folderId);
/// <summary>
/// Creates a draft MailCopy and MimeMessage based on the given options.
/// For forward/reply it would include the referenced message.
/// </summary>
/// <param name="accountId">AccountId which should have new draft.</param>
/// <param name="draftCreationOptions">Options like new email/forward/draft.</param>
/// <returns>Draft MailCopy and Draft MimeMessage as base64.</returns>
Task<(MailCopy draftMailCopy, string draftBase64MimeMessage)> CreateDraftAsync(Guid accountId, DraftCreationOptions draftCreationOptions);
}
}

View File

@@ -8,9 +8,23 @@ namespace Wino.Core.Domain.Interfaces
{
string GetWebAuthenticationBrokerUri();
Task<string> GetMimeMessageStoragePath();
Task<string> GetQuillEditorBundlePathAsync();
Task<string> GetEditorBundlePathAsync();
Task LaunchFileAsync(string filePath);
Task LaunchUriAsync(Uri uri);
/// <summary>
/// Launches the default browser with the specified uri and waits for protocol activation to finish.
/// </summary>
/// <param name="authenticator"></param>
/// <returns>Response callback from the browser.</returns>
Task<Uri> GetAuthorizationResponseUriAsync(IAuthenticator authenticator, string authorizationUri);
/// <summary>
/// Finalizes GetAuthorizationResponseUriAsync for current IAuthenticator.
/// </summary>
/// <param name="authorizationResponseUri"></param>
void ContinueAuthorization(Uri authorizationResponseUri);
bool IsAppRunning();
string GetFullAppVersion();
@@ -21,5 +35,11 @@ namespace Wino.Core.Domain.Interfaces
/// Some cryptographic shit is needed for requesting Google authentication in UWP.
/// </summary>
GoogleAuthorizationRequest GetGoogleAuthorizationRequest();
/// <summary>
/// Gets or sets the function that returns a pointer for main window hwnd for UWP.
/// This is used to display WAM broker dialog on running UWP app called by a windowless server code.
/// </summary>
Func<IntPtr> GetCoreWindowHwnd { get; set; }
}
}

View File

@@ -122,15 +122,25 @@ namespace Wino.Core.Domain.Interfaces
AppLanguage CurrentLanguage { get; set; }
/// <summary>
/// Setting: Display font for the mail reader. Not composer.
/// Setting: Display font for the mail reader.
/// </summary>
ReaderFont ReaderFont { get; set; }
string ReaderFont { get; set; }
/// <summary>
/// Setting: Font size for the mail reader. Not composer.
/// Setting: Font size for the mail reader.
/// </summary>
int ReaderFontSize { get; set; }
/// <summary>
/// Setting: Display font for the mail composer.
/// </summary>
string ComposerFont { get; set; }
/// <summary>
/// Setting: Font size for the mail composer.
/// </summary>
int ComposerFontSize { get; set; }
/// <summary>
/// Setting: Whether the navigation pane is opened on the last session or not.
/// </summary>
@@ -140,5 +150,10 @@ namespace Wino.Core.Domain.Interfaces
/// Setting: Whether the next item should be automatically selected once the current item is moved or removed.
/// </summary>
bool AutoSelectNextItem { get; set; }
/// <summary>
/// Setting: Gets or sets what should happen to server app when the client is terminated.
/// </summary>
ServerBackgroundMode ServerTerminationBehavior { get; set; }
}
}

View File

@@ -22,7 +22,7 @@ namespace Wino.Core.Domain.Interfaces
TRequest NativeRequest { get; }
}
public interface IRequestBase
public interface IRequestBase : IClientMessage
{
/// <summary>
/// Synchronizer option to perform.
@@ -40,6 +40,15 @@ namespace Wino.Core.Domain.Interfaces
/// Reverts the UI changes applied by <see cref="ApplyUIChanges"/> if the request fails.
/// </summary>
void RevertUIChanges();
/// <summary>
/// Whether synchronizations should be delayed after executing this request.
/// Specially Outlook sometimes don't report changes back immidiately after sending the API request.
/// This results following synchronization to miss the changes.
/// We add small delay for the following synchronization after executing current requests to overcome this issue.
/// Default is false.
/// </summary>
int ResynchronizationDelay { get; }
}
public interface IRequest : IRequestBase

View File

@@ -1,4 +1,5 @@
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Wino.Core.Domain.Entities;
@@ -7,27 +8,40 @@ namespace Wino.Core.Domain.Interfaces
public interface ISignatureService
{
/// <summary>
/// Returns the assigned account signature for the account.
/// Get one signature by Id.
/// </summary>
/// <param name="accountId"></param>
/// <returns></returns>
Task<AccountSignature> GetAccountSignatureAsync(Guid accountId);
/// <param name="signatureId">Signature Id.</param>
Task<AccountSignature> GetSignatureAsync(Guid signatureId);
/// <summary>
/// Creates the initial signature for new created accounts.
/// Returns all signatures for specified account.
/// </summary>
/// <param name="accountId"></param>
/// <returns></returns>
/// <param name="accountId">Account id</param>
Task<List<AccountSignature>> GetSignaturesAsync(Guid accountId);
/// <summary>
/// Creates a new signature for the account.
/// </summary>
/// <param name="signature">Signature that should be created. It should contain ID and account to which it belongs.</param>
Task<AccountSignature> CreateSignatureAsync(AccountSignature signature);
/// <summary>
/// Creates a default Wino signature for the account.
/// Needed only for initial account setup.
/// </summary>
/// <param name="accountId">Account Id.</param>
Task<AccountSignature> CreateDefaultSignatureAsync(Guid accountId);
/// <summary>
/// Updates account's existing signature with the given HTML signature.
/// Updates existing signature.
/// </summary>
Task<AccountSignature> UpdateAccountSignatureAsync(Guid accountId, string htmlBody);
/// <param name="signature">Signature that should be updated. It should contain ID and account to which it belongs.</param>
Task<AccountSignature> UpdateSignatureAsync(AccountSignature signature);
/// <summary>
/// Disabled signature for the account and deletes existing signature.
/// Deletes existing signature.
/// </summary>
Task DeleteAccountSignatureAssignment(Guid accountId);
/// <param name="signature">Signature that should be deleted.</param>
Task<AccountSignature> DeleteSignatureAsync(AccountSignature signature);
}
}

View File

@@ -0,0 +1,20 @@
using System.Threading.Tasks;
using Wino.Core.Domain.Enums;
namespace Wino.Core.Domain.Interfaces
{
public interface IStartupBehaviorService
{
/// <summary>
/// Gets whether Wino Server is set to launch on startup or not.
/// </summary>
Task<StartupBehaviorResult> GetCurrentStartupBehaviorAsync();
/// <summary>
/// Enables/disables the current startup behavior for Wino Server.
/// </summary>
/// <param name="isEnabled">Whether to launch enabled or disabled.</param>
/// <returns>True if operation success, false if not.</returns>
Task<StartupBehaviorResult> ToggleStartupBehavior(bool isEnabled);
}
}

View File

@@ -1,8 +0,0 @@
namespace Wino.Core.Domain.Interfaces
{
public interface IStoreRatingDialog
{
bool DontAskAgain { get; }
bool RateWinoClicked { get; }
}
}

View File

@@ -1,19 +0,0 @@
using System;
namespace Wino.Core.Domain.Interfaces
{
/// <summary>
/// An interface for reporting progress of the synchronization.
/// Gmail does not support reporting folder progress.
/// For others, account progress is calculated based on the number of folders.
/// </summary>
public interface ISynchronizationProgress
{
/// <summary>
/// Reports account synchronization progress.
/// </summary>
/// <param name="accountId">Account id for the report.</param>
/// <param name="progress">Value. This is always between 0 - 100</param>
void AccountProgressUpdated(Guid accountId, int progress);
}
}

View File

@@ -0,0 +1,11 @@
using System;
using System.Threading.Tasks;
namespace Wino.Core.Domain.Interfaces
{
public interface ISynchronizerFactory
{
Task<IBaseSynchronizer> GetAccountSynchronizerAsync(Guid accountId);
Task InitializeAsync();
}
}

View File

@@ -7,6 +7,11 @@ namespace Wino.Core.Domain.Interfaces
{
public interface IThreadingStrategy
{
/// <summary>
/// Attach thread mails to the list.
/// </summary>
/// <param name="items">Original mails.</param>
/// <returns>Original mails with thread mails.</returns>
Task<List<IMailItem>> ThreadItemsAsync(List<MailCopy> items);
bool ShouldThreadWithItem(IMailItem originalItem, IMailItem targetItem);
}

View File

@@ -1,4 +1,4 @@
namespace Wino.Core.Domain.Models.Requests
namespace Wino.Core.Domain.Interfaces
{
/// <summary>
/// Interface for all messages to report UI changes from synchronizers to UI.
@@ -6,5 +6,6 @@
/// They are sent either from processor or view models to signal some other
/// parts of the application.
/// </summary>
public interface IUIMessage;
}

View File

@@ -0,0 +1,15 @@
using System.Threading.Tasks;
using Wino.Core.Domain.Models.Reader;
namespace Wino.Core.Domain.Interfaces
{
public interface IUnsubscriptionService
{
/// <summary>
/// Unsubscribes from the subscription using one-click method.
/// </summary>
/// <param name="info">Unsubscribtion information.</param>
/// <returns>Whether the unsubscription is succeeded or not.</returns>
Task<bool> OneClickUnsubscribeAsync(UnsubscribeInfo info);
}
}

View File

@@ -1,5 +1,4 @@
using System.Threading.Tasks;
using Wino.Core.Domain.Enums;
using Wino.Core.Domain.Models.Folders;
using Wino.Core.Domain.Models.MailItem;
@@ -17,7 +16,7 @@ namespace Wino.Core.Domain.Interfaces
/// Queues new draft creation request for synchronizer.
/// </summary>
/// <param name="draftPreperationRequest">A class that holds the parameters for creating a draft.</param>
Task ExecuteAsync(DraftPreperationRequest draftPreperationRequest);
Task ExecuteAsync(DraftPreparationRequest draftPreperationRequest);
/// <summary>
/// Queues a new request for synchronizer to send a draft.
@@ -28,8 +27,7 @@ namespace Wino.Core.Domain.Interfaces
/// <summary>
/// Prepares requires IRequest collection for folder actions and executes them via proper synchronizers.
/// </summary>
/// <param name="operation">Folder operation to execute.</param>
/// <param name="folderStructure">Target folder</param>
Task ExecuteAsync(FolderOperation operation, IMailItemFolder folderStructure);
/// <param name="folderOperationPreperationRequest">Folder prep request.</param>
Task ExecuteAsync(FolderOperationPreperationRequest folderOperationPreperationRequest);
}
}

View File

@@ -1,15 +1,18 @@
using System.Collections.Generic;
using System.Threading.Tasks;
using Wino.Core.Domain.Enums;
using Wino.Core.Domain.Models.Folders;
using Wino.Core.Domain.Models.MailItem;
using Wino.Core.Domain.Models.Requests;
namespace Wino.Core.Domain.Interfaces
{
public interface IWinoRequestProcessor
{
Task<IRequest> PrepareFolderRequestAsync(FolderOperation operation, IMailItemFolder mailItemFolder);
/// <summary>
/// Prepares proper folder action requests for synchronizers to execute.
/// </summary>
/// <param name="request"></param>
/// <returns>Base request that synchronizer can execute.</returns>
Task<IRequestBase> PrepareFolderRequestAsync(FolderOperationPreperationRequest request);
/// <summary>
/// Prepares proper Wino requests for synchronizers to execute categorized by AccountId and FolderId.
@@ -17,6 +20,7 @@ namespace Wino.Core.Domain.Interfaces
/// <param name="operation">User action</param>
/// <param name="mailCopyIds">Selected mails.</param>
/// <exception cref="UnavailableSpecialFolderException">When required folder target is not available for account.</exception>
/// <returns>Base request that synchronizer can execute.</returns>
Task<List<IRequest>> PrepareRequestsAsync(MailOperationPreperationRequest request);
}
}

View File

@@ -0,0 +1,61 @@
using System;
using System.Threading.Tasks;
using Wino.Core.Domain.Enums;
using Wino.Core.Domain.Models.Server;
namespace Wino.Core.Domain.Interfaces
{
public interface IWinoServerConnectionManager
{
/// <summary>
/// When the connection status changes, this event will be triggered.
/// </summary>
event EventHandler<WinoServerConnectionStatus> StatusChanged;
/// <summary>
/// Gets the connection status.
/// </summary>
WinoServerConnectionStatus Status { get; }
/// <summary>
/// Launches Full Trust process (Wino Server) and awaits connection completion.
/// If connection is not established in 10 seconds, it will return false.
/// If the server process is already running, it'll connect to existing one.
/// If the server process is not running, it'll be launched and connection establishment is awaited.
/// </summary>
/// <returns>Whether connection is established or not.</returns>
Task<bool> ConnectAsync();
/// <summary>
/// Queues a new user request to be processed by Wino Server.
/// Healthy connection must present before calling this method.
/// </summary>
/// <param name="request">Request to queue for synchronizer in the server.</param>
/// <param name="accountId">Account id to queueu request for.</param>
Task QueueRequestAsync(IRequestBase request, Guid accountId);
/// <summary>
/// Returns response from server for the given request.
/// </summary>
/// <typeparam name="TResponse">Response type.</typeparam>
/// <typeparam name="TRequestType">Request type.</typeparam>
/// <param name="clientMessage">Request type.</param>
/// <returns>Response received from the server for the given TResponse type.</returns>
Task<WinoServerResponse<TResponse>> GetResponseAsync<TResponse, TRequestType>(TRequestType clientMessage) where TRequestType : IClientMessage;
/// <summary>
/// Handle for connecting to the server.
/// If the server is already running, it'll connect to existing one.
/// Callers can await this handle to wait for connection establishment.
/// </summary>
TaskCompletionSource<bool> ConnectingHandle { get; }
}
public interface IWinoServerConnectionManager<TAppServiceConnection> : IWinoServerConnectionManager, IInitializeAsync
{
/// <summary>
/// Existing connection handle to the server of TAppServiceConnection type.
/// </summary>
TAppServiceConnection Connection { get; set; }
}
}

View File

@@ -0,0 +1,11 @@
using System;
using Wino.Core.Domain.Entities;
namespace Wino.Core.Domain.Interfaces
{
public interface IWinoSynchronizerFactory : IInitializeAsync
{
IBaseSynchronizer GetAccountSynchronizer(Guid accountId);
IBaseSynchronizer CreateNewSynchronizer(MailAccount account);
}
}

View File

@@ -0,0 +1,6 @@
using Wino.Core.Domain.Enums;
namespace Wino.Core.Domain.Models.Accounts
{
public record AccountCreationDialogResult(MailProviderType ProviderType, string AccountName, string AccountColorHex = "");
}

View File

@@ -0,0 +1,9 @@
namespace Wino.Core.Domain.Models.Accounts
{
/// <summary>
/// Encapsulates the profile information of an account.
/// </summary>
/// <param name="SenderName">Display sender name for the account.</param>
/// <param name="Base64ProfilePictureData">Base 64 encoded profile picture data of the account. Thumbnail size.</param>
public record ProfileInformation(string SenderName, string Base64ProfilePictureData);
}

View File

@@ -0,0 +1,13 @@
using System;
using Wino.Core.Domain.Enums;
namespace Wino.Core.Domain.Models.Accounts
{
public class UnreadItemCountResult
{
public Guid FolderId { get; set; }
public Guid AccountId { get; set; }
public SpecialFolderType SpecialFolderType { get; set; }
public int UnreadItemCount { get; set; }
}
}

View File

@@ -33,7 +33,7 @@ namespace Wino.Core.Domain.Models.Authorization
ClientId = clientId;
// Creates the OAuth 2.0 authorization request.
return string.Format("{0}?response_type=code&scope=https://mail.google.com/ https://www.googleapis.com/auth/gmail.labels&redirect_uri={1}&client_id={2}&state={3}&code_challenge={4}&code_challenge_method={5}",
return string.Format("{0}?response_type=code&scope=https://mail.google.com/ https://www.googleapis.com/auth/gmail.labels https://www.googleapis.com/auth/userinfo.profile&redirect_uri={1}&client_id={2}&state={3}&code_challenge={4}&code_challenge_method={5}",
authorizationEndpoint,
Uri.EscapeDataString(RedirectUri),
ClientId,

View File

@@ -1,21 +0,0 @@
using System;
namespace Wino.Core.Domain.Models.AutoDiscovery
{
public class AutoDiscoveryConnectionTestFailedPackage
{
public AutoDiscoveryConnectionTestFailedPackage(AutoDiscoverySettings settings, Exception error)
{
Settings = settings ?? throw new ArgumentNullException(nameof(settings));
Error = error ?? throw new ArgumentNullException(nameof(error));
}
public AutoDiscoveryConnectionTestFailedPackage(Exception error)
{
Error = error ?? throw new ArgumentNullException(nameof(error));
}
public AutoDiscoverySettings Settings { get; set; }
public Exception Error { get; set; }
}
}

View File

@@ -1,22 +1,22 @@
using Newtonsoft.Json;
using System.Text.Json.Serialization;
namespace Wino.Core.Domain.Models.AutoDiscovery
{
public class AutoDiscoveryProviderSetting
{
[JsonProperty("protocol")]
[JsonPropertyName("protocol")]
public string Protocol { get; set; }
[JsonProperty("address")]
[JsonPropertyName("address")]
public string Address { get; set; }
[JsonProperty("port")]
[JsonPropertyName("port")]
public int Port { get; set; }
[JsonProperty("secure")]
[JsonPropertyName("secure")]
public string Secure { get; set; }
[JsonProperty("username")]
[JsonPropertyName("username")]
public string Username { get; set; }
}
}

View File

@@ -1,19 +1,19 @@
using System;
using System.Collections.Generic;
using Newtonsoft.Json;
using System.Text.Json.Serialization;
using Wino.Core.Domain.Entities;
namespace Wino.Core.Domain.Models.AutoDiscovery
{
public class AutoDiscoverySettings
{
[JsonProperty("domain")]
[JsonPropertyName("domain")]
public string Domain { get; set; }
[JsonProperty("password")]
[JsonPropertyName("password")]
public string Password { get; set; }
[JsonProperty("settings")]
[JsonPropertyName("settings")]
public List<AutoDiscoveryProviderSetting> Settings { get; set; }
/// <summary>
@@ -30,9 +30,6 @@ namespace Wino.Core.Domain.Models.AutoDiscovery
if (imapSettings == null || smtpSettings == null) return null;
bool imapRequiresSSL = imapSettings.Secure == "SSL";
bool smtpRequiresSSL = smtpSettings.Secure == "SSL";
string imapUrl = imapSettings.Address;
string smtpUrl = smtpSettings.Address;
@@ -49,15 +46,18 @@ namespace Wino.Core.Domain.Models.AutoDiscovery
Address = UserMinimalSettings.Email,
IncomingServerPassword = UserMinimalSettings.Password,
OutgoingServerPassword = UserMinimalSettings.Password,
IncomingRequiresSSL = imapRequiresSSL,
OutgoingRequresSSL = smtpRequiresSSL,
IncomingAuthenticationMethod = Enums.ImapAuthenticationMethod.Auto,
OutgoingAuthenticationMethod = Enums.ImapAuthenticationMethod.Auto,
OutgoingServerSocketOption = Enums.ImapConnectionSecurity.Auto,
IncomingServerSocketOption = Enums.ImapConnectionSecurity.Auto,
IncomingServer = imapUrl,
OutgoingServer = smtpUrl,
IncomingServerPort = imapPort.ToString(),
OutgoingServerPort = smtpPort.ToString(),
IncomingServerType = Enums.CustomIncomingServerType.IMAP4,
IncomingServerUsername = imapUsername,
OutgoingServerUsername = smtpUsername
OutgoingServerUsername = smtpUsername,
MaxConcurrentClients = 5
};
return serverInfo;

View File

@@ -0,0 +1,12 @@
using Wino.Core.Domain.Entities;
using Wino.Core.Domain.Enums;
namespace Wino.Core.Domain.Models.Folders
{
/// <summary>
/// Encapsulates a request to prepare a folder operation like Rename, Delete, etc.
/// </summary>
/// <param name="Action">Folder operation.</param>
/// <param name="Folder">Target folder.</param>
public record FolderOperationPreperationRequest(FolderOperation Action, MailItemFolder Folder) { }
}

View File

@@ -0,0 +1,76 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace Wino.Core.Domain.Models.Launch;
public class MailToUri
{
public string Subject { get; private set; }
public string Body { get; private set; }
public List<string> To { get; } = [];
public List<string> Cc { get; } = [];
public List<string> Bcc { get; } = [];
public Dictionary<string, string> OtherParameters { get; } = [];
public MailToUri(string mailToUrl)
{
ParseMailToUrl(mailToUrl);
}
private void ParseMailToUrl(string mailToUrl)
{
if (string.IsNullOrWhiteSpace(mailToUrl))
throw new ArgumentException("mailtoUrl cannot be null or empty.", nameof(mailToUrl));
if (!mailToUrl.StartsWith("mailto:", StringComparison.OrdinalIgnoreCase))
throw new ArgumentException("URL must start with 'mailto:'.", nameof(mailToUrl));
var mailToWithoutScheme = mailToUrl.Substring(7); // Remove "mailto:"
var components = mailToWithoutScheme.Split('?');
if (!string.IsNullOrEmpty(components[0]))
{
To.AddRange(components[0].Split(',').Select(email => HttpUtility.UrlDecode(email).Trim()));
}
if (components.Length <= 1)
{
return;
}
var parameters = components[1].Split('&');
foreach (var parameter in parameters)
{
var keyValue = parameter.Split('=');
if (keyValue.Length != 2)
continue;
var key = keyValue[0].ToLowerInvariant();
var value = HttpUtility.UrlDecode(keyValue[1]);
switch (key)
{
case "to":
To.AddRange(value.Split(',').Select(email => email.Trim()));
break;
case "subject":
Subject = value;
break;
case "body":
Body = value;
break;
case "cc":
Cc.AddRange(value.Split(',').Select(email => email.Trim()));
break;
case "bcc":
Bcc.AddRange(value.Split(',').Select(email => email.Trim()));
break;
default:
OtherParameters[key] = value;
break;
}
}
}
}

View File

@@ -1,40 +1,27 @@
using System.Collections.Specialized;
using System.Linq;
using MimeKit;
using MimeKit;
using Wino.Core.Domain.Entities;
using Wino.Core.Domain.Enums;
using Wino.Core.Domain.Models.Launch;
namespace Wino.Core.Domain.Models.MailItem
namespace Wino.Core.Domain.Models.MailItem;
public class DraftCreationOptions
{
public class DraftCreationOptions
{
public MimeMessage ReferenceMimeMessage { get; set; }
public MailCopy ReferenceMailCopy { get; set; }
public DraftCreationReason Reason { get; set; }
public DraftCreationReason Reason { get; set; }
#region Mailto Protocol Related Stuff
/// <summary>
/// Used for forward/reply
/// </summary>
public ReferencedMessage ReferencedMessage { get; set; }
public const string MailtoSubjectParameterKey = "subject";
public const string MailtoBodyParameterKey = "body";
public const string MailtoToParameterKey = "mailto";
public const string MailtoCCParameterKey = "cc";
public const string MailtoBCCParameterKey = "bcc";
public NameValueCollection MailtoParameters { get; set; }
private bool IsMailtoParameterExists(string parameterKey)
=> MailtoParameters != null
&& MailtoParameters.AllKeys.Contains(parameterKey);
public bool TryGetMailtoValue(string key, out string value)
{
bool valueExists = IsMailtoParameterExists(key);
value = valueExists ? MailtoParameters[key] : string.Empty;
return valueExists;
}
#endregion
}
/// <summary>
/// Used to create mails from Mailto links
/// </summary>
public MailToUri MailToUri { get; set; }
}
public class ReferencedMessage
{
public MailCopy MailCopy { get; set; }
public MimeMessage MimeMessage { get; set; }
}

View File

@@ -0,0 +1,55 @@
using System;
using System.Text.Json.Serialization;
using MimeKit;
using Wino.Core.Domain.Entities;
using Wino.Core.Domain.Enums;
using Wino.Core.Domain.Extensions;
namespace Wino.Core.Domain.Models.MailItem;
public class DraftPreparationRequest
{
public DraftPreparationRequest(MailAccount account,
MailCopy createdLocalDraftCopy,
string base64EncodedMimeMessage,
DraftCreationReason reason,
MailCopy referenceMailCopy = null)
{
Account = account ?? throw new ArgumentNullException(nameof(account));
CreatedLocalDraftCopy = createdLocalDraftCopy ?? throw new ArgumentNullException(nameof(createdLocalDraftCopy));
ReferenceMailCopy = referenceMailCopy;
// MimeMessage is not serializable with System.Text.Json. Convert to base64 string.
// This is additional work when deserialization needed, but not much to do atm.
Base64LocalDraftMimeMessage = base64EncodedMimeMessage;
Reason = reason;
}
[JsonConstructor]
private DraftPreparationRequest() { }
public MailCopy CreatedLocalDraftCopy { get; set; }
public MailCopy ReferenceMailCopy { get; set; }
public string Base64LocalDraftMimeMessage { get; set; }
public DraftCreationReason Reason { get; set; }
[JsonIgnore]
private MimeMessage createdLocalDraftMimeMessage;
[JsonIgnore]
public MimeMessage CreatedLocalDraftMimeMessage
{
get
{
createdLocalDraftMimeMessage ??= Base64LocalDraftMimeMessage.GetMimeMessageFromBase64();
return createdLocalDraftMimeMessage;
}
}
public MailAccount Account { get; set; }
}

View File

@@ -1,23 +0,0 @@
using System;
using System.Collections.Generic;
using System.Text;
using MimeKit;
using Wino.Core.Domain.Entities;
namespace Wino.Core.Domain.Models.MailItem
{
public class DraftPreperationRequest : DraftCreationOptions
{
public DraftPreperationRequest(MailAccount account, MailCopy createdLocalDraftCopy, MimeMessage createdLocalDraftMimeMessage)
{
Account = account ?? throw new ArgumentNullException(nameof(account));
CreatedLocalDraftCopy = createdLocalDraftCopy ?? throw new ArgumentNullException(nameof(createdLocalDraftCopy));
CreatedLocalDraftMimeMessage = createdLocalDraftMimeMessage ?? throw new ArgumentNullException(nameof(createdLocalDraftMimeMessage));
}
public MailCopy CreatedLocalDraftCopy { get; set; }
public MimeMessage CreatedLocalDraftMimeMessage { get; set; }
public MailAccount Account { get; }
}
}

View File

@@ -0,0 +1,15 @@
using System;
using System.Collections.Generic;
namespace Wino.Core.Domain.Models.MailItem
{
/// <summary>
/// An interface that returns the UniqueId store for IMailItem.
/// For threads, it may be multiple items.
/// For single mails, it'll always be one item.
/// </summary>
public interface IMailHashContainer
{
IEnumerable<Guid> GetContainingIds();
}
}

View File

@@ -6,7 +6,7 @@ namespace Wino.Core.Domain.Models.MailItem
/// <summary>
/// Interface of simplest representation of a MailCopy.
/// </summary>
public interface IMailItem
public interface IMailItem : IMailHashContainer
{
Guid UniqueId { get; }
string Id { get; }
@@ -29,5 +29,6 @@ namespace Wino.Core.Domain.Models.MailItem
MailItemFolder AssignedFolder { get; }
MailAccount AssignedAccount { get; }
AccountContact SenderContact { get; }
}
}

View File

@@ -9,61 +9,31 @@ namespace Wino.Core.Domain.Models.MailItem
/// <summary>
/// Encapsulates the options for preparing requests to execute mail operations for mail items like Move, Delete, MarkAsRead, etc.
/// </summary>
public class MailOperationPreperationRequest
/// <param name="Action"> Action to execute. </param>
/// <param name="MailItems"> Mail copies execute the action on. </param>
/// <param name="ToggleExecution"> Whether the operation can be reverted if needed.
/// eg. MarkAsRead on already read item will set the action to MarkAsUnread.
/// This is used in hover actions for example. </param>
/// <param name="IgnoreHardDeleteProtection"> Whether hard delete protection should be ignored.
/// Discard draft requests for example should ignore hard delete protection. </param>
/// <param name="MoveTargetFolder"> Moving folder for the Move operation.
/// If null and the action is Move, the user will be prompted to select a folder. </param>
public record MailOperationPreperationRequest(MailOperation Action, IEnumerable<MailCopy> MailItems, bool ToggleExecution, bool IgnoreHardDeleteProtection, IMailItemFolder MoveTargetFolder)
{
public MailOperationPreperationRequest(MailOperation action,
IEnumerable<MailCopy> mailItems,
bool toggleExecution = false,
IMailItemFolder moveTargetFolder = null,
bool ignoreHardDeleteProtection = false)
bool ignoreHardDeleteProtection = false) : this(action, mailItems ?? throw new ArgumentNullException(nameof(mailItems)), toggleExecution, ignoreHardDeleteProtection, moveTargetFolder)
{
Action = action;
MailItems = mailItems ?? throw new ArgumentNullException(nameof(mailItems));
ToggleExecution = toggleExecution;
MoveTargetFolder = moveTargetFolder;
IgnoreHardDeleteProtection = ignoreHardDeleteProtection;
}
public MailOperationPreperationRequest(MailOperation action,
MailCopy singleMailItem,
bool toggleExecution = false,
IMailItemFolder moveTargetFolder = null,
bool ignoreHardDeleteProtection = false)
bool ignoreHardDeleteProtection = false) : this(action, new List<MailCopy>() { singleMailItem }, toggleExecution, ignoreHardDeleteProtection, moveTargetFolder)
{
Action = action;
MailItems = new List<MailCopy>() { singleMailItem };
ToggleExecution = toggleExecution;
MoveTargetFolder = moveTargetFolder;
IgnoreHardDeleteProtection = ignoreHardDeleteProtection;
}
/// <summary>
/// Action to execute.
/// </summary>
public MailOperation Action { get; set; }
/// <summary>
/// Mail copies execute the action on.
/// </summary>
public IEnumerable<MailCopy> MailItems { get; set; }
/// <summary>
/// Whether the operation can be reverted if needed.
/// eg. MarkAsRead on already read item will set the action to MarkAsUnread.
/// This is used in hover actions for example.
/// </summary>
public bool ToggleExecution { get; set; }
/// <summary>
/// Whether hard delete protection should be ignored.
/// Discard draft requests for example should ignore hard delete protection.
/// </summary>
public bool IgnoreHardDeleteProtection { get; set; }
/// <summary>
/// Moving folder for the Move operation.
/// If null and the action is Move, the user will be prompted to select a folder.
/// </summary>
public IMailItemFolder MoveTargetFolder { get; }
}
}

View File

@@ -1,7 +1,21 @@
using MimeKit;
using System.Text.Json.Serialization;
using MimeKit;
using Wino.Core.Domain.Entities;
using Wino.Core.Domain.Extensions;
namespace Wino.Core.Domain.Models.MailItem
{
public record SendDraftPreparationRequest(MailCopy MailItem, MimeMessage Mime, MailItemFolder DraftFolder, MailItemFolder SentFolder, MailAccountPreferences AccountPreferences);
public record SendDraftPreparationRequest(MailCopy MailItem,
MailAccountAlias SendingAlias,
MailItemFolder SentFolder,
MailItemFolder DraftFolder,
MailAccountPreferences AccountPreferences,
string Base64MimeMessage)
{
[JsonIgnore]
private MimeMessage mime;
[JsonIgnore]
public MimeMessage Mime => mime ??= Base64MimeMessage.GetMimeMessageFromBase64();
}
}

View File

@@ -1,4 +1,5 @@
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using Wino.Core.Domain.Entities;
@@ -40,6 +41,8 @@ namespace Wino.Core.Domain.Models.MailItem
}
}
public IEnumerable<Guid> GetContainingIds() => ThreadItems?.Select(a => a.UniqueId) ?? default;
#region IMailItem
public Guid UniqueId => LatestMailItem?.UniqueId ?? Guid.Empty;
@@ -82,6 +85,8 @@ namespace Wino.Core.Domain.Models.MailItem
public Guid FileId => LatestMailItem?.FileId ?? Guid.Empty;
public AccountContact SenderContact => LatestMailItem?.SenderContact;
#endregion
}
}

View File

@@ -1,8 +1,7 @@
using System;
using Wino.Core.Domain.Enums;
using Wino.Core.Domain.Models.MailItem;
namespace Wino.Core.Domain.Models.Requests
namespace Wino.Core.Domain.Models.MailItem
{
/// <summary>
/// Defines a single rule for toggling user actions if needed.

View File

@@ -3,6 +3,6 @@
public enum NavigationTransitionType
{
None, // Supress
DrillIn,
DrillIn
}
}

View File

@@ -1,4 +0,0 @@
namespace Wino.Core.Domain.Models.Personalization
{
public record MailListPaneLengthPreferences(string Title, double Length);
}

View File

@@ -1,30 +0,0 @@
using Wino.Core.Domain.Enums;
namespace Wino.Core.Domain.Models.Reader
{
public class EditorToolbarSection
{
public EditorToolbarSectionType SectionType { get; set; }
public string Title
{
get
{
switch (SectionType)
{
case EditorToolbarSectionType.None:
return Translator.EditorToolbarOption_None;
case EditorToolbarSectionType.Format:
return Translator.EditorToolbarOption_Format;
case EditorToolbarSectionType.Insert:
return Translator.EditorToolbarOption_Insert;
case EditorToolbarSectionType.Draw:
return Translator.EditorToolbarOption_Draw;
case EditorToolbarSectionType.Options:
return Translator.EditorToolbarOption_Options;
default:
return "Unknown Editor Option";
}
}
}
}
}

View File

@@ -0,0 +1,12 @@
using System.Text.Json.Serialization;
namespace Wino.Core.Domain.Models.Reader;
public class ImageInfo
{
[JsonPropertyName("data")]
public string Data { get; set; }
[JsonPropertyName("name")]
public string Name { get; set; }
}

View File

@@ -11,10 +11,9 @@ namespace Wino.Core.Domain.Models.Reader
{
public string RenderHtml { get; }
public MailRenderingOptions MailRenderingOptions { get; }
public List<MimePart> Attachments { get; set; } = new List<MimePart>();
public List<MimePart> Attachments { get; set; } = [];
public string UnsubscribeLink { get; set; }
public bool CanUnsubscribe => !string.IsNullOrEmpty(UnsubscribeLink);
public UnsubscribeInfo UnsubscribeInfo { get; set; }
public MailRenderModel(string renderHtml, MailRenderingOptions mailRenderingOptions = null)
{
@@ -22,4 +21,12 @@ namespace Wino.Core.Domain.Models.Reader
MailRenderingOptions = mailRenderingOptions;
}
}
public class UnsubscribeInfo
{
public string HttpLink { get; set; }
public string MailToLink { get; set; }
public bool IsOneClick { get; set; }
public bool CanUnsubscribe => HttpLink != null || MailToLink != null;
}
}

View File

@@ -1,6 +0,0 @@
using Wino.Core.Domain.Enums;
namespace Wino.Core.Domain.Models.Reader
{
public record ReaderFontModel(ReaderFont Font, string FontFamilyName);
}

View File

@@ -0,0 +1,16 @@
using System.Text.Json.Serialization;
namespace Wino.Core.Domain.Models.Reader
{
/// <summary>
/// Used to pass messages from the webview to the app.
/// </summary>
public class WebViewMessage
{
[JsonPropertyName("type")]
public string Type { get; set; }
[JsonPropertyName("value")]
public string Value { get; set; }
}
}

View File

@@ -11,17 +11,24 @@ namespace Wino.Core.Domain.Models.Requests
public abstract IBatchChangeRequest CreateBatch(IEnumerable<IRequest> requests);
public abstract void ApplyUIChanges();
public abstract void RevertUIChanges();
public virtual int ResynchronizationDelay => 0;
}
public abstract record FolderRequestBase(MailItemFolder Folder, MailSynchronizerOperation Operation) : IFolderRequest
{
public abstract void ApplyUIChanges();
public abstract void RevertUIChanges();
public virtual int ResynchronizationDelay => 0;
}
public abstract record BatchRequestBase(IEnumerable<IRequest> Items, MailSynchronizerOperation Operation) : IBatchChangeRequest
{
public abstract void ApplyUIChanges();
public abstract void RevertUIChanges();
public virtual int ResynchronizationDelay => 0;
public virtual bool ExecuteSerialBatch => false;
}
}

View File

@@ -0,0 +1,15 @@
using System;
using Wino.Core.Domain.Interfaces;
namespace Wino.Core.Domain.Models.Requests
{
/// <summary>
/// Encapsulates request to queue and account for synchronizer.
/// </summary>
/// <param name="AccountId">Which account to execute this request for.</param>
/// <param name="Request">Prepared request for the server.</param>
public record ServerRequestPackage(Guid AccountId, IRequestBase Request) : IClientMessage
{
public override string ToString() => $"Server Package: {Request.GetType().Name}";
}
}

View File

@@ -0,0 +1,40 @@
using Wino.Core.Domain.Exceptions;
namespace Wino.Core.Domain.Models.Server
{
/// <summary>
/// Encapsulates responses from the Wino server.
/// Exceptions are stored separately in the Message and StackTrace properties due to serialization issues.
/// </summary>
/// <typeparam name="T">Type of the expected response.</typeparam>
public class WinoServerResponse<T>
{
public bool IsSuccess { get; set; }
public string Message { get; set; }
public T Data { get; set; }
public static WinoServerResponse<T> CreateSuccessResponse(T data)
{
return new WinoServerResponse<T>
{
IsSuccess = true,
Data = data
};
}
public static WinoServerResponse<T> CreateErrorResponse(string message)
{
return new WinoServerResponse<T>
{
IsSuccess = false,
Message = message
};
}
public void ThrowIfFailed()
{
if (!IsSuccess)
throw new WinoServerException(Message);
}
}
}

Some files were not shown because too many files have changed in this diff Show More