From dae631c164f27da637e3b0570030a8ee5242022c Mon Sep 17 00:00:00 2001 From: amiram Date: Thu, 7 Jun 2018 09:56:48 +0300 Subject: [PATCH 1/7] inboxsdk types --- types/inboxsdk/inboxsdk-tests.ts | 6 + types/inboxsdk/index.d.ts | 981 +++++++++++++++++++++++++++++++ types/inboxsdk/tsconfig.json | 23 + types/inboxsdk/tslint.json | 1 + 4 files changed, 1011 insertions(+) create mode 100644 types/inboxsdk/inboxsdk-tests.ts create mode 100644 types/inboxsdk/index.d.ts create mode 100644 types/inboxsdk/tsconfig.json create mode 100644 types/inboxsdk/tslint.json diff --git a/types/inboxsdk/inboxsdk-tests.ts b/types/inboxsdk/inboxsdk-tests.ts new file mode 100644 index 0000000000..64abf04f6e --- /dev/null +++ b/types/inboxsdk/inboxsdk-tests.ts @@ -0,0 +1,6 @@ +import * as InboxSDK from "inboxsdk"; +import {Compose, InboxSDKInstance} from "inboxsdk"; + +InboxSDK.load(1, '1234').then((sdk: InboxSDKInstance) => sdk.Compose.registerComposeViewHandler((v: Compose.ComposeView) => { + +})); diff --git a/types/inboxsdk/index.d.ts b/types/inboxsdk/index.d.ts new file mode 100644 index 0000000000..1dfb0de2f4 --- /dev/null +++ b/types/inboxsdk/index.d.ts @@ -0,0 +1,981 @@ +// Type definitions for InboxSDK +// Project: https://www.inboxsdk.com/ +// Definitions by: Raphaël Doursenaud +// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped + +/* + * Copyright (c) 2016 GPC.solutions + */ +export function load(version: number, appId?: string, opts?: LoadOptions): Promise; + +export function loadScript(url: string): Promise; + +// // Undocummented +// var IMPL_VERSION: string; +// var LOADER_VERSION: string; +// var destroyed: boolean; //: false +// var Logger: { +// error: () => any; +// event: () => any; +// }; + +interface LoadOptions { + appName?: string; + appIconUrl?: string; +} + +export interface InboxSDKInstance { + Compose: Compose.Compose; + Lists: Lists.Lists; + Conversations: Conversations.Conversations; + Toolbars: Toolbars.Toolbars; + Router: Router.Router; + NavMenu: NavMenu.NavMenu; + Widgets: Widgets.Widgets; + ButterBar: ButterBar.ButterBar; + Search: Search.Search; + User: User.User; + Keyboard: Keyboard.Keyboard; +} + +declare namespace Common { + export interface Contact { + name: string; + emailAddress: string; + } + + export interface DropdownView { + setPlacementOptions(options: PositionOptions): void; + + close(): void; + + el: HTMLElement; + destroyed: boolean; + + // TODO: Events + } + + export interface PositionOptions { + position?: string; //: null + forcePosition?: boolean; //: false + hAlign?: string; //: null + forceHAlign?: boolean; //: false + vAlign?: string; //: null + forceVAlign?: boolean; //: false + buffer?: number; //: 0 + topBuffer?: number; //:0 + bottomBuffer?: number; //: 0 + leftBuffer?: number; //:0 + rightBuffer?: number; //:0 + } + + export interface SimpleElementView { + destroy(): void; + + el: HTMLElement; + destroyed: boolean; + } +} + +declare namespace Compose { + export interface Compose { + registerComposeViewHandler(handler: (composeView: ComposeView) => void): Function; + + openNewComposeView(): Promise; + } + + export interface ComposeView { + addButton(buttonDescriptor: ComposeButtonDescriptor): void; + + //addButton(buttonDescriptor: Stream): void; + + addStatusBar(statusBarDescriptor: StatusBarDescriptor): StatusBarView; + + close(): void; + + send(): void; + + getBodyElement(): HTMLElement; + + getInitialMessageID(): string; + + getThreadID(): string; + + getDraftID(): Promise; + + getCurrentDraftID(): Promise; + + getHTMLContent(): string; + + getSelectedBodyHTML(): string; + + getSelectedBodyText(): string; + + getSubject(): string; + + getTextContent(): string; + + getToRecipients(): Common.Contact[]; + + getCcRecipients(): Common.Contact[]; + + getBccRecipients(): Common.Contact[]; + + insertTextIntoBodyAtCursor(text: string): void; + + insertHTMLIntoBodyAtCursor(html: string): HTMLElement; + + insertHTMLIntoBodyAtCursor(html: HTMLElement): HTMLElement; + + insertLinkChipIntoBodyAtCursor(text: string, url: string, iconUrl: string): HTMLElement; + + isInlineReplyForm(): boolean; + + isFullscreen(): boolean; + + setFullscreen(minimized: boolean): void; + + isMinimized(): boolean; + + setMinimized(minimized: boolean): void; + + popOut(): Promise; + + isReply(): boolean; + + setToRecipients(emails: string[]): void; + + setCcRecipients(emails: string[]): void; + + setBccRecipients(emails: string[]): void; + + getFromContact(): Common.Contact; + + getFromContactChoices(): Common.Contact[]; + + setFromEmail(email: string[]): void; + + setSubject(text: string): void; + + setBodyHTML(html: string): void; + + setBodyText(text: string): void; + + attachFiles(files: Blob[]): void; + + attachInlineFiles(Files: Blob[]): void; + + // TODO: Events + + // Properties + destroyed: boolean; + } + + interface ComposeButtonDescriptor { + title: string; + iconUrl?: string; //: null + iconClass?: string; //: null + onClick: (event: ComposeButtonClickEvent) => void; + hasDropdown?: boolean; //: false + type?: string; //: 'MODIFIER' // Permitted values SEND_ACTION, MODIFIER + orderHint?: number; //: 0 + enabled?: boolean; //: true + } + + interface ComposeButtonClickEvent { + composeView: ComposeView; + dropdown: Common.DropdownView; + } + + interface StatusBarDescriptor { + height?: number; //:40 + orderHint?: number; //:0 + } + + interface StatusBarView { + el: HTMLElement; + destroyed: boolean; + + destroy(): void; + + // TODO: Events + } +} + +declare namespace Lists { + interface Lists { + registerThreadRowViewHandler(handler: (threadRowView: ThreadRowView) => any): void; + } + + interface ThreadRowView { + addLabel(labelDescriptor: LabelDescriptor): void; + + //addLabel(labelDescriptor: Stream): void; + + addImage(imageDescriptor: ImageDescriptor): void; + + //addImage(imageDescriptor: Stream): void; + + addButton(buttonDescriptor: ThreadRowButtonDescriptor): void; + + //addButton(buttonDescriptor: Stream): void; + + addActionButton(buttonDescriptor: ThreadRowActionButtonDescriptor): void; + + //addActionButton(buttonDescriptor: Stream): void; + + addAttachmentIcon(threadRowAttachmentIconDescriptor: ThreadRowAttachmentIconDescriptor): void + + //addAttachmentIcon(threadRowAttachmentIconDescriptor: stream): void + + replaceDate(threadRowDateDescriptor: ThreadRowDateDescriptor): void; + + //replaceDate(threadRowDateDescriptor: Stream): void; + + replaceDraftLabel(draftLabelDescriptor: ThreadRowDraftLabelDescriptor): void; + + //replaceDraftLabel(draftLabelDescriptor: Stream): void; + + getSubject(): string; + + getDateString(): string; + + getThreadID(): string; + + getThreadIDIfStable(): string; + + getDraftID(): Promise; + + getVisibleDraftCount(): number; + + getVisibleMessageCount(): number; + + getContacts(): Common.Contact[]; + + // TODO: Events + + destroyed: boolean; + } + + interface ThreadRowButtonDescriptor { + iconUrl: string; + iconClass?: string; //: '' + onClick: (event: ThreadRowButtonClickEvent) => void; + hasDropdown?: boolean; //: false + } + + interface ThreadRowButtonClickEvent { + threadRowView: ThreadRowView; + dropdown: Common.DropdownView; + } + + interface ThreadRowActionButtonDescriptor { + type: ActionButtonTypes; + title: string; + className?: string; //: '' + onClick?: (event: ThreadRowActionButtonClickEvent) => void; + url: string; + } + + interface ThreadRowActionButtonClickEvent { + // FIXME: testme, undocummented + } + + interface LabelDescriptor { + title: string; + foregroundColor?: string; //: '' + backgroundColor?: string; //: '' + iconUrl: string; + iconClass?: string; //: '' + } + + interface ImageDescriptor { + imageUrl: string; + imageClass?: string; //: null + tooltip?: string; //: null + orderHint?: number; //: 0 + } + + interface ThreadRowDateDescriptor { + text: string; + textColor?: string; //: '' + tooltip?: string; //: '' + } + + interface ThreadRowAttachmentIconDescriptor { + iconUrl?: string; //: '' + iconClass?: string; //: '' + tooltip?: string; //: '' + } + + interface ThreadRowDraftLabelDescriptor { + text: string; + count?: string; //: 1 + } + + enum ActionButtonTypes { + LINK + } +} + +declare namespace Conversations { + interface Conversations { + registerThreadViewHandler(handler: (threadView: ThreadView) => void): void; + + registerMessageViewHandler(handler: (messageView: MessageView) => void): void; + + registerMessageViewHandlerAll(handler: (messageView: MessageView) => void): void; + + registerFileAttachmentCardViewHandler(handler: (attachmentCardView: AttachmentCardView) => void): void; + } + + interface ThreadView { + addNoticeBar(): Common.SimpleElementView; + + addSidebarContentPanel(contentPanelDescriptor: ContentPanelDescriptor): ContentPanelView; + + getMessageViews(): MessageView[]; + + getMessageViewsAll(): MessageView[]; + + getSubject(): string; + + getThreadID(): string; + + on(name: 'contactHover', cb: (event: ContactHoverEvent) => void): void + + on(name: 'destroy', cb: () => void): void + + destroyed: boolean; + } + + interface ContactHoverEvent { + contact: Common.Contact; + contactType: 'sender' | 'recipient'; + messageView: MessageView; + threadView: ThreadView; + } + + interface MessageView { + addAttachmentCardView(cardOptions: AttachmentCardOptions): AttachmentCardView; + + addAttachmentCardView(cardOptions: AttachmentCardNoPreviewOptions): AttachmentCardView; + + addaAttachmentsToolbarButton(buttonOptions: AttachmentsToolbarButtonDescriptor): void; + + addToolbarButton(options: MessageViewToolbarButtonDescriptor): void; + + getBodyElement(): HTMLElement; + + getMessageID(): string; + + getFileAttachmentCardViews(): AttachmentCardView[]; + + isElementInQuotedArea(): boolean; + + isLoaded(): boolean; + + getLinksInbody(): MessageViewLinkDescriptor[]; + + getSender(): Common.Contact; + + getRecipients(): Common.Contact[]; + + getThreadView(): ThreadView; + + getDateString(): string; + + addAttachmentIcon(iconDescriptor: MessageAttachmentIconDescriptor): void; + + //addAttachmentIcon(iconDescriptor: Stream): void; + + getViewState(): MessageViewViewStates; + + // TODO: Events + + destroyed: boolean; + } + + interface ContentPanelView { + remove(): void; + + // TODO: Events + + destroyed: boolean; + } + + interface AttachmentCardView { + getAttachmentType(): string; + + addButton(buttonDescriptor: CustomButtonDescriptor): void; + + getTitle(): string; + + getDownloadURL(): Promise; + + getMessageView(): void; // TODO: null is not a type? + getMessageView(): MessageView; + + // TODO: Events + + destroyed: boolean; + } + + // ConversationsDescriptors + + interface AttachmentCardOptions { + title: string; + description: string; + previewUrl: string; + previewThumbnailUrl: string; + failoverPreviewIconUrl: string; + previewOnClick: (event: PreviewClickEvent) => void; + fileIconImageUrl: string; + buttons: DownloadButtonDescriptor[] | CustomButtonDescriptor[]; + foldColor?: string; //: #BEBEBE + mimeType?: string; //: null + } + + interface AttachmentCardNoPreviewOptions { + title: string; + description: string; + previewUrl: string; + iconThumbnailUrl: string; + previewOnClick: (event: PreviewClickEvent) => void; + fileIconImageUrl: string; + buttons: DownloadButtonDescriptor[] | CustomButtonDescriptor[]; + foldColor?: string; //: #BEBEBE + } + + interface PreviewClickEvent { + attachmentCardView: AttachmentCardView; + + preventDefault(): void; + } + + interface ContentPanelDescriptor { + el: HTMLElement; + title: string; + iconUrl: string; + orderHint?: number; //: 0 + } + + interface DownloadButtonDescriptor { + downloadUrl: string; + onClick: (event: DownloadButtonClickEvent) => void; + openInNewTab?: boolean; //: false + } + + interface DownloadButtonClickEvent { + // FIXME: testme, undocumented + } + + interface CustomButtonDescriptor { + iconUrl: string; + tooltip: string; + onClick: (event: AttachmentCardClickEvent) => void; + } + + interface AttachmentCardClickEvent { + // FIXME: testme, AttachmentCardClickEvent not documented + } + + interface AttachmentsToolbarButtonDescriptor { + tooltip: string; + iconUrl: string; + onClick: (event: AttachmentsToolbarButtonEvent) => void; + } + + interface AttachmentsToolbarButtonEvent { + attachmentCardViews: AttachmentCardView[]; + } + + interface MessageViewLinkDescriptor { + text: string; + html: string; + element: HTMLElement; + href: string; + isInQuotedArea: boolean; + } + + interface MessageAttachmentIconDescriptor { + iconUrl: string; + iconClass?: string; //: 'MODIFIER' + tooltip: string; + onClick: () => any; // TODO: check any? + } + + interface MessageViewToolbarButtonDescriptor { + section: 'MORE'; + title: string; + iconUrl: string; + onClick: () => any; + iconClass?: string; + orderHint?: number; + } + + enum MessageViewViewStates { + HIDDEN, + COLLAPSED, + EXPANDED + } +} + +declare namespace Toolbars { + interface Toolbars { + registerThreadButton(toolbarButtonDescriptor: ToolbarButtonDescriptor): void; + + registerToolbarButtonForList(toolbarButtonDescriptor: ToolbarButtonDescriptor): void; + + registerToolbarButtonForThreadView(toolbarButtonDescriptor: ToolbarButtonDescriptor): void; + + addToolbarButtonForApp(appToolbarButtonDescriptor: AppToolbarButtonDescriptor): AppToolbarButtonView; + } + + interface ToolbarButtonDescriptor { + title: string; + onClick: (event: ToolbarButtonEvent) => void; + iconUrl?: string; //: null + iconClass?: string; //: null + section?: SectionNames; + hasDropdown?: boolean //: false + hideFor?: (routeView: Router.RouteView) => void; //: null + keyboardShortcutHandle?: Keyboard.KeyboardShortcutHandle; //: null + } + + interface ToolbarButtonEvent { + selectedThreadRowViews: Lists.ThreadRowView[]; + threadRowViews: Lists.ThreadRowView[]; + threadView: Conversations.ThreadView; + dropdown: Common.DropdownView; + } + + interface AppToolbarButtonDescriptor { + title: string; + titleClass?: string; //: null + iconUrl: string; + iconClass?: string; //: null + onClick: (event: AppToolbarButtonEvent) => void; + arrowColor?: string; //: null + } + + interface AppToolbarButtonView { + open(): void; + + close(): void; + + remove(): void; + + //TODO: Events + + destroyed: boolean; + } + + interface AppToolbarButtonEvent { + dropdown: Common.DropdownView; + } + + enum SectionNames { + INBOX_STATE, + METADATA_STATE, + OTHER + } +} + +declare namespace Router { + interface Router { + createLink(routeID: string, params: Object): string; + + goto(routeID: string, params: Object): void; + + handleCustomRoute(routeID: string, handler: (customRouteView: CustomRouteView) => void): Function; + + handleAllRoutes(handler: (routeView: RouteView) => Function): Function; + + handleListRoute(routeID: NativeListRouteIDs, handler: (listRouteView: ListRouteView) => Function): Function; + + handleCustomListRoute(routeID: string, handler: () => string[]): Function; // Array of ThreadIDs + handleCustomListRoute(routeID: string, handler: () => Promise): Function; // Promise for an array of ThreadIDs + + getCurrentRouteView(): RouteView; + } + + interface RouteView { + getRouteID(): string; + + getRouteType(): string; + + getParams(): string; + + // TODO: Events + + destroyed: boolean; + } + + interface CustomRouteView extends RouteView { + getElement(): HTMLElement; + } + + interface ListRouteView extends RouteView { + addCollapsibleSection(options: SectionDescriptor): CollapsibleSectionView; + + //addCollapsibleSection(options: Stream): CollapsibleSectionView; + + addSection(options: SectionDescriptor): SectionView; + + //addSection(options: Stream): SectionView; + + refresh(): void; + } + + interface SectionView { + remove(): void; + + // TODO: Events + + destroyed: boolean; + } + + interface CollapsibleSectionView extends SectionView { + setCollapsed(value: boolean): void; + + remove(): void + + // TODO: Events + } + + interface SectionDescriptor { + title: string; + subtitle?: string; //: null + titleLinkText?: string; //: null + onTitleLinkClick?: () => any; //: null // TODO: check any? + hasDropdown?: boolean; //: false + onDropdownClick?: (event: SectionDropdownClickEvent) => any; //: null // TODO: check any? + tableRows?: RowDescriptor[]; //: null + contentElement?: HTMLElement; //:null + footerLinkText?: string; //: null + onFooterLinkClick?: (event: SectionFooterLinkClickEvent) => any //: null // TODO: check any? + } + + interface SectionDropdownClickEvent { + dropdown: Common.DropdownView; + } + + interface SectionFooterLinkClickEvent { + // FIXME: testme, undocumented + } + + interface RowDescriptor { + title: string; + body: string; + shortDetailText: string; + isRead: string; + labels: Lists.LabelDescriptor[]; + iconUrl?: string; //: null + iconClass?: string; //: null + routeID?: string; //: null + routeParams?: string; //: null + onClick?: () => any; //: null + } + + enum NativeRouteIDs { + INBOX, + ALL_MAIL, + SENT, + STARRED, + DRAFTS, + SNOOZED, + DONE, + REMINDERS, + LABEL, + TRASH, + SPAM, + IMPORTANT, + SEARCH, + THREAD, + CHATS, + CHAT, + CONTACTS, + CONTACT, + SETTINGS, + ANY_LIST + } + + enum NativeListRouteIDs { + INBOX, + ALL_MAIL, + SENT, + STARRED, + DRAFTS, + SNOOZED, + DONE, + REMINDERS, + LABEL, + TRASH, + SPAM, + IMPORTANT, + SEARCH, + ANY_LIST + } + + enum RouteTypes { + LIST, + THREAD, + SETTINGS, + CHAT, + CUSTOM, + UNKNOWN + } +} + +declare namespace NavMenu { + interface NavMenu { + addNavItem(navItemDescriptor: NavItemDescriptor): NavItemView; + } + + interface NavItemView { + addNavItem(navItemDescriptor: NavItemDescriptor): NavItemView; + + remove(): void; + + isCollapsed(): boolean; + + setCollapsed(collapseValue: boolean): void; + + // TODO: Events + + destroyed: boolean; + } + + interface NavItemDescriptor { + name: string; + routeId?: string; //: null + routeParams?: Object; //: null + orderHint?: number; //: Number.MAX_SAFE_INTEGER // FIXME: integer + accessory?: CreateAccessoryDescriptor | IconButtonAccessoryDescriptor | DropdownButtonAccessoryDescriptor; //: null + iconUrl?: string; //: null + iconClass?: string; //: null + } + + interface CreateAccessoryDescriptor { + type: string; //: 'CREATE' + onClick: () => any; // TODO: check any? + } + + interface IconButtonAccessoryDescriptor { + type: string; //: 'ICON_BUTTON' + onClick: () => any; // TODO: check any? + iconUrl: string; + iconClass?: string; //: null + } + + interface DropdownButtonAccessoryDescriptor { + type: string; //: 'DROPDOWN_BUTTON' + buttonBackgroundColor: string; + buttonForegroundColor: string; + onClick: (event: DropdownButtonClickEvent) => any; // TODO: check any? + } + + interface DropdownButtonClickEvent { + dropdown: Common.DropdownView; + } + + // Undocumented + enum NavItemTypes { + MANAGE, + NAVIGATION + } + + // Undocumented + var SENT_MAIL: Object; +} + +declare namespace Widgets { + + interface Widgets { + showModalView(options: ModalOptions): ModalView; + + showMoleView(options: MoleOptions): MoleView; + + showDrawerView(options: DrawerOptions): DrawerView; + } + + interface ModalOptions { + el: HTMLElement; + chrome?: boolean; //: true + showCloseButton?: boolean; //: false + title?: string; //: '' + buttons?: ModalButtonDescriptor[]; // [] + } + + interface ModalButtonDescriptor { + text: string; + title: string; + onClick: () => any; // TODO: check any? + type?: string; //: 'SECONDARY_ACTION' + orderHint?: number; //: 0 + } + + interface MoleOptions { + el: HTMLElement; + title?: string; //: '' + titleEl?: HTMLElement; //: null + minimizedTitleEl?: HTMLElement; //: null + className?: string; //: '' + titleButtons?: MoleButtonDescriptor[]; //: [] + chrome?: boolean; //: false + } + + interface MoleButtonDescriptor { + title: string; + iconUrl: string; + iconClass?: string; //: '' + onClick: () => any; // TODO: check any? + } + + interface DrawerOptions { + el: HTMLElement; + chrome?: boolean; //: true + title?: string; //: '' + composeView?: Compose.ComposeView; //: null + closeWithCompose?: boolean; //: false + } + + interface ModalView { + close(): void; + + // TODO: Events + + destroyed: boolean; + } + + interface MoleView { + close(): void; + + setTitle(text: string): void; + + setMinimized(minimized: boolean): void; + + getMinimized(): boolean; + + // TODO: Events + + destroyed: boolean; + } + + interface DrawerView { + close(): void; + + associateComposeView(composeView: Compose.ComposeView, closeWithCompose: boolean): void; + + // TODO: Events + + destroyed: boolean; + } +} + +declare namespace ButterBar { + interface ButterBar { + showMessage(options: MessageDescriptor): Object; + + showLoading(): Object; + + showError(options: MessageDescriptor): Object; + + showSaving(options: SavingMessageDescriptor): Object; + + hideMessage(messageKey: Object): void; + + hideGmailMessage(): void; + } + + interface MessageDescriptorBase { + className?: string; //: '' + priority?: number; //: 0 + time?: number; //: 15000 + hideOnViewChanged?: boolean; //: true + persistent?: boolean; //: false + messageKey?: Object; //: null + } + + interface MessageDescriptorText extends MessageDescriptorBase { + text: string; + } + + interface MessageDescriptorHtml extends MessageDescriptorBase { + html: string; + } + + interface MessageDescriptorHtmlElement extends MessageDescriptorBase { + el: HTMLElement; + } + + type MessageDescriptor = MessageDescriptorText | MessageDescriptorHtml | MessageDescriptorHtmlElement; + + interface SavingMessageDescriptor { + text?: string; //: 'Saving...' + confirmationText?: string; //: 'Saved' + priority?: number; //: 0 + time?: number; //: Infinity + confirmationTime?: number; //: 1000 + showConfirmation?: boolean; //: true + hideOnViewChanged?: boolean; //: true + persistent?: boolean; //: true + messageKey?: Object; //: null + } +} + +declare namespace Search { + interface Search { + registerSearchSuggestionsProvider(handler: (query: string) => AutocompleteSearchResult[] | Promise): void; + + registerSearchQueryRewriter(rewriter: SearchQueryRewriter): void; + } + + interface AutocompleteSearchResultBase { + iconUrl?: string; + routeName?: string; + routeParams?: string[] + externalURL?: string; + } + + interface AutocompleteSearchResultText extends AutocompleteSearchResultBase { + name: string; + description: string; + } + + interface AutocompleteSearchResultHtml extends AutocompleteSearchResultBase { + nameHTML: string; + descriptionHTML: string; + } + + type AutocompleteSearchResult = AutocompleteSearchResultText | AutocompleteSearchResultHtml; + + interface SearchQueryRewriter { + term: string; + termReplacer: () => any; // TODO: check any? // FIXME: function can take a string or a Promise + } +} + +declare namespace User { + interface User { + getEmailAddress(): string; + + getAccountSwitcherContactList(): Common.Contact[]; + } +} + +declare namespace Keyboard { + interface Keyboard { + createShortcutHandle(keyboardShortcutDescriptor: KeyboardShortcutDescriptor): KeyboardShortcutHandle; + } + + interface KeyboardShortcutHandle { + remove(): void; + } + + interface KeyboardShortcutDescriptor { + chord: string; + description: string; + } +} diff --git a/types/inboxsdk/tsconfig.json b/types/inboxsdk/tsconfig.json new file mode 100644 index 0000000000..2169e6902c --- /dev/null +++ b/types/inboxsdk/tsconfig.json @@ -0,0 +1,23 @@ +{ + "compilerOptions": { + "module": "commonjs", + "lib": [ + "es6", + "dom" + ], + "noImplicitAny": true, + "noImplicitThis": true, + "strictNullChecks": true, + "baseUrl": "../", + "typeRoots": [ + "../" + ], + "types": [], + "noEmit": true, + "forceConsistentCasingInFileNames": true + }, + "files": [ + "index.d.ts", + "inboxsdk-tests.ts" + ] +} diff --git a/types/inboxsdk/tslint.json b/types/inboxsdk/tslint.json new file mode 100644 index 0000000000..3db14f85ea --- /dev/null +++ b/types/inboxsdk/tslint.json @@ -0,0 +1 @@ +{ "extends": "dtslint/dt.json" } From 5928f4fb187388fdb896ae3efc6f7dbc9871cf49 Mon Sep 17 00:00:00 2001 From: amiram Date: Tue, 12 Jun 2018 00:42:59 +0300 Subject: [PATCH 2/7] inboxsdk types --- types/inboxsdk/inboxsdk-tests.ts | 822 ++++++++++++++++++++++++++++++- types/inboxsdk/index.d.ts | 610 +++++++++++++---------- 2 files changed, 1176 insertions(+), 256 deletions(-) diff --git a/types/inboxsdk/inboxsdk-tests.ts b/types/inboxsdk/inboxsdk-tests.ts index 64abf04f6e..001dd538e6 100644 --- a/types/inboxsdk/inboxsdk-tests.ts +++ b/types/inboxsdk/inboxsdk-tests.ts @@ -1,6 +1,820 @@ -import * as InboxSDK from "inboxsdk"; -import {Compose, InboxSDKInstance} from "inboxsdk"; +import * as InboxSDK from 'inboxsdk'; +import {Common, Compose, Conversations, InboxSDKInstance, Lists, NavMenu, Router} from 'inboxsdk'; +import ComposeView = Compose.ComposeView; +import Contact = Common.Contact; +import ThreadRowView = Lists.ThreadRowView; +import ThreadView = Conversations.ThreadView; +import SimpleElementView = Common.SimpleElementView; +import ContentPanelView = Conversations.ContentPanelView; +import MessageView = Conversations.MessageView; +import AttachmentCardView = Conversations.AttachmentCardView; +import AttachmentCardClickEvent = Conversations.AttachmentCardClickEvent; +import MessageViewLinkDescriptor = Conversations.MessageViewLinkDescriptor; +import SectionDescriptor = Router.SectionDescriptor; +import NavItemDescriptor = NavMenu.NavItemDescriptor; -InboxSDK.load(1, '1234').then((sdk: InboxSDKInstance) => sdk.Compose.registerComposeViewHandler((v: Compose.ComposeView) => { +InboxSDK.load(1, '1234').then((_sdk: InboxSDKInstance) => { + _sdk.ButterBar.hideGmailMessage(); +}); -})); +InboxSDK.load(1, '1234', {}).then(() => console.log('done')); +InboxSDK.load(1, '1234', { + appIconUrl: 'url', + appName: 'name', + suppressAddonTitle: 'su' +}).then(() => console.log('done')); + +InboxSDK.loadScript('https://google.com').then(() => console.log('done')); +InboxSDK.loadScript('https://google.com', {}).then(() => console.log('done')); +InboxSDK.loadScript('https://google.com', {nowrap: true}).then(() => console.log('done')); + +InboxSDK.load(1, '1234').then((sdk: InboxSDKInstance) => { + sdk.ButterBar.showMessage({ + text: 'text', + }); + + sdk.ButterBar.showMessage({ + text: 'text', + className: 'c', + hideOnViewChanged: true, + persistent: true, + priority: 1, + time: 1, + messageKey: '1' + }); + + const el: HTMLElement = new HTMLElement(); + + sdk.ButterBar.showMessage({ + el, + }); + + sdk.ButterBar.showMessage({ + el, + className: 'c', + hideOnViewChanged: true, + persistent: true, + priority: 1, + time: 1, + messageKey: '1' + }); + + sdk.ButterBar.showMessage({ + html: '

