diff --git a/package-lock.json b/package-lock.json index 74754c9..8121cc1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21,7 +21,6 @@ "bootstrap": "^5.3.3", "react": "^18.3.1", "react-bootstrap": "^2.10.4", - "react-bootstrap-icons": "^1.11.4", "react-dom": "^18.3.1", "react-scripts": "5.0.1", "sass": "^1.77.8", @@ -14747,17 +14746,6 @@ } } }, - "node_modules/react-bootstrap-icons": { - "version": "1.11.4", - "resolved": "https://registry.npmjs.org/react-bootstrap-icons/-/react-bootstrap-icons-1.11.4.tgz", - "integrity": "sha512-lnkOpNEZ/Zr7mNxvjA9efuarCPSgtOuGA55XiRj7ASJnBjb1wEAdtJOd2Aiv9t07r7FLI1IgyZPg9P6jqWD/IA==", - "dependencies": { - "prop-types": "^15.7.2" - }, - "peerDependencies": { - "react": ">=16.8.6" - } - }, "node_modules/react-dev-utils": { "version": "12.0.1", "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz", diff --git a/package.json b/package.json index bf024bc..6627f40 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,6 @@ "bootstrap": "^5.3.3", "react": "^18.3.1", "react-bootstrap": "^2.10.4", - "react-bootstrap-icons": "^1.11.4", "react-dom": "^18.3.1", "react-scripts": "5.0.1", "sass": "^1.77.8", diff --git a/src/EmailContent.tsx b/src/EmailContent.tsx index e1df3c4..953d043 100644 --- a/src/EmailContent.tsx +++ b/src/EmailContent.tsx @@ -88,10 +88,6 @@ class EmailContent extends React.Component< Received {email.receivedAt} - - Sent - - {email.sentAt} diff --git a/src/EmailSummary.tsx b/src/EmailSummary.tsx index 66d3517..a9514ea 100644 --- a/src/EmailSummary.tsx +++ b/src/EmailSummary.tsx @@ -1,7 +1,3 @@ -import { Trash } from "react-bootstrap-icons"; -import Button from "react-bootstrap/Button"; -import ButtonGroup from "react-bootstrap/ButtonGroup"; -import ButtonToolbar from "react-bootstrap/ButtonToolbar"; import Placeholder from "react-bootstrap/Placeholder"; import React from "react"; @@ -59,21 +55,6 @@ class EmailSummary extends React.Component< stub.subject} - - - - - - ); } diff --git a/src/client/Client.tsx b/src/client/Client.tsx index 25eb9ab..4ed9de5 100644 --- a/src/client/Client.tsx +++ b/src/client/Client.tsx @@ -3,19 +3,10 @@ * None of the dependencies should leak, in types or otherwise */ import * as base64 from "base-64"; -import * as jmaptypes from "./jmap-client-ts/src/types"; import * as jmapclient from "./jmap-client-ts/src"; import { FetchTransport } from "./jmap-client-ts/src/utils/fetch-transport"; -import { - IAccount, - IEmail, - IEmailStub, - IMailbox, - ISession, - MailboxRole, - PushMessage, -} from "./types"; +import { IAccount, IEmail, IEmailStub, IMailbox, ISession } from "./types"; type Callback = () => void; @@ -30,40 +21,9 @@ export interface ClientState { emailStubs: Set; mailboxes: Set; }; - mailboxes: { - trash: IMailbox; - } | null; session: ISession | null; } -class Account implements IAccount { - id: string; - - accountCapabilities: { [key: string]: jmaptypes.IMailCapabilities }; - isPersonal: boolean; - isReadOnly: boolean; - mailboxes: Array | null; - name: string; - - constructor(id: string, props: jmaptypes.IAccount) { - this.id = id; - this.accountCapabilities = props.accountCapabilities; - this.isPersonal = props.isPersonal; - this.isReadOnly = props.isReadOnly; - this.mailboxes = null; - this.name = props.name; - } - mailboxByRole(role: MailboxRole): IMailbox | null { - if (this.mailboxes === null) return null; - for (let i = 0; i < this.mailboxes.length; i++) { - const m = this.mailboxes[i]; - if (m.role === role) { - return m; - } - } - return null; - } -} export default class Client { // All objects which currently are listening for changes callbacks: Array = []; @@ -74,7 +34,6 @@ export default class Client { emailStubs: new Set(), mailboxes: new Set(), }, - mailboxes: null, session: null, }; @@ -108,43 +67,6 @@ export default class Client { return; } - emailMoveTrash(account: IAccount, emailId: string) { - if (this.jclient === null) return; - console.log("Trashing", emailId); - const email = this.emailStub(emailId); - if (email === null) return; - const trashMailbox = account.mailboxByRole("trash"); - if (trashMailbox === null) { - console.error( - "Cannot trash ", - emailId, - " because ", - account.id, - " does not have a 'trash' mailbox", - ); - return; - } - let mailboxIds = Object.keys(email.mailboxIds).reduce( - (acc, key) => { - acc[key as keyof typeof email.mailboxIds] = false; - return acc; - }, - {} as Record, - ); - mailboxIds[trashMailbox.id] = true; - const props = { - accountId: account.id, - update: { - [email.id]: { - mailboxIds: mailboxIds, - }, - }, - }; - this.jclient.email_set(props).then((response) => { - console.log("Trashed", emailId); - }); - } - // Ensure we have the full email content ensureEmailContent(accountId: string, emailId: string) { if (this.state.session == null) return; @@ -176,9 +98,7 @@ export default class Client { email(emailId: string): IEmail | null { if (this.state.session == null) return null; - const result = this.state.session.emails[emailId]; - if (result === undefined) return null; - return result; + return this.state.session.emails[emailId]; } emailGetContent(accountId: string, emailId: string) { @@ -228,7 +148,7 @@ export default class Client { .email_get({ accountId: accountId, ids: [emailId], - properties: ["from", "mailboxIds", "receivedAt", "subject"], + properties: ["from", "receivedAt", "subject"], }) .then((response) => { console.log(msg, "response", response); @@ -243,7 +163,6 @@ export default class Client { this.state.session.emailStubs[e.id] = { from: e.from, id: e.id, - mailboxIds: e.mailboxIds, receivedAt: e.receivedAt, subject: e.subject, }; @@ -344,16 +263,12 @@ export default class Client { if (!this.jclient) return; const session = this.jclient.getSession(); - // Subscribe to server-pushed events - if (session.eventSourceUrl) { - this._subscribeToEventSource(session.eventSourceUrl); - } this.state.session = { ...session, accounts: Object.fromEntries( Object.entries(session.accounts).map(([key, account]) => [ key, - new Account(key.toString(), account), + { ...account, id: key.toString(), mailboxes: null }, ]), ), emails: {}, @@ -362,16 +277,4 @@ export default class Client { if (!this.state.session) return; this._triggerChange("Session"); } - - _subscribeToEventSource(url: string) { - // For typechecker - if (this.jclient === null) return; - const eventSourceUrl = url - .replace("{types}", "*") - .replace("{closeafter}", "no") - .replace("{ping}", "60"); - this.jclient.subscribeToEvents(eventSourceUrl, (e) => { - console.log("Got an event!", e); - }); - } } diff --git a/src/client/jmap-client-ts b/src/client/jmap-client-ts index 2ef5f5b..fdab379 160000 --- a/src/client/jmap-client-ts +++ b/src/client/jmap-client-ts @@ -1 +1 @@ -Subproject commit 2ef5f5b7fa0a22a499bd32831ac24622f17e10e6 +Subproject commit fdab37996a4709b13962b67d1aa49e85a8305755 diff --git a/src/client/types.tsx b/src/client/types.tsx index e8fa48c..a479d70 100644 --- a/src/client/types.tsx +++ b/src/client/types.tsx @@ -1,10 +1,8 @@ import * as client from "./jmap-client-ts/src/types"; -export type MailboxIdMap = { [mailboxId: string]: boolean }; export interface IEmailStub { from: Array | null; id: string; - mailboxIds: MailboxIdMap; receivedAt: string; subject: string; } @@ -20,20 +18,8 @@ export interface IEmail extends client.IEmailProperties { export interface IAccount extends client.IAccount { id: string; mailboxes: Array | null; - - mailboxByRole(role: MailboxRole): IMailbox | null; } -export type MailboxRole = - | "all" - | "archive" - | "drafts" - | "flagged" - | "important" - | "junk" - | "sent" - | "subscribed" - | "trash"; -export type PushMessage = client.PushMessage; + export type AccountIdMap = { [accountId: string]: IAccount }; export type EmailStubIdMap = { [emailId: string]: IEmailStub }; export type EmailIdMap = { [emailId: string]: IEmail };