Select a mailbox on click, show its email IDs
We'll eventually want to populate them.
This commit is contained in:
parent
656495904b
commit
ee872f6985
11
src/App.tsx
11
src/App.tsx
|
@ -59,7 +59,12 @@ class App extends React.Component<AppProps, AppState> {
|
||||||
}
|
}
|
||||||
|
|
||||||
onMailboxSelect(mailboxId: string) {
|
onMailboxSelect(mailboxId: string) {
|
||||||
console.log("Mailbox", mailboxId);
|
if (!this.state.account) return;
|
||||||
|
this.client.emailList(this.state.account.id, mailboxId, []);
|
||||||
|
this.setState({
|
||||||
|
...this.state,
|
||||||
|
mailbox: this.client.mailbox(this.state.account.id, mailboxId),
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// Load up auth credentials from the local store
|
// Load up auth credentials from the local store
|
||||||
|
@ -113,7 +118,9 @@ class App extends React.Component<AppProps, AppState> {
|
||||||
accounts={this.state.accounts}
|
accounts={this.state.accounts}
|
||||||
client={this.client}
|
client={this.client}
|
||||||
mailbox={this.state.mailbox}
|
mailbox={this.state.mailbox}
|
||||||
onMailboxSelect={this.onMailboxSelect}
|
onMailboxSelect={(m) => {
|
||||||
|
this.onMailboxSelect(m);
|
||||||
|
}}
|
||||||
/>
|
/>
|
||||||
<AuthModal
|
<AuthModal
|
||||||
show={this.client.state.session == null}
|
show={this.client.state.session == null}
|
||||||
|
|
|
@ -25,9 +25,24 @@ class EmailList extends React.Component<EmailListProps, EmailListState> {
|
||||||
}
|
}
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
return !(this.props.account && this.props.mailbox) ? (
|
if (
|
||||||
<Stack />
|
this.props.account == null ||
|
||||||
) : (
|
this.props.mailbox == null ||
|
||||||
|
this.props.mailbox.emailIds == null
|
||||||
|
) {
|
||||||
|
return <Stack />;
|
||||||
|
} else if (this.props.mailbox.emails == null) {
|
||||||
|
return (
|
||||||
|
<Stack>
|
||||||
|
{this.props.mailbox.emailIds.map((e) => (
|
||||||
|
<div className="p-2" key={e}>
|
||||||
|
Email {e}
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
|
</Stack>
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
return (
|
||||||
<Stack>
|
<Stack>
|
||||||
{this.props.mailbox.emails.map((m) => (
|
{this.props.mailbox.emails.map((m) => (
|
||||||
<div className="p-2" key={m.id}>
|
<div className="p-2" key={m.id}>
|
||||||
|
@ -37,5 +52,6 @@ class EmailList extends React.Component<EmailListProps, EmailListState> {
|
||||||
</Stack>
|
</Stack>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
export default EmailList;
|
export default EmailList;
|
||||||
|
|
|
@ -25,7 +25,8 @@ class MailboxList extends React.Component<MailboxListProps, MailboxListState> {
|
||||||
}
|
}
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
return this.props.account == null ? (
|
return this.props.account == null ||
|
||||||
|
this.props.account.mailboxes == null ? (
|
||||||
<Stack />
|
<Stack />
|
||||||
) : (
|
) : (
|
||||||
<Stack>
|
<Stack>
|
||||||
|
|
|
@ -65,10 +65,45 @@ export default class Client {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
emailList(accountId: string, mailboxId: string, ids: Array<string>) {}
|
emailList(accountId: string, mailboxId: string, ids: Array<string>) {
|
||||||
|
if (this.jclient == null) return;
|
||||||
|
/*this.jclient.email_get({
|
||||||
|
accountId: accountId,
|
||||||
|
ids: [],
|
||||||
|
properties: ["threadId"]
|
||||||
|
});*/
|
||||||
|
this.jclient
|
||||||
|
.email_query({
|
||||||
|
accountId: accountId,
|
||||||
|
filter: { inMailbox: mailboxId },
|
||||||
|
})
|
||||||
|
.then((response) => {
|
||||||
|
const mailbox = this.mailbox(accountId, mailboxId);
|
||||||
|
if (mailbox == null) return;
|
||||||
|
mailbox.emailIds = response.ids;
|
||||||
|
this._triggerChange();
|
||||||
|
})
|
||||||
|
.catch(() => {
|
||||||
|
console.error("OH NOES");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
mailbox(accountId: string, mailboxId: string): IMailbox | null {
|
||||||
|
if (this.state.session == null) return null;
|
||||||
|
const account = this.state.session.accounts[accountId];
|
||||||
|
if (account.mailboxes == null) return null;
|
||||||
|
for (let i = 0; i < account.mailboxes.length; i++) {
|
||||||
|
if (account.mailboxes[i].id === mailboxId) {
|
||||||
|
return account.mailboxes[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
mailboxList(accountId: string, ids: Array<string>) {
|
mailboxList(accountId: string, ids: Array<string>) {
|
||||||
if (this.jclient == null) return;
|
if (this.jclient == null) return;
|
||||||
|
if (this.state.session == null) return;
|
||||||
|
// We already populated the list
|
||||||
|
if (this.state.session.accounts[accountId].mailboxes != null) return;
|
||||||
this.jclient
|
this.jclient
|
||||||
.mailbox_get({
|
.mailbox_get({
|
||||||
accountId: accountId,
|
accountId: accountId,
|
||||||
|
@ -81,7 +116,8 @@ export default class Client {
|
||||||
response.list.forEach((m) => {
|
response.list.forEach((m) => {
|
||||||
mailboxes.push({
|
mailboxes.push({
|
||||||
...m,
|
...m,
|
||||||
emails: [],
|
emailIds: null,
|
||||||
|
emails: null,
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
account.mailboxes = mailboxes;
|
account.mailboxes = mailboxes;
|
||||||
|
@ -106,7 +142,7 @@ export default class Client {
|
||||||
accounts: Object.fromEntries(
|
accounts: Object.fromEntries(
|
||||||
Object.entries(session.accounts).map(([key, account]) => [
|
Object.entries(session.accounts).map(([key, account]) => [
|
||||||
key,
|
key,
|
||||||
{ ...account, id: key.toString(), mailboxes: [] },
|
{ ...account, id: key.toString(), mailboxes: null },
|
||||||
]),
|
]),
|
||||||
),
|
),
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,12 +1,13 @@
|
||||||
import client from "jmap-client-ts/lib/types";
|
import client from "jmap-client-ts/lib/types";
|
||||||
|
|
||||||
export interface IMailbox extends client.IMailboxProperties {
|
export interface IMailbox extends client.IMailboxProperties {
|
||||||
emails: Array<client.IEmailProperties>;
|
emailIds: Array<string> | null;
|
||||||
|
emails: Array<client.IEmailProperties> | null;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface IAccount extends client.IAccount {
|
export interface IAccount extends client.IAccount {
|
||||||
id: string;
|
id: string;
|
||||||
mailboxes: Array<IMailbox>;
|
mailboxes: Array<IMailbox> | null;
|
||||||
}
|
}
|
||||||
|
|
||||||
export type AccountIdMap = { [accountId: string]: IAccount };
|
export type AccountIdMap = { [accountId: string]: IAccount };
|
||||||
|
|
Loading…
Reference in New Issue