', + }); + + sdk.ButterBar.showMessage({ + html: '

', + className: 'c', + hideOnViewChanged: true, + persistent: true, + priority: 1, + time: 1, + messageKey: '1' + }); + + sdk.ButterBar.showLoading(); + + sdk.ButterBar.showError({ + text: 'error' + }); + + sdk.ButterBar.showSaving({ + text: 'saving' + }); + + sdk.ButterBar.hideMessage('key'); + sdk.ButterBar.hideGmailMessage(); +}); + +InboxSDK.load(1, '1234').then((sdk: InboxSDKInstance) => { + const unregister = sdk.Compose.registerComposeViewHandler((composeView: ComposeView) => { + + composeView.addButton({ + title: 'button title', + onClick: e => { + const eq = e.composeView === composeView; + const dropdownDestroyed = e.dropdown.destroyed; + + e.dropdown.close(); + + const el: HTMLElement = e.dropdown.el; + + e.dropdown.setPlacementOptions({}); + e.dropdown.setPlacementOptions({ + bottomBuffer: 1, + buffer: 1, + forceHAlign: true, + forcePosition: true, + forceVAlign: true, + hAlign: 'center', + position: 'middle', + rightBuffer: 1, + topBuffer: 1, + vAlign: 'top', + leftBuffer: 1 + }); + } + }); + + const statusBarView = composeView.addStatusBar({}); + statusBarView.setHeight(1); + + composeView.addStatusBar({ + height: 1, + orderHint: 1 + }); + + composeView.close(); + + composeView.send(); + composeView.send({sendAndArchive: true}); + + const element: HTMLElement = composeView.getBodyElement(); + const msgId: String = composeView.getInitialMessageID(); + const threadId: String = composeView.getThreadID(); + composeView.getDraftID().then(draftId => { + const id: string = draftId.toLowerCase(); + }); + composeView.getCurrentDraftID().then(draftId => { + if (draftId) { + const id: string = draftId.toLowerCase(); + } + }); + + const html: String = composeView.getHTMLContent(); + const bodyHtml: String = composeView.getSelectedBodyHTML(); + const bodyText: String = composeView.getSelectedBodyText(); + const subject: String = composeView.getSubject(); + const textContent: String = composeView.getTextContent(); + const contacts: Contact[] = composeView.getToRecipients(); + const contactsCC: Contact[] = composeView.getCcRecipients(); + const contactsBCC: Contact[] = composeView.getBccRecipients(); + + composeView.insertTextIntoBodyAtCursor('text'); + const el1: HTMLElement = composeView.insertHTMLIntoBodyAtCursor(new HTMLElement()); + const el2: HTMLElement = composeView.insertHTMLIntoBodyAtCursor('html'); + + const el3: HTMLElement = composeView.insertLinkChipIntoBodyAtCursor('text', 'http://url.com', 'http://url.com/favicon.ico'); + const el4: HTMLElement = composeView.insertLinkIntoBodyAtCursor('text', 'http://url.com'); + + const inline: boolean = composeView.isInlineReplyForm(); + const fullScreen: boolean = composeView.isFullscreen(); + const minimized: boolean = composeView.isMinimized(); + composeView.setFullscreen(true); + composeView.setMinimized(true); + composeView.popOut().then(view => view === composeView); + + const removeColor = composeView.setTitleBarColor('red'); + removeColor(); + + const isReply: boolean = composeView.isReply(); + + composeView.setToRecipients(['a@a.com', 'b@b.com']); + composeView.setCcRecipients(['a@a.com', 'b@b.com']); + composeView.setBccRecipients(['a@a.com', 'b@b.com']); + + const fromContact: Common.Contact = composeView.getFromContact(); + const fromContacts: Common.Contact[] = composeView.getFromContactChoices(); + + composeView.setFromEmail('a@a.com'); + composeView.setSubject('subject'); + composeView.setBodyHTML('

'); + composeView.setBodyText('text'); + composeView.attachFiles([new Blob()]).then(() => console.log()); + composeView.attachInlineFiles([new Blob()]).then(() => console.log()); + + composeView.on('destroy', event => { + const msgId: string = event.messageID; + const byInbox: boolean = event.closedByInboxSDK; + }); + + composeView.on('fullscreenChanged', event => { + const fs: boolean = event.fullscreen; + }); + + composeView.on('fromContactChanged', event => { + const c: Common.Contact = event.contact; + }); + + composeView.on('toContactAdded', event => { + const c: Common.Contact = event.contact; + }); + + composeView.on('toContactRemoved', event => { + const c: Common.Contact = event.contact; + }); + + composeView.on('ccContactAdded', event => { + const c: Common.Contact = event.contact; + }); + + composeView.on('ccContactRemoved', event => { + const c: Common.Contact = event.contact; + }); + + composeView.on('bccContactAdded', event => { + const c: Common.Contact = event.contact; + }); + + composeView.on('bccContactRemoved', event => { + const c: Common.Contact = event.contact; + }); + + composeView.on('recipientsChanged', event => { + let c: Common.Contact; + c = event.to.added[0]; + c = event.to.removed[0]; + c = event.cc.added[0]; + c = event.cc.removed[0]; + c = event.bcc.added[0]; + c = event.bcc.removed[0]; + }); + + composeView.on('presending', event => { + event.cancel(); + }); + + composeView.on('sent', event => { + event.getMessageID().then(msgId => msgId.toLowerCase()); + event.getThreadID().then(threadId => threadId.toLowerCase()); + }); + + composeView.on('discard', () => { + console.log(); + }); + composeView.on('sendCanceled', () => { + console.log(); + }); + composeView.on('sending', () => { + console.log(); + }); + composeView.on('bodyChanged', () => { + console.log(); + }); + composeView.on('minimized', () => { + console.log(); + }); + composeView.on('restored', () => { + console.log(); + }); + + const destroyed: boolean = composeView.destroyed; + }); + + unregister(); +}); + +InboxSDK.load(1, '1234').then((sdk: InboxSDKInstance) => { + const unregister = sdk.Lists.registerThreadRowViewHandler((threadRowView: ThreadRowView) => { + threadRowView.addLabel({ + title: 'title', + iconUrl: 'http://url.com' + }); + + threadRowView.addLabel({ + title: 'title', + iconUrl: 'http://url.com', + backgroundColor: 'red', + foregroundColor: 'blue', + iconBackgroundColor: 'yellow', + iconClass: 'big' + }); + + threadRowView.addImage({ + imageUrl: 'http://url.com' + }); + + threadRowView.addImage({ + imageUrl: 'http://url.com', + imageClass: 'big', + tooltip: 'tooltip', + orderHint: 1 + }); + + threadRowView.addButton({ + title: 'title', + iconUrl: 'http://url.com', + onClick: event => { + const eq = event.threadRowView === threadRowView; + if (event.dropdown) { + event.dropdown.close(); + } + }, + hasDropdown: true + }); + + threadRowView.addButton({ + title: 'title', + iconUrl: 'http://url.com', + onClick: event => { + }, + hasDropdown: false, + iconClass: 'big' + }); + + threadRowView.addActionButton({ + type: 'LINK', + title: 'title', + className: 'big', + url: 'http://url.com', + onClick: () => { + } + }); + + threadRowView.addAttachmentIcon({}); + threadRowView.addAttachmentIcon({ + tooltip: 'tooltip', + iconClass: 'big', + iconUrl: 'http://url.com' + }); + + threadRowView.replaceDate({ + text: '1/1/2000' + }); + threadRowView.replaceDate({ + text: '1/1/2000', + textColor: 'red', + tooltip: 'tooltip' + }); + + threadRowView.replaceDraftLabel({ + text: 'my draft' + }); + threadRowView.replaceDraftLabel({ + text: 'my draft', + count: '2' + }); + + const subject: string = threadRowView.getSubject(); + const date: string = threadRowView.getDateString(); + threadRowView.getThreadIDAsync().then(threadId => threadId.toLowerCase()); + threadRowView.getThreadIDIfStableAsync().then(threadId => { + if (threadId) { + threadId.toLowerCase(); + } + }); + threadRowView.getDraftID().then(draftId => draftId.toLowerCase()); + + const count1: number = threadRowView.getVisibleDraftCount(); + const count2: number = threadRowView.getVisibleMessageCount(); + + const contacts: Common.Contact[] = threadRowView.getContacts(); + + threadRowView.on('destroyed', () => console.log()); + + const destroyed: boolean = threadRowView.destroyed; + }); + + unregister(); +}); + +InboxSDK.load(1, '1234').then((sdk: InboxSDKInstance) => { + const unregister = sdk.Conversations.registerThreadViewHandler((threadView: ThreadView) => { + const noticeBar: SimpleElementView = threadView.addNoticeBar(); + noticeBar.destroy(); + + const contentPanel: ContentPanelView = threadView.addSidebarContentPanel({ + el: new HTMLElement(), + title: 'title', + iconUrl: 'http://url.com', + }); + + contentPanel.remove(); + const destroyed: boolean = contentPanel.destroyed; + contentPanel.on('destroy', () => console.log()); + contentPanel.on('deactivate', () => console.log()); + contentPanel.on('activate', () => console.log()); + + threadView.addSidebarContentPanel({ + el: new HTMLElement(), + title: 'title', + iconUrl: 'http://url.com', + appIconUrl: 'http://url.com', + appName: 'app name', + id: '1', + orderHint: 1, + hideTitleBar: true + }); + + const messageViews: MessageView[] = threadView.getMessageViews(); + const allMessageViews: MessageView[] = threadView.getMessageViewsAll(); + const subject: string = threadView.getSubject(); + threadView.getThreadIDAsync().then(threadId => threadId.toLowerCase()); + + threadView.on('contactHover', event => { + const contact: Contact = event.contact; + const eq1 = event.messageView === messageViews[0]; + const eq2 = event.threadView === threadView; + const isSender: boolean = event.contactType === 'sender'; + }); + + threadView.on('destroy', () => console.log()); + }); + + unregister(); +}); + +InboxSDK.load(1, '1234').then((sdk: InboxSDKInstance) => { + const unregister = sdk.Conversations.registerMessageViewHandler((messageView: MessageView) => { + const attachmentCardView: AttachmentCardView = messageView.addAttachmentCardView({ + title: 'title', + description: 'desc', + previewUrl: 'http://url.com', + previewThumbnailUrl: 'http://url.com', + failoverPreviewIconUrl: 'http://url.com', + previewOnClick: event => { + const eq = event.attachmentCardView === attachmentCardView; + event.preventDefault(); + }, + fileIconImageUrl: 'http://url.com', + buttons: [ + { + downloadUrl: 'http://url.com', + downloadFilename: 'file.txt', + openInNewTab: true, + onClick: () => { + } + }, + { + iconUrl: 'http://url.com', + tooltip: 'tooltip', + onClick: (event: AttachmentCardClickEvent) => event.getDownloadURL().then(url => url.toLowerCase()) + } + ], + foldColor: 'red', + mimeType: 'text' + }); + + const attachmentType: string = attachmentCardView.getAttachmentType(); + const title: string = attachmentCardView.getTitle(); + const msgView: MessageView | null = attachmentCardView.getMessageView(); + attachmentCardView.addButton({ + iconUrl: 'http://url.com', + tooltip: 'tooltip', + onClick: (event: AttachmentCardClickEvent) => event.getDownloadURL().then(url => url.toLowerCase()) + }); + + attachmentCardView.on('destroy', () => console.log()); + const destroyed: boolean = attachmentCardView.destroyed; + + messageView.addAttachmentsToolbarButton({ + iconUrl: 'http://url.com', + tooltip: 'tooltip', + onClick: event => { + const attType: string = event.attachmentCardViews[0].getAttachmentType(); + } + }); + + messageView.addToolbarButton({ + section: 'MORE', + title: 'title', + iconUrl: 'http://url.com', + iconClass: 'big', + onClick: () => { + }, + orderHint: 1 + }); + + const el: HTMLElement = messageView.getBodyElement(); + messageView.getMessageIDAsync().then(msgId => msgId.toLowerCase()); + const attCardViews: AttachmentCardView[] = messageView.getFileAttachmentCardViews(); + const isQuotedArea = messageView.isElementInQuotedArea(); + const isLoaded = messageView.isLoaded(); + const links: MessageViewLinkDescriptor[] = messageView.getLinksInBody(); + links[0].text.toLowerCase(); + links[0].element.click(); + links[0].html.toLowerCase(); + links[0].isInQuotedArea === true; + links[0].href.toLowerCase(); + + const contact: Contact = messageView.getSender(); + const add: string[] = messageView.getRecipientEmailAddresses(); + messageView.getRecipientsFull().then(contacts => { + const c: Contact = contacts[0]; + }); + + const threadView: ThreadView = messageView.getThreadView(); + const date: string = messageView.getDateString(); + messageView.addAttachmentIcon({ + iconUrl: 'http://url.com', + iconClass: 'big', + onClick: () => { + }, + tooltip: 'tooltip' + }); + + const eq = messageView.getViewState() === 'HIDDEN'; + + messageView.on('viewStateChange', event => { + const eq1 = event.newViewState === 'COLLAPSED'; + const eq2 = event.oldViewState === 'EXPANDED'; + const eq3 = event.messageView === messageView; + }); + + messageView.on('contactHover', event => { + event.contact.name.toLowerCase(); + }); + + messageView.on('load', () => console.log()); + messageView.on('destroy', () => console.log()); + + const destroyed1: boolean = messageView.destroyed; + }); + + unregister(); +}); + +InboxSDK.load(1, '1234').then((sdk: InboxSDKInstance) => { + const unregister = sdk.Conversations.registerMessageViewHandlerAll((messageView: MessageView) => { + const isLoaded: boolean = messageView.isLoaded(); + }); + + unregister(); +}); + +InboxSDK.load(1, '1234').then((sdk: InboxSDKInstance) => { + const unregister = sdk.Conversations.registerFileAttachmentCardViewHandler((attachmentCardView: AttachmentCardView) => { + const messageView: MessageView | null = attachmentCardView.getMessageView(); + }); + + unregister(); +}); + +InboxSDK.load(1, '1234').then((sdk: InboxSDKInstance) => { + const unregister = sdk.Toolbars.registerThreadButton({ + hasDropdown: true, + hideFor: (routeView => routeView.getParams()), + iconClass: 'big', + iconUrl: 'http://url.com', + keyboardShortcutHandle: { + remove: () => { + } + }, + listSection: 'INBOX_STATE', + onClick: event => event.position === 'LIST', + orderHint: 1, + positions: ['LIST', 'ROW'], + threadSection: 'METADATA_STATE', + title: 'title' + }); + + unregister(); + + sdk.Toolbars.addToolbarButtonForApp({ + iconClass: 'big', + arrowColor: 'red', + iconUrl: 'http://url.com', + onClick: event => event.dropdown.close(), + title: 'title', + titleClass: 'big' + }); +}); + +InboxSDK.load(1, '1234').then((sdk: InboxSDKInstance) => { + sdk.Router.createLink('1234', {p1: 1, 0: 1}).toLowerCase(); + sdk.Router.goto('1234', {p1: 1, 0: 1}); + + const unregister1 = sdk.Router.handleCustomRoute('1234', customRouteView => { + customRouteView.getParams(); + customRouteView.setFullWidth(true); + customRouteView.getElement().click(); + }); + + unregister1(); + + const unregister2 = sdk.Router.handleAllRoutes(routeView => { + routeView.getParams(); + routeView.getRouteID(); + routeView.getRouteType(); + routeView.on('destroy', () => { + }); + const destroyed: boolean = routeView.destroyed; + }); + + unregister2(); + + const unregister3 = sdk.Router.handleListRoute('ALL_MAIL', listRouteView => { + + const sectionDescriptor: SectionDescriptor = { + contentElement: new HTMLElement(), + footerLinkText: 'text', + hasDropdown: true, + onDropdownClick: event => event.dropdown.close(), + onFooterLinkClick: event => { + }, + onTitleLinkClick: () => { + }, + subtitle: 'title', + tableRows: [{ + body: 'body', + iconClass: 'big', + iconUrl: 'http://url.com', + isRead: 'true', + labels: [{ + iconClass: 'big', + iconBackgroundColor: 'red', + foregroundColor: 'green', + backgroundColor: 'blue', + iconUrl: 'http://url.com', + title: 'title' + }], + onClick: () => { + }, + routeID: '1234', + routeParams: ['p1'], + shortDetailText: 'text', + title: 'title' + }], + title: 'title', + titleLinkText: 'text' + }; + + listRouteView.addCollapsibleSection(sectionDescriptor); + listRouteView.addSection(sectionDescriptor); + + listRouteView.refresh(); + }); + + unregister3(); + + const unregister4 = sdk.Router.handleCustomListRoute('1234', (offset, max) => { + return { + threads: [ + { + rfcMessageId: 'id', + gmailThreadId: 'id' + }, + 'id' + ], + total: 1, + hasMore: true, + }; + }); + + unregister4(); + + sdk.Router.getCurrentRouteView().getRouteID().toLowerCase(); + +}); + +InboxSDK.load(1, '1234').then((sdk: InboxSDKInstance) => { + const navItemDescriptor: NavItemDescriptor = { + accessory: { + type: 'CREATE', + onClick: () => { + } + }, + backgroundColor: 'red', + expanderForegroundColor: 'green', + iconClass: 'big', + iconUrl: 'http://url.com', + name: 'name', + onClick: event => event.preventDefault(), + orderHint: 1, + routeID: '1234', + routeParams: {p: 1}, + type: 'MANAGE' + }; + + const navItem = sdk.NavMenu.addNavItem(navItemDescriptor); + const navItem1 = navItem.addNavItem(navItemDescriptor); + navItem.remove(); + navItem1.remove(); + + const isCollapsed: boolean = navItem.isCollapsed(); + navItem.setCollapsed(true); + + navItem.on('destroy', () => { + }); + const destroyed: boolean = navItem.destroyed; +}); + +InboxSDK.load(1, '1234').then((sdk: InboxSDKInstance) => { + const modalView = sdk.Widgets.showModalView({ + buttons: [{ + color: 'red', + onClick: () => { + }, + orderHint: 1, + text: 'text', + title: 'title', + type: 'PRIMARY_ACTION' + }], + chrome: true, + constrainTitleWidth: true, + el: new HTMLElement(), + showCloseButton: true, + title: 'title' + }); + + modalView.close(); + modalView.on('destroyed', () => { + }); + modalView.destroyed === true; + + const moleView = sdk.Widgets.showMoleView({ + chrome: true, + className: 'big', + el: new HTMLElement(), + minimizedTitleEl: new HTMLElement(), + title: 'title', + titleEl: new HTMLElement(), + titleButtons: [{ + iconClass: 'big', + iconUrl: 'http://url.com', + onClick: () => { + }, + title: 'title' + }] + }); + + moleView.close(); + const minimized: boolean = moleView.getMinimized(); + moleView.setMinimized(true); + moleView.setTitle('title'); + moleView.on('destroyed', () => { + }); + moleView.on('minimize', () => { + }); + moleView.on('restore', () => { + }); + + const drawerView = sdk.Widgets.showDrawerView({ + chrome: true, + closeWithCompose: true, + el: new HTMLElement(), + title: 'title' + }); + + drawerView.close(); + drawerView.disassociateComposeView(); + drawerView.destroyed === true; + drawerView.on('destroyed', () => { + }); + drawerView.on('slideAnimationDone', () => { + }); + drawerView.on('closing', () => { + }); +}); + +InboxSDK.load(1, '1234').then((sdk: InboxSDKInstance) => { + const searchResults = [{ + iconUrl: 'http://url.com', + onClick: () => { + }, + description: 'desc', + externalURL: 'http://url.com', + name: 'name', + routeName: 'name', + routeParams: ['a', 'b'] + }, { + iconUrl: 'http://url.com', + onClick: () => { + }, + descriptionHTML: 'desc', + externalURL: 'http://url.com', + nameHTML: 'name', + routeName: 'name', + routeParams: ['a', 'b'] + }]; + + sdk.Search.registerSearchSuggestionsProvider(query => searchResults); + sdk.Search.registerSearchSuggestionsProvider(query => Promise.resolve(searchResults)); + + sdk.Search.registerSearchQueryRewriter({ + term: 'a', + termReplacer: () => 'b' + }); + + sdk.Search.registerSearchQueryRewriter({ + term: 'a', + termReplacer: () => Promise.resolve('b') + }); +}); + +InboxSDK.load(1, '1234').then((sdk: InboxSDKInstance) => { + sdk.User.getEmailAddress().toLowerCase(); + sdk.User.isConversationViewDisabled() === true; + sdk.User.isUsingGmailMaterialUI() === true; + sdk.User.getLanguage().toLowerCase(); + sdk.User.getAccountSwitcherContactList()[0].name.toLowerCase(); +}); + +InboxSDK.load(1, '1234').then((sdk: InboxSDKInstance) => { + const panel = sdk.Global.addSidebarContentPanel({ + el: new HTMLElement(), + title: 'title', + iconUrl: 'http://url.com' + }); + panel.remove(); +}); + +InboxSDK.load(1, '1234').then((sdk: InboxSDKInstance) => { + const handler = sdk.Keyboard.createShortcutHandle({ + chord: 'a', + description: 'b' + }); + + handler.remove(); +}); diff --git a/types/inboxsdk/index.d.ts b/types/inboxsdk/index.d.ts index 1dfb0de2f4..140df3f13d 100644 --- a/types/inboxsdk/index.d.ts +++ b/types/inboxsdk/index.d.ts @@ -1,6 +1,7 @@ // Type definitions for InboxSDK // Project: https://www.inboxsdk.com/ // Definitions by: Raphaël Doursenaud +// Amiram Korach // Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped /* @@ -8,7 +9,7 @@ */ export function load(version: number, appId?: string, opts?: LoadOptions): Promise; -export function loadScript(url: string): Promise; +export function loadScript(url: string, options?: LoadScriptOptions): Promise; // // Undocummented // var IMPL_VERSION: string; @@ -22,20 +23,26 @@ export function loadScript(url: string): Promise; interface LoadOptions { appName?: string; appIconUrl?: string; + suppressAddonTitle?: string; +} + +interface LoadScriptOptions { + nowrap?: boolean; } export interface InboxSDKInstance { - Compose: Compose.Compose; + Compose: Compose.ComposeInstance; Lists: Lists.Lists; Conversations: Conversations.Conversations; Toolbars: Toolbars.Toolbars; Router: Router.Router; NavMenu: NavMenu.NavMenu; - Widgets: Widgets.Widgets; + Widgets: Widgets.WidgetsInstance; ButterBar: ButterBar.ButterBar; Search: Search.Search; User: User.User; Keyboard: Keyboard.Keyboard; + Global: Global.Global; } declare namespace Common { @@ -49,24 +56,35 @@ declare namespace Common { close(): void; + reposition(): void; + el: HTMLElement; destroyed: boolean; - // TODO: Events + on(name: 'destroy', cb: () => void): void + + on(name: 'preautoclose', cb: (event: PreAutoCloseEvent) => void): void + } + + export interface PreAutoCloseEvent { + type: 'outsideInteraction' | 'escape', + cause: Event, + + cancel(): void; } export interface PositionOptions { - position?: string; //: null - forcePosition?: boolean; //: false - hAlign?: string; //: null - forceHAlign?: boolean; //: false - vAlign?: string; //: null - forceVAlign?: boolean; //: false - buffer?: number; //: 0 - topBuffer?: number; //:0 - bottomBuffer?: number; //: 0 - leftBuffer?: number; //:0 - rightBuffer?: number; //:0 + position?: string; + forcePosition?: boolean; + hAlign?: string; + forceHAlign?: boolean; + vAlign?: string; + forceVAlign?: boolean; + buffer?: number; + topBuffer?: number; + bottomBuffer?: number; + leftBuffer?: number; + rightBuffer?: number; } export interface SimpleElementView { @@ -74,12 +92,14 @@ declare namespace Common { el: HTMLElement; destroyed: boolean; + + on(name: 'destroy', cb: () => void): void } } declare namespace Compose { - export interface Compose { - registerComposeViewHandler(handler: (composeView: ComposeView) => void): Function; + export interface ComposeInstance { + registerComposeViewHandler(handler: (composeView: ComposeView) => void): () => void; openNewComposeView(): Promise; } @@ -87,13 +107,11 @@ declare namespace Compose { export interface ComposeView { addButton(buttonDescriptor: ComposeButtonDescriptor): void; - //addButton(buttonDescriptor: Stream): void; - addStatusBar(statusBarDescriptor: StatusBarDescriptor): StatusBarView; close(): void; - send(): void; + send(options?: SendOptions): void; getBodyElement(): HTMLElement; @@ -103,7 +121,7 @@ declare namespace Compose { getDraftID(): Promise; - getCurrentDraftID(): Promise; + getCurrentDraftID(): Promise; getHTMLContent(): string; @@ -123,12 +141,12 @@ declare namespace Compose { insertTextIntoBodyAtCursor(text: string): void; - insertHTMLIntoBodyAtCursor(html: string): HTMLElement; - - insertHTMLIntoBodyAtCursor(html: HTMLElement): HTMLElement; + insertHTMLIntoBodyAtCursor(html: string | HTMLElement): HTMLElement; insertLinkChipIntoBodyAtCursor(text: string, url: string, iconUrl: string): HTMLElement; + insertLinkIntoBodyAtCursor(text: string, url: string): HTMLElement; + isInlineReplyForm(): boolean; isFullscreen(): boolean; @@ -141,6 +159,8 @@ declare namespace Compose { popOut(): Promise; + setTitleBarColor(color: string): () => void; + isReply(): boolean; setToRecipients(emails: string[]): void; @@ -153,7 +173,7 @@ declare namespace Compose { getFromContactChoices(): Common.Contact[]; - setFromEmail(email: string[]): void; + setFromEmail(email: string): void; setSubject(text: string): void; @@ -161,25 +181,52 @@ declare namespace Compose { setBodyText(text: string): void; - attachFiles(files: Blob[]): void; + attachFiles(files: Blob[]): Promise; - attachInlineFiles(Files: Blob[]): void; + attachInlineFiles(Files: Blob[]): Promise; - // TODO: Events + on(name: 'destroy', cb: (event: { messageID: string, closedByInboxSDK: boolean }) => void): void; + + on(name: 'fullscreenChanged', cb: (event: { fullscreen: boolean }) => void): void; + + on(name: 'fromContactChanged' | 'toContactAdded' | 'toContactRemoved' | 'ccContactAdded' | 'ccContactRemoved' | 'bccContactAdded' | 'bccContactRemoved', + cb: (event: { contact: Common.Contact }) => void): void; + + on(name: 'recipientsChanged', cb: (event: RecipientsChangedEvent) => void): void; + + on(name: 'presending', cb: (event: { cancel: () => void }) => void): void; + + on(name: 'sent', cb: (event: { getThreadID: () => Promise, getMessageID: () => Promise }) => void): void; + + on(name: 'discard' | 'sendCanceled' | 'sending' | 'bodyChanged' | 'minimized' | 'restored', cb: () => void): void; - // Properties destroyed: boolean; } + interface RecipientsChangedEvent { + to: { + added: Common.Contact[], + removed: Common.Contact[] + }, + cc: { + added: Common.Contact[], + removed: Common.Contact[] + }, + bcc: { + added: Common.Contact[], + removed: Common.Contact[] + } + } + interface ComposeButtonDescriptor { title: string; - iconUrl?: string; //: null - iconClass?: string; //: null + iconUrl?: string; + iconClass?: string; onClick: (event: ComposeButtonClickEvent) => void; - hasDropdown?: boolean; //: false - type?: string; //: 'MODIFIER' // Permitted values SEND_ACTION, MODIFIER - orderHint?: number; //: 0 - enabled?: boolean; //: true + hasDropdown?: boolean; + type?: 'MODIFIER' | 'SEND_ACTION'; + orderHint?: number; + enabled?: boolean; } interface ComposeButtonClickEvent { @@ -188,23 +235,22 @@ declare namespace Compose { } interface StatusBarDescriptor { - height?: number; //:40 - orderHint?: number; //:0 + height?: number; + orderHint?: number; } - interface StatusBarView { - el: HTMLElement; - destroyed: boolean; + interface StatusBarView extends Common.SimpleElementView { + setHeight(height: number): void; + } - destroy(): void; - - // TODO: Events + interface SendOptions { + sendAndArchive?: boolean; } } declare namespace Lists { interface Lists { - registerThreadRowViewHandler(handler: (threadRowView: ThreadRowView) => any): void; + registerThreadRowViewHandler(handler: (threadRowView: ThreadRowView) => any): () => void; } interface ThreadRowView { @@ -240,9 +286,9 @@ declare namespace Lists { getDateString(): string; - getThreadID(): string; + getThreadIDAsync(): Promise; - getThreadIDIfStable(): string; + getThreadIDIfStableAsync(): Promise; getDraftID(): Promise; @@ -252,27 +298,28 @@ declare namespace Lists { getContacts(): Common.Contact[]; - // TODO: Events + on(name: 'destroyed', cb: () => void): void; destroyed: boolean; } interface ThreadRowButtonDescriptor { + title: string; iconUrl: string; - iconClass?: string; //: '' + iconClass?: string; onClick: (event: ThreadRowButtonClickEvent) => void; - hasDropdown?: boolean; //: false + hasDropdown?: boolean; } interface ThreadRowButtonClickEvent { threadRowView: ThreadRowView; - dropdown: Common.DropdownView; + dropdown?: Common.DropdownView; } interface ThreadRowActionButtonDescriptor { - type: ActionButtonTypes; + type: 'LINK'; title: string; - className?: string; //: '' + className?: string; onClick?: (event: ThreadRowActionButtonClickEvent) => void; url: string; } @@ -283,50 +330,47 @@ declare namespace Lists { interface LabelDescriptor { title: string; - foregroundColor?: string; //: '' - backgroundColor?: string; //: '' + foregroundColor?: string; + backgroundColor?: string; iconUrl: string; - iconClass?: string; //: '' + iconClass?: string; + iconBackgroundColor?: string; } interface ImageDescriptor { imageUrl: string; - imageClass?: string; //: null - tooltip?: string; //: null - orderHint?: number; //: 0 + imageClass?: string; + tooltip?: string; + orderHint?: number; } interface ThreadRowDateDescriptor { text: string; - textColor?: string; //: '' - tooltip?: string; //: '' + textColor?: string; + tooltip?: string; } interface ThreadRowAttachmentIconDescriptor { - iconUrl?: string; //: '' - iconClass?: string; //: '' - tooltip?: string; //: '' + iconUrl?: string; + iconClass?: string; + tooltip?: string; } interface ThreadRowDraftLabelDescriptor { text: string; - count?: string; //: 1 - } - - enum ActionButtonTypes { - LINK + count?: string; } } declare namespace Conversations { interface Conversations { - registerThreadViewHandler(handler: (threadView: ThreadView) => void): void; + registerThreadViewHandler(handler: (threadView: ThreadView) => void): () => void; - registerMessageViewHandler(handler: (messageView: MessageView) => void): void; + registerMessageViewHandler(handler: (messageView: MessageView) => void): () => void; - registerMessageViewHandlerAll(handler: (messageView: MessageView) => void): void; + registerMessageViewHandlerAll(handler: (messageView: MessageView) => void): () => void; - registerFileAttachmentCardViewHandler(handler: (attachmentCardView: AttachmentCardView) => void): void; + registerFileAttachmentCardViewHandler(handler: (attachmentCardView: AttachmentCardView) => void): () => void; } interface ThreadView { @@ -340,7 +384,7 @@ declare namespace Conversations { getSubject(): string; - getThreadID(): string; + getThreadIDAsync(): Promise; on(name: 'contactHover', cb: (event: ContactHoverEvent) => void): void @@ -357,17 +401,15 @@ declare namespace Conversations { } interface MessageView { - addAttachmentCardView(cardOptions: AttachmentCardOptions): AttachmentCardView; + addAttachmentCardView(cardOptions: AttachmentCardOptions | AttachmentCardNoPreviewOptions): AttachmentCardView; - addAttachmentCardView(cardOptions: AttachmentCardNoPreviewOptions): AttachmentCardView; - - addaAttachmentsToolbarButton(buttonOptions: AttachmentsToolbarButtonDescriptor): void; + addAttachmentsToolbarButton(buttonOptions: AttachmentsToolbarButtonDescriptor): void; addToolbarButton(options: MessageViewToolbarButtonDescriptor): void; getBodyElement(): HTMLElement; - getMessageID(): string; + getMessageIDAsync(): Promise; getFileAttachmentCardViews(): AttachmentCardView[]; @@ -375,11 +417,13 @@ declare namespace Conversations { isLoaded(): boolean; - getLinksInbody(): MessageViewLinkDescriptor[]; + getLinksInBody(): MessageViewLinkDescriptor[]; getSender(): Common.Contact; - getRecipients(): Common.Contact[]; + getRecipientEmailAddresses(): string[]; + + getRecipientsFull(): Promise; getThreadView(): ThreadView; @@ -391,15 +435,27 @@ declare namespace Conversations { getViewState(): MessageViewViewStates; - // TODO: Events + on(name: 'viewStateChange', cb: (event: { newViewState: MessageViewViewStates, oldViewState: MessageViewViewStates, messageView: MessageView }) => void): void; + + on(name: 'contactHover', cb: (event: ContactHoverEvent) => void): void; + + on(name: 'load', cb: () => void): void; + + on(name: 'destroy', cb: () => void): void; destroyed: boolean; } + type MessageViewViewStates = 'HIDDEN' | 'COLLAPSED' | 'EXPANDED'; + interface ContentPanelView { remove(): void; - // TODO: Events + on(name: 'activate', cb: () => void): void; + + on(name: 'deactivate', cb: () => void): void; + + on(name: 'destroy', cb: () => void): void; destroyed: boolean; } @@ -411,12 +467,14 @@ declare namespace Conversations { getTitle(): string; + /** + * @deprecated. Use AttachmentCardClickEvent.getDownloadURL() instead + */ getDownloadURL(): Promise; - getMessageView(): void; // TODO: null is not a type? - getMessageView(): MessageView; + getMessageView(): MessageView | null; - // TODO: Events + on(name: 'destroy', cb: () => void): void; destroyed: boolean; } @@ -431,9 +489,9 @@ declare namespace Conversations { failoverPreviewIconUrl: string; previewOnClick: (event: PreviewClickEvent) => void; fileIconImageUrl: string; - buttons: DownloadButtonDescriptor[] | CustomButtonDescriptor[]; - foldColor?: string; //: #BEBEBE - mimeType?: string; //: null + buttons: (DownloadButtonDescriptor | CustomButtonDescriptor)[]; + foldColor?: string; + mimeType?: string; } interface AttachmentCardNoPreviewOptions { @@ -443,8 +501,8 @@ declare namespace Conversations { iconThumbnailUrl: string; previewOnClick: (event: PreviewClickEvent) => void; fileIconImageUrl: string; - buttons: DownloadButtonDescriptor[] | CustomButtonDescriptor[]; - foldColor?: string; //: #BEBEBE + buttons: (DownloadButtonDescriptor | CustomButtonDescriptor)[]; + foldColor?: string; } interface PreviewClickEvent { @@ -457,13 +515,18 @@ declare namespace Conversations { el: HTMLElement; title: string; iconUrl: string; - orderHint?: number; //: 0 + appName?: string; + appIconUrl?: string; + id?: string; + hideTitleBar?: boolean; + orderHint?: number; } interface DownloadButtonDescriptor { downloadUrl: string; + downloadFilename?: string; onClick: (event: DownloadButtonClickEvent) => void; - openInNewTab?: boolean; //: false + openInNewTab?: boolean; } interface DownloadButtonClickEvent { @@ -477,7 +540,7 @@ declare namespace Conversations { } interface AttachmentCardClickEvent { - // FIXME: testme, AttachmentCardClickEvent not documented + getDownloadURL(): Promise; } interface AttachmentsToolbarButtonDescriptor { @@ -500,34 +563,36 @@ declare namespace Conversations { interface MessageAttachmentIconDescriptor { iconUrl: string; - iconClass?: string; //: 'MODIFIER' + iconClass?: string; tooltip: string; - onClick: () => any; // TODO: check any? + onClick?: () => void; } interface MessageViewToolbarButtonDescriptor { section: 'MORE'; title: string; iconUrl: string; - onClick: () => any; + onClick: () => void; iconClass?: string; - orderHint?: number; - } - - enum MessageViewViewStates { - HIDDEN, - COLLAPSED, - EXPANDED + orderHint: number; } } declare namespace Toolbars { interface Toolbars { - registerThreadButton(toolbarButtonDescriptor: ToolbarButtonDescriptor): void; + registerThreadButton(toolbarButtonDescriptor: ToolbarButtonDescriptor): () => void; - registerToolbarButtonForList(toolbarButtonDescriptor: ToolbarButtonDescriptor): void; + /** + * @deprecated. use registerThreadButton + * @param toolbarButtonDescriptor + */ + registerToolbarButtonForList(toolbarButtonDescriptor: ToolbarButtonDescriptor): () => void; - registerToolbarButtonForThreadView(toolbarButtonDescriptor: ToolbarButtonDescriptor): void; + /** + * @deprecated. use registerThreadButton + * @param toolbarButtonDescriptor + */ + registerToolbarButtonForThreadView(toolbarButtonDescriptor: ToolbarButtonDescriptor): () => void; addToolbarButtonForApp(appToolbarButtonDescriptor: AppToolbarButtonDescriptor): AppToolbarButtonView; } @@ -535,28 +600,33 @@ declare namespace Toolbars { interface ToolbarButtonDescriptor { title: string; onClick: (event: ToolbarButtonEvent) => void; - iconUrl?: string; //: null - iconClass?: string; //: null - section?: SectionNames; - hasDropdown?: boolean //: false - hideFor?: (routeView: Router.RouteView) => void; //: null - keyboardShortcutHandle?: Keyboard.KeyboardShortcutHandle; //: null + iconUrl?: string; + iconClass?: string; + positions: ToolbarButtonPosition[] + threadSection?: SectionNames; + listSection?: SectionNames; + hasDropdown?: boolean; + hideFor?: (routeView: Router.RouteView) => void; + orderHint?: number; + keyboardShortcutHandle?: Keyboard.KeyboardShortcutHandle; } + type ToolbarButtonPosition = 'THREAD' | 'ROW' | 'LIST'; + interface ToolbarButtonEvent { + position: ToolbarButtonPosition; selectedThreadRowViews: Lists.ThreadRowView[]; - threadRowViews: Lists.ThreadRowView[]; - threadView: Conversations.ThreadView; - dropdown: Common.DropdownView; + selectedThreadViews: Conversations.ThreadView[]; + dropdown?: Common.DropdownView; } interface AppToolbarButtonDescriptor { title: string; - titleClass?: string; //: null + titleClass?: string; iconUrl: string; - iconClass?: string; //: null + iconClass?: string; onClick: (event: AppToolbarButtonEvent) => void; - arrowColor?: string; //: null + arrowColor?: string; } interface AppToolbarButtonView { @@ -575,45 +645,61 @@ declare namespace Toolbars { dropdown: Common.DropdownView; } - enum SectionNames { - INBOX_STATE, - METADATA_STATE, - OTHER - } + type SectionNames = 'INBOX_STATE' | 'METADATA_STATE' | 'OTHER'; } declare namespace Router { interface Router { - createLink(routeID: string, params: Object): string; + createLink(routeID: string | NativeRouteIDs, params: RouteParams): string; - goto(routeID: string, params: Object): void; + goto(routeID: string | NativeRouteIDs, params: RouteParams): void; - handleCustomRoute(routeID: string, handler: (customRouteView: CustomRouteView) => void): Function; + handleCustomRoute(routeID: string, handler: (customRouteView: CustomRouteView) => void): () => void; - handleAllRoutes(handler: (routeView: RouteView) => Function): Function; + handleAllRoutes(handler: (routeView: RouteView) => void): () => void; - handleListRoute(routeID: NativeListRouteIDs, handler: (listRouteView: ListRouteView) => Function): Function; + handleListRoute(routeID: NativeListRouteIDs, handler: (listRouteView: ListRouteView) => void): () => void; - handleCustomListRoute(routeID: string, handler: () => string[]): Function; // Array of ThreadIDs - handleCustomListRoute(routeID: string, handler: () => Promise): Function; // Promise for an array of ThreadIDs + handleCustomListRoute(routeID: string, handler: (offset: number, max: number) => CustomListDescriptor | Promise): () => void; getCurrentRouteView(): RouteView; } + interface CustomListDescriptor { + threads: (ThreadDescriptor | string)[]; + total?: number; + hasMore?: boolean; + } + + interface ThreadDescriptor { + rfcMessageId?: string; + gmailThreadId?: string; + } + + interface RouteParams { + [key: number]: string | number; + + [key: string]: string | number; + } + interface RouteView { getRouteID(): string; - getRouteType(): string; + getRouteType(): RouteTypes; - getParams(): string; + getParams(): RouteParams; - // TODO: Events + on(name: 'destroy', cb: () => void): void; destroyed: boolean; } + type RouteTypes = 'LIST' | 'THREAD' | 'SETTINGS' | 'CHAT' | 'CUSTOM' | 'UNKNOWN'; + interface CustomRouteView extends RouteView { getElement(): HTMLElement; + + setFullWidth(fullWidth: boolean): void; } interface ListRouteView extends RouteView { @@ -646,15 +732,15 @@ declare namespace Router { interface SectionDescriptor { title: string; - subtitle?: string; //: null - titleLinkText?: string; //: null - onTitleLinkClick?: () => any; //: null // TODO: check any? - hasDropdown?: boolean; //: false - onDropdownClick?: (event: SectionDropdownClickEvent) => any; //: null // TODO: check any? - tableRows?: RowDescriptor[]; //: null - contentElement?: HTMLElement; //:null - footerLinkText?: string; //: null - onFooterLinkClick?: (event: SectionFooterLinkClickEvent) => any //: null // TODO: check any? + subtitle?: string; + titleLinkText?: string; + onTitleLinkClick?: () => void; + hasDropdown?: boolean; + onDropdownClick?: (event: SectionDropdownClickEvent) => void; + tableRows?: RowDescriptor[]; + contentElement?: HTMLElement; + footerLinkText?: string; + onFooterLinkClick?: (event: SectionFooterLinkClickEvent) => void; } interface SectionDropdownClickEvent { @@ -671,61 +757,50 @@ declare namespace Router { shortDetailText: string; isRead: string; labels: Lists.LabelDescriptor[]; - iconUrl?: string; //: null - iconClass?: string; //: null - routeID?: string; //: null - routeParams?: string; //: null - onClick?: () => any; //: null + iconUrl?: string; + iconClass?: string; + routeID?: string; + routeParams?: string[]; + onClick?: () => void; } - enum NativeRouteIDs { - INBOX, - ALL_MAIL, - SENT, - STARRED, - DRAFTS, - SNOOZED, - DONE, - REMINDERS, - LABEL, - TRASH, - SPAM, - IMPORTANT, - SEARCH, - THREAD, - CHATS, - CHAT, - CONTACTS, - CONTACT, - SETTINGS, - ANY_LIST - } + type NativeRouteIDs = + 'INBOX' | + 'ALL_MAIL' | + 'SENT' | + 'STARRED' | + 'DRAFTS' | + 'SNOOZED' | + 'DONE' | + 'REMINDERS' | + 'LABEL' | + 'TRASH' | + 'SPAM' | + 'IMPORTANT' | + 'SEARCH' | + 'THREAD' | + 'CHATS' | + 'CHAT' | + 'CONTACTS' | + 'CONTACT' | + 'SETTINGS' | + 'ANY_LIST'; - enum NativeListRouteIDs { - INBOX, - ALL_MAIL, - SENT, - STARRED, - DRAFTS, - SNOOZED, - DONE, - REMINDERS, - LABEL, - TRASH, - SPAM, - IMPORTANT, - SEARCH, - ANY_LIST - } - - enum RouteTypes { - LIST, - THREAD, - SETTINGS, - CHAT, - CUSTOM, - UNKNOWN - } + type NativeListRouteIDs = + 'INBOX' + | 'ALL_MAIL' + | 'SENT' + | 'STARRED' + | 'DRAFTS' + | 'SNOOZED' + | 'DONE' + | 'REMINDERS' + | 'LABEL' + | 'TRASH' + | 'SPAM' + | 'IMPORTANT' + | 'SEARCH' + | 'ANY_LIST'; } declare namespace NavMenu { @@ -742,38 +817,44 @@ declare namespace NavMenu { setCollapsed(collapseValue: boolean): void; - // TODO: Events + on(name: 'destroy', cb: () => void): void; destroyed: boolean; } interface NavItemDescriptor { name: string; - routeId?: string; //: null - routeParams?: Object; //: null - orderHint?: number; //: Number.MAX_SAFE_INTEGER // FIXME: integer - accessory?: CreateAccessoryDescriptor | IconButtonAccessoryDescriptor | DropdownButtonAccessoryDescriptor; //: null - iconUrl?: string; //: null - iconClass?: string; //: null + routeID?: string; + routeParams?: Object; + + onClick?: (event: { preventDefault(): void }) => void; + + orderHint?: number; + accessory?: CreateAccessoryDescriptor | IconButtonAccessoryDescriptor | DropdownButtonAccessoryDescriptor; + iconUrl?: string; + iconClass?: string; + backgroundColor?: string; + expanderForegroundColor?: string; + type?: NavItemTypes; } interface CreateAccessoryDescriptor { - type: string; //: 'CREATE' - onClick: () => any; // TODO: check any? + type: 'CREATE'; + onClick: () => void; } interface IconButtonAccessoryDescriptor { - type: string; //: 'ICON_BUTTON' - onClick: () => any; // TODO: check any? + type: 'ICON_BUTTON'; + onClick: () => void; iconUrl: string; - iconClass?: string; //: null + iconClass?: string; } interface DropdownButtonAccessoryDescriptor { - type: string; //: 'DROPDOWN_BUTTON' + type: 'DROPDOWN_BUTTON'; buttonBackgroundColor: string; buttonForegroundColor: string; - onClick: (event: DropdownButtonClickEvent) => any; // TODO: check any? + onClick: (event: DropdownButtonClickEvent) => void; } interface DropdownButtonClickEvent { @@ -781,10 +862,7 @@ declare namespace NavMenu { } // Undocumented - enum NavItemTypes { - MANAGE, - NAVIGATION - } + type NavItemTypes = 'MANAGE' | 'NAVIGATION'; // Undocumented var SENT_MAIL: Object; @@ -792,7 +870,7 @@ declare namespace NavMenu { declare namespace Widgets { - interface Widgets { + interface WidgetsInstance { showModalView(options: ModalOptions): ModalView; showMoleView(options: MoleOptions): MoleView; @@ -802,49 +880,51 @@ declare namespace Widgets { interface ModalOptions { el: HTMLElement; - chrome?: boolean; //: true - showCloseButton?: boolean; //: false - title?: string; //: '' - buttons?: ModalButtonDescriptor[]; // [] + chrome?: boolean; + constrainTitleWidth?: boolean; + showCloseButton?: boolean; + title?: string; + buttons?: ModalButtonDescriptor[]; } interface ModalButtonDescriptor { text: string; title: string; - onClick: () => any; // TODO: check any? - type?: string; //: 'SECONDARY_ACTION' - orderHint?: number; //: 0 + onClick: () => void; + type?: 'PRIMARY_ACTION' | 'SECONDARY_ACTION'; + color?: string; + orderHint?: number; } interface MoleOptions { el: HTMLElement; - title?: string; //: '' - titleEl?: HTMLElement; //: null - minimizedTitleEl?: HTMLElement; //: null - className?: string; //: '' - titleButtons?: MoleButtonDescriptor[]; //: [] - chrome?: boolean; //: false + title?: string; + titleEl?: HTMLElement; + minimizedTitleEl?: HTMLElement; + className?: string; + titleButtons?: MoleButtonDescriptor[]; + chrome?: boolean; } interface MoleButtonDescriptor { title: string; iconUrl: string; - iconClass?: string; //: '' - onClick: () => any; // TODO: check any? + iconClass?: string; + onClick: () => void; } interface DrawerOptions { el: HTMLElement; - chrome?: boolean; //: true - title?: string; //: '' - composeView?: Compose.ComposeView; //: null - closeWithCompose?: boolean; //: false + chrome?: boolean; + title?: string; + composeView?: Compose.ComposeView; + closeWithCompose?: boolean; } interface ModalView { close(): void; - // TODO: Events + on(name: 'destroyed', cb: () => void): void; destroyed: boolean; } @@ -858,7 +938,7 @@ declare namespace Widgets { getMinimized(): boolean; - // TODO: Events + on(name: 'destroyed' | 'minimize' | 'restore', cb: () => void): void; destroyed: boolean; } @@ -868,7 +948,9 @@ declare namespace Widgets { associateComposeView(composeView: Compose.ComposeView, closeWithCompose: boolean): void; - // TODO: Events + disassociateComposeView(): void; + + on(name: 'destroyed' | 'slideAnimationDone' | 'closing', cb: () => void): void; destroyed: boolean; } @@ -890,12 +972,12 @@ declare namespace ButterBar { } interface MessageDescriptorBase { - className?: string; //: '' - priority?: number; //: 0 - time?: number; //: 15000 - hideOnViewChanged?: boolean; //: true - persistent?: boolean; //: false - messageKey?: Object; //: null + className?: string; + priority?: number; + time?: number; + hideOnViewChanged?: boolean; + persistent?: boolean; + messageKey?: Object; } interface MessageDescriptorText extends MessageDescriptorBase { @@ -912,17 +994,28 @@ declare namespace ButterBar { type MessageDescriptor = MessageDescriptorText | MessageDescriptorHtml | MessageDescriptorHtmlElement; - interface SavingMessageDescriptor { - text?: string; //: 'Saving...' - confirmationText?: string; //: 'Saved' - priority?: number; //: 0 - time?: number; //: Infinity - confirmationTime?: number; //: 1000 - showConfirmation?: boolean; //: true - hideOnViewChanged?: boolean; //: true - persistent?: boolean; //: true - messageKey?: Object; //: null + interface SavingMessageDescriptorBase extends MessageDescriptorBase { + confirmationText?: string; + confirmationTime?: number; + showConfirmation?: boolean; } + + interface SavingMessageDescriptorText extends SavingMessageDescriptorBase { + text: string; + } + + interface SavingMessageDescriptorHtml extends SavingMessageDescriptorBase { + html: string; + } + + interface SavingMessageDescriptorHtmlElement extends SavingMessageDescriptorBase { + el: HTMLElement; + } + + type SavingMessageDescriptor = + SavingMessageDescriptorText + | SavingMessageDescriptorHtml + | SavingMessageDescriptorHtmlElement; } declare namespace Search { @@ -937,6 +1030,7 @@ declare namespace Search { routeName?: string; routeParams?: string[] externalURL?: string; + onClick?: () => void; } interface AutocompleteSearchResultText extends AutocompleteSearchResultBase { @@ -953,7 +1047,7 @@ declare namespace Search { interface SearchQueryRewriter { term: string; - termReplacer: () => any; // TODO: check any? // FIXME: function can take a string or a Promise + termReplacer: () => string | Promise; } } @@ -961,6 +1055,12 @@ declare namespace User { interface User { getEmailAddress(): string; + isUsingGmailMaterialUI(): boolean; + + isConversationViewDisabled(): boolean; + + getLanguage(): string; + getAccountSwitcherContactList(): Common.Contact[]; } } @@ -979,3 +1079,9 @@ declare namespace Keyboard { description: string; } } + +declare namespace Global { + interface Global { + addSidebarContentPanel(contentPanelDescriptor: Conversations.ContentPanelDescriptor): Conversations.ContentPanelView; + } +} \ No newline at end of file From 8300a571e0d6a4fcb4532c408ba94f626de1a62b Mon Sep 17 00:00:00 2001 From: amiram Date: Tue, 12 Jun 2018 01:25:43 +0300 Subject: [PATCH 3/7] inboxsdk types --- types/inboxsdk/inboxsdk-tests.ts | 106 ++++++++++--------- types/inboxsdk/index.d.ts | 170 ++++++++++++++----------------- types/inboxsdk/tsconfig.json | 1 + 3 files changed, 126 insertions(+), 151 deletions(-) diff --git a/types/inboxsdk/inboxsdk-tests.ts b/types/inboxsdk/inboxsdk-tests.ts index 001dd538e6..c1b48a1f7f 100644 --- a/types/inboxsdk/inboxsdk-tests.ts +++ b/types/inboxsdk/inboxsdk-tests.ts @@ -1,19 +1,18 @@ import * as InboxSDK from 'inboxsdk'; -import {Common, Compose, Conversations, InboxSDKInstance, Lists, NavMenu, Router} from 'inboxsdk'; -import ComposeView = Compose.ComposeView; -import Contact = Common.Contact; -import ThreadRowView = Lists.ThreadRowView; -import ThreadView = Conversations.ThreadView; -import SimpleElementView = Common.SimpleElementView; -import ContentPanelView = Conversations.ContentPanelView; -import MessageView = Conversations.MessageView; -import AttachmentCardView = Conversations.AttachmentCardView; -import AttachmentCardClickEvent = Conversations.AttachmentCardClickEvent; -import MessageViewLinkDescriptor = Conversations.MessageViewLinkDescriptor; -import SectionDescriptor = Router.SectionDescriptor; -import NavItemDescriptor = NavMenu.NavItemDescriptor; +import ComposeView = InboxSDK.Compose.ComposeView; +import Contact = InboxSDK.Common.Contact; +import ThreadRowView = InboxSDK.Lists.ThreadRowView; +import ThreadView = InboxSDK.Conversations.ThreadView; +import SimpleElementView = InboxSDK.Common.SimpleElementView; +import ContentPanelView = InboxSDK.Conversations.ContentPanelView; +import MessageView = InboxSDK.Conversations.MessageView; +import AttachmentCardView = InboxSDK.Conversations.AttachmentCardView; +import AttachmentCardClickEvent = InboxSDK.Conversations.AttachmentCardClickEvent; +import MessageViewLinkDescriptor = InboxSDK.Conversations.MessageViewLinkDescriptor; +import SectionDescriptor = InboxSDK.Router.SectionDescriptor; +import NavItemDescriptor = InboxSDK.NavMenu.NavItemDescriptor; -InboxSDK.load(1, '1234').then((_sdk: InboxSDKInstance) => { +InboxSDK.load(1, '1234').then((_sdk: InboxSDK.InboxSDKInstance) => { _sdk.ButterBar.hideGmailMessage(); }); @@ -28,7 +27,7 @@ InboxSDK.loadScript('https://google.com').then(() => console.log('done')); InboxSDK.loadScript('https://google.com', {}).then(() => console.log('done')); InboxSDK.loadScript('https://google.com', {nowrap: true}).then(() => console.log('done')); -InboxSDK.load(1, '1234').then((sdk: InboxSDKInstance) => { +InboxSDK.load(1, '1234').then((sdk: InboxSDK.InboxSDKInstance) => { sdk.ButterBar.showMessage({ text: 'text', }); @@ -87,9 +86,8 @@ InboxSDK.load(1, '1234').then((sdk: InboxSDKInstance) => { sdk.ButterBar.hideGmailMessage(); }); -InboxSDK.load(1, '1234').then((sdk: InboxSDKInstance) => { +InboxSDK.load(1, '1234').then((sdk: InboxSDK.InboxSDKInstance) => { const unregister = sdk.Compose.registerComposeViewHandler((composeView: ComposeView) => { - composeView.addButton({ title: 'button title', onClick: e => { @@ -131,8 +129,8 @@ InboxSDK.load(1, '1234').then((sdk: InboxSDKInstance) => { composeView.send({sendAndArchive: true}); const element: HTMLElement = composeView.getBodyElement(); - const msgId: String = composeView.getInitialMessageID(); - const threadId: String = composeView.getThreadID(); + const msgId: string = composeView.getInitialMessageID(); + const threadId: string = composeView.getThreadID(); composeView.getDraftID().then(draftId => { const id: string = draftId.toLowerCase(); }); @@ -142,11 +140,11 @@ InboxSDK.load(1, '1234').then((sdk: InboxSDKInstance) => { } }); - const html: String = composeView.getHTMLContent(); - const bodyHtml: String = composeView.getSelectedBodyHTML(); - const bodyText: String = composeView.getSelectedBodyText(); - const subject: String = composeView.getSubject(); - const textContent: String = composeView.getTextContent(); + const html: string = composeView.getHTMLContent(); + const bodyHtml: string = composeView.getSelectedBodyHTML(); + const bodyText: string = composeView.getSelectedBodyText(); + const subject: string = composeView.getSubject(); + const textContent: string = composeView.getTextContent(); const contacts: Contact[] = composeView.getToRecipients(); const contactsCC: Contact[] = composeView.getCcRecipients(); const contactsBCC: Contact[] = composeView.getBccRecipients(); @@ -174,8 +172,8 @@ InboxSDK.load(1, '1234').then((sdk: InboxSDKInstance) => { composeView.setCcRecipients(['a@a.com', 'b@b.com']); composeView.setBccRecipients(['a@a.com', 'b@b.com']); - const fromContact: Common.Contact = composeView.getFromContact(); - const fromContacts: Common.Contact[] = composeView.getFromContactChoices(); + const fromContact: InboxSDK.Common.Contact = composeView.getFromContact(); + const fromContacts: InboxSDK.Common.Contact[] = composeView.getFromContactChoices(); composeView.setFromEmail('a@a.com'); composeView.setSubject('subject'); @@ -194,35 +192,35 @@ InboxSDK.load(1, '1234').then((sdk: InboxSDKInstance) => { }); composeView.on('fromContactChanged', event => { - const c: Common.Contact = event.contact; + const c: InboxSDK.Common.Contact = event.contact; }); composeView.on('toContactAdded', event => { - const c: Common.Contact = event.contact; + const c: InboxSDK.Common.Contact = event.contact; }); composeView.on('toContactRemoved', event => { - const c: Common.Contact = event.contact; + const c: InboxSDK.Common.Contact = event.contact; }); composeView.on('ccContactAdded', event => { - const c: Common.Contact = event.contact; + const c: InboxSDK.Common.Contact = event.contact; }); composeView.on('ccContactRemoved', event => { - const c: Common.Contact = event.contact; + const c: InboxSDK.Common.Contact = event.contact; }); composeView.on('bccContactAdded', event => { - const c: Common.Contact = event.contact; + const c: InboxSDK.Common.Contact = event.contact; }); composeView.on('bccContactRemoved', event => { - const c: Common.Contact = event.contact; + const c: InboxSDK.Common.Contact = event.contact; }); composeView.on('recipientsChanged', event => { - let c: Common.Contact; + let c: InboxSDK.Common.Contact; c = event.to.added[0]; c = event.to.removed[0]; c = event.cc.added[0]; @@ -265,7 +263,7 @@ InboxSDK.load(1, '1234').then((sdk: InboxSDKInstance) => { unregister(); }); -InboxSDK.load(1, '1234').then((sdk: InboxSDKInstance) => { +InboxSDK.load(1, '1234').then((sdk: InboxSDK.InboxSDKInstance) => { const unregister = sdk.Lists.registerThreadRowViewHandler((threadRowView: ThreadRowView) => { threadRowView.addLabel({ title: 'title', @@ -359,7 +357,7 @@ InboxSDK.load(1, '1234').then((sdk: InboxSDKInstance) => { const count1: number = threadRowView.getVisibleDraftCount(); const count2: number = threadRowView.getVisibleMessageCount(); - const contacts: Common.Contact[] = threadRowView.getContacts(); + const contacts: InboxSDK.Common.Contact[] = threadRowView.getContacts(); threadRowView.on('destroyed', () => console.log()); @@ -369,7 +367,7 @@ InboxSDK.load(1, '1234').then((sdk: InboxSDKInstance) => { unregister(); }); -InboxSDK.load(1, '1234').then((sdk: InboxSDKInstance) => { +InboxSDK.load(1, '1234').then((sdk: InboxSDK.InboxSDKInstance) => { const unregister = sdk.Conversations.registerThreadViewHandler((threadView: ThreadView) => { const noticeBar: SimpleElementView = threadView.addNoticeBar(); noticeBar.destroy(); @@ -415,7 +413,7 @@ InboxSDK.load(1, '1234').then((sdk: InboxSDKInstance) => { unregister(); }); -InboxSDK.load(1, '1234').then((sdk: InboxSDKInstance) => { +InboxSDK.load(1, '1234').then((sdk: InboxSDK.InboxSDKInstance) => { const unregister = sdk.Conversations.registerMessageViewHandler((messageView: MessageView) => { const attachmentCardView: AttachmentCardView = messageView.addAttachmentCardView({ title: 'title', @@ -485,7 +483,7 @@ InboxSDK.load(1, '1234').then((sdk: InboxSDKInstance) => { links[0].text.toLowerCase(); links[0].element.click(); links[0].html.toLowerCase(); - links[0].isInQuotedArea === true; + const isInQuotedArea: boolean = links[0].isInQuotedArea; links[0].href.toLowerCase(); const contact: Contact = messageView.getSender(); @@ -525,7 +523,7 @@ InboxSDK.load(1, '1234').then((sdk: InboxSDKInstance) => { unregister(); }); -InboxSDK.load(1, '1234').then((sdk: InboxSDKInstance) => { +InboxSDK.load(1, '1234').then((sdk: InboxSDK.InboxSDKInstance) => { const unregister = sdk.Conversations.registerMessageViewHandlerAll((messageView: MessageView) => { const isLoaded: boolean = messageView.isLoaded(); }); @@ -533,7 +531,7 @@ InboxSDK.load(1, '1234').then((sdk: InboxSDKInstance) => { unregister(); }); -InboxSDK.load(1, '1234').then((sdk: InboxSDKInstance) => { +InboxSDK.load(1, '1234').then((sdk: InboxSDK.InboxSDKInstance) => { const unregister = sdk.Conversations.registerFileAttachmentCardViewHandler((attachmentCardView: AttachmentCardView) => { const messageView: MessageView | null = attachmentCardView.getMessageView(); }); @@ -541,7 +539,7 @@ InboxSDK.load(1, '1234').then((sdk: InboxSDKInstance) => { unregister(); }); -InboxSDK.load(1, '1234').then((sdk: InboxSDKInstance) => { +InboxSDK.load(1, '1234').then((sdk: InboxSDK.InboxSDKInstance) => { const unregister = sdk.Toolbars.registerThreadButton({ hasDropdown: true, hideFor: (routeView => routeView.getParams()), @@ -571,7 +569,7 @@ InboxSDK.load(1, '1234').then((sdk: InboxSDKInstance) => { }); }); -InboxSDK.load(1, '1234').then((sdk: InboxSDKInstance) => { +InboxSDK.load(1, '1234').then((sdk: InboxSDK.InboxSDKInstance) => { sdk.Router.createLink('1234', {p1: 1, 0: 1}).toLowerCase(); sdk.Router.goto('1234', {p1: 1, 0: 1}); @@ -595,7 +593,6 @@ InboxSDK.load(1, '1234').then((sdk: InboxSDKInstance) => { unregister2(); const unregister3 = sdk.Router.handleListRoute('ALL_MAIL', listRouteView => { - const sectionDescriptor: SectionDescriptor = { contentElement: new HTMLElement(), footerLinkText: 'text', @@ -655,10 +652,9 @@ InboxSDK.load(1, '1234').then((sdk: InboxSDKInstance) => { unregister4(); sdk.Router.getCurrentRouteView().getRouteID().toLowerCase(); - }); -InboxSDK.load(1, '1234').then((sdk: InboxSDKInstance) => { +InboxSDK.load(1, '1234').then((sdk: InboxSDK.InboxSDKInstance) => { const navItemDescriptor: NavItemDescriptor = { accessory: { type: 'CREATE', @@ -690,7 +686,7 @@ InboxSDK.load(1, '1234').then((sdk: InboxSDKInstance) => { const destroyed: boolean = navItem.destroyed; }); -InboxSDK.load(1, '1234').then((sdk: InboxSDKInstance) => { +InboxSDK.load(1, '1234').then((sdk: InboxSDK.InboxSDKInstance) => { const modalView = sdk.Widgets.showModalView({ buttons: [{ color: 'red', @@ -711,7 +707,7 @@ InboxSDK.load(1, '1234').then((sdk: InboxSDKInstance) => { modalView.close(); modalView.on('destroyed', () => { }); - modalView.destroyed === true; + const destroyed: boolean = modalView.destroyed; const moleView = sdk.Widgets.showMoleView({ chrome: true, @@ -749,7 +745,7 @@ InboxSDK.load(1, '1234').then((sdk: InboxSDKInstance) => { drawerView.close(); drawerView.disassociateComposeView(); - drawerView.destroyed === true; + const destroyed1: boolean = drawerView.destroyed; drawerView.on('destroyed', () => { }); drawerView.on('slideAnimationDone', () => { @@ -758,7 +754,7 @@ InboxSDK.load(1, '1234').then((sdk: InboxSDKInstance) => { }); }); -InboxSDK.load(1, '1234').then((sdk: InboxSDKInstance) => { +InboxSDK.load(1, '1234').then((sdk: InboxSDK.InboxSDKInstance) => { const searchResults = [{ iconUrl: 'http://url.com', onClick: () => { @@ -793,15 +789,15 @@ InboxSDK.load(1, '1234').then((sdk: InboxSDKInstance) => { }); }); -InboxSDK.load(1, '1234').then((sdk: InboxSDKInstance) => { +InboxSDK.load(1, '1234').then((sdk: InboxSDK.InboxSDKInstance) => { sdk.User.getEmailAddress().toLowerCase(); - sdk.User.isConversationViewDisabled() === true; - sdk.User.isUsingGmailMaterialUI() === true; + const isConversationViewDisabled: boolean = sdk.User.isConversationViewDisabled(); + const isUsingGmailMaterialUI: boolean = sdk.User.isUsingGmailMaterialUI(); sdk.User.getLanguage().toLowerCase(); sdk.User.getAccountSwitcherContactList()[0].name.toLowerCase(); }); -InboxSDK.load(1, '1234').then((sdk: InboxSDKInstance) => { +InboxSDK.load(1, '1234').then((sdk: InboxSDK.InboxSDKInstance) => { const panel = sdk.Global.addSidebarContentPanel({ el: new HTMLElement(), title: 'title', @@ -810,7 +806,7 @@ InboxSDK.load(1, '1234').then((sdk: InboxSDKInstance) => { panel.remove(); }); -InboxSDK.load(1, '1234').then((sdk: InboxSDKInstance) => { +InboxSDK.load(1, '1234').then((sdk: InboxSDK.InboxSDKInstance) => { const handler = sdk.Keyboard.createShortcutHandle({ chord: 'a', description: 'b' diff --git a/types/inboxsdk/index.d.ts b/types/inboxsdk/index.d.ts index 140df3f13d..96faa844e4 100644 --- a/types/inboxsdk/index.d.ts +++ b/types/inboxsdk/index.d.ts @@ -1,8 +1,9 @@ -// Type definitions for InboxSDK +// Type definitions for InboxSDK 2.0 // Project: https://www.inboxsdk.com/ -// Definitions by: Raphaël Doursenaud +// Definitions by: Raphaël Doursenaud // Amiram Korach // Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped +// TypeScript Version: 2.2 /* * Copyright (c) 2016 GPC.solutions @@ -20,13 +21,13 @@ export function loadScript(url: string, options?: LoadScriptOptions): Promise any; // }; -interface LoadOptions { +export interface LoadOptions { appName?: string; appIconUrl?: string; suppressAddonTitle?: string; } -interface LoadScriptOptions { +export interface LoadScriptOptions { nowrap?: boolean; } @@ -45,13 +46,13 @@ export interface InboxSDKInstance { Global: Global.Global; } -declare namespace Common { - export interface Contact { +export namespace Common { + interface Contact { name: string; emailAddress: string; } - export interface DropdownView { + interface DropdownView { setPlacementOptions(options: PositionOptions): void; close(): void; @@ -61,19 +62,19 @@ declare namespace Common { el: HTMLElement; destroyed: boolean; - on(name: 'destroy', cb: () => void): void + on(name: 'destroy', cb: () => void): void; - on(name: 'preautoclose', cb: (event: PreAutoCloseEvent) => void): void + on(name: 'preautoclose', cb: (event: PreAutoCloseEvent) => void): void; } - export interface PreAutoCloseEvent { - type: 'outsideInteraction' | 'escape', - cause: Event, + interface PreAutoCloseEvent { + type: 'outsideInteraction' | 'escape'; + cause: Event; cancel(): void; } - export interface PositionOptions { + interface PositionOptions { position?: string; forcePosition?: boolean; hAlign?: string; @@ -87,24 +88,24 @@ declare namespace Common { rightBuffer?: number; } - export interface SimpleElementView { + interface SimpleElementView { destroy(): void; el: HTMLElement; destroyed: boolean; - on(name: 'destroy', cb: () => void): void + on(name: 'destroy', cb: () => void): void; } } -declare namespace Compose { - export interface ComposeInstance { +export namespace Compose { + interface ComposeInstance { registerComposeViewHandler(handler: (composeView: ComposeView) => void): () => void; openNewComposeView(): Promise; } - export interface ComposeView { + interface ComposeView { addButton(buttonDescriptor: ComposeButtonDescriptor): void; addStatusBar(statusBarDescriptor: StatusBarDescriptor): StatusBarView; @@ -205,17 +206,17 @@ declare namespace Compose { interface RecipientsChangedEvent { to: { - added: Common.Contact[], - removed: Common.Contact[] - }, + added: Common.Contact[]; + removed: Common.Contact[]; + }; cc: { - added: Common.Contact[], - removed: Common.Contact[] - }, + added: Common.Contact[]; + removed: Common.Contact[]; + }; bcc: { - added: Common.Contact[], - removed: Common.Contact[] - } + added: Common.Contact[]; + removed: Common.Contact[]; + }; } interface ComposeButtonDescriptor { @@ -248,7 +249,7 @@ declare namespace Compose { } } -declare namespace Lists { +export namespace Lists { interface Lists { registerThreadRowViewHandler(handler: (threadRowView: ThreadRowView) => any): () => void; } @@ -256,31 +257,31 @@ declare namespace Lists { interface ThreadRowView { addLabel(labelDescriptor: LabelDescriptor): void; - //addLabel(labelDescriptor: Stream): void; + // addLabel(labelDescriptor: Stream): void; addImage(imageDescriptor: ImageDescriptor): void; - //addImage(imageDescriptor: Stream): void; + // addImage(imageDescriptor: Stream): void; addButton(buttonDescriptor: ThreadRowButtonDescriptor): void; - //addButton(buttonDescriptor: Stream): void; + // addButton(buttonDescriptor: Stream): void; addActionButton(buttonDescriptor: ThreadRowActionButtonDescriptor): void; - //addActionButton(buttonDescriptor: Stream): void; + // addActionButton(buttonDescriptor: Stream): void; - addAttachmentIcon(threadRowAttachmentIconDescriptor: ThreadRowAttachmentIconDescriptor): void + addAttachmentIcon(threadRowAttachmentIconDescriptor: ThreadRowAttachmentIconDescriptor): void; - //addAttachmentIcon(threadRowAttachmentIconDescriptor: stream): void + // addAttachmentIcon(threadRowAttachmentIconDescriptor: stream): void replaceDate(threadRowDateDescriptor: ThreadRowDateDescriptor): void; - //replaceDate(threadRowDateDescriptor: Stream): void; + // replaceDate(threadRowDateDescriptor: Stream): void; replaceDraftLabel(draftLabelDescriptor: ThreadRowDraftLabelDescriptor): void; - //replaceDraftLabel(draftLabelDescriptor: Stream): void; + // replaceDraftLabel(draftLabelDescriptor: Stream): void; getSubject(): string; @@ -320,14 +321,10 @@ declare namespace Lists { type: 'LINK'; title: string; className?: string; - onClick?: (event: ThreadRowActionButtonClickEvent) => void; + onClick?: (event: any) => void; url: string; } - interface ThreadRowActionButtonClickEvent { - // FIXME: testme, undocummented - } - interface LabelDescriptor { title: string; foregroundColor?: string; @@ -362,7 +359,7 @@ declare namespace Lists { } } -declare namespace Conversations { +export namespace Conversations { interface Conversations { registerThreadViewHandler(handler: (threadView: ThreadView) => void): () => void; @@ -386,9 +383,9 @@ declare namespace Conversations { getThreadIDAsync(): Promise; - on(name: 'contactHover', cb: (event: ContactHoverEvent) => void): void + on(name: 'contactHover', cb: (event: ContactHoverEvent) => void): void; - on(name: 'destroy', cb: () => void): void + on(name: 'destroy', cb: () => void): void; destroyed: boolean; } @@ -431,7 +428,7 @@ declare namespace Conversations { addAttachmentIcon(iconDescriptor: MessageAttachmentIconDescriptor): void; - //addAttachmentIcon(iconDescriptor: Stream): void; + // addAttachmentIcon(iconDescriptor: Stream): void; getViewState(): MessageViewViewStates; @@ -439,9 +436,7 @@ declare namespace Conversations { on(name: 'contactHover', cb: (event: ContactHoverEvent) => void): void; - on(name: 'load', cb: () => void): void; - - on(name: 'destroy', cb: () => void): void; + on(name: 'destroy' | 'load', cb: () => void): void; destroyed: boolean; } @@ -451,11 +446,7 @@ declare namespace Conversations { interface ContentPanelView { remove(): void; - on(name: 'activate', cb: () => void): void; - - on(name: 'deactivate', cb: () => void): void; - - on(name: 'destroy', cb: () => void): void; + on(name: 'destroy' | 'activate' | 'deactivate', cb: () => void): void; destroyed: boolean; } @@ -489,7 +480,7 @@ declare namespace Conversations { failoverPreviewIconUrl: string; previewOnClick: (event: PreviewClickEvent) => void; fileIconImageUrl: string; - buttons: (DownloadButtonDescriptor | CustomButtonDescriptor)[]; + buttons: Array; foldColor?: string; mimeType?: string; } @@ -501,7 +492,7 @@ declare namespace Conversations { iconThumbnailUrl: string; previewOnClick: (event: PreviewClickEvent) => void; fileIconImageUrl: string; - buttons: (DownloadButtonDescriptor | CustomButtonDescriptor)[]; + buttons: Array; foldColor?: string; } @@ -525,14 +516,10 @@ declare namespace Conversations { interface DownloadButtonDescriptor { downloadUrl: string; downloadFilename?: string; - onClick: (event: DownloadButtonClickEvent) => void; + onClick: (event: any) => void; openInNewTab?: boolean; } - interface DownloadButtonClickEvent { - // FIXME: testme, undocumented - } - interface CustomButtonDescriptor { iconUrl: string; tooltip: string; @@ -578,7 +565,7 @@ declare namespace Conversations { } } -declare namespace Toolbars { +export namespace Toolbars { interface Toolbars { registerThreadButton(toolbarButtonDescriptor: ToolbarButtonDescriptor): () => void; @@ -602,7 +589,7 @@ declare namespace Toolbars { onClick: (event: ToolbarButtonEvent) => void; iconUrl?: string; iconClass?: string; - positions: ToolbarButtonPosition[] + positions: ToolbarButtonPosition[]; threadSection?: SectionNames; listSection?: SectionNames; hasDropdown?: boolean; @@ -636,7 +623,7 @@ declare namespace Toolbars { remove(): void; - //TODO: Events + on(name: 'destroy', cb: () => void): void; destroyed: boolean; } @@ -648,7 +635,7 @@ declare namespace Toolbars { type SectionNames = 'INBOX_STATE' | 'METADATA_STATE' | 'OTHER'; } -declare namespace Router { +export namespace Router { interface Router { createLink(routeID: string | NativeRouteIDs, params: RouteParams): string; @@ -666,7 +653,7 @@ declare namespace Router { } interface CustomListDescriptor { - threads: (ThreadDescriptor | string)[]; + threads: Array; total?: number; hasMore?: boolean; } @@ -705,11 +692,11 @@ declare namespace Router { interface ListRouteView extends RouteView { addCollapsibleSection(options: SectionDescriptor): CollapsibleSectionView; - //addCollapsibleSection(options: Stream): CollapsibleSectionView; + // addCollapsibleSection(options: Stream): CollapsibleSectionView; addSection(options: SectionDescriptor): SectionView; - //addSection(options: Stream): SectionView; + // addSection(options: Stream): SectionView; refresh(): void; } @@ -717,7 +704,7 @@ declare namespace Router { interface SectionView { remove(): void; - // TODO: Events + on(name: 'destroy', cb: () => void): void; destroyed: boolean; } @@ -725,9 +712,9 @@ declare namespace Router { interface CollapsibleSectionView extends SectionView { setCollapsed(value: boolean): void; - remove(): void + remove(): void; - // TODO: Events + on(name: 'destroy' | 'expanded' | 'collapsed', cb: () => void): void; } interface SectionDescriptor { @@ -740,17 +727,13 @@ declare namespace Router { tableRows?: RowDescriptor[]; contentElement?: HTMLElement; footerLinkText?: string; - onFooterLinkClick?: (event: SectionFooterLinkClickEvent) => void; + onFooterLinkClick?: (event: any) => void; } interface SectionDropdownClickEvent { dropdown: Common.DropdownView; } - interface SectionFooterLinkClickEvent { - // FIXME: testme, undocumented - } - interface RowDescriptor { title: string; body: string; @@ -803,7 +786,7 @@ declare namespace Router { | 'ANY_LIST'; } -declare namespace NavMenu { +export namespace NavMenu { interface NavMenu { addNavItem(navItemDescriptor: NavItemDescriptor): NavItemView; } @@ -825,7 +808,7 @@ declare namespace NavMenu { interface NavItemDescriptor { name: string; routeID?: string; - routeParams?: Object; + routeParams?: object; onClick?: (event: { preventDefault(): void }) => void; @@ -861,15 +844,10 @@ declare namespace NavMenu { dropdown: Common.DropdownView; } - // Undocumented type NavItemTypes = 'MANAGE' | 'NAVIGATION'; - - // Undocumented - var SENT_MAIL: Object; } -declare namespace Widgets { - +export namespace Widgets { interface WidgetsInstance { showModalView(options: ModalOptions): ModalView; @@ -956,17 +934,17 @@ declare namespace Widgets { } } -declare namespace ButterBar { +export namespace ButterBar { interface ButterBar { - showMessage(options: MessageDescriptor): Object; + showMessage(options: MessageDescriptor): object; - showLoading(): Object; + showLoading(): object; - showError(options: MessageDescriptor): Object; + showError(options: MessageDescriptor): object; - showSaving(options: SavingMessageDescriptor): Object; + showSaving(options: SavingMessageDescriptor): object; - hideMessage(messageKey: Object): void; + hideMessage(messageKey: object | string): void; hideGmailMessage(): void; } @@ -977,7 +955,7 @@ declare namespace ButterBar { time?: number; hideOnViewChanged?: boolean; persistent?: boolean; - messageKey?: Object; + messageKey?: object | string; } interface MessageDescriptorText extends MessageDescriptorBase { @@ -1018,7 +996,7 @@ declare namespace ButterBar { | SavingMessageDescriptorHtmlElement; } -declare namespace Search { +export namespace Search { interface Search { registerSearchSuggestionsProvider(handler: (query: string) => AutocompleteSearchResult[] | Promise): void; @@ -1028,7 +1006,7 @@ declare namespace Search { interface AutocompleteSearchResultBase { iconUrl?: string; routeName?: string; - routeParams?: string[] + routeParams?: string[]; externalURL?: string; onClick?: () => void; } @@ -1051,7 +1029,7 @@ declare namespace Search { } } -declare namespace User { +export namespace User { interface User { getEmailAddress(): string; @@ -1065,7 +1043,7 @@ declare namespace User { } } -declare namespace Keyboard { +export namespace Keyboard { interface Keyboard { createShortcutHandle(keyboardShortcutDescriptor: KeyboardShortcutDescriptor): KeyboardShortcutHandle; } @@ -1080,8 +1058,8 @@ declare namespace Keyboard { } } -declare namespace Global { +export namespace Global { interface Global { addSidebarContentPanel(contentPanelDescriptor: Conversations.ContentPanelDescriptor): Conversations.ContentPanelView; } -} \ No newline at end of file +} diff --git a/types/inboxsdk/tsconfig.json b/types/inboxsdk/tsconfig.json index 2169e6902c..846443ce68 100644 --- a/types/inboxsdk/tsconfig.json +++ b/types/inboxsdk/tsconfig.json @@ -8,6 +8,7 @@ "noImplicitAny": true, "noImplicitThis": true, "strictNullChecks": true, + "strictFunctionTypes": true, "baseUrl": "../", "typeRoots": [ "../" From cc99dc8a94d4293b3f8550256b6325a1c04a3af7 Mon Sep 17 00:00:00 2001 From: amiram Date: Tue, 12 Jun 2018 01:55:46 +0300 Subject: [PATCH 4/7] inboxsdk types - fix ToolbarButtonDescriptor --- types/inboxsdk/index.d.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/types/inboxsdk/index.d.ts b/types/inboxsdk/index.d.ts index 96faa844e4..bfb6cc3738 100644 --- a/types/inboxsdk/index.d.ts +++ b/types/inboxsdk/index.d.ts @@ -589,7 +589,7 @@ export namespace Toolbars { onClick: (event: ToolbarButtonEvent) => void; iconUrl?: string; iconClass?: string; - positions: ToolbarButtonPosition[]; + positions?: ToolbarButtonPosition[]; threadSection?: SectionNames; listSection?: SectionNames; hasDropdown?: boolean; From f19c0bc7d32c6443ce5695bd7abe9ca4c4e84a8e Mon Sep 17 00:00:00 2001 From: amiram Date: Tue, 12 Jun 2018 08:48:42 +0300 Subject: [PATCH 5/7] inboxsdk types - fix using as a global --- types/inboxsdk/inboxsdk-tests.ts | 1 - types/inboxsdk/index.d.ts | 2055 +++++++++++++++--------------- types/inboxsdk/tslint.json | 7 +- 3 files changed, 1037 insertions(+), 1026 deletions(-) diff --git a/types/inboxsdk/inboxsdk-tests.ts b/types/inboxsdk/inboxsdk-tests.ts index c1b48a1f7f..a763674c73 100644 --- a/types/inboxsdk/inboxsdk-tests.ts +++ b/types/inboxsdk/inboxsdk-tests.ts @@ -1,4 +1,3 @@ -import * as InboxSDK from 'inboxsdk'; import ComposeView = InboxSDK.Compose.ComposeView; import Contact = InboxSDK.Common.Contact; import ThreadRowView = InboxSDK.Lists.ThreadRowView; diff --git a/types/inboxsdk/index.d.ts b/types/inboxsdk/index.d.ts index bfb6cc3738..4fdd6a86f2 100644 --- a/types/inboxsdk/index.d.ts +++ b/types/inboxsdk/index.d.ts @@ -8,9 +8,15 @@ /* * Copyright (c) 2016 GPC.solutions */ -export function load(version: number, appId?: string, opts?: LoadOptions): Promise; -export function loadScript(url: string, options?: LoadScriptOptions): Promise; +// tslint:disable-next-line:export-just-namespace +export = InboxSDK; +export as namespace InboxSDK; + +declare namespace InboxSDK { + function load(version: number, appId?: string, opts?: LoadOptions): Promise; + + function loadScript(url: string, options?: LoadScriptOptions): Promise; // // Undocummented // var IMPL_VERSION: string; @@ -21,1045 +27,1046 @@ export function loadScript(url: string, options?: LoadScriptOptions): Promise any; // }; -export interface LoadOptions { - appName?: string; - appIconUrl?: string; - suppressAddonTitle?: string; -} - -export interface LoadScriptOptions { - nowrap?: boolean; -} - -export interface InboxSDKInstance { - Compose: Compose.ComposeInstance; - Lists: Lists.Lists; - Conversations: Conversations.Conversations; - Toolbars: Toolbars.Toolbars; - Router: Router.Router; - NavMenu: NavMenu.NavMenu; - Widgets: Widgets.WidgetsInstance; - ButterBar: ButterBar.ButterBar; - Search: Search.Search; - User: User.User; - Keyboard: Keyboard.Keyboard; - Global: Global.Global; -} - -export namespace Common { - interface Contact { - name: string; - emailAddress: string; - } - - interface DropdownView { - setPlacementOptions(options: PositionOptions): void; - - close(): void; - - reposition(): void; - - el: HTMLElement; - destroyed: boolean; - - on(name: 'destroy', cb: () => void): void; - - on(name: 'preautoclose', cb: (event: PreAutoCloseEvent) => void): void; - } - - interface PreAutoCloseEvent { - type: 'outsideInteraction' | 'escape'; - cause: Event; - - cancel(): void; - } - - interface PositionOptions { - position?: string; - forcePosition?: boolean; - hAlign?: string; - forceHAlign?: boolean; - vAlign?: string; - forceVAlign?: boolean; - buffer?: number; - topBuffer?: number; - bottomBuffer?: number; - leftBuffer?: number; - rightBuffer?: number; - } - - interface SimpleElementView { - destroy(): void; - - el: HTMLElement; - destroyed: boolean; - - on(name: 'destroy', cb: () => void): void; - } -} - -export namespace Compose { - interface ComposeInstance { - registerComposeViewHandler(handler: (composeView: ComposeView) => void): () => void; - - openNewComposeView(): Promise; - } - - interface ComposeView { - addButton(buttonDescriptor: ComposeButtonDescriptor): void; - - addStatusBar(statusBarDescriptor: StatusBarDescriptor): StatusBarView; - - close(): void; - - send(options?: SendOptions): void; - - getBodyElement(): HTMLElement; - - getInitialMessageID(): string; - - getThreadID(): string; - - getDraftID(): Promise; - - getCurrentDraftID(): Promise; - - getHTMLContent(): string; - - getSelectedBodyHTML(): string; - - getSelectedBodyText(): string; - - getSubject(): string; - - getTextContent(): string; - - getToRecipients(): Common.Contact[]; - - getCcRecipients(): Common.Contact[]; - - getBccRecipients(): Common.Contact[]; - - insertTextIntoBodyAtCursor(text: string): void; - - insertHTMLIntoBodyAtCursor(html: string | HTMLElement): HTMLElement; - - insertLinkChipIntoBodyAtCursor(text: string, url: string, iconUrl: string): HTMLElement; - - insertLinkIntoBodyAtCursor(text: string, url: string): HTMLElement; - - isInlineReplyForm(): boolean; - - isFullscreen(): boolean; - - setFullscreen(minimized: boolean): void; - - isMinimized(): boolean; - - setMinimized(minimized: boolean): void; - - popOut(): Promise; - - setTitleBarColor(color: string): () => void; - - isReply(): boolean; - - setToRecipients(emails: string[]): void; - - setCcRecipients(emails: string[]): void; - - setBccRecipients(emails: string[]): void; - - getFromContact(): Common.Contact; - - getFromContactChoices(): Common.Contact[]; - - setFromEmail(email: string): void; - - setSubject(text: string): void; - - setBodyHTML(html: string): void; - - setBodyText(text: string): void; - - attachFiles(files: Blob[]): Promise; - - attachInlineFiles(Files: Blob[]): Promise; - - on(name: 'destroy', cb: (event: { messageID: string, closedByInboxSDK: boolean }) => void): void; - - on(name: 'fullscreenChanged', cb: (event: { fullscreen: boolean }) => void): void; - - on(name: 'fromContactChanged' | 'toContactAdded' | 'toContactRemoved' | 'ccContactAdded' | 'ccContactRemoved' | 'bccContactAdded' | 'bccContactRemoved', - cb: (event: { contact: Common.Contact }) => void): void; - - on(name: 'recipientsChanged', cb: (event: RecipientsChangedEvent) => void): void; - - on(name: 'presending', cb: (event: { cancel: () => void }) => void): void; - - on(name: 'sent', cb: (event: { getThreadID: () => Promise, getMessageID: () => Promise }) => void): void; - - on(name: 'discard' | 'sendCanceled' | 'sending' | 'bodyChanged' | 'minimized' | 'restored', cb: () => void): void; - - destroyed: boolean; - } - - interface RecipientsChangedEvent { - to: { - added: Common.Contact[]; - removed: Common.Contact[]; - }; - cc: { - added: Common.Contact[]; - removed: Common.Contact[]; - }; - bcc: { - added: Common.Contact[]; - removed: Common.Contact[]; - }; - } - - interface ComposeButtonDescriptor { - title: string; - iconUrl?: string; - iconClass?: string; - onClick: (event: ComposeButtonClickEvent) => void; - hasDropdown?: boolean; - type?: 'MODIFIER' | 'SEND_ACTION'; - orderHint?: number; - enabled?: boolean; - } - - interface ComposeButtonClickEvent { - composeView: ComposeView; - dropdown: Common.DropdownView; - } - - interface StatusBarDescriptor { - height?: number; - orderHint?: number; - } - - interface StatusBarView extends Common.SimpleElementView { - setHeight(height: number): void; - } - - interface SendOptions { - sendAndArchive?: boolean; - } -} - -export namespace Lists { - interface Lists { - registerThreadRowViewHandler(handler: (threadRowView: ThreadRowView) => any): () => void; - } - - interface ThreadRowView { - addLabel(labelDescriptor: LabelDescriptor): void; - - // addLabel(labelDescriptor: Stream): void; - - addImage(imageDescriptor: ImageDescriptor): void; - - // addImage(imageDescriptor: Stream): void; - - addButton(buttonDescriptor: ThreadRowButtonDescriptor): void; - - // addButton(buttonDescriptor: Stream): void; - - addActionButton(buttonDescriptor: ThreadRowActionButtonDescriptor): void; - - // addActionButton(buttonDescriptor: Stream): void; - - addAttachmentIcon(threadRowAttachmentIconDescriptor: ThreadRowAttachmentIconDescriptor): void; - - // addAttachmentIcon(threadRowAttachmentIconDescriptor: stream): void - - replaceDate(threadRowDateDescriptor: ThreadRowDateDescriptor): void; - - // replaceDate(threadRowDateDescriptor: Stream): void; - - replaceDraftLabel(draftLabelDescriptor: ThreadRowDraftLabelDescriptor): void; - - // replaceDraftLabel(draftLabelDescriptor: Stream): void; - - getSubject(): string; - - getDateString(): string; - - getThreadIDAsync(): Promise; - - getThreadIDIfStableAsync(): Promise; - - getDraftID(): Promise; - - getVisibleDraftCount(): number; - - getVisibleMessageCount(): number; - - getContacts(): Common.Contact[]; - - on(name: 'destroyed', cb: () => void): void; - - destroyed: boolean; - } - - interface ThreadRowButtonDescriptor { - title: string; - iconUrl: string; - iconClass?: string; - onClick: (event: ThreadRowButtonClickEvent) => void; - hasDropdown?: boolean; - } - - interface ThreadRowButtonClickEvent { - threadRowView: ThreadRowView; - dropdown?: Common.DropdownView; - } - - interface ThreadRowActionButtonDescriptor { - type: 'LINK'; - title: string; - className?: string; - onClick?: (event: any) => void; - url: string; - } - - interface LabelDescriptor { - title: string; - foregroundColor?: string; - backgroundColor?: string; - iconUrl: string; - iconClass?: string; - iconBackgroundColor?: string; - } - - interface ImageDescriptor { - imageUrl: string; - imageClass?: string; - tooltip?: string; - orderHint?: number; - } - - interface ThreadRowDateDescriptor { - text: string; - textColor?: string; - tooltip?: string; - } - - interface ThreadRowAttachmentIconDescriptor { - iconUrl?: string; - iconClass?: string; - tooltip?: string; - } - - interface ThreadRowDraftLabelDescriptor { - text: string; - count?: string; - } -} - -export namespace Conversations { - interface Conversations { - registerThreadViewHandler(handler: (threadView: ThreadView) => void): () => void; - - registerMessageViewHandler(handler: (messageView: MessageView) => void): () => void; - - registerMessageViewHandlerAll(handler: (messageView: MessageView) => void): () => void; - - registerFileAttachmentCardViewHandler(handler: (attachmentCardView: AttachmentCardView) => void): () => void; - } - - interface ThreadView { - addNoticeBar(): Common.SimpleElementView; - - addSidebarContentPanel(contentPanelDescriptor: ContentPanelDescriptor): ContentPanelView; - - getMessageViews(): MessageView[]; - - getMessageViewsAll(): MessageView[]; - - getSubject(): string; - - getThreadIDAsync(): Promise; - - on(name: 'contactHover', cb: (event: ContactHoverEvent) => void): void; - - on(name: 'destroy', cb: () => void): void; - - destroyed: boolean; - } - - interface ContactHoverEvent { - contact: Common.Contact; - contactType: 'sender' | 'recipient'; - messageView: MessageView; - threadView: ThreadView; - } - - interface MessageView { - addAttachmentCardView(cardOptions: AttachmentCardOptions | AttachmentCardNoPreviewOptions): AttachmentCardView; - - addAttachmentsToolbarButton(buttonOptions: AttachmentsToolbarButtonDescriptor): void; - - addToolbarButton(options: MessageViewToolbarButtonDescriptor): void; - - getBodyElement(): HTMLElement; - - getMessageIDAsync(): Promise; - - getFileAttachmentCardViews(): AttachmentCardView[]; - - isElementInQuotedArea(): boolean; - - isLoaded(): boolean; - - getLinksInBody(): MessageViewLinkDescriptor[]; - - getSender(): Common.Contact; - - getRecipientEmailAddresses(): string[]; - - getRecipientsFull(): Promise; - - getThreadView(): ThreadView; - - getDateString(): string; - - addAttachmentIcon(iconDescriptor: MessageAttachmentIconDescriptor): void; - - // addAttachmentIcon(iconDescriptor: Stream): void; - - getViewState(): MessageViewViewStates; - - on(name: 'viewStateChange', cb: (event: { newViewState: MessageViewViewStates, oldViewState: MessageViewViewStates, messageView: MessageView }) => void): void; - - on(name: 'contactHover', cb: (event: ContactHoverEvent) => void): void; - - on(name: 'destroy' | 'load', cb: () => void): void; - - destroyed: boolean; - } - - type MessageViewViewStates = 'HIDDEN' | 'COLLAPSED' | 'EXPANDED'; - - interface ContentPanelView { - remove(): void; - - on(name: 'destroy' | 'activate' | 'deactivate', cb: () => void): void; - - destroyed: boolean; - } - - interface AttachmentCardView { - getAttachmentType(): string; - - addButton(buttonDescriptor: CustomButtonDescriptor): void; - - getTitle(): string; - - /** - * @deprecated. Use AttachmentCardClickEvent.getDownloadURL() instead - */ - getDownloadURL(): Promise; - - getMessageView(): MessageView | null; - - on(name: 'destroy', cb: () => void): void; - - destroyed: boolean; - } - - // ConversationsDescriptors - - interface AttachmentCardOptions { - title: string; - description: string; - previewUrl: string; - previewThumbnailUrl: string; - failoverPreviewIconUrl: string; - previewOnClick: (event: PreviewClickEvent) => void; - fileIconImageUrl: string; - buttons: Array; - foldColor?: string; - mimeType?: string; - } - - interface AttachmentCardNoPreviewOptions { - title: string; - description: string; - previewUrl: string; - iconThumbnailUrl: string; - previewOnClick: (event: PreviewClickEvent) => void; - fileIconImageUrl: string; - buttons: Array; - foldColor?: string; - } - - interface PreviewClickEvent { - attachmentCardView: AttachmentCardView; - - preventDefault(): void; - } - - interface ContentPanelDescriptor { - el: HTMLElement; - title: string; - iconUrl: string; + interface LoadOptions { appName?: string; appIconUrl?: string; - id?: string; - hideTitleBar?: boolean; - orderHint?: number; + suppressAddonTitle?: string; } - interface DownloadButtonDescriptor { - downloadUrl: string; - downloadFilename?: string; - onClick: (event: any) => void; - openInNewTab?: boolean; + interface LoadScriptOptions { + nowrap?: boolean; } - interface CustomButtonDescriptor { - iconUrl: string; - tooltip: string; - onClick: (event: AttachmentCardClickEvent) => void; + interface InboxSDKInstance { + Compose: Compose.ComposeInstance; + Lists: Lists.Lists; + Conversations: Conversations.Conversations; + Toolbars: Toolbars.Toolbars; + Router: Router.Router; + NavMenu: NavMenu.NavMenu; + Widgets: Widgets.WidgetsInstance; + ButterBar: ButterBar.ButterBar; + Search: Search.Search; + User: User.User; + Keyboard: Keyboard.Keyboard; + Global: Global.Global; } - interface AttachmentCardClickEvent { - getDownloadURL(): Promise; + namespace Common { + interface Contact { + name: string; + emailAddress: string; + } + + interface DropdownView { + setPlacementOptions(options: PositionOptions): void; + + close(): void; + + reposition(): void; + + el: HTMLElement; + destroyed: boolean; + + on(name: 'destroy', cb: () => void): void; + + on(name: 'preautoclose', cb: (event: PreAutoCloseEvent) => void): void; + } + + interface PreAutoCloseEvent { + type: 'outsideInteraction' | 'escape'; + cause: Event; + + cancel(): void; + } + + interface PositionOptions { + position?: string; + forcePosition?: boolean; + hAlign?: string; + forceHAlign?: boolean; + vAlign?: string; + forceVAlign?: boolean; + buffer?: number; + topBuffer?: number; + bottomBuffer?: number; + leftBuffer?: number; + rightBuffer?: number; + } + + interface SimpleElementView { + destroy(): void; + + el: HTMLElement; + destroyed: boolean; + + on(name: 'destroy', cb: () => void): void; + } } - interface AttachmentsToolbarButtonDescriptor { - tooltip: string; - iconUrl: string; - onClick: (event: AttachmentsToolbarButtonEvent) => void; + export namespace Compose { + interface ComposeInstance { + registerComposeViewHandler(handler: (composeView: ComposeView) => void): () => void; + + openNewComposeView(): Promise; + } + + interface ComposeView { + addButton(buttonDescriptor: ComposeButtonDescriptor): void; + + addStatusBar(statusBarDescriptor: StatusBarDescriptor): StatusBarView; + + close(): void; + + send(options?: SendOptions): void; + + getBodyElement(): HTMLElement; + + getInitialMessageID(): string; + + getThreadID(): string; + + getDraftID(): Promise; + + getCurrentDraftID(): Promise; + + getHTMLContent(): string; + + getSelectedBodyHTML(): string; + + getSelectedBodyText(): string; + + getSubject(): string; + + getTextContent(): string; + + getToRecipients(): Common.Contact[]; + + getCcRecipients(): Common.Contact[]; + + getBccRecipients(): Common.Contact[]; + + insertTextIntoBodyAtCursor(text: string): void; + + insertHTMLIntoBodyAtCursor(html: string | HTMLElement): HTMLElement; + + insertLinkChipIntoBodyAtCursor(text: string, url: string, iconUrl: string): HTMLElement; + + insertLinkIntoBodyAtCursor(text: string, url: string): HTMLElement; + + isInlineReplyForm(): boolean; + + isFullscreen(): boolean; + + setFullscreen(minimized: boolean): void; + + isMinimized(): boolean; + + setMinimized(minimized: boolean): void; + + popOut(): Promise; + + setTitleBarColor(color: string): () => void; + + isReply(): boolean; + + setToRecipients(emails: string[]): void; + + setCcRecipients(emails: string[]): void; + + setBccRecipients(emails: string[]): void; + + getFromContact(): Common.Contact; + + getFromContactChoices(): Common.Contact[]; + + setFromEmail(email: string): void; + + setSubject(text: string): void; + + setBodyHTML(html: string): void; + + setBodyText(text: string): void; + + attachFiles(files: Blob[]): Promise; + + attachInlineFiles(Files: Blob[]): Promise; + + on(name: 'destroy', cb: (event: { messageID: string, closedByInboxSDK: boolean }) => void): void; + + on(name: 'fullscreenChanged', cb: (event: { fullscreen: boolean }) => void): void; + + on(name: 'fromContactChanged' | 'toContactAdded' | 'toContactRemoved' | 'ccContactAdded' | 'ccContactRemoved' | 'bccContactAdded' | 'bccContactRemoved', + cb: (event: { contact: Common.Contact }) => void): void; + + on(name: 'recipientsChanged', cb: (event: RecipientsChangedEvent) => void): void; + + on(name: 'presending', cb: (event: { cancel: () => void }) => void): void; + + on(name: 'sent', cb: (event: { getThreadID: () => Promise, getMessageID: () => Promise }) => void): void; + + on(name: 'discard' | 'sendCanceled' | 'sending' | 'bodyChanged' | 'minimized' | 'restored', cb: () => void): void; + + destroyed: boolean; + } + + interface RecipientsChangedEvent { + to: { + added: Common.Contact[]; + removed: Common.Contact[]; + }; + cc: { + added: Common.Contact[]; + removed: Common.Contact[]; + }; + bcc: { + added: Common.Contact[]; + removed: Common.Contact[]; + }; + } + + interface ComposeButtonDescriptor { + title: string; + iconUrl?: string; + iconClass?: string; + onClick: (event: ComposeButtonClickEvent) => void; + hasDropdown?: boolean; + type?: 'MODIFIER' | 'SEND_ACTION'; + orderHint?: number; + enabled?: boolean; + } + + interface ComposeButtonClickEvent { + composeView: ComposeView; + dropdown: Common.DropdownView; + } + + interface StatusBarDescriptor { + height?: number; + orderHint?: number; + } + + interface StatusBarView extends Common.SimpleElementView { + setHeight(height: number): void; + } + + interface SendOptions { + sendAndArchive?: boolean; + } } - interface AttachmentsToolbarButtonEvent { - attachmentCardViews: AttachmentCardView[]; + export namespace Lists { + interface Lists { + registerThreadRowViewHandler(handler: (threadRowView: ThreadRowView) => any): () => void; + } + + interface ThreadRowView { + addLabel(labelDescriptor: LabelDescriptor): void; + + // addLabel(labelDescriptor: Stream): void; + + addImage(imageDescriptor: ImageDescriptor): void; + + // addImage(imageDescriptor: Stream): void; + + addButton(buttonDescriptor: ThreadRowButtonDescriptor): void; + + // addButton(buttonDescriptor: Stream): void; + + addActionButton(buttonDescriptor: ThreadRowActionButtonDescriptor): void; + + // addActionButton(buttonDescriptor: Stream): void; + + addAttachmentIcon(threadRowAttachmentIconDescriptor: ThreadRowAttachmentIconDescriptor): void; + + // addAttachmentIcon(threadRowAttachmentIconDescriptor: stream): void + + replaceDate(threadRowDateDescriptor: ThreadRowDateDescriptor): void; + + // replaceDate(threadRowDateDescriptor: Stream): void; + + replaceDraftLabel(draftLabelDescriptor: ThreadRowDraftLabelDescriptor): void; + + // replaceDraftLabel(draftLabelDescriptor: Stream): void; + + getSubject(): string; + + getDateString(): string; + + getThreadIDAsync(): Promise; + + getThreadIDIfStableAsync(): Promise; + + getDraftID(): Promise; + + getVisibleDraftCount(): number; + + getVisibleMessageCount(): number; + + getContacts(): Common.Contact[]; + + on(name: 'destroyed', cb: () => void): void; + + destroyed: boolean; + } + + interface ThreadRowButtonDescriptor { + title: string; + iconUrl: string; + iconClass?: string; + onClick: (event: ThreadRowButtonClickEvent) => void; + hasDropdown?: boolean; + } + + interface ThreadRowButtonClickEvent { + threadRowView: ThreadRowView; + dropdown?: Common.DropdownView; + } + + interface ThreadRowActionButtonDescriptor { + type: 'LINK'; + title: string; + className?: string; + onClick?: (event: any) => void; + url: string; + } + + interface LabelDescriptor { + title: string; + foregroundColor?: string; + backgroundColor?: string; + iconUrl: string; + iconClass?: string; + iconBackgroundColor?: string; + } + + interface ImageDescriptor { + imageUrl: string; + imageClass?: string; + tooltip?: string; + orderHint?: number; + } + + interface ThreadRowDateDescriptor { + text: string; + textColor?: string; + tooltip?: string; + } + + interface ThreadRowAttachmentIconDescriptor { + iconUrl?: string; + iconClass?: string; + tooltip?: string; + } + + interface ThreadRowDraftLabelDescriptor { + text: string; + count?: string; + } } - interface MessageViewLinkDescriptor { - text: string; - html: string; - element: HTMLElement; - href: string; - isInQuotedArea: boolean; + export namespace Conversations { + interface Conversations { + registerThreadViewHandler(handler: (threadView: ThreadView) => void): () => void; + + registerMessageViewHandler(handler: (messageView: MessageView) => void): () => void; + + registerMessageViewHandlerAll(handler: (messageView: MessageView) => void): () => void; + + registerFileAttachmentCardViewHandler(handler: (attachmentCardView: AttachmentCardView) => void): () => void; + } + + interface ThreadView { + addNoticeBar(): Common.SimpleElementView; + + addSidebarContentPanel(contentPanelDescriptor: ContentPanelDescriptor): ContentPanelView; + + getMessageViews(): MessageView[]; + + getMessageViewsAll(): MessageView[]; + + getSubject(): string; + + getThreadIDAsync(): Promise; + + on(name: 'contactHover', cb: (event: ContactHoverEvent) => void): void; + + on(name: 'destroy', cb: () => void): void; + + destroyed: boolean; + } + + interface ContactHoverEvent { + contact: Common.Contact; + contactType: 'sender' | 'recipient'; + messageView: MessageView; + threadView: ThreadView; + } + + interface MessageView { + addAttachmentCardView(cardOptions: AttachmentCardOptions | AttachmentCardNoPreviewOptions): AttachmentCardView; + + addAttachmentsToolbarButton(buttonOptions: AttachmentsToolbarButtonDescriptor): void; + + addToolbarButton(options: MessageViewToolbarButtonDescriptor): void; + + getBodyElement(): HTMLElement; + + getMessageIDAsync(): Promise; + + getFileAttachmentCardViews(): AttachmentCardView[]; + + isElementInQuotedArea(): boolean; + + isLoaded(): boolean; + + getLinksInBody(): MessageViewLinkDescriptor[]; + + getSender(): Common.Contact; + + getRecipientEmailAddresses(): string[]; + + getRecipientsFull(): Promise; + + getThreadView(): ThreadView; + + getDateString(): string; + + addAttachmentIcon(iconDescriptor: MessageAttachmentIconDescriptor): void; + + // addAttachmentIcon(iconDescriptor: Stream): void; + + getViewState(): MessageViewViewStates; + + on(name: 'viewStateChange', cb: (event: { newViewState: MessageViewViewStates, oldViewState: MessageViewViewStates, messageView: MessageView }) => void): void; + + on(name: 'contactHover', cb: (event: ContactHoverEvent) => void): void; + + on(name: 'destroy' | 'load', cb: () => void): void; + + destroyed: boolean; + } + + type MessageViewViewStates = 'HIDDEN' | 'COLLAPSED' | 'EXPANDED'; + + interface ContentPanelView { + remove(): void; + + on(name: 'destroy' | 'activate' | 'deactivate', cb: () => void): void; + + destroyed: boolean; + } + + interface AttachmentCardView { + getAttachmentType(): string; + + addButton(buttonDescriptor: CustomButtonDescriptor): void; + + getTitle(): string; + + /** + * @deprecated. Use AttachmentCardClickEvent.getDownloadURL() instead + */ + getDownloadURL(): Promise; + + getMessageView(): MessageView | null; + + on(name: 'destroy', cb: () => void): void; + + destroyed: boolean; + } + + // ConversationsDescriptors + + interface AttachmentCardOptions { + title: string; + description: string; + previewUrl: string; + previewThumbnailUrl: string; + failoverPreviewIconUrl: string; + previewOnClick: (event: PreviewClickEvent) => void; + fileIconImageUrl: string; + buttons: Array; + foldColor?: string; + mimeType?: string; + } + + interface AttachmentCardNoPreviewOptions { + title: string; + description: string; + previewUrl: string; + iconThumbnailUrl: string; + previewOnClick: (event: PreviewClickEvent) => void; + fileIconImageUrl: string; + buttons: Array; + foldColor?: string; + } + + interface PreviewClickEvent { + attachmentCardView: AttachmentCardView; + + preventDefault(): void; + } + + interface ContentPanelDescriptor { + el: HTMLElement; + title: string; + iconUrl: string; + appName?: string; + appIconUrl?: string; + id?: string; + hideTitleBar?: boolean; + orderHint?: number; + } + + interface DownloadButtonDescriptor { + downloadUrl: string; + downloadFilename?: string; + onClick: (event: any) => void; + openInNewTab?: boolean; + } + + interface CustomButtonDescriptor { + iconUrl: string; + tooltip: string; + onClick: (event: AttachmentCardClickEvent) => void; + } + + interface AttachmentCardClickEvent { + getDownloadURL(): Promise; + } + + interface AttachmentsToolbarButtonDescriptor { + tooltip: string; + iconUrl: string; + onClick: (event: AttachmentsToolbarButtonEvent) => void; + } + + interface AttachmentsToolbarButtonEvent { + attachmentCardViews: AttachmentCardView[]; + } + + interface MessageViewLinkDescriptor { + text: string; + html: string; + element: HTMLElement; + href: string; + isInQuotedArea: boolean; + } + + interface MessageAttachmentIconDescriptor { + iconUrl: string; + iconClass?: string; + tooltip: string; + onClick?: () => void; + } + + interface MessageViewToolbarButtonDescriptor { + section: 'MORE'; + title: string; + iconUrl: string; + onClick: () => void; + iconClass?: string; + orderHint: number; + } } - interface MessageAttachmentIconDescriptor { - iconUrl: string; - iconClass?: string; - tooltip: string; - onClick?: () => void; + export namespace Toolbars { + interface Toolbars { + registerThreadButton(toolbarButtonDescriptor: ToolbarButtonDescriptor): () => void; + + /** + * @deprecated. use registerThreadButton + * @param toolbarButtonDescriptor + */ + registerToolbarButtonForList(toolbarButtonDescriptor: ToolbarButtonDescriptor): () => void; + + /** + * @deprecated. use registerThreadButton + * @param toolbarButtonDescriptor + */ + registerToolbarButtonForThreadView(toolbarButtonDescriptor: ToolbarButtonDescriptor): () => void; + + addToolbarButtonForApp(appToolbarButtonDescriptor: AppToolbarButtonDescriptor): AppToolbarButtonView; + } + + interface ToolbarButtonDescriptor { + title: string; + onClick: (event: ToolbarButtonEvent) => void; + iconUrl?: string; + iconClass?: string; + positions?: ToolbarButtonPosition[]; + threadSection?: SectionNames; + listSection?: SectionNames; + hasDropdown?: boolean; + hideFor?: (routeView: Router.RouteView) => void; + orderHint?: number; + keyboardShortcutHandle?: Keyboard.KeyboardShortcutHandle; + } + + type ToolbarButtonPosition = 'THREAD' | 'ROW' | 'LIST'; + + interface ToolbarButtonEvent { + position: ToolbarButtonPosition; + selectedThreadRowViews: Lists.ThreadRowView[]; + selectedThreadViews: Conversations.ThreadView[]; + dropdown?: Common.DropdownView; + } + + interface AppToolbarButtonDescriptor { + title: string; + titleClass?: string; + iconUrl: string; + iconClass?: string; + onClick: (event: AppToolbarButtonEvent) => void; + arrowColor?: string; + } + + interface AppToolbarButtonView { + open(): void; + + close(): void; + + remove(): void; + + on(name: 'destroy', cb: () => void): void; + + destroyed: boolean; + } + + interface AppToolbarButtonEvent { + dropdown: Common.DropdownView; + } + + type SectionNames = 'INBOX_STATE' | 'METADATA_STATE' | 'OTHER'; } - interface MessageViewToolbarButtonDescriptor { - section: 'MORE'; - title: string; - iconUrl: string; - onClick: () => void; - iconClass?: string; - orderHint: number; - } -} - -export namespace Toolbars { - interface Toolbars { - registerThreadButton(toolbarButtonDescriptor: ToolbarButtonDescriptor): () => void; - - /** - * @deprecated. use registerThreadButton - * @param toolbarButtonDescriptor - */ - registerToolbarButtonForList(toolbarButtonDescriptor: ToolbarButtonDescriptor): () => void; - - /** - * @deprecated. use registerThreadButton - * @param toolbarButtonDescriptor - */ - registerToolbarButtonForThreadView(toolbarButtonDescriptor: ToolbarButtonDescriptor): () => void; - - addToolbarButtonForApp(appToolbarButtonDescriptor: AppToolbarButtonDescriptor): AppToolbarButtonView; - } - - interface ToolbarButtonDescriptor { - title: string; - onClick: (event: ToolbarButtonEvent) => void; - iconUrl?: string; - iconClass?: string; - positions?: ToolbarButtonPosition[]; - threadSection?: SectionNames; - listSection?: SectionNames; - hasDropdown?: boolean; - hideFor?: (routeView: Router.RouteView) => void; - orderHint?: number; - keyboardShortcutHandle?: Keyboard.KeyboardShortcutHandle; - } - - type ToolbarButtonPosition = 'THREAD' | 'ROW' | 'LIST'; - - interface ToolbarButtonEvent { - position: ToolbarButtonPosition; - selectedThreadRowViews: Lists.ThreadRowView[]; - selectedThreadViews: Conversations.ThreadView[]; - dropdown?: Common.DropdownView; - } - - interface AppToolbarButtonDescriptor { - title: string; - titleClass?: string; - iconUrl: string; - iconClass?: string; - onClick: (event: AppToolbarButtonEvent) => void; - arrowColor?: string; - } - - interface AppToolbarButtonView { - open(): void; - - close(): void; - - remove(): void; - - on(name: 'destroy', cb: () => void): void; - - destroyed: boolean; - } - - interface AppToolbarButtonEvent { - dropdown: Common.DropdownView; - } - - type SectionNames = 'INBOX_STATE' | 'METADATA_STATE' | 'OTHER'; -} - -export namespace Router { - interface Router { - createLink(routeID: string | NativeRouteIDs, params: RouteParams): string; - - goto(routeID: string | NativeRouteIDs, params: RouteParams): void; - - handleCustomRoute(routeID: string, handler: (customRouteView: CustomRouteView) => void): () => void; - - handleAllRoutes(handler: (routeView: RouteView) => void): () => void; - - handleListRoute(routeID: NativeListRouteIDs, handler: (listRouteView: ListRouteView) => void): () => void; - - handleCustomListRoute(routeID: string, handler: (offset: number, max: number) => CustomListDescriptor | Promise): () => void; - - getCurrentRouteView(): RouteView; - } - - interface CustomListDescriptor { - threads: Array; - total?: number; - hasMore?: boolean; - } - - interface ThreadDescriptor { - rfcMessageId?: string; - gmailThreadId?: string; - } - - interface RouteParams { - [key: number]: string | number; - - [key: string]: string | number; - } - - interface RouteView { - getRouteID(): string; - - getRouteType(): RouteTypes; - - getParams(): RouteParams; - - on(name: 'destroy', cb: () => void): void; - - destroyed: boolean; - } - - type RouteTypes = 'LIST' | 'THREAD' | 'SETTINGS' | 'CHAT' | 'CUSTOM' | 'UNKNOWN'; - - interface CustomRouteView extends RouteView { - getElement(): HTMLElement; - - setFullWidth(fullWidth: boolean): void; - } - - interface ListRouteView extends RouteView { - addCollapsibleSection(options: SectionDescriptor): CollapsibleSectionView; - - // addCollapsibleSection(options: Stream): CollapsibleSectionView; - - addSection(options: SectionDescriptor): SectionView; - - // addSection(options: Stream): SectionView; - - refresh(): void; - } - - interface SectionView { - remove(): void; - - on(name: 'destroy', cb: () => void): void; - - destroyed: boolean; - } - - interface CollapsibleSectionView extends SectionView { - setCollapsed(value: boolean): void; - - remove(): void; - - on(name: 'destroy' | 'expanded' | 'collapsed', cb: () => void): void; - } - - interface SectionDescriptor { - title: string; - subtitle?: string; - titleLinkText?: string; - onTitleLinkClick?: () => void; - hasDropdown?: boolean; - onDropdownClick?: (event: SectionDropdownClickEvent) => void; - tableRows?: RowDescriptor[]; - contentElement?: HTMLElement; - footerLinkText?: string; - onFooterLinkClick?: (event: any) => void; - } - - interface SectionDropdownClickEvent { - dropdown: Common.DropdownView; - } - - interface RowDescriptor { - title: string; - body: string; - shortDetailText: string; - isRead: string; - labels: Lists.LabelDescriptor[]; - iconUrl?: string; - iconClass?: string; - routeID?: string; - routeParams?: string[]; - onClick?: () => void; - } - - type NativeRouteIDs = - 'INBOX' | - 'ALL_MAIL' | - 'SENT' | - 'STARRED' | - 'DRAFTS' | - 'SNOOZED' | - 'DONE' | - 'REMINDERS' | - 'LABEL' | - 'TRASH' | - 'SPAM' | - 'IMPORTANT' | - 'SEARCH' | - 'THREAD' | - 'CHATS' | - 'CHAT' | - 'CONTACTS' | - 'CONTACT' | - 'SETTINGS' | - 'ANY_LIST'; - - type NativeListRouteIDs = - 'INBOX' - | 'ALL_MAIL' - | 'SENT' - | 'STARRED' - | 'DRAFTS' - | 'SNOOZED' - | 'DONE' - | 'REMINDERS' - | 'LABEL' - | 'TRASH' - | 'SPAM' - | 'IMPORTANT' - | 'SEARCH' - | 'ANY_LIST'; -} - -export namespace NavMenu { - interface NavMenu { - addNavItem(navItemDescriptor: NavItemDescriptor): NavItemView; - } - - interface NavItemView { - addNavItem(navItemDescriptor: NavItemDescriptor): NavItemView; - - remove(): void; - - isCollapsed(): boolean; - - setCollapsed(collapseValue: boolean): void; - - on(name: 'destroy', cb: () => void): void; - - destroyed: boolean; - } - - interface NavItemDescriptor { - name: string; - routeID?: string; - routeParams?: object; - - onClick?: (event: { preventDefault(): void }) => void; - - orderHint?: number; - accessory?: CreateAccessoryDescriptor | IconButtonAccessoryDescriptor | DropdownButtonAccessoryDescriptor; - iconUrl?: string; - iconClass?: string; - backgroundColor?: string; - expanderForegroundColor?: string; - type?: NavItemTypes; - } - - interface CreateAccessoryDescriptor { - type: 'CREATE'; - onClick: () => void; - } - - interface IconButtonAccessoryDescriptor { - type: 'ICON_BUTTON'; - onClick: () => void; - iconUrl: string; - iconClass?: string; - } - - interface DropdownButtonAccessoryDescriptor { - type: 'DROPDOWN_BUTTON'; - buttonBackgroundColor: string; - buttonForegroundColor: string; - onClick: (event: DropdownButtonClickEvent) => void; - } - - interface DropdownButtonClickEvent { - dropdown: Common.DropdownView; - } - - type NavItemTypes = 'MANAGE' | 'NAVIGATION'; -} - -export namespace Widgets { - interface WidgetsInstance { - showModalView(options: ModalOptions): ModalView; - - showMoleView(options: MoleOptions): MoleView; - - showDrawerView(options: DrawerOptions): DrawerView; - } - - interface ModalOptions { - el: HTMLElement; - chrome?: boolean; - constrainTitleWidth?: boolean; - showCloseButton?: boolean; - title?: string; - buttons?: ModalButtonDescriptor[]; - } - - interface ModalButtonDescriptor { - text: string; - title: string; - onClick: () => void; - type?: 'PRIMARY_ACTION' | 'SECONDARY_ACTION'; - color?: string; - orderHint?: number; - } - - interface MoleOptions { - el: HTMLElement; - title?: string; - titleEl?: HTMLElement; - minimizedTitleEl?: HTMLElement; - className?: string; - titleButtons?: MoleButtonDescriptor[]; - chrome?: boolean; - } - - interface MoleButtonDescriptor { - title: string; - iconUrl: string; - iconClass?: string; - onClick: () => void; - } - - interface DrawerOptions { - el: HTMLElement; - chrome?: boolean; - title?: string; - composeView?: Compose.ComposeView; - closeWithCompose?: boolean; - } - - interface ModalView { - close(): void; - - on(name: 'destroyed', cb: () => void): void; - - destroyed: boolean; - } - - interface MoleView { - close(): void; - - setTitle(text: string): void; - - setMinimized(minimized: boolean): void; - - getMinimized(): boolean; - - on(name: 'destroyed' | 'minimize' | 'restore', cb: () => void): void; - - destroyed: boolean; - } - - interface DrawerView { - close(): void; - - associateComposeView(composeView: Compose.ComposeView, closeWithCompose: boolean): void; - - disassociateComposeView(): void; - - on(name: 'destroyed' | 'slideAnimationDone' | 'closing', cb: () => void): void; - - destroyed: boolean; - } -} - -export namespace ButterBar { - interface ButterBar { - showMessage(options: MessageDescriptor): object; - - showLoading(): object; - - showError(options: MessageDescriptor): object; - - showSaving(options: SavingMessageDescriptor): object; - - hideMessage(messageKey: object | string): void; - - hideGmailMessage(): void; - } - - interface MessageDescriptorBase { - className?: string; - priority?: number; - time?: number; - hideOnViewChanged?: boolean; - persistent?: boolean; - messageKey?: object | string; - } - - interface MessageDescriptorText extends MessageDescriptorBase { - text: string; - } - - interface MessageDescriptorHtml extends MessageDescriptorBase { - html: string; - } - - interface MessageDescriptorHtmlElement extends MessageDescriptorBase { - el: HTMLElement; - } - - type MessageDescriptor = MessageDescriptorText | MessageDescriptorHtml | MessageDescriptorHtmlElement; - - interface SavingMessageDescriptorBase extends MessageDescriptorBase { - confirmationText?: string; - confirmationTime?: number; - showConfirmation?: boolean; - } - - interface SavingMessageDescriptorText extends SavingMessageDescriptorBase { - text: string; - } - - interface SavingMessageDescriptorHtml extends SavingMessageDescriptorBase { - html: string; - } - - interface SavingMessageDescriptorHtmlElement extends SavingMessageDescriptorBase { - el: HTMLElement; - } - - type SavingMessageDescriptor = - SavingMessageDescriptorText - | SavingMessageDescriptorHtml - | SavingMessageDescriptorHtmlElement; -} - -export namespace Search { - interface Search { - registerSearchSuggestionsProvider(handler: (query: string) => AutocompleteSearchResult[] | Promise): void; - - registerSearchQueryRewriter(rewriter: SearchQueryRewriter): void; - } - - interface AutocompleteSearchResultBase { - iconUrl?: string; - routeName?: string; - routeParams?: string[]; - externalURL?: string; - onClick?: () => void; - } - - interface AutocompleteSearchResultText extends AutocompleteSearchResultBase { - name: string; - description: string; - } - - interface AutocompleteSearchResultHtml extends AutocompleteSearchResultBase { - nameHTML: string; - descriptionHTML: string; - } - - type AutocompleteSearchResult = AutocompleteSearchResultText | AutocompleteSearchResultHtml; - - interface SearchQueryRewriter { - term: string; - termReplacer: () => string | Promise; - } -} - -export namespace User { - interface User { - getEmailAddress(): string; - - isUsingGmailMaterialUI(): boolean; - - isConversationViewDisabled(): boolean; - - getLanguage(): string; - - getAccountSwitcherContactList(): Common.Contact[]; - } -} - -export namespace Keyboard { - interface Keyboard { - createShortcutHandle(keyboardShortcutDescriptor: KeyboardShortcutDescriptor): KeyboardShortcutHandle; - } - - interface KeyboardShortcutHandle { - remove(): void; - } - - interface KeyboardShortcutDescriptor { - chord: string; - description: string; - } -} - -export namespace Global { - interface Global { - addSidebarContentPanel(contentPanelDescriptor: Conversations.ContentPanelDescriptor): Conversations.ContentPanelView; + export namespace Router { + interface Router { + createLink(routeID: string | NativeRouteIDs, params: RouteParams): string; + + goto(routeID: string | NativeRouteIDs, params: RouteParams): void; + + handleCustomRoute(routeID: string, handler: (customRouteView: CustomRouteView) => void): () => void; + + handleAllRoutes(handler: (routeView: RouteView) => void): () => void; + + handleListRoute(routeID: NativeListRouteIDs, handler: (listRouteView: ListRouteView) => void): () => void; + + handleCustomListRoute(routeID: string, handler: (offset: number, max: number) => CustomListDescriptor | Promise): () => void; + + getCurrentRouteView(): RouteView; + } + + interface CustomListDescriptor { + threads: Array; + total?: number; + hasMore?: boolean; + } + + interface ThreadDescriptor { + rfcMessageId?: string; + gmailThreadId?: string; + } + + interface RouteParams { + [key: number]: string | number; + + [key: string]: string | number; + } + + interface RouteView { + getRouteID(): string; + + getRouteType(): RouteTypes; + + getParams(): RouteParams; + + on(name: 'destroy', cb: () => void): void; + + destroyed: boolean; + } + + type RouteTypes = 'LIST' | 'THREAD' | 'SETTINGS' | 'CHAT' | 'CUSTOM' | 'UNKNOWN'; + + interface CustomRouteView extends RouteView { + getElement(): HTMLElement; + + setFullWidth(fullWidth: boolean): void; + } + + interface ListRouteView extends RouteView { + addCollapsibleSection(options: SectionDescriptor): CollapsibleSectionView; + + // addCollapsibleSection(options: Stream): CollapsibleSectionView; + + addSection(options: SectionDescriptor): SectionView; + + // addSection(options: Stream): SectionView; + + refresh(): void; + } + + interface SectionView { + remove(): void; + + on(name: 'destroy', cb: () => void): void; + + destroyed: boolean; + } + + interface CollapsibleSectionView extends SectionView { + setCollapsed(value: boolean): void; + + remove(): void; + + on(name: 'destroy' | 'expanded' | 'collapsed', cb: () => void): void; + } + + interface SectionDescriptor { + title: string; + subtitle?: string; + titleLinkText?: string; + onTitleLinkClick?: () => void; + hasDropdown?: boolean; + onDropdownClick?: (event: SectionDropdownClickEvent) => void; + tableRows?: RowDescriptor[]; + contentElement?: HTMLElement; + footerLinkText?: string; + onFooterLinkClick?: (event: any) => void; + } + + interface SectionDropdownClickEvent { + dropdown: Common.DropdownView; + } + + interface RowDescriptor { + title: string; + body: string; + shortDetailText: string; + isRead: string; + labels: Lists.LabelDescriptor[]; + iconUrl?: string; + iconClass?: string; + routeID?: string; + routeParams?: string[]; + onClick?: () => void; + } + + type NativeRouteIDs = + 'INBOX' | + 'ALL_MAIL' | + 'SENT' | + 'STARRED' | + 'DRAFTS' | + 'SNOOZED' | + 'DONE' | + 'REMINDERS' | + 'LABEL' | + 'TRASH' | + 'SPAM' | + 'IMPORTANT' | + 'SEARCH' | + 'THREAD' | + 'CHATS' | + 'CHAT' | + 'CONTACTS' | + 'CONTACT' | + 'SETTINGS' | + 'ANY_LIST'; + + type NativeListRouteIDs = + 'INBOX' + | 'ALL_MAIL' + | 'SENT' + | 'STARRED' + | 'DRAFTS' + | 'SNOOZED' + | 'DONE' + | 'REMINDERS' + | 'LABEL' + | 'TRASH' + | 'SPAM' + | 'IMPORTANT' + | 'SEARCH' + | 'ANY_LIST'; + } + + export namespace NavMenu { + interface NavMenu { + addNavItem(navItemDescriptor: NavItemDescriptor): NavItemView; + } + + interface NavItemView { + addNavItem(navItemDescriptor: NavItemDescriptor): NavItemView; + + remove(): void; + + isCollapsed(): boolean; + + setCollapsed(collapseValue: boolean): void; + + on(name: 'destroy', cb: () => void): void; + + destroyed: boolean; + } + + interface NavItemDescriptor { + name: string; + routeID?: string; + routeParams?: object; + + onClick?: (event: { preventDefault(): void }) => void; + + orderHint?: number; + accessory?: CreateAccessoryDescriptor | IconButtonAccessoryDescriptor | DropdownButtonAccessoryDescriptor; + iconUrl?: string; + iconClass?: string; + backgroundColor?: string; + expanderForegroundColor?: string; + type?: NavItemTypes; + } + + interface CreateAccessoryDescriptor { + type: 'CREATE'; + onClick: () => void; + } + + interface IconButtonAccessoryDescriptor { + type: 'ICON_BUTTON'; + onClick: () => void; + iconUrl: string; + iconClass?: string; + } + + interface DropdownButtonAccessoryDescriptor { + type: 'DROPDOWN_BUTTON'; + buttonBackgroundColor: string; + buttonForegroundColor: string; + onClick: (event: DropdownButtonClickEvent) => void; + } + + interface DropdownButtonClickEvent { + dropdown: Common.DropdownView; + } + + type NavItemTypes = 'MANAGE' | 'NAVIGATION'; + } + + export namespace Widgets { + interface WidgetsInstance { + showModalView(options: ModalOptions): ModalView; + + showMoleView(options: MoleOptions): MoleView; + + showDrawerView(options: DrawerOptions): DrawerView; + } + + interface ModalOptions { + el: HTMLElement; + chrome?: boolean; + constrainTitleWidth?: boolean; + showCloseButton?: boolean; + title?: string; + buttons?: ModalButtonDescriptor[]; + } + + interface ModalButtonDescriptor { + text: string; + title: string; + onClick: () => void; + type?: 'PRIMARY_ACTION' | 'SECONDARY_ACTION'; + color?: string; + orderHint?: number; + } + + interface MoleOptions { + el: HTMLElement; + title?: string; + titleEl?: HTMLElement; + minimizedTitleEl?: HTMLElement; + className?: string; + titleButtons?: MoleButtonDescriptor[]; + chrome?: boolean; + } + + interface MoleButtonDescriptor { + title: string; + iconUrl: string; + iconClass?: string; + onClick: () => void; + } + + interface DrawerOptions { + el: HTMLElement; + chrome?: boolean; + title?: string; + composeView?: Compose.ComposeView; + closeWithCompose?: boolean; + } + + interface ModalView { + close(): void; + + on(name: 'destroyed', cb: () => void): void; + + destroyed: boolean; + } + + interface MoleView { + close(): void; + + setTitle(text: string): void; + + setMinimized(minimized: boolean): void; + + getMinimized(): boolean; + + on(name: 'destroyed' | 'minimize' | 'restore', cb: () => void): void; + + destroyed: boolean; + } + + interface DrawerView { + close(): void; + + associateComposeView(composeView: Compose.ComposeView, closeWithCompose: boolean): void; + + disassociateComposeView(): void; + + on(name: 'destroyed' | 'slideAnimationDone' | 'closing', cb: () => void): void; + + destroyed: boolean; + } + } + + export namespace ButterBar { + interface ButterBar { + showMessage(options: MessageDescriptor): object; + + showLoading(): object; + + showError(options: MessageDescriptor): object; + + showSaving(options: SavingMessageDescriptor): object; + + hideMessage(messageKey: object | string): void; + + hideGmailMessage(): void; + } + + interface MessageDescriptorBase { + className?: string; + priority?: number; + time?: number; + hideOnViewChanged?: boolean; + persistent?: boolean; + messageKey?: object | string; + } + + interface MessageDescriptorText extends MessageDescriptorBase { + text: string; + } + + interface MessageDescriptorHtml extends MessageDescriptorBase { + html: string; + } + + interface MessageDescriptorHtmlElement extends MessageDescriptorBase { + el: HTMLElement; + } + + type MessageDescriptor = MessageDescriptorText | MessageDescriptorHtml | MessageDescriptorHtmlElement; + + interface SavingMessageDescriptorBase extends MessageDescriptorBase { + confirmationText?: string; + confirmationTime?: number; + showConfirmation?: boolean; + } + + interface SavingMessageDescriptorText extends SavingMessageDescriptorBase { + text: string; + } + + interface SavingMessageDescriptorHtml extends SavingMessageDescriptorBase { + html: string; + } + + interface SavingMessageDescriptorHtmlElement extends SavingMessageDescriptorBase { + el: HTMLElement; + } + + type SavingMessageDescriptor = + SavingMessageDescriptorText + | SavingMessageDescriptorHtml + | SavingMessageDescriptorHtmlElement; + } + + export namespace Search { + interface Search { + registerSearchSuggestionsProvider(handler: (query: string) => AutocompleteSearchResult[] | Promise): void; + + registerSearchQueryRewriter(rewriter: SearchQueryRewriter): void; + } + + interface AutocompleteSearchResultBase { + iconUrl?: string; + routeName?: string; + routeParams?: string[]; + externalURL?: string; + onClick?: () => void; + } + + interface AutocompleteSearchResultText extends AutocompleteSearchResultBase { + name: string; + description: string; + } + + interface AutocompleteSearchResultHtml extends AutocompleteSearchResultBase { + nameHTML: string; + descriptionHTML: string; + } + + type AutocompleteSearchResult = AutocompleteSearchResultText | AutocompleteSearchResultHtml; + + interface SearchQueryRewriter { + term: string; + termReplacer: () => string | Promise; + } + } + + export namespace User { + interface User { + getEmailAddress(): string; + + isUsingGmailMaterialUI(): boolean; + + isConversationViewDisabled(): boolean; + + getLanguage(): string; + + getAccountSwitcherContactList(): Common.Contact[]; + } + } + + export namespace Keyboard { + interface Keyboard { + createShortcutHandle(keyboardShortcutDescriptor: KeyboardShortcutDescriptor): KeyboardShortcutHandle; + } + + interface KeyboardShortcutHandle { + remove(): void; + } + + interface KeyboardShortcutDescriptor { + chord: string; + description: string; + } + } + + export namespace Global { + interface Global { + addSidebarContentPanel(contentPanelDescriptor: Conversations.ContentPanelDescriptor): Conversations.ContentPanelView; + } } } diff --git a/types/inboxsdk/tslint.json b/types/inboxsdk/tslint.json index 3db14f85ea..99ea174f67 100644 --- a/types/inboxsdk/tslint.json +++ b/types/inboxsdk/tslint.json @@ -1 +1,6 @@ -{ "extends": "dtslint/dt.json" } +{ + "extends": "dtslint/dt.json", + "rules": { + "strict-export-declare-modifiers": false + } +} From 2923b2785d9571f144af455feb627b810a80d72d Mon Sep 17 00:00:00 2001 From: amiram Date: Thu, 14 Jun 2018 02:14:47 +0300 Subject: [PATCH 6/7] inboxsdk types - add 'Instance' to main interfaces --- types/inboxsdk/index.d.ts | 40 +++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/types/inboxsdk/index.d.ts b/types/inboxsdk/index.d.ts index 4fdd6a86f2..4d9eabdd46 100644 --- a/types/inboxsdk/index.d.ts +++ b/types/inboxsdk/index.d.ts @@ -39,17 +39,17 @@ declare namespace InboxSDK { interface InboxSDKInstance { Compose: Compose.ComposeInstance; - Lists: Lists.Lists; - Conversations: Conversations.Conversations; - Toolbars: Toolbars.Toolbars; - Router: Router.Router; - NavMenu: NavMenu.NavMenu; + Lists: Lists.ListsInstance; + Conversations: Conversations.ConversationsInstance; + Toolbars: Toolbars.ToolbarsInstance; + Router: Router.RouterInstance; + NavMenu: NavMenu.NavMenuInstance; Widgets: Widgets.WidgetsInstance; - ButterBar: ButterBar.ButterBar; - Search: Search.Search; - User: User.User; - Keyboard: Keyboard.Keyboard; - Global: Global.Global; + ButterBar: ButterBar.ButterBarInstance; + Search: Search.SearchInstance; + User: User.UserInstance; + Keyboard: Keyboard.KeyboardInstance; + Global: Global.GlobalInstance; } namespace Common { @@ -256,7 +256,7 @@ declare namespace InboxSDK { } export namespace Lists { - interface Lists { + interface ListsInstance { registerThreadRowViewHandler(handler: (threadRowView: ThreadRowView) => any): () => void; } @@ -366,7 +366,7 @@ declare namespace InboxSDK { } export namespace Conversations { - interface Conversations { + interface ConversationsInstance { registerThreadViewHandler(handler: (threadView: ThreadView) => void): () => void; registerMessageViewHandler(handler: (messageView: MessageView) => void): () => void; @@ -572,7 +572,7 @@ declare namespace InboxSDK { } export namespace Toolbars { - interface Toolbars { + interface ToolbarsInstance { registerThreadButton(toolbarButtonDescriptor: ToolbarButtonDescriptor): () => void; /** @@ -642,7 +642,7 @@ declare namespace InboxSDK { } export namespace Router { - interface Router { + interface RouterInstance { createLink(routeID: string | NativeRouteIDs, params: RouteParams): string; goto(routeID: string | NativeRouteIDs, params: RouteParams): void; @@ -793,7 +793,7 @@ declare namespace InboxSDK { } export namespace NavMenu { - interface NavMenu { + interface NavMenuInstance { addNavItem(navItemDescriptor: NavItemDescriptor): NavItemView; } @@ -941,7 +941,7 @@ declare namespace InboxSDK { } export namespace ButterBar { - interface ButterBar { + interface ButterBarInstance { showMessage(options: MessageDescriptor): object; showLoading(): object; @@ -1003,7 +1003,7 @@ declare namespace InboxSDK { } export namespace Search { - interface Search { + interface SearchInstance { registerSearchSuggestionsProvider(handler: (query: string) => AutocompleteSearchResult[] | Promise): void; registerSearchQueryRewriter(rewriter: SearchQueryRewriter): void; @@ -1036,7 +1036,7 @@ declare namespace InboxSDK { } export namespace User { - interface User { + interface UserInstance { getEmailAddress(): string; isUsingGmailMaterialUI(): boolean; @@ -1050,7 +1050,7 @@ declare namespace InboxSDK { } export namespace Keyboard { - interface Keyboard { + interface KeyboardInstance { createShortcutHandle(keyboardShortcutDescriptor: KeyboardShortcutDescriptor): KeyboardShortcutHandle; } @@ -1065,7 +1065,7 @@ declare namespace InboxSDK { } export namespace Global { - interface Global { + interface GlobalInstance { addSidebarContentPanel(contentPanelDescriptor: Conversations.ContentPanelDescriptor): Conversations.ContentPanelView; } } From bbbb5123f0ec8f5e17d4026de28d3a8f891feaf6 Mon Sep 17 00:00:00 2001 From: amiram Date: Thu, 14 Jun 2018 10:51:02 +0300 Subject: [PATCH 7/7] inboxsdk types --- types/inboxsdk/index.d.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/types/inboxsdk/index.d.ts b/types/inboxsdk/index.d.ts index 4d9eabdd46..66b696e05a 100644 --- a/types/inboxsdk/index.d.ts +++ b/types/inboxsdk/index.d.ts @@ -7,6 +7,7 @@ /* * Copyright (c) 2016 GPC.solutions + * Copyright (c) 2018 https://propelmypr.com */ // tslint:disable-next-line:export-just-namespace