Socket
Socket
Sign inDemoInstall

@microsoft/teams-js

Package Overview
Dependencies
Maintainers
3
Versions
488
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@microsoft/teams-js - npm Package Compare versions

Comparing version 1.4.0-beta.3.1 to 1.4.0-beta.3.2

3

dist/index.d.ts

@@ -1,1 +0,2 @@

export { microsoftTeams } from './src/MicrosoftTeams';
import * as microsoftTeams from './src/MicrosoftTeams';
export { microsoftTeams };

@@ -93,2 +93,28 @@ /******/ (function(modules) { // webpackBootstrap

__webpack_require__.r(__webpack_exports__);
var MicrosoftTeams_namespaceObject = {};
__webpack_require__.r(MicrosoftTeams_namespaceObject);
__webpack_require__.d(MicrosoftTeams_namespaceObject, "menus", function() { return menus; });
__webpack_require__.d(MicrosoftTeams_namespaceObject, "initialize", function() { return initialize; });
__webpack_require__.d(MicrosoftTeams_namespaceObject, "_uninitialize", function() { return _uninitialize; });
__webpack_require__.d(MicrosoftTeams_namespaceObject, "enablePrintCapability", function() { return enablePrintCapability; });
__webpack_require__.d(MicrosoftTeams_namespaceObject, "print", function() { return print; });
__webpack_require__.d(MicrosoftTeams_namespaceObject, "getContext", function() { return getContext; });
__webpack_require__.d(MicrosoftTeams_namespaceObject, "registerOnThemeChangeHandler", function() { return registerOnThemeChangeHandler; });
__webpack_require__.d(MicrosoftTeams_namespaceObject, "registerFullScreenHandler", function() { return registerFullScreenHandler; });
__webpack_require__.d(MicrosoftTeams_namespaceObject, "registerBackButtonHandler", function() { return registerBackButtonHandler; });
__webpack_require__.d(MicrosoftTeams_namespaceObject, "navigateBack", function() { return navigateBack; });
__webpack_require__.d(MicrosoftTeams_namespaceObject, "navigateCrossDomain", function() { return navigateCrossDomain; });
__webpack_require__.d(MicrosoftTeams_namespaceObject, "getTabInstances", function() { return getTabInstances; });
__webpack_require__.d(MicrosoftTeams_namespaceObject, "getUserJoinedTeams", function() { return getUserJoinedTeams; });
__webpack_require__.d(MicrosoftTeams_namespaceObject, "getMruTabInstances", function() { return getMruTabInstances; });
__webpack_require__.d(MicrosoftTeams_namespaceObject, "shareDeepLink", function() { return shareDeepLink; });
__webpack_require__.d(MicrosoftTeams_namespaceObject, "openFilePreview", function() { return openFilePreview; });
__webpack_require__.d(MicrosoftTeams_namespaceObject, "showNotification", function() { return showNotification; });
__webpack_require__.d(MicrosoftTeams_namespaceObject, "uploadCustomApp", function() { return uploadCustomApp; });
__webpack_require__.d(MicrosoftTeams_namespaceObject, "navigateToTab", function() { return navigateToTab; });
__webpack_require__.d(MicrosoftTeams_namespaceObject, "settings", function() { return settings; });
__webpack_require__.d(MicrosoftTeams_namespaceObject, "authentication", function() { return authentication; });
__webpack_require__.d(MicrosoftTeams_namespaceObject, "sendCustomMessage", function() { return sendCustomMessage; });
__webpack_require__.d(MicrosoftTeams_namespaceObject, "tasks", function() { return tasks; });
__webpack_require__.d(MicrosoftTeams_namespaceObject, "getChatMembers", function() { return getChatMembers; });

@@ -101,444 +127,680 @@ // CONCATENATED MODULE: ./src/MicrosoftTeams.ts

}
"use strict";
var version = "1.3.6";
var validOrigins = [
"https://teams.microsoft.com",
"https://teams.microsoft.us",
"https://int.teams.microsoft.com",
"https://devspaces.skype.com",
"https://ssauth.skype.com",
"http://dev.local",
"https://msft.spoppe.com",
"https://*.sharepoint.com",
"https://*.sharepoint-df.com",
"https://*.sharepointonline.com",
"https://outlook.office.com",
"https://outlook-sdf.office.com"
];
// This will return a reg expression a given url
function generateRegExpFromUrl(url) {
var urlRegExpPart = "^";
var urlParts = url.split(".");
for (var j = 0; j < urlParts.length; j++) {
urlRegExpPart +=
(j > 0 ? "[.]" : "") + urlParts[j].replace("*", "[^/^.]+");
}
urlRegExpPart += "$";
return urlRegExpPart;
}
// This will return a reg expression for list of url
function generateRegExpFromUrls(urls) {
var urlRegExp = "";
for (var i = 0; i < urls.length; i++) {
urlRegExp += (i === 0 ? "" : "|") + generateRegExpFromUrl(urls[i]);
}
return new RegExp(urlRegExp);
}
var validOriginRegExp = generateRegExpFromUrls(validOrigins);
var handlers = {};
// Ensure these declarations stay in sync with the framework.
var frameContexts = {
settings: "settings",
content: "content",
authentication: "authentication",
remove: "remove",
task: "task"
};
/**
* This is the root namespace for the JavaScript SDK.
* Namespace to interact with the menu-specific part of the SDK.
* This object is used to show View Configuration, Action Menu and Navigation Bar Menu.
*
* @private
* Hide from docs until feature is complete
*/
var microsoftTeams;
(function (microsoftTeams) {
"use strict";
var version = "1.3.6";
var validOrigins = [
"https://teams.microsoft.com",
"https://teams.microsoft.us",
"https://int.teams.microsoft.com",
"https://devspaces.skype.com",
"https://ssauth.skype.com",
"http://dev.local",
"https://msft.spoppe.com",
"https://*.sharepoint.com",
"https://*.sharepoint-df.com",
"https://*.sharepointonline.com",
"https://outlook.office.com",
"https://outlook-sdf.office.com"
];
// This will return a reg expression a given url
function generateRegExpFromUrl(url) {
var urlRegExpPart = "^";
var urlParts = url.split(".");
for (var j = 0; j < urlParts.length; j++) {
urlRegExpPart +=
(j > 0 ? "[.]" : "") + urlParts[j].replace("*", "[^/^.]+");
var menus;
(function (menus) {
/**
* Represents information about menu item for Action Menu and Navigation Bar Menu.
*/
var MenuItem = /** @class */ (function () {
function MenuItem() {
/**
* State of the menu item
*/
this.enabled = true;
}
urlRegExpPart += "$";
return urlRegExpPart;
return MenuItem;
}());
menus.MenuItem = MenuItem;
/**
* Represents information about type of list to display in Navigation Bar Menu.
*/
var MenuListType;
(function (MenuListType) {
MenuListType["dropDown"] = "dropDown";
MenuListType["popOver"] = "popOver";
})(MenuListType = menus.MenuListType || (menus.MenuListType = {}));
var navBarMenuItemPressHandler;
handlers["navBarMenuItemPress"] = handleNavBarMenuItemPress;
var actionMenuItemPressHandler;
handlers["actionMenuItemPress"] = handleActionMenuItemPress;
var viewConfigItemPressHandler;
handlers["setModuleView"] = handleViewConfigItemPress;
/**
* Registers list of view configurations and it's handler.
* Handler is responsible for listening selection of View Configuration.
* @param viewConfig List of view configurations. Minimum 1 value is required.
* @param handler The handler to invoke when the user selects view configuration.
*/
function setUpViews(viewConfig, handler) {
ensureInitialized();
viewConfigItemPressHandler = handler;
sendMessageRequest(parentWindow, "setUpViews", [viewConfig]);
}
// This will return a reg expression for list of url
function generateRegExpFromUrls(urls) {
var urlRegExp = "";
for (var i = 0; i < urls.length; i++) {
urlRegExp += (i === 0 ? "" : "|") + generateRegExpFromUrl(urls[i]);
menus.setUpViews = setUpViews;
function handleViewConfigItemPress(id) {
if (!viewConfigItemPressHandler || !viewConfigItemPressHandler(id)) {
ensureInitialized();
sendMessageRequest(parentWindow, "viewConfigItemPress", [id]);
}
return new RegExp(urlRegExp);
}
var validOriginRegExp = generateRegExpFromUrls(validOrigins);
var handlers = {};
// Ensure these declarations stay in sync with the framework.
var frameContexts = {
settings: "settings",
content: "content",
authentication: "authentication",
remove: "remove",
task: "task"
};
/**
* Namespace to interact with the menu-specific part of the SDK.
* This object is used to show View Configuration, Action Menu and Navigation Bar Menu.
*
* @private
* Hide from docs until feature is complete
* Used to set menu items on the Navigation Bar. If icon is available, icon will be shown, otherwise title will be shown.
* @param items List of MenuItems for Navigation Bar Menu.
* @param handler The handler to invoke when the user selects menu item.
*/
var menus;
(function (menus) {
/**
* Represents information about menu item for Action Menu and Navigation Bar Menu.
*/
var MenuItem = /** @class */ (function () {
function MenuItem() {
/**
* State of the menu item
*/
this.enabled = true;
}
return MenuItem;
}());
menus.MenuItem = MenuItem;
/**
* Represents information about type of list to display in Navigation Bar Menu.
*/
var MenuListType;
(function (MenuListType) {
MenuListType["dropDown"] = "dropDown";
MenuListType["popOver"] = "popOver";
})(MenuListType = menus.MenuListType || (menus.MenuListType = {}));
var navBarMenuItemPressHandler;
handlers["navBarMenuItemPress"] = handleNavBarMenuItemPress;
var actionMenuItemPressHandler;
handlers["actionMenuItemPress"] = handleActionMenuItemPress;
var viewConfigItemPressHandler;
handlers["setModuleView"] = handleViewConfigItemPress;
/**
* Registers list of view configurations and it's handler.
* Handler is responsible for listening selection of View Configuration.
* @param viewConfig List of view configurations. Minimum 1 value is required.
* @param handler The handler to invoke when the user selects view configuration.
*/
function setUpViews(viewConfig, handler) {
function setNavBarMenu(items, handler) {
ensureInitialized();
navBarMenuItemPressHandler = handler;
sendMessageRequest(parentWindow, "setNavBarMenu", [items]);
}
menus.setNavBarMenu = setNavBarMenu;
function handleNavBarMenuItemPress(id) {
if (!navBarMenuItemPressHandler || !navBarMenuItemPressHandler(id)) {
ensureInitialized();
viewConfigItemPressHandler = handler;
sendMessageRequest(parentWindow, "setUpViews", [viewConfig]);
sendMessageRequest(parentWindow, "handleNavBarMenuItemPress", [id]);
}
menus.setUpViews = setUpViews;
function handleViewConfigItemPress(id) {
if (!viewConfigItemPressHandler || !viewConfigItemPressHandler(id)) {
ensureInitialized();
sendMessageRequest(parentWindow, "viewConfigItemPress", [id]);
}
}
/**
* Used to set menu items on the Navigation Bar. If icon is available, icon will be shown, otherwise title will be shown.
* @param items List of MenuItems for Navigation Bar Menu.
* @param handler The handler to invoke when the user selects menu item.
*/
function setNavBarMenu(items, handler) {
}
/**
* Used to show Action Menu.
* @param params Parameters for Menu Parameters
* @param handler The handler to invoke when the user selects menu item.
*/
function showActionMenu(params, handler) {
ensureInitialized();
actionMenuItemPressHandler = handler;
sendMessageRequest(parentWindow, "showActionMenu", [params]);
}
menus.showActionMenu = showActionMenu;
function handleActionMenuItemPress(id) {
if (!actionMenuItemPressHandler || !actionMenuItemPressHandler(id)) {
ensureInitialized();
navBarMenuItemPressHandler = handler;
sendMessageRequest(parentWindow, "setNavBarMenu", [items]);
sendMessageRequest(parentWindow, "handleActionMenuItemPress", [id]);
}
menus.setNavBarMenu = setNavBarMenu;
function handleNavBarMenuItemPress(id) {
if (!navBarMenuItemPressHandler || !navBarMenuItemPressHandler(id)) {
ensureInitialized();
sendMessageRequest(parentWindow, "handleNavBarMenuItemPress", [id]);
}
}
})(menus || (menus = {}));
// This indicates whether initialize was called (started).
// It does not indicate whether initialization is complete. That can be inferred by whether parentOrigin is set.
var initializeCalled = false;
var isFramelessWindow = false;
var currentWindow;
var parentWindow;
var parentOrigin;
var parentMessageQueue = [];
var childWindow;
var childOrigin;
var childMessageQueue = [];
var nextMessageId = 0;
var callbacks = {};
var frameContext;
var hostClientType;
var printCapabilityEnabled = false;
var themeChangeHandler;
handlers["themeChange"] = handleThemeChange;
var fullScreenChangeHandler;
handlers["fullScreenChange"] = handleFullScreenChange;
var backButtonPressHandler;
handlers["backButtonPress"] = handleBackButtonPress;
/**
* Initializes the library. This must be called before any other SDK calls
* but after the frame is loaded successfully.
*/
function initialize(hostWindow) {
if (hostWindow === void 0) { hostWindow = window; }
if (initializeCalled) {
// Independent components might not know whether the SDK is initialized so might call it to be safe.
// Just no-op if that happens to make it easier to use.
return;
}
initializeCalled = true;
// Undocumented field used to mock the window for unit tests
currentWindow = hostWindow;
// Listen for messages post to our window
var messageListener = function (evt) { return processMessage(evt); };
// If we are in an iframe, our parent window is the one hosting us (i.e., window.parent); otherwise,
// it's the window that opened us (i.e., window.opener)
parentWindow =
currentWindow.parent !== currentWindow.self
? currentWindow.parent
: currentWindow.opener;
if (!parentWindow) {
isFramelessWindow = true;
window.onNativeMessage = handleParentMessage;
}
else {
// For iFrame scenario, add listener to listen 'message'
currentWindow.addEventListener("message", messageListener, false);
}
try {
// Send the initialized message to any origin, because at this point we most likely don't know the origin
// of the parent window, and this message contains no data that could pose a security risk.
parentOrigin = "*";
var messageId = sendMessageRequest(parentWindow, "initialize", [version]);
callbacks[messageId] = function (context, clientType) {
frameContext = context;
hostClientType = clientType;
};
}
finally {
parentOrigin = null;
}
// Undocumented function used to clear state between unit tests
this._uninitialize = function () {
if (frameContext) {
registerOnThemeChangeHandler(null);
registerFullScreenHandler(null);
registerBackButtonHandler(null);
}
/**
* Used to show Action Menu.
* @param params Parameters for Menu Parameters
* @param handler The handler to invoke when the user selects menu item.
*/
function showActionMenu(params, handler) {
ensureInitialized();
actionMenuItemPressHandler = handler;
sendMessageRequest(parentWindow, "showActionMenu", [params]);
if (frameContext === frameContexts.settings) {
settings.registerOnSaveHandler(null);
}
menus.showActionMenu = showActionMenu;
function handleActionMenuItemPress(id) {
if (!actionMenuItemPressHandler || !actionMenuItemPressHandler(id)) {
ensureInitialized();
sendMessageRequest(parentWindow, "handleActionMenuItemPress", [id]);
}
if (frameContext === frameContexts.remove) {
settings.registerOnRemoveHandler(null);
}
})(menus = microsoftTeams.menus || (microsoftTeams.menus = {}));
// This indicates whether initialize was called (started).
// It does not indicate whether initialization is complete. That can be inferred by whether parentOrigin is set.
var initializeCalled = false;
var isFramelessWindow = false;
var currentWindow;
var parentWindow;
var parentOrigin;
var parentMessageQueue = [];
var childWindow;
var childOrigin;
var childMessageQueue = [];
var nextMessageId = 0;
var callbacks = {};
var frameContext;
var hostClientType;
var printCapabilityEnabled = false;
var themeChangeHandler;
handlers["themeChange"] = handleThemeChange;
var fullScreenChangeHandler;
handlers["fullScreenChange"] = handleFullScreenChange;
var backButtonPressHandler;
handlers["backButtonPress"] = handleBackButtonPress;
/**
* Initializes the library. This must be called before any other SDK calls
* but after the frame is loaded successfully.
*/
function initialize(hostWindow) {
if (hostWindow === void 0) { hostWindow = window; }
if (initializeCalled) {
// Independent components might not know whether the SDK is initialized so might call it to be safe.
// Just no-op if that happens to make it easier to use.
return;
if (!isFramelessWindow) {
currentWindow.removeEventListener("message", messageListener, false);
}
initializeCalled = true;
// Undocumented field used to mock the window for unit tests
currentWindow = hostWindow;
// Listen for messages post to our window
var messageListener = function (evt) { return processMessage(evt); };
// If we are in an iframe, our parent window is the one hosting us (i.e., window.parent); otherwise,
// it's the window that opened us (i.e., window.opener)
parentWindow =
currentWindow.parent !== currentWindow.self
? currentWindow.parent
: currentWindow.opener;
if (!parentWindow) {
isFramelessWindow = true;
window.onNativeMessage = handleParentMessage;
initializeCalled = false;
parentWindow = null;
parentOrigin = null;
parentMessageQueue = [];
childWindow = null;
childOrigin = null;
childMessageQueue = [];
nextMessageId = 0;
callbacks = {};
frameContext = null;
hostClientType = null;
isFramelessWindow = false;
};
}
/**
* Initializes the library. This must be called before any other SDK calls
* but after the frame is loaded successfully.
*/
function _uninitialize() { }
/**
* Enable print capability to support printing page using Ctrl+P and cmd+P
*/
function enablePrintCapability() {
if (!printCapabilityEnabled) {
printCapabilityEnabled = true;
ensureInitialized();
// adding ctrl+P and cmd+P handler
document.addEventListener("keydown", function (event) {
if ((event.ctrlKey || event.metaKey) && event.keyCode === 80) {
print();
event.cancelBubble = true;
event.preventDefault();
event.stopImmediatePropagation();
}
});
}
}
/**
* default print handler
*/
function print() {
window.print();
}
/**
* Retrieves the current context the frame is running in.
* @param callback The callback to invoke when the {@link Context} object is retrieved.
*/
function getContext(callback) {
ensureInitialized();
var messageId = sendMessageRequest(parentWindow, "getContext");
callbacks[messageId] = callback;
}
/**
* Registers a handler for theme changes.
* Only one handler can be registered at a time. A subsequent registration replaces an existing registration.
* @param handler The handler to invoke when the user changes their theme.
*/
function registerOnThemeChangeHandler(handler) {
ensureInitialized();
themeChangeHandler = handler;
}
function handleThemeChange(theme) {
if (themeChangeHandler) {
themeChangeHandler(theme);
}
if (childWindow) {
sendMessageRequest(childWindow, "themeChange", [theme]);
}
}
/**
* Registers a handler for changes from or to full-screen view for a tab.
* Only one handler can be registered at a time. A subsequent registration replaces an existing registration.
* @param handler The handler to invoke when the user toggles full-screen view for a tab.
*/
function registerFullScreenHandler(handler) {
ensureInitialized();
fullScreenChangeHandler = handler;
}
function handleFullScreenChange(isFullScreen) {
if (fullScreenChangeHandler) {
fullScreenChangeHandler(isFullScreen);
}
}
/**
* Registers a handler for user presses of the Team client's back button. Experiences that maintain an internal
* navigation stack should use this handler to navigate the user back within their frame. If an app finds
* that after running its back button handler it cannot handle the event it should call the navigateBack
* method to ask the Teams client to handle it instead.
* @param handler The handler to invoke when the user presses their Team client's back button.
*/
function registerBackButtonHandler(handler) {
ensureInitialized();
backButtonPressHandler = handler;
}
function handleBackButtonPress() {
if (!backButtonPressHandler || !backButtonPressHandler()) {
navigateBack();
}
}
/**
* Navigates back in the Teams client. See registerBackButtonHandler for more information on when
* it's appropriate to use this method.
*/
function navigateBack() {
ensureInitialized();
var messageId = sendMessageRequest(parentWindow, "navigateBack", []);
callbacks[messageId] = function (success) {
if (!success) {
throw new Error("Back navigation is not supported in the current client or context.");
}
else {
// For iFrame scenario, add listener to listen 'message'
currentWindow.addEventListener("message", messageListener, false);
};
}
/**
* Navigates the frame to a new cross-domain URL. The domain of this URL must match at least one of the
* valid domains specified in the validDomains block of the manifest; otherwise, an exception will be
* thrown. This function needs to be used only when navigating the frame to a URL in a different domain
* than the current one in a way that keeps the app informed of the change and allows the SDK to
* continue working.
* @param url The URL to navigate the frame to.
*/
function navigateCrossDomain(url) {
ensureInitialized(frameContexts.content, frameContexts.settings, frameContexts.remove, frameContexts.task);
var messageId = sendMessageRequest(parentWindow, "navigateCrossDomain", [
url
]);
callbacks[messageId] = function (success) {
if (!success) {
throw new Error("Cross-origin navigation is only supported for URLs matching the pattern registered in the manifest.");
}
try {
// Send the initialized message to any origin, because at this point we most likely don't know the origin
// of the parent window, and this message contains no data that could pose a security risk.
parentOrigin = "*";
var messageId = sendMessageRequest(parentWindow, "initialize", [version]);
callbacks[messageId] = function (context, clientType) {
frameContext = context;
hostClientType = clientType;
};
};
}
/**
* Allows an app to retrieve for this user tabs that are owned by this app.
* If no TabInstanceParameters are passed, the app defaults to favorite teams and favorite channels.
* @param callback The callback to invoke when the {@link TabInstanceParameters} object is retrieved.
* @param tabInstanceParameters OPTIONAL Flags that specify whether to scope call to favorite teams or channels.
*/
function getTabInstances(callback, tabInstanceParameters) {
ensureInitialized();
var messageId = sendMessageRequest(parentWindow, "getTabInstances", [
tabInstanceParameters
]);
callbacks[messageId] = callback;
}
/**
* @private
* Hide from docs
* ------
* Allows an app to retrieve information of all user joined teams
* @param callback The callback to invoke when the {@link TeamInstanceParameters} object is retrieved.
* @param teamInstanceParameters OPTIONAL Flags that specify whether to scope call to favorite teams
*/
function getUserJoinedTeams(callback, teamInstanceParameters) {
ensureInitialized();
var messageId = sendMessageRequest(parentWindow, "getUserJoinedTeams", [
teamInstanceParameters
]);
callbacks[messageId] = callback;
}
/**
* Allows an app to retrieve the most recently used tabs for this user.
* @param callback The callback to invoke when the {@link TabInformation} object is retrieved.
* @param tabInstanceParameters OPTIONAL Ignored, kept for future use
*/
function getMruTabInstances(callback, tabInstanceParameters) {
ensureInitialized();
var messageId = sendMessageRequest(parentWindow, "getMruTabInstances", [
tabInstanceParameters
]);
callbacks[messageId] = callback;
}
/**
* Shares a deep link that a user can use to navigate back to a specific state in this page.
* @param deepLinkParameters ID and label for the link and fallback URL.
*/
function shareDeepLink(deepLinkParameters) {
ensureInitialized(frameContexts.content);
sendMessageRequest(parentWindow, "shareDeepLink", [
deepLinkParameters.subEntityId,
deepLinkParameters.subEntityLabel,
deepLinkParameters.subEntityWebUrl
]);
}
/**
* @private
* Hide from docs.
* ------
* Opens a client-friendly preview of the specified file.
* @param file The file to preview.
*/
function openFilePreview(filePreviewParameters) {
ensureInitialized(frameContexts.content);
var params = [
filePreviewParameters.entityId,
filePreviewParameters.title,
filePreviewParameters.description,
filePreviewParameters.type,
filePreviewParameters.objectUrl,
filePreviewParameters.downloadUrl,
filePreviewParameters.webPreviewUrl,
filePreviewParameters.webEditUrl,
filePreviewParameters.baseUrl,
filePreviewParameters.editFile,
filePreviewParameters.subEntityId
];
sendMessageRequest(parentWindow, "openFilePreview", params);
}
/**
* @private
* Hide from docs.
* ------
* download file.
* @param file The file to download.
*/
function showNotification(showNotificationParameters) {
ensureInitialized(frameContexts.content);
var params = [
showNotificationParameters.message,
showNotificationParameters.isDownloadComplete
];
sendMessageRequest(parentWindow, "showNotification", params);
}
/**
* @private
* Hide from docs.
* ------
* Upload a custom App manifest directly to both team and personal scopes.
* This method works just for the first party Apps.
*/
function uploadCustomApp(manifestBlob) {
ensureInitialized();
var messageId = sendMessageRequest(parentWindow, "uploadCustomApp", [
manifestBlob
]);
callbacks[messageId] = function (success, result) {
if (!success) {
throw new Error(result);
}
finally {
parentOrigin = null;
};
}
/**
* Navigates the Microsoft Teams app to the specified tab instance.
* @param tabInstance The tab instance to navigate to.
*/
function navigateToTab(tabInstance) {
ensureInitialized();
var messageId = sendMessageRequest(parentWindow, "navigateToTab", [
tabInstance
]);
callbacks[messageId] = function (success) {
if (!success) {
throw new Error("Invalid internalTabInstanceId and/or channelId were/was provided");
}
// Undocumented function used to clear state between unit tests
this._uninitialize = function () {
if (frameContext) {
registerOnThemeChangeHandler(null);
registerFullScreenHandler(null);
registerBackButtonHandler(null);
}
if (frameContext === frameContexts.settings) {
settings.registerOnSaveHandler(null);
}
if (frameContext === frameContexts.remove) {
settings.registerOnRemoveHandler(null);
}
if (!isFramelessWindow) {
currentWindow.removeEventListener("message", messageListener, false);
}
initializeCalled = false;
parentWindow = null;
parentOrigin = null;
parentMessageQueue = [];
childWindow = null;
childOrigin = null;
childMessageQueue = [];
nextMessageId = 0;
callbacks = {};
frameContext = null;
hostClientType = null;
isFramelessWindow = false;
};
}
microsoftTeams.initialize = initialize;
};
}
/**
* Namespace to interact with the settings-specific part of the SDK.
* This object is usable only on the settings frame.
*/
var settings;
(function (settings) {
var saveHandler;
var removeHandler;
handlers["settings.save"] = handleSave;
handlers["settings.remove"] = handleRemove;
/**
* Initializes the library. This must be called before any other SDK calls
* but after the frame is loaded successfully.
* Sets the validity state for the settings.
* The initial value is false, so the user cannot save the settings until this is called with true.
* @param validityState Indicates whether the save or remove button is enabled for the user.
*/
function _uninitialize() { }
microsoftTeams._uninitialize = _uninitialize;
/**
* Enable print capability to support printing page using Ctrl+P and cmd+P
*/
function enablePrintCapability() {
if (!printCapabilityEnabled) {
printCapabilityEnabled = true;
ensureInitialized();
// adding ctrl+P and cmd+P handler
document.addEventListener("keydown", function (event) {
if ((event.ctrlKey || event.metaKey) && event.keyCode === 80) {
microsoftTeams.print();
event.cancelBubble = true;
event.preventDefault();
event.stopImmediatePropagation();
}
});
}
function setValidityState(validityState) {
ensureInitialized(frameContexts.settings, frameContexts.remove);
sendMessageRequest(parentWindow, "settings.setValidityState", [
validityState
]);
}
microsoftTeams.enablePrintCapability = enablePrintCapability;
settings.setValidityState = setValidityState;
/**
* default print handler
* Gets the settings for the current instance.
* @param callback The callback to invoke when the {@link Settings} object is retrieved.
*/
function print() {
window.print();
function getSettings(callback) {
ensureInitialized(frameContexts.settings, frameContexts.remove);
var messageId = sendMessageRequest(parentWindow, "settings.getSettings");
callbacks[messageId] = callback;
}
microsoftTeams.print = print;
settings.getSettings = getSettings;
/**
* Retrieves the current context the frame is running in.
* @param callback The callback to invoke when the {@link Context} object is retrieved.
* Sets the settings for the current instance.
* This is an asynchronous operation; calls to getSettings are not guaranteed to reflect the changed state.
* @param settings The desired settings for this instance.
*/
function getContext(callback) {
ensureInitialized();
var messageId = sendMessageRequest(parentWindow, "getContext");
callbacks[messageId] = callback;
function setSettings(instanceSettings) {
ensureInitialized(frameContexts.settings);
sendMessageRequest(parentWindow, "settings.setSettings", [
instanceSettings
]);
}
microsoftTeams.getContext = getContext;
settings.setSettings = setSettings;
/**
* Registers a handler for theme changes.
* Registers a handler for when the user attempts to save the settings. This handler should be used
* to create or update the underlying resource powering the content.
* The object passed to the handler must be used to notify whether to proceed with the save.
* Only one handler can be registered at a time. A subsequent registration replaces an existing registration.
* @param handler The handler to invoke when the user changes their theme.
* @param handler The handler to invoke when the user selects the save button.
*/
function registerOnThemeChangeHandler(handler) {
ensureInitialized();
themeChangeHandler = handler;
function registerOnSaveHandler(handler) {
ensureInitialized(frameContexts.settings);
saveHandler = handler;
}
microsoftTeams.registerOnThemeChangeHandler = registerOnThemeChangeHandler;
function handleThemeChange(theme) {
if (themeChangeHandler) {
themeChangeHandler(theme);
}
if (childWindow) {
sendMessageRequest(childWindow, "themeChange", [theme]);
}
}
settings.registerOnSaveHandler = registerOnSaveHandler;
/**
* Registers a handler for changes from or to full-screen view for a tab.
* Only one handler can be registered at a time. A subsequent registration replaces an existing registration.
* @param handler The handler to invoke when the user toggles full-screen view for a tab.
* Registers a handler for user attempts to remove content. This handler should be used
* to remove the underlying resource powering the content.
* The object passed to the handler must be used to indicate whether to proceed with the removal.
* Only one handler may be registered at a time. Subsequent registrations will override the first.
* @param handler The handler to invoke when the user selects the remove button.
*/
function registerFullScreenHandler(handler) {
ensureInitialized();
fullScreenChangeHandler = handler;
function registerOnRemoveHandler(handler) {
ensureInitialized(frameContexts.remove);
removeHandler = handler;
}
microsoftTeams.registerFullScreenHandler = registerFullScreenHandler;
function handleFullScreenChange(isFullScreen) {
if (fullScreenChangeHandler) {
fullScreenChangeHandler(isFullScreen);
settings.registerOnRemoveHandler = registerOnRemoveHandler;
function handleSave(result) {
var saveEvent = new SaveEventImpl(result);
if (saveHandler) {
saveHandler(saveEvent);
}
else {
// If no handler is registered, we assume success.
saveEvent.notifySuccess();
}
}
/**
* Registers a handler for user presses of the Team client's back button. Experiences that maintain an internal
* navigation stack should use this handler to navigate the user back within their frame. If an app finds
* that after running its back button handler it cannot handle the event it should call the navigateBack
* method to ask the Teams client to handle it instead.
* @param handler The handler to invoke when the user presses their Team client's back button.
* @private
* Hide from docs, since this class is not directly used.
*/
function registerBackButtonHandler(handler) {
ensureInitialized();
backButtonPressHandler = handler;
}
microsoftTeams.registerBackButtonHandler = registerBackButtonHandler;
function handleBackButtonPress() {
if (!backButtonPressHandler || !backButtonPressHandler()) {
navigateBack();
var SaveEventImpl = /** @class */ (function () {
function SaveEventImpl(result) {
this.notified = false;
this.result = result ? result : {};
}
}
/**
* Navigates back in the Teams client. See registerBackButtonHandler for more information on when
* it's appropriate to use this method.
*/
function navigateBack() {
ensureInitialized();
var messageId = sendMessageRequest(parentWindow, "navigateBack", []);
callbacks[messageId] = function (success) {
if (!success) {
throw new Error("Back navigation is not supported in the current client or context.");
SaveEventImpl.prototype.notifySuccess = function () {
this.ensureNotNotified();
sendMessageRequest(parentWindow, "settings.save.success");
this.notified = true;
};
SaveEventImpl.prototype.notifyFailure = function (reason) {
this.ensureNotNotified();
sendMessageRequest(parentWindow, "settings.save.failure", [reason]);
this.notified = true;
};
SaveEventImpl.prototype.ensureNotNotified = function () {
if (this.notified) {
throw new Error("The SaveEvent may only notify success or failure once.");
}
};
return SaveEventImpl;
}());
function handleRemove() {
var removeEvent = new RemoveEventImpl();
if (removeHandler) {
removeHandler(removeEvent);
}
else {
// If no handler is registered, we assume success.
removeEvent.notifySuccess();
}
}
microsoftTeams.navigateBack = navigateBack;
/**
* Navigates the frame to a new cross-domain URL. The domain of this URL must match at least one of the
* valid domains specified in the validDomains block of the manifest; otherwise, an exception will be
* thrown. This function needs to be used only when navigating the frame to a URL in a different domain
* than the current one in a way that keeps the app informed of the change and allows the SDK to
* continue working.
* @param url The URL to navigate the frame to.
* @private
* Hide from docs, since this class is not directly used.
*/
function navigateCrossDomain(url) {
ensureInitialized(frameContexts.content, frameContexts.settings, frameContexts.remove, frameContexts.task);
var messageId = sendMessageRequest(parentWindow, "navigateCrossDomain", [
url
]);
callbacks[messageId] = function (success) {
if (!success) {
throw new Error("Cross-origin navigation is only supported for URLs matching the pattern registered in the manifest.");
var RemoveEventImpl = /** @class */ (function () {
function RemoveEventImpl() {
this.notified = false;
}
RemoveEventImpl.prototype.notifySuccess = function () {
this.ensureNotNotified();
sendMessageRequest(parentWindow, "settings.remove.success");
this.notified = true;
};
RemoveEventImpl.prototype.notifyFailure = function (reason) {
this.ensureNotNotified();
sendMessageRequest(parentWindow, "settings.remove.failure", [reason]);
this.notified = true;
};
RemoveEventImpl.prototype.ensureNotNotified = function () {
if (this.notified) {
throw new Error("The removeEvent may only notify success or failure once.");
}
};
}
microsoftTeams.navigateCrossDomain = navigateCrossDomain;
return RemoveEventImpl;
}());
})(settings || (settings = {}));
/**
* Namespace to interact with the authentication-specific part of the SDK.
* This object is used for starting or completing authentication flows.
*/
var authentication;
(function (authentication) {
var authParams;
var authWindowMonitor;
handlers["authentication.authenticate.success"] = handleSuccess;
handlers["authentication.authenticate.failure"] = handleFailure;
/**
* Allows an app to retrieve for this user tabs that are owned by this app.
* If no TabInstanceParameters are passed, the app defaults to favorite teams and favorite channels.
* @param callback The callback to invoke when the {@link TabInstanceParameters} object is retrieved.
* @param tabInstanceParameters OPTIONAL Flags that specify whether to scope call to favorite teams or channels.
* Registers the authentication handlers
* @param authenticateParameters A set of values that configure the authentication pop-up.
*/
function getTabInstances(callback, tabInstanceParameters) {
ensureInitialized();
var messageId = sendMessageRequest(parentWindow, "getTabInstances", [
tabInstanceParameters
]);
callbacks[messageId] = callback;
function registerAuthenticationHandlers(authenticateParameters) {
authParams = authenticateParameters;
}
microsoftTeams.getTabInstances = getTabInstances;
authentication.registerAuthenticationHandlers = registerAuthenticationHandlers;
/**
* @private
* Hide from docs
* ------
* Allows an app to retrieve information of all user joined teams
* @param callback The callback to invoke when the {@link TeamInstanceParameters} object is retrieved.
* @param teamInstanceParameters OPTIONAL Flags that specify whether to scope call to favorite teams
* Initiates an authentication request, which opens a new window with the specified settings.
*/
function getUserJoinedTeams(callback, teamInstanceParameters) {
ensureInitialized();
var messageId = sendMessageRequest(parentWindow, "getUserJoinedTeams", [
teamInstanceParameters
]);
callbacks[messageId] = callback;
function authenticate(authenticateParameters) {
var authenticateParams = authenticateParameters !== undefined
? authenticateParameters
: authParams;
ensureInitialized(frameContexts.content, frameContexts.settings, frameContexts.remove, frameContexts.task);
if (hostClientType === "desktop" /* desktop */) {
// Convert any relative URLs into absolute URLs before sending them over to the parent window.
var link = document.createElement("a");
link.href = authenticateParams.url;
// Ask the parent window to open an authentication window with the parameters provided by the caller.
var messageId = sendMessageRequest(parentWindow, "authentication.authenticate", [link.href, authenticateParams.width, authenticateParams.height]);
callbacks[messageId] = function (success, response) {
if (success) {
authenticateParams.successCallback(response);
}
else {
authenticateParams.failureCallback(response);
}
};
}
else {
// Open an authentication window with the parameters provided by the caller.
openAuthenticationWindow(authenticateParams);
}
}
microsoftTeams.getUserJoinedTeams = getUserJoinedTeams;
authentication.authenticate = authenticate;
/**
* Allows an app to retrieve the most recently used tabs for this user.
* @param callback The callback to invoke when the {@link TabInformation} object is retrieved.
* @param tabInstanceParameters OPTIONAL Ignored, kept for future use
*/
function getMruTabInstances(callback, tabInstanceParameters) {
ensureInitialized();
var messageId = sendMessageRequest(parentWindow, "getMruTabInstances", [
tabInstanceParameters
]);
callbacks[messageId] = callback;
}
microsoftTeams.getMruTabInstances = getMruTabInstances;
/**
* Shares a deep link that a user can use to navigate back to a specific state in this page.
* @param deepLinkParameters ID and label for the link and fallback URL.
*/
function shareDeepLink(deepLinkParameters) {
ensureInitialized(frameContexts.content);
sendMessageRequest(parentWindow, "shareDeepLink", [
deepLinkParameters.subEntityId,
deepLinkParameters.subEntityLabel,
deepLinkParameters.subEntityWebUrl
]);
}
microsoftTeams.shareDeepLink = shareDeepLink;
/**
* @private
* Hide from docs.
* ------
* Opens a client-friendly preview of the specified file.
* @param file The file to preview.
* Requests an Azure AD token to be issued on behalf of the app. The token is acquired from the cache
* if it is not expired. Otherwise a request is sent to Azure AD to obtain a new token.
* @param authTokenRequest A set of values that configure the token request.
*/
function openFilePreview(filePreviewParameters) {
ensureInitialized(frameContexts.content);
var params = [
filePreviewParameters.entityId,
filePreviewParameters.title,
filePreviewParameters.description,
filePreviewParameters.type,
filePreviewParameters.objectUrl,
filePreviewParameters.downloadUrl,
filePreviewParameters.webPreviewUrl,
filePreviewParameters.webEditUrl,
filePreviewParameters.baseUrl,
filePreviewParameters.editFile,
filePreviewParameters.subEntityId
];
sendMessageRequest(parentWindow, "openFilePreview", params);
function getAuthToken(authTokenRequest) {
ensureInitialized();
var messageId = sendMessageRequest(parentWindow, "authentication.getAuthToken", [authTokenRequest.resources]);
callbacks[messageId] = function (success, result) {
if (success) {
authTokenRequest.successCallback(result);
}
else {
authTokenRequest.failureCallback(result);
}
};
}
microsoftTeams.openFilePreview = openFilePreview;
authentication.getAuthToken = getAuthToken;
/**

@@ -548,742 +810,481 @@ * @private

* ------
* download file.
* @param file The file to download.
* Requests the decoded Azure AD user identity on behalf of the app.
*/
function showNotification(showNotificationParameters) {
ensureInitialized(frameContexts.content);
var params = [
showNotificationParameters.message,
showNotificationParameters.isDownloadComplete
];
sendMessageRequest(parentWindow, "showNotification", params);
}
microsoftTeams.showNotification = showNotification;
/**
* @private
* Hide from docs.
* ------
* Upload a custom App manifest directly to both team and personal scopes.
* This method works just for the first party Apps.
*/
function uploadCustomApp(manifestBlob) {
function getUser(userRequest) {
ensureInitialized();
var messageId = sendMessageRequest(parentWindow, "uploadCustomApp", [
manifestBlob
]);
var messageId = sendMessageRequest(parentWindow, "authentication.getUser");
callbacks[messageId] = function (success, result) {
if (!success) {
throw new Error(result);
if (success) {
userRequest.successCallback(result);
}
else {
userRequest.failureCallback(result);
}
};
}
microsoftTeams.uploadCustomApp = uploadCustomApp;
/**
* Navigates the Microsoft Teams app to the specified tab instance.
* @param tabInstance The tab instance to navigate to.
*/
function navigateToTab(tabInstance) {
ensureInitialized();
var messageId = sendMessageRequest(parentWindow, "navigateToTab", [
tabInstance
]);
callbacks[messageId] = function (success) {
if (!success) {
throw new Error("Invalid internalTabInstanceId and/or channelId were/was provided");
authentication.getUser = getUser;
function closeAuthenticationWindow() {
// Stop monitoring the authentication window
stopAuthenticationWindowMonitor();
// Try to close the authentication window and clear all properties associated with it
try {
if (childWindow) {
childWindow.close();
}
};
}
microsoftTeams.navigateToTab = navigateToTab;
/**
* Namespace to interact with the settings-specific part of the SDK.
* This object is usable only on the settings frame.
*/
var settings;
(function (settings) {
var saveHandler;
var removeHandler;
handlers["settings.save"] = handleSave;
handlers["settings.remove"] = handleRemove;
/**
* Sets the validity state for the settings.
* The initial value is false, so the user cannot save the settings until this is called with true.
* @param validityState Indicates whether the save or remove button is enabled for the user.
*/
function setValidityState(validityState) {
ensureInitialized(frameContexts.settings, frameContexts.remove);
sendMessageRequest(parentWindow, "settings.setValidityState", [
validityState
]);
}
settings.setValidityState = setValidityState;
/**
* Gets the settings for the current instance.
* @param callback The callback to invoke when the {@link Settings} object is retrieved.
*/
function getSettings(callback) {
ensureInitialized(frameContexts.settings, frameContexts.remove);
var messageId = sendMessageRequest(parentWindow, "settings.getSettings");
callbacks[messageId] = callback;
finally {
childWindow = null;
childOrigin = null;
}
settings.getSettings = getSettings;
/**
* Sets the settings for the current instance.
* This is an asynchronous operation; calls to getSettings are not guaranteed to reflect the changed state.
* @param settings The desired settings for this instance.
*/
function setSettings(instanceSettings) {
ensureInitialized(frameContexts.settings);
sendMessageRequest(parentWindow, "settings.setSettings", [
instanceSettings
]);
}
function openAuthenticationWindow(authenticateParameters) {
authParams = authenticateParameters;
// Close the previously opened window if we have one
closeAuthenticationWindow();
// Start with a sensible default size
var width = authParams.width || 600;
var height = authParams.height || 400;
// Ensure that the new window is always smaller than our app's window so that it never fully covers up our app
width = Math.min(width, currentWindow.outerWidth - 400);
height = Math.min(height, currentWindow.outerHeight - 200);
// Convert any relative URLs into absolute URLs before sending them over to the parent window
var link = document.createElement("a");
link.href = authParams.url;
// We are running in the browser, so we need to center the new window ourselves
var left = typeof currentWindow.screenLeft !== "undefined"
? currentWindow.screenLeft
: currentWindow.screenX;
var top = typeof currentWindow.screenTop !== "undefined"
? currentWindow.screenTop
: currentWindow.screenY;
left += currentWindow.outerWidth / 2 - width / 2;
top += currentWindow.outerHeight / 2 - height / 2;
// Open a child window with a desired set of standard browser features
childWindow = currentWindow.open(link.href, "_blank", "toolbar=no, location=yes, status=no, menubar=no, scrollbars=yes, top=" +
top +
", left=" +
left +
", width=" +
width +
", height=" +
height);
if (childWindow) {
// Start monitoring the authentication window so that we can detect if it gets closed before the flow completes
startAuthenticationWindowMonitor();
}
settings.setSettings = setSettings;
/**
* Registers a handler for when the user attempts to save the settings. This handler should be used
* to create or update the underlying resource powering the content.
* The object passed to the handler must be used to notify whether to proceed with the save.
* Only one handler can be registered at a time. A subsequent registration replaces an existing registration.
* @param handler The handler to invoke when the user selects the save button.
*/
function registerOnSaveHandler(handler) {
ensureInitialized(frameContexts.settings);
saveHandler = handler;
else {
// If we failed to open the window, fail the authentication flow
handleFailure("FailedToOpenWindow");
}
settings.registerOnSaveHandler = registerOnSaveHandler;
/**
* Registers a handler for user attempts to remove content. This handler should be used
* to remove the underlying resource powering the content.
* The object passed to the handler must be used to indicate whether to proceed with the removal.
* Only one handler may be registered at a time. Subsequent registrations will override the first.
* @param handler The handler to invoke when the user selects the remove button.
*/
function registerOnRemoveHandler(handler) {
ensureInitialized(frameContexts.remove);
removeHandler = handler;
}
function stopAuthenticationWindowMonitor() {
if (authWindowMonitor) {
clearInterval(authWindowMonitor);
authWindowMonitor = 0;
}
settings.registerOnRemoveHandler = registerOnRemoveHandler;
function handleSave(result) {
var saveEvent = new SaveEventImpl(result);
if (saveHandler) {
saveHandler(saveEvent);
delete handlers["initialize"];
delete handlers["navigateCrossDomain"];
}
function startAuthenticationWindowMonitor() {
// Stop the previous window monitor if one is running
stopAuthenticationWindowMonitor();
// Create an interval loop that
// - Notifies the caller of failure if it detects that the authentication window is closed
// - Keeps pinging the authentication window while it is open to re-establish
// contact with any pages along the authentication flow that need to communicate
// with us
authWindowMonitor = currentWindow.setInterval(function () {
if (!childWindow || childWindow.closed) {
handleFailure("CancelledByUser");
}
else {
// If no handler is registered, we assume success.
saveEvent.notifySuccess();
}
}
/**
* @private
* Hide from docs, since this class is not directly used.
*/
var SaveEventImpl = /** @class */ (function () {
function SaveEventImpl(result) {
this.notified = false;
this.result = result ? result : {};
}
SaveEventImpl.prototype.notifySuccess = function () {
this.ensureNotNotified();
sendMessageRequest(parentWindow, "settings.save.success");
this.notified = true;
};
SaveEventImpl.prototype.notifyFailure = function (reason) {
this.ensureNotNotified();
sendMessageRequest(parentWindow, "settings.save.failure", [reason]);
this.notified = true;
};
SaveEventImpl.prototype.ensureNotNotified = function () {
if (this.notified) {
throw new Error("The SaveEvent may only notify success or failure once.");
var savedChildOrigin = childOrigin;
try {
childOrigin = "*";
sendMessageRequest(childWindow, "ping");
}
};
return SaveEventImpl;
}());
function handleRemove() {
var removeEvent = new RemoveEventImpl();
if (removeHandler) {
removeHandler(removeEvent);
finally {
childOrigin = savedChildOrigin;
}
}
else {
// If no handler is registered, we assume success.
removeEvent.notifySuccess();
}
}
/**
* @private
* Hide from docs, since this class is not directly used.
*/
var RemoveEventImpl = /** @class */ (function () {
function RemoveEventImpl() {
this.notified = false;
}
RemoveEventImpl.prototype.notifySuccess = function () {
this.ensureNotNotified();
sendMessageRequest(parentWindow, "settings.remove.success");
this.notified = true;
};
RemoveEventImpl.prototype.notifyFailure = function (reason) {
this.ensureNotNotified();
sendMessageRequest(parentWindow, "settings.remove.failure", [reason]);
this.notified = true;
};
RemoveEventImpl.prototype.ensureNotNotified = function () {
if (this.notified) {
throw new Error("The removeEvent may only notify success or failure once.");
}
};
return RemoveEventImpl;
}());
})(settings = microsoftTeams.settings || (microsoftTeams.settings = {}));
}, 100);
// Set up an initialize-message handler that gives the authentication window its frame context
handlers["initialize"] = function () {
return [frameContexts.authentication, hostClientType];
};
// Set up a navigateCrossDomain message handler that blocks cross-domain re-navigation attempts
// in the authentication window. We could at some point choose to implement this method via a call to
// authenticationWindow.location.href = url; however, we would first need to figure out how to
// validate the URL against the tab's list of valid domains.
handlers["navigateCrossDomain"] = function (url) {
return false;
};
}
/**
* Namespace to interact with the authentication-specific part of the SDK.
* This object is used for starting or completing authentication flows.
* Notifies the frame that initiated this authentication request that the request was successful.
* This function is usable only on the authentication window.
* This call causes the authentication window to be closed.
* @param result Specifies a result for the authentication. If specified, the frame that initiated the authentication pop-up receives this value in its callback.
* @param callbackUrl Specifies the url to redirect back to if the client is Win32 Outlook.
*/
var authentication;
(function (authentication) {
var authParams;
var authWindowMonitor;
handlers["authentication.authenticate.success"] = handleSuccess;
handlers["authentication.authenticate.failure"] = handleFailure;
/**
* Registers the authentication handlers
* @param authenticateParameters A set of values that configure the authentication pop-up.
*/
function registerAuthenticationHandlers(authenticateParameters) {
authParams = authenticateParameters;
}
authentication.registerAuthenticationHandlers = registerAuthenticationHandlers;
/**
* Initiates an authentication request, which opens a new window with the specified settings.
*/
function authenticate(authenticateParameters) {
var authenticateParams = authenticateParameters !== undefined
? authenticateParameters
: authParams;
ensureInitialized(frameContexts.content, frameContexts.settings, frameContexts.remove, frameContexts.task);
if (hostClientType === "desktop" /* desktop */) {
// Convert any relative URLs into absolute URLs before sending them over to the parent window.
var link = document.createElement("a");
link.href = authenticateParams.url;
// Ask the parent window to open an authentication window with the parameters provided by the caller.
var messageId = sendMessageRequest(parentWindow, "authentication.authenticate", [link.href, authenticateParams.width, authenticateParams.height]);
callbacks[messageId] = function (success, response) {
if (success) {
authenticateParams.successCallback(response);
}
else {
authenticateParams.failureCallback(response);
}
};
function notifySuccess(result, callbackUrl) {
redirectIfWin32Outlook(callbackUrl, "result", result);
ensureInitialized(frameContexts.authentication);
sendMessageRequest(parentWindow, "authentication.authenticate.success", [
result
]);
// Wait for the message to be sent before closing the window
waitForMessageQueue(parentWindow, function () {
return setTimeout(function () { return currentWindow.close(); }, 200);
});
}
authentication.notifySuccess = notifySuccess;
/**
* Notifies the frame that initiated this authentication request that the request failed.
* This function is usable only on the authentication window.
* This call causes the authentication window to be closed.
* @param result Specifies a result for the authentication. If specified, the frame that initiated the authentication pop-up receives this value in its callback.
* @param callbackUrl Specifies the url to redirect back to if the client is Win32 Outlook.
*/
function notifyFailure(reason, callbackUrl) {
redirectIfWin32Outlook(callbackUrl, "reason", reason);
ensureInitialized(frameContexts.authentication);
sendMessageRequest(parentWindow, "authentication.authenticate.failure", [
reason
]);
// Wait for the message to be sent before closing the window
waitForMessageQueue(parentWindow, function () {
return setTimeout(function () { return currentWindow.close(); }, 200);
});
}
authentication.notifyFailure = notifyFailure;
function handleSuccess(result) {
try {
if (authParams && authParams.successCallback) {
authParams.successCallback(result);
}
else {
// Open an authentication window with the parameters provided by the caller.
openAuthenticationWindow(authenticateParams);
}
}
authentication.authenticate = authenticate;
/**
* @private
* Hide from docs.
* ------
* Requests an Azure AD token to be issued on behalf of the app. The token is acquired from the cache
* if it is not expired. Otherwise a request is sent to Azure AD to obtain a new token.
* @param authTokenRequest A set of values that configure the token request.
*/
function getAuthToken(authTokenRequest) {
ensureInitialized();
var messageId = sendMessageRequest(parentWindow, "authentication.getAuthToken", [authTokenRequest.resources]);
callbacks[messageId] = function (success, result) {
if (success) {
authTokenRequest.successCallback(result);
}
else {
authTokenRequest.failureCallback(result);
}
};
finally {
authParams = null;
closeAuthenticationWindow();
}
authentication.getAuthToken = getAuthToken;
/**
* @private
* Hide from docs.
* ------
* Requests the decoded Azure AD user identity on behalf of the app.
*/
function getUser(userRequest) {
ensureInitialized();
var messageId = sendMessageRequest(parentWindow, "authentication.getUser");
callbacks[messageId] = function (success, result) {
if (success) {
userRequest.successCallback(result);
}
else {
userRequest.failureCallback(result);
}
};
}
authentication.getUser = getUser;
function closeAuthenticationWindow() {
// Stop monitoring the authentication window
stopAuthenticationWindowMonitor();
// Try to close the authentication window and clear all properties associated with it
try {
if (childWindow) {
childWindow.close();
}
}
function handleFailure(reason) {
try {
if (authParams && authParams.failureCallback) {
authParams.failureCallback(reason);
}
finally {
childWindow = null;
childOrigin = null;
}
}
function openAuthenticationWindow(authenticateParameters) {
authParams = authenticateParameters;
// Close the previously opened window if we have one
finally {
authParams = null;
closeAuthenticationWindow();
// Start with a sensible default size
var width = authParams.width || 600;
var height = authParams.height || 400;
// Ensure that the new window is always smaller than our app's window so that it never fully covers up our app
width = Math.min(width, currentWindow.outerWidth - 400);
height = Math.min(height, currentWindow.outerHeight - 200);
// Convert any relative URLs into absolute URLs before sending them over to the parent window
}
}
/**
* Validates that the callbackUrl param is a valid connector url, appends the result/reason and authSuccess/authFailure as URL fragments and redirects the window
* @param callbackUrl - the connectors url to redirect to
* @param key - "result" in case of success and "reason" in case of failure
* @param value - the value of the passed result/reason parameter
*/
function redirectIfWin32Outlook(callbackUrl, key, value) {
if (callbackUrl) {
var link = document.createElement("a");
link.href = authParams.url;
// We are running in the browser, so we need to center the new window ourselves
var left = typeof currentWindow.screenLeft !== "undefined"
? currentWindow.screenLeft
: currentWindow.screenX;
var top = typeof currentWindow.screenTop !== "undefined"
? currentWindow.screenTop
: currentWindow.screenY;
left += currentWindow.outerWidth / 2 - width / 2;
top += currentWindow.outerHeight / 2 - height / 2;
// Open a child window with a desired set of standard browser features
childWindow = currentWindow.open(link.href, "_blank", "toolbar=no, location=yes, status=no, menubar=no, scrollbars=yes, top=" +
top +
", left=" +
left +
", width=" +
width +
", height=" +
height);
if (childWindow) {
// Start monitoring the authentication window so that we can detect if it gets closed before the flow completes
startAuthenticationWindowMonitor();
}
else {
// If we failed to open the window, fail the authentication flow
handleFailure("FailedToOpenWindow");
}
}
function stopAuthenticationWindowMonitor() {
if (authWindowMonitor) {
clearInterval(authWindowMonitor);
authWindowMonitor = 0;
}
delete handlers["initialize"];
delete handlers["navigateCrossDomain"];
}
function startAuthenticationWindowMonitor() {
// Stop the previous window monitor if one is running
stopAuthenticationWindowMonitor();
// Create an interval loop that
// - Notifies the caller of failure if it detects that the authentication window is closed
// - Keeps pinging the authentication window while it is open to re-establish
// contact with any pages along the authentication flow that need to communicate
// with us
authWindowMonitor = currentWindow.setInterval(function () {
if (!childWindow || childWindow.closed) {
handleFailure("CancelledByUser");
}
else {
var savedChildOrigin = childOrigin;
try {
childOrigin = "*";
sendMessageRequest(childWindow, "ping");
link.href = decodeURIComponent(callbackUrl);
if (link.host &&
link.host !== window.location.host &&
link.host === "outlook.office.com" &&
link.search.indexOf("client_type=Win32_Outlook") > -1) {
if (key && key === "result") {
if (value) {
link.href = updateUrlParameter(link.href, "result", value);
}
finally {
childOrigin = savedChildOrigin;
}
currentWindow.location.assign(updateUrlParameter(link.href, "authSuccess", ""));
}
}, 100);
// Set up an initialize-message handler that gives the authentication window its frame context
handlers["initialize"] = function () {
return [frameContexts.authentication, hostClientType];
};
// Set up a navigateCrossDomain message handler that blocks cross-domain re-navigation attempts
// in the authentication window. We could at some point choose to implement this method via a call to
// authenticationWindow.location.href = url; however, we would first need to figure out how to
// validate the URL against the tab's list of valid domains.
handlers["navigateCrossDomain"] = function (url) {
return false;
};
}
/**
* Notifies the frame that initiated this authentication request that the request was successful.
* This function is usable only on the authentication window.
* This call causes the authentication window to be closed.
* @param result Specifies a result for the authentication. If specified, the frame that initiated the authentication pop-up receives this value in its callback.
* @param callbackUrl Specifies the url to redirect back to if the client is Win32 Outlook.
*/
function notifySuccess(result, callbackUrl) {
redirectIfWin32Outlook(callbackUrl, "result", result);
ensureInitialized(frameContexts.authentication);
sendMessageRequest(parentWindow, "authentication.authenticate.success", [
result
]);
// Wait for the message to be sent before closing the window
waitForMessageQueue(parentWindow, function () {
return setTimeout(function () { return currentWindow.close(); }, 200);
});
}
authentication.notifySuccess = notifySuccess;
/**
* Notifies the frame that initiated this authentication request that the request failed.
* This function is usable only on the authentication window.
* This call causes the authentication window to be closed.
* @param result Specifies a result for the authentication. If specified, the frame that initiated the authentication pop-up receives this value in its callback.
* @param callbackUrl Specifies the url to redirect back to if the client is Win32 Outlook.
*/
function notifyFailure(reason, callbackUrl) {
redirectIfWin32Outlook(callbackUrl, "reason", reason);
ensureInitialized(frameContexts.authentication);
sendMessageRequest(parentWindow, "authentication.authenticate.failure", [
reason
]);
// Wait for the message to be sent before closing the window
waitForMessageQueue(parentWindow, function () {
return setTimeout(function () { return currentWindow.close(); }, 200);
});
}
authentication.notifyFailure = notifyFailure;
function handleSuccess(result) {
try {
if (authParams && authParams.successCallback) {
authParams.successCallback(result);
}
}
finally {
authParams = null;
closeAuthenticationWindow();
}
}
function handleFailure(reason) {
try {
if (authParams && authParams.failureCallback) {
authParams.failureCallback(reason);
}
}
finally {
authParams = null;
closeAuthenticationWindow();
}
}
/**
* Validates that the callbackUrl param is a valid connector url, appends the result/reason and authSuccess/authFailure as URL fragments and redirects the window
* @param callbackUrl - the connectors url to redirect to
* @param key - "result" in case of success and "reason" in case of failure
* @param value - the value of the passed result/reason parameter
*/
function redirectIfWin32Outlook(callbackUrl, key, value) {
if (callbackUrl) {
var link = document.createElement("a");
link.href = decodeURIComponent(callbackUrl);
if (link.host &&
link.host !== window.location.host &&
link.host === "outlook.office.com" &&
link.search.indexOf("client_type=Win32_Outlook") > -1) {
if (key && key === "result") {
if (value) {
link.href = updateUrlParameter(link.href, "result", value);
}
currentWindow.location.assign(updateUrlParameter(link.href, "authSuccess", ""));
if (key && key === "reason") {
if (value) {
link.href = updateUrlParameter(link.href, "reason", value);
}
if (key && key === "reason") {
if (value) {
link.href = updateUrlParameter(link.href, "reason", value);
}
currentWindow.location.assign(updateUrlParameter(link.href, "authFailure", ""));
}
currentWindow.location.assign(updateUrlParameter(link.href, "authFailure", ""));
}
}
}
/**
* Appends either result or reason as a fragment to the 'callbackUrl'
* @param uri - the url to modify
* @param key - the fragment key
* @param value - the fragment value
*/
function updateUrlParameter(uri, key, value) {
var i = uri.indexOf("#");
var hash = i === -1 ? "#" : uri.substr(i);
hash = hash + "&" + key + (value !== "" ? "=" + value : "");
uri = i === -1 ? uri : uri.substr(0, i);
return uri + hash;
}
})(authentication = microsoftTeams.authentication || (microsoftTeams.authentication = {}));
function ensureInitialized() {
var expectedFrameContexts = [];
for (var _i = 0; _i < arguments.length; _i++) {
expectedFrameContexts[_i] = arguments[_i];
}
if (!initializeCalled) {
throw new Error("The library has not yet been initialized");
}
if (frameContext &&
expectedFrameContexts &&
expectedFrameContexts.length > 0) {
var found = false;
for (var i = 0; i < expectedFrameContexts.length; i++) {
if (expectedFrameContexts[i] === frameContext) {
found = true;
break;
}
}
if (!found) {
throw new Error("This call is not allowed in the '" + frameContext + "' context");
}
}
}
function processMessage(evt) {
// Process only if we received a valid message
if (!evt || !evt.data || typeof evt.data !== "object") {
return;
}
// Process only if the message is coming from a different window and a valid origin
var messageSource = evt.source || evt.originalEvent.source;
var messageOrigin = evt.origin || evt.originalEvent.origin;
if (messageSource === currentWindow ||
(messageOrigin !== currentWindow.location.origin &&
!validOriginRegExp.test(messageOrigin.toLowerCase()))) {
return;
}
// Update our parent and child relationships based on this message
updateRelationships(messageSource, messageOrigin);
// Handle the message
if (messageSource === parentWindow) {
handleParentMessage(evt);
}
else if (messageSource === childWindow) {
handleChildMessage(evt);
}
/**
* Appends either result or reason as a fragment to the 'callbackUrl'
* @param uri - the url to modify
* @param key - the fragment key
* @param value - the fragment value
*/
function updateUrlParameter(uri, key, value) {
var i = uri.indexOf("#");
var hash = i === -1 ? "#" : uri.substr(i);
hash = hash + "&" + key + (value !== "" ? "=" + value : "");
uri = i === -1 ? uri : uri.substr(0, i);
return uri + hash;
}
function updateRelationships(messageSource, messageOrigin) {
// Determine whether the source of the message is our parent or child and update our
// window and origin pointer accordingly
if (!parentWindow || messageSource === parentWindow) {
parentWindow = messageSource;
parentOrigin = messageOrigin;
}
else if (!childWindow || messageSource === childWindow) {
childWindow = messageSource;
childOrigin = messageOrigin;
}
// Clean up pointers to closed parent and child windows
if (parentWindow && parentWindow.closed) {
parentWindow = null;
parentOrigin = null;
}
if (childWindow && childWindow.closed) {
childWindow = null;
childOrigin = null;
}
// If we have any messages in our queue, send them now
flushMessageQueue(parentWindow);
flushMessageQueue(childWindow);
})(authentication || (authentication = {}));
function ensureInitialized() {
var expectedFrameContexts = [];
for (var _i = 0; _i < arguments.length; _i++) {
expectedFrameContexts[_i] = arguments[_i];
}
function handleParentMessage(evt) {
if ("id" in evt.data) {
// Call any associated callbacks
var message = evt.data;
var callback = callbacks[message.id];
if (callback) {
callback.apply(null, message.args);
// Remove the callback to ensure that the callback is called only once and to free up memory.
delete callbacks[message.id];
if (!initializeCalled) {
throw new Error("The library has not yet been initialized");
}
if (frameContext &&
expectedFrameContexts &&
expectedFrameContexts.length > 0) {
var found = false;
for (var i = 0; i < expectedFrameContexts.length; i++) {
if (expectedFrameContexts[i] === frameContext) {
found = true;
break;
}
}
else if ("func" in evt.data) {
// Delegate the request to the proper handler
var message = evt.data;
var handler = handlers[message.func];
if (handler) {
// We don't expect any handler to respond at this point
handler.apply(this, message.args);
}
if (!found) {
throw new Error("This call is not allowed in the '" + frameContext + "' context");
}
}
function handleChildMessage(evt) {
if ("id" in evt.data && "func" in evt.data) {
// Try to delegate the request to the proper handler
var message_1 = evt.data;
var handler = handlers[message_1.func];
if (handler) {
var result = handler.apply(this, message_1.args);
if (result) {
sendMessageResponse(childWindow, message_1.id, Array.isArray(result) ? result : [result]);
}
}
else {
// Proxy to parent
var messageId = sendMessageRequest(parentWindow, message_1.func, message_1.args);
// tslint:disable-next-line:no-any
callbacks[messageId] = function () {
var args = [];
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i];
}
if (childWindow) {
sendMessageResponse(childWindow, message_1.id, args);
}
};
}
}
}
function processMessage(evt) {
// Process only if we received a valid message
if (!evt || !evt.data || typeof evt.data !== "object") {
return;
}
function getTargetMessageQueue(targetWindow) {
return targetWindow === parentWindow
? parentMessageQueue
: targetWindow === childWindow
? childMessageQueue
: [];
// Process only if the message is coming from a different window and a valid origin
var messageSource = evt.source || evt.originalEvent.source;
var messageOrigin = evt.origin || evt.originalEvent.origin;
if (messageSource === currentWindow ||
(messageOrigin !== currentWindow.location.origin &&
!validOriginRegExp.test(messageOrigin.toLowerCase()))) {
return;
}
function getTargetOrigin(targetWindow) {
return targetWindow === parentWindow
? parentOrigin
: targetWindow === childWindow
? childOrigin
: null;
// Update our parent and child relationships based on this message
updateRelationships(messageSource, messageOrigin);
// Handle the message
if (messageSource === parentWindow) {
handleParentMessage(evt);
}
function flushMessageQueue(targetWindow) {
var targetOrigin = getTargetOrigin(targetWindow);
var targetMessageQueue = getTargetMessageQueue(targetWindow);
while (targetWindow && targetOrigin && targetMessageQueue.length > 0) {
targetWindow.postMessage(targetMessageQueue.shift(), targetOrigin);
else if (messageSource === childWindow) {
handleChildMessage(evt);
}
}
function updateRelationships(messageSource, messageOrigin) {
// Determine whether the source of the message is our parent or child and update our
// window and origin pointer accordingly
if (!parentWindow || messageSource === parentWindow) {
parentWindow = messageSource;
parentOrigin = messageOrigin;
}
else if (!childWindow || messageSource === childWindow) {
childWindow = messageSource;
childOrigin = messageOrigin;
}
// Clean up pointers to closed parent and child windows
if (parentWindow && parentWindow.closed) {
parentWindow = null;
parentOrigin = null;
}
if (childWindow && childWindow.closed) {
childWindow = null;
childOrigin = null;
}
// If we have any messages in our queue, send them now
flushMessageQueue(parentWindow);
flushMessageQueue(childWindow);
}
function handleParentMessage(evt) {
if ("id" in evt.data) {
// Call any associated callbacks
var message = evt.data;
var callback = callbacks[message.id];
if (callback) {
callback.apply(null, message.args);
// Remove the callback to ensure that the callback is called only once and to free up memory.
delete callbacks[message.id];
}
}
function waitForMessageQueue(targetWindow, callback) {
var messageQueueMonitor = currentWindow.setInterval(function () {
if (getTargetMessageQueue(targetWindow).length === 0) {
clearInterval(messageQueueMonitor);
callback();
}
}, 100);
else if ("func" in evt.data) {
// Delegate the request to the proper handler
var message = evt.data;
var handler = handlers[message.func];
if (handler) {
// We don't expect any handler to respond at this point
handler.apply(this, message.args);
}
}
function sendMessageRequest(targetWindow, actionName,
// tslint:disable-next-line: no-any
args) {
var request = createMessageRequest(actionName, args);
if (isFramelessWindow) {
if (currentWindow && currentWindow.nativeInterface) {
currentWindow.nativeInterface.framelessPostMessage(JSON.stringify(request));
}
function handleChildMessage(evt) {
if ("id" in evt.data && "func" in evt.data) {
// Try to delegate the request to the proper handler
var message_1 = evt.data;
var handler = handlers[message_1.func];
if (handler) {
var result = handler.apply(this, message_1.args);
if (result) {
sendMessageResponse(childWindow, message_1.id, Array.isArray(result) ? result : [result]);
}
}
else {
var targetOrigin = getTargetOrigin(targetWindow);
// If the target window isn't closed and we already know its origin, send the message right away; otherwise,
// queue the message and send it after the origin is established
if (targetWindow && targetOrigin) {
targetWindow.postMessage(request, targetOrigin);
}
else {
getTargetMessageQueue(targetWindow).push(request);
}
// Proxy to parent
var messageId = sendMessageRequest(parentWindow, message_1.func, message_1.args);
// tslint:disable-next-line:no-any
callbacks[messageId] = function () {
var args = [];
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i];
}
if (childWindow) {
sendMessageResponse(childWindow, message_1.id, args);
}
};
}
return request.id;
}
/**
* @private
* Internal use only
* Sends a custom action message to Teams.
* @param actionName Specifies name of the custom action to be sent
* @param args Specifies additional arguments passed to the action
* @returns id of sent message
*/
function sendCustomMessage(actionName,
// tslint:disable-next-line:no-any
args) {
ensureInitialized();
return sendMessageRequest(parentWindow, actionName, args);
}
function getTargetMessageQueue(targetWindow) {
return targetWindow === parentWindow
? parentMessageQueue
: targetWindow === childWindow
? childMessageQueue
: [];
}
function getTargetOrigin(targetWindow) {
return targetWindow === parentWindow
? parentOrigin
: targetWindow === childWindow
? childOrigin
: null;
}
function flushMessageQueue(targetWindow) {
var targetOrigin = getTargetOrigin(targetWindow);
var targetMessageQueue = getTargetMessageQueue(targetWindow);
while (targetWindow && targetOrigin && targetMessageQueue.length > 0) {
targetWindow.postMessage(targetMessageQueue.shift(), targetOrigin);
}
microsoftTeams.sendCustomMessage = sendCustomMessage;
function sendMessageResponse(targetWindow, id,
// tslint:disable-next-line:no-any
args) {
var response = createMessageResponse(id, args);
}
function waitForMessageQueue(targetWindow, callback) {
var messageQueueMonitor = currentWindow.setInterval(function () {
if (getTargetMessageQueue(targetWindow).length === 0) {
clearInterval(messageQueueMonitor);
callback();
}
}, 100);
}
function sendMessageRequest(targetWindow, actionName,
// tslint:disable-next-line: no-any
args) {
var request = createMessageRequest(actionName, args);
if (isFramelessWindow) {
if (currentWindow && currentWindow.nativeInterface) {
currentWindow.nativeInterface.framelessPostMessage(JSON.stringify(request));
}
}
else {
var targetOrigin = getTargetOrigin(targetWindow);
// If the target window isn't closed and we already know its origin, send the message right away; otherwise,
// queue the message and send it after the origin is established
if (targetWindow && targetOrigin) {
targetWindow.postMessage(response, targetOrigin);
targetWindow.postMessage(request, targetOrigin);
}
else {
getTargetMessageQueue(targetWindow).push(request);
}
}
// tslint:disable-next-line:no-any
function createMessageRequest(func, args) {
return {
id: nextMessageId++,
func: func,
args: args || []
};
return request.id;
}
/**
* @private
* Internal use only
* Sends a custom action message to Teams.
* @param actionName Specifies name of the custom action to be sent
* @param args Specifies additional arguments passed to the action
* @returns id of sent message
*/
function sendCustomMessage(actionName,
// tslint:disable-next-line:no-any
args) {
ensureInitialized();
return sendMessageRequest(parentWindow, actionName, args);
}
function sendMessageResponse(targetWindow, id,
// tslint:disable-next-line:no-any
args) {
var response = createMessageResponse(id, args);
var targetOrigin = getTargetOrigin(targetWindow);
if (targetWindow && targetOrigin) {
targetWindow.postMessage(response, targetOrigin);
}
// tslint:disable-next-line:no-any
function createMessageResponse(id, args) {
return {
id: id,
args: args || []
};
}
}
// tslint:disable-next-line:no-any
function createMessageRequest(func, args) {
return {
id: nextMessageId++,
func: func,
args: args || []
};
}
// tslint:disable-next-line:no-any
function createMessageResponse(id, args) {
return {
id: id,
args: args || []
};
}
/**
* Namespace to interact with the task module-specific part of the SDK.
* This object is usable only on the content frame.
*/
var tasks;
(function (tasks) {
/**
* Namespace to interact with the task module-specific part of the SDK.
* This object is usable only on the content frame.
* Allows an app to open the task module.
* @param taskInfo An object containing the parameters of the task module
* @param submitHandler Handler to call when the task module is completed
*/
var tasks;
(function (tasks) {
/**
* Allows an app to open the task module.
* @param taskInfo An object containing the parameters of the task module
* @param submitHandler Handler to call when the task module is completed
*/
function startTask(taskInfo, submitHandler) {
ensureInitialized(frameContexts.content);
var messageId = sendMessageRequest(parentWindow, "tasks.startTask", [
taskInfo
]);
callbacks[messageId] = submitHandler;
}
tasks.startTask = startTask;
/**
* Submit the task module.
* @param result Contains the result to be sent to the bot or the app. Typically a JSON object or a serialized version of it
* @param appIds Helps to validate that the call originates from the same appId as the one that invoked the task module
*/
function submitTask(result, appIds) {
ensureInitialized(frameContexts.content, frameContexts.task);
// Send tasks.completeTask instead of tasks.submitTask message for backward compatibility with Mobile clients
sendMessageRequest(parentWindow, "tasks.completeTask", [
result,
Array.isArray(appIds) ? appIds : [appIds]
]);
}
tasks.submitTask = submitTask;
})(tasks = microsoftTeams.tasks || (microsoftTeams.tasks = {}));
function startTask(taskInfo, submitHandler) {
ensureInitialized(frameContexts.content);
var messageId = sendMessageRequest(parentWindow, "tasks.startTask", [
taskInfo
]);
callbacks[messageId] = submitHandler;
}
tasks.startTask = startTask;
/**
* @private
* Hide from docs
* ------
* Allows an app to retrieve information of all chat members
* Because a malicious party run your content in a browser, this value should
* be used only as a hint as to who the members are and never as proof of membership.
* @param callback The callback to invoke when the {@link ChatMembersInformation} object is retrieved.
* Submit the task module.
* @param result Contains the result to be sent to the bot or the app. Typically a JSON object or a serialized version of it
* @param appIds Helps to validate that the call originates from the same appId as the one that invoked the task module
*/
function getChatMembers(callback) {
ensureInitialized();
var messageId = sendMessageRequest(parentWindow, "getChatMembers");
callbacks[messageId] = callback;
function submitTask(result, appIds) {
ensureInitialized(frameContexts.content, frameContexts.task);
// Send tasks.completeTask instead of tasks.submitTask message for backward compatibility with Mobile clients
sendMessageRequest(parentWindow, "tasks.completeTask", [
result,
Array.isArray(appIds) ? appIds : [appIds]
]);
}
microsoftTeams.getChatMembers = getChatMembers;
})(microsoftTeams || (microsoftTeams = {}));
tasks.submitTask = submitTask;
})(tasks || (tasks = {}));
/**
* @private
* Hide from docs
* ------
* Allows an app to retrieve information of all chat members
* Because a malicious party run your content in a browser, this value should
* be used only as a hint as to who the members are and never as proof of membership.
* @param callback The callback to invoke when the {@link ChatMembersInformation} object is retrieved.
*/
function getChatMembers(callback) {
ensureInitialized();
var messageId = sendMessageRequest(parentWindow, "getChatMembers");
callbacks[messageId] = callback;
}
// CONCATENATED MODULE: ./index.ts
/* concated harmony reexport microsoftTeams */__webpack_require__.d(__webpack_exports__, "microsoftTeams", function() { return microsoftTeams; });
/* concated harmony reexport microsoftTeams */__webpack_require__.d(__webpack_exports__, "microsoftTeams", function() { return MicrosoftTeams_namespaceObject; });
/***/ })
/******/ ]);
//# sourceMappingURL=MicrosoftTeams.js.map

@@ -1,1 +0,1 @@

!function(t){var e={};function n(i){if(e[i])return e[i].exports;var o=e[i]={i:i,l:!1,exports:{}};return t[i].call(o.exports,o,o.exports,n),o.l=!0,o.exports}n.m=t,n.c=e,n.d=function(t,e,i){n.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:i})},n.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},n.t=function(t,e){if(1&e&&(t=n(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var i=Object.create(null);if(n.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var o in t)n.d(i,o,function(e){return t[e]}.bind(null,o));return i},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p="",n(n.s=0)}([function(t,e,n){"use strict";var i;n.r(e),String.prototype.startsWith||(String.prototype.startsWith=function(t,e){return this.substr(!e||e<0?0:+e,t.length)===t}),function(t){var e="1.3.6";function n(t){for(var e="^",n=t.split("."),i=0;i<n.length;i++)e+=(i>0?"[.]":"")+n[i].replace("*","[^/^.]+");return e+="$"}var i=function(t){for(var e="",i=0;i<t.length;i++)e+=(0===i?"":"|")+n(t[i]);return new RegExp(e)}(["https://teams.microsoft.com","https://teams.microsoft.us","https://int.teams.microsoft.com","https://devspaces.skype.com","https://ssauth.skype.com","http://dev.local","https://msft.spoppe.com","https://*.sharepoint.com","https://*.sharepoint-df.com","https://*.sharepointonline.com","https://outlook.office.com","https://outlook-sdf.office.com"]),o={},r={settings:"settings",content:"content",authentication:"authentication",remove:"remove",task:"task"};!function(t){var e,n,i,r=function(){return function(){this.enabled=!0}}();t.MenuItem=r,function(t){t.dropDown="dropDown",t.popOver="popOver"}(t.MenuListType||(t.MenuListType={})),o.navBarMenuItemPress=function(t){e&&e(t)||(N(),B(s,"handleNavBarMenuItemPress",[t]))},o.actionMenuItemPress=function(t){n&&n(t)||(N(),B(s,"handleActionMenuItemPress",[t]))},o.setModuleView=function(t){i&&i(t)||(N(),B(s,"viewConfigItemPress",[t]))},t.setUpViews=function(t,e){N(),i=e,B(s,"setUpViews",[t])},t.setNavBarMenu=function(t,n){N(),e=n,B(s,"setNavBarMenu",[t])},t.showActionMenu=function(t,e){N(),n=e,B(s,"showActionMenu",[t])}}(t.menus||(t.menus={}));var a,s,u,c,f,l,h,d,v,p,g,m=!1,y=!1,b=[],w=[],k=0,C={},T=!1;function M(t){N(),d=t}function I(t){N(),v=t}function S(t){N(),p=t}function E(){N();var t=B(s,"navigateBack",[]);C[t]=function(t){if(!t)throw new Error("Back navigation is not supported in the current client or context.")}}function N(){for(var t=[],e=0;e<arguments.length;e++)t[e]=arguments[e];if(!m)throw new Error("The library has not yet been initialized");if(l&&t&&t.length>0){for(var n=!1,i=0;i<t.length;i++)if(t[i]===l){n=!0;break}if(!n)throw new Error("This call is not allowed in the '"+l+"' context")}}function O(t){if("id"in t.data){var e=t.data,n=C[e.id];n&&(n.apply(null,e.args),delete C[e.id])}else if("func"in t.data){e=t.data;var i=o[e.func];i&&i.apply(this,e.args)}}function P(t){return t===s?b:t===c?w:[]}function U(t){return t===s?u:t===c?f:null}function x(t){for(var e=U(t),n=P(t);t&&e&&n.length>0;)t.postMessage(n.shift(),e)}function A(t,e){var n=a.setInterval(function(){0===P(t).length&&(clearInterval(n),e())},100)}function B(t,e,n){var i=function(t,e){return{id:k++,func:t,args:e||[]}}(e,n);if(y)a&&a.nativeInterface&&a.nativeInterface.framelessPostMessage(JSON.stringify(i));else{var o=U(t);t&&o?t.postMessage(i,o):P(t).push(i)}return i.id}function L(t,e,n){var i=function(t,e){return{id:t,args:e||[]}}(e,n),o=U(t);t&&o&&t.postMessage(i,o)}o.themeChange=function(t){d&&d(t);c&&B(c,"themeChange",[t])},o.fullScreenChange=function(t){v&&v(t)},o.backButtonPress=function(){p&&p()||E()},t.initialize=function(t){if(void 0===t&&(t=window),!m){m=!0;var n=function(t){return function(t){if(t&&t.data&&"object"==typeof t.data){var e=t.source||t.originalEvent.source,n=t.origin||t.originalEvent.origin;e===a||n!==a.location.origin&&!i.test(n.toLowerCase())||(function(t,e){s&&t!==s?c&&t!==c||(c=t,f=e):(s=t,u=e),s&&s.closed&&(s=null,u=null),c&&c.closed&&(c=null,f=null),x(s),x(c)}(e,n),e===s?O(t):e===c&&function(t){if("id"in t.data&&"func"in t.data){var e=t.data,n=o[e.func];if(n){var i=n.apply(this,e.args);i&&L(c,e.id,Array.isArray(i)?i:[i])}else{var r=B(s,e.func,e.args);C[r]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];c&&L(c,e.id,t)}}}}(t))}}(t)};(s=(a=t).parent!==a.self?a.parent:a.opener)?a.addEventListener("message",n,!1):(y=!0,window.onNativeMessage=O);try{u="*";var d=B(s,"initialize",[e]);C[d]=function(t,e){l=t,h=e}}finally{u=null}this._uninitialize=function(){l&&(M(null),I(null),S(null)),l===r.settings&&g.registerOnSaveHandler(null),l===r.remove&&g.registerOnRemoveHandler(null),y||a.removeEventListener("message",n,!1),m=!1,s=null,u=null,b=[],c=null,f=null,w=[],k=0,C={},l=null,h=null,y=!1}}},t._uninitialize=function(){},t.enablePrintCapability=function(){T||(T=!0,N(),document.addEventListener("keydown",function(e){(e.ctrlKey||e.metaKey)&&80===e.keyCode&&(t.print(),e.cancelBubble=!0,e.preventDefault(),e.stopImmediatePropagation())}))},t.print=function(){window.print()},t.getContext=function(t){N();var e=B(s,"getContext");C[e]=t},t.registerOnThemeChangeHandler=M,t.registerFullScreenHandler=I,t.registerBackButtonHandler=S,t.navigateBack=E,t.navigateCrossDomain=function(t){N(r.content,r.settings,r.remove,r.task);var e=B(s,"navigateCrossDomain",[t]);C[e]=function(t){if(!t)throw new Error("Cross-origin navigation is only supported for URLs matching the pattern registered in the manifest.")}},t.getTabInstances=function(t,e){N();var n=B(s,"getTabInstances",[e]);C[n]=t},t.getUserJoinedTeams=function(t,e){N();var n=B(s,"getUserJoinedTeams",[e]);C[n]=t},t.getMruTabInstances=function(t,e){N();var n=B(s,"getMruTabInstances",[e]);C[n]=t},t.shareDeepLink=function(t){N(r.content),B(s,"shareDeepLink",[t.subEntityId,t.subEntityLabel,t.subEntityWebUrl])},t.openFilePreview=function(t){N(r.content);var e=[t.entityId,t.title,t.description,t.type,t.objectUrl,t.downloadUrl,t.webPreviewUrl,t.webEditUrl,t.baseUrl,t.editFile,t.subEntityId];B(s,"openFilePreview",e)},t.showNotification=function(t){N(r.content);var e=[t.message,t.isDownloadComplete];B(s,"showNotification",e)},t.uploadCustomApp=function(t){N();var e=B(s,"uploadCustomApp",[t]);C[e]=function(t,e){if(!t)throw new Error(e)}},t.navigateToTab=function(t){N();var e=B(s,"navigateToTab",[t]);C[e]=function(t){if(!t)throw new Error("Invalid internalTabInstanceId and/or channelId were/was provided")}},function(t){var e,n;o["settings.save"]=function(t){var n=new i(t);e?e(n):n.notifySuccess()},o["settings.remove"]=function(){var t=new a;n?n(t):t.notifySuccess()},t.setValidityState=function(t){N(r.settings,r.remove),B(s,"settings.setValidityState",[t])},t.getSettings=function(t){N(r.settings,r.remove);var e=B(s,"settings.getSettings");C[e]=t},t.setSettings=function(t){N(r.settings),B(s,"settings.setSettings",[t])},t.registerOnSaveHandler=function(t){N(r.settings),e=t},t.registerOnRemoveHandler=function(t){N(r.remove),n=t};var i=function(){function t(t){this.notified=!1,this.result=t||{}}return t.prototype.notifySuccess=function(){this.ensureNotNotified(),B(s,"settings.save.success"),this.notified=!0},t.prototype.notifyFailure=function(t){this.ensureNotNotified(),B(s,"settings.save.failure",[t]),this.notified=!0},t.prototype.ensureNotNotified=function(){if(this.notified)throw new Error("The SaveEvent may only notify success or failure once.")},t}();var a=function(){function t(){this.notified=!1}return t.prototype.notifySuccess=function(){this.ensureNotNotified(),B(s,"settings.remove.success"),this.notified=!0},t.prototype.notifyFailure=function(t){this.ensureNotNotified(),B(s,"settings.remove.failure",[t]),this.notified=!0},t.prototype.ensureNotNotified=function(){if(this.notified)throw new Error("The removeEvent may only notify success or failure once.")},t}()}(g=t.settings||(t.settings={})),function(t){var e,n;function i(){u();try{c&&c.close()}finally{c=null,f=null}}function u(){n&&(clearInterval(n),n=0),delete o.initialize,delete o.navigateCrossDomain}function l(t){try{e&&e.failureCallback&&e.failureCallback(t)}finally{e=null,i()}}function d(t,e,n){if(t){var i=document.createElement("a");i.href=decodeURIComponent(t),i.host&&i.host!==window.location.host&&"outlook.office.com"===i.host&&i.search.indexOf("client_type=Win32_Outlook")>-1&&(e&&"result"===e&&(n&&(i.href=v(i.href,"result",n)),a.location.assign(v(i.href,"authSuccess",""))),e&&"reason"===e&&(n&&(i.href=v(i.href,"reason",n)),a.location.assign(v(i.href,"authFailure",""))))}}function v(t,e,n){var i=t.indexOf("#"),o=-1===i?"#":t.substr(i);return o=o+"&"+e+(""!==n?"="+n:""),(t=-1===i?t:t.substr(0,i))+o}o["authentication.authenticate.success"]=function(t){try{e&&e.successCallback&&e.successCallback(t)}finally{e=null,i()}},o["authentication.authenticate.failure"]=l,t.registerAuthenticationHandlers=function(t){e=t},t.authenticate=function(t){var d=void 0!==t?t:e;if(N(r.content,r.settings,r.remove,r.task),"desktop"===h){var v=document.createElement("a");v.href=d.url;var p=B(s,"authentication.authenticate",[v.href,d.width,d.height]);C[p]=function(t,e){t?d.successCallback(e):d.failureCallback(e)}}else!function(t){e=t,i();var s=e.width||600,d=e.height||400;s=Math.min(s,a.outerWidth-400),d=Math.min(d,a.outerHeight-200);var v=document.createElement("a");v.href=e.url;var p=void 0!==a.screenLeft?a.screenLeft:a.screenX,g=void 0!==a.screenTop?a.screenTop:a.screenY;p+=a.outerWidth/2-s/2,g+=a.outerHeight/2-d/2,(c=a.open(v.href,"_blank","toolbar=no, location=yes, status=no, menubar=no, scrollbars=yes, top="+g+", left="+p+", width="+s+", height="+d))?(u(),n=a.setInterval(function(){if(!c||c.closed)l("CancelledByUser");else{var t=f;try{f="*",B(c,"ping")}finally{f=t}}},100),o.initialize=function(){return[r.authentication,h]},o.navigateCrossDomain=function(t){return!1}):l("FailedToOpenWindow")}(d)},t.getAuthToken=function(t){N();var e=B(s,"authentication.getAuthToken",[t.resources]);C[e]=function(e,n){e?t.successCallback(n):t.failureCallback(n)}},t.getUser=function(t){N();var e=B(s,"authentication.getUser");C[e]=function(e,n){e?t.successCallback(n):t.failureCallback(n)}},t.notifySuccess=function(t,e){d(e,"result",t),N(r.authentication),B(s,"authentication.authenticate.success",[t]),A(s,function(){return setTimeout(function(){return a.close()},200)})},t.notifyFailure=function(t,e){d(e,"reason",t),N(r.authentication),B(s,"authentication.authenticate.failure",[t]),A(s,function(){return setTimeout(function(){return a.close()},200)})}}(t.authentication||(t.authentication={})),t.sendCustomMessage=function(t,e){return N(),B(s,t,e)},function(t){t.startTask=function(t,e){N(r.content);var n=B(s,"tasks.startTask",[t]);C[n]=e},t.submitTask=function(t,e){N(r.content,r.task),B(s,"tasks.completeTask",[t,Array.isArray(e)?e:[e]])}}(t.tasks||(t.tasks={})),t.getChatMembers=function(t){N();var e=B(s,"getChatMembers");C[e]=t}}(i||(i={})),n.d(e,"microsoftTeams",function(){return i})}]);
!function(t){var n={};function e(i){if(n[i])return n[i].exports;var r=n[i]={i:i,l:!1,exports:{}};return t[i].call(r.exports,r,r.exports,e),r.l=!0,r.exports}e.m=t,e.c=n,e.d=function(t,n,i){e.o(t,n)||Object.defineProperty(t,n,{enumerable:!0,get:i})},e.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},e.t=function(t,n){if(1&n&&(t=e(t)),8&n)return t;if(4&n&&"object"==typeof t&&t&&t.__esModule)return t;var i=Object.create(null);if(e.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:t}),2&n&&"string"!=typeof t)for(var r in t)e.d(i,r,function(n){return t[n]}.bind(null,r));return i},e.n=function(t){var n=t&&t.__esModule?function(){return t.default}:function(){return t};return e.d(n,"a",n),n},e.o=function(t,n){return Object.prototype.hasOwnProperty.call(t,n)},e.p="",e(e.s=0)}([function(t,n,e){"use strict";e.r(n);var i={};e.r(i),e.d(i,"menus",function(){return a}),e.d(i,"initialize",function(){return P}),e.d(i,"_uninitialize",function(){return U}),e.d(i,"enablePrintCapability",function(){return x}),e.d(i,"print",function(){return A}),e.d(i,"getContext",function(){return B}),e.d(i,"registerOnThemeChangeHandler",function(){return L}),e.d(i,"registerFullScreenHandler",function(){return _}),e.d(i,"registerBackButtonHandler",function(){return D}),e.d(i,"navigateBack",function(){return H}),e.d(i,"navigateCrossDomain",function(){return j}),e.d(i,"getTabInstances",function(){return F}),e.d(i,"getUserJoinedTeams",function(){return z}),e.d(i,"getMruTabInstances",function(){return W}),e.d(i,"shareDeepLink",function(){return R}),e.d(i,"openFilePreview",function(){return V}),e.d(i,"showNotification",function(){return J}),e.d(i,"uploadCustomApp",function(){return K}),e.d(i,"navigateToTab",function(){return X}),e.d(i,"settings",function(){return w}),e.d(i,"authentication",function(){return k}),e.d(i,"sendCustomMessage",function(){return nt}),e.d(i,"tasks",function(){return C}),e.d(i,"getChatMembers",function(){return it}),String.prototype.startsWith||(String.prototype.startsWith=function(t,n){return this.substr(!n||n<0?0:+n,t.length)===t});var r="1.3.6";function o(t){for(var n="^",e=t.split("."),i=0;i<e.length;i++)n+=(i>0?"[.]":"")+e[i].replace("*","[^/^.]+");return n+="$"}var a,s=function(t){for(var n="",e=0;e<t.length;e++)n+=(0===e?"":"|")+o(t[e]);return new RegExp(n)}(["https://teams.microsoft.com","https://teams.microsoft.us","https://int.teams.microsoft.com","https://devspaces.skype.com","https://ssauth.skype.com","http://dev.local","https://msft.spoppe.com","https://*.sharepoint.com","https://*.sharepoint-df.com","https://*.sharepointonline.com","https://outlook.office.com","https://outlook-sdf.office.com"]),u={},c={settings:"settings",content:"content",authentication:"authentication",remove:"remove",task:"task"};!function(t){var n,e,i,r=function(){return function(){this.enabled=!0}}();t.MenuItem=r,function(t){t.dropDown="dropDown",t.popOver="popOver"}(t.MenuListType||(t.MenuListType={})),u.navBarMenuItemPress=function(t){n&&n(t)||(Y(),tt(l,"handleNavBarMenuItemPress",[t]))},u.actionMenuItemPress=function(t){e&&e(t)||(Y(),tt(l,"handleActionMenuItemPress",[t]))},u.setModuleView=function(t){i&&i(t)||(Y(),tt(l,"viewConfigItemPress",[t]))},t.setUpViews=function(t,n){Y(),i=n,tt(l,"setUpViews",[t])},t.setNavBarMenu=function(t,e){Y(),n=e,tt(l,"setNavBarMenu",[t])},t.showActionMenu=function(t,n){Y(),e=n,tt(l,"showActionMenu",[t])}}(a||(a={}));var f,l,d,h,v,p,g,m,y,b,w,k,C,T=!1,M=!1,I=[],S=[],E=0,N={},O=!1;function P(t){if(void 0===t&&(t=window),!T){T=!0;var n=function(t){return function(t){if(!t||!t.data||"object"!=typeof t.data)return;var n=t.source||t.originalEvent.source,e=t.origin||t.originalEvent.origin;if(n===f||e!==f.location.origin&&!s.test(e.toLowerCase()))return;(function(t,n){l&&t!==l?h&&t!==h||(h=t,v=n):(l=t,d=n),l&&l.closed&&(l=null,d=null),h&&h.closed&&(h=null,v=null),Q(l),Q(h)})(n,e),n===l?$(t):n===h&&function(t){if("id"in t.data&&"func"in t.data){var n=t.data,e=u[n.func];if(e){var i=e.apply(this,n.args);i&&et(h,n.id,Array.isArray(i)?i:[i])}else{var r=tt(l,n.func,n.args);N[r]=function(){for(var t=[],e=0;e<arguments.length;e++)t[e]=arguments[e];h&&et(h,n.id,t)}}}}(t)}(t)};(l=(f=t).parent!==f.self?f.parent:f.opener)?f.addEventListener("message",n,!1):(M=!0,window.onNativeMessage=$);try{d="*";var e=tt(l,"initialize",[r]);N[e]=function(t,n){p=t,g=n}}finally{d=null}this._uninitialize=function(){p&&(L(null),_(null),D(null)),p===c.settings&&w.registerOnSaveHandler(null),p===c.remove&&w.registerOnRemoveHandler(null),M||f.removeEventListener("message",n,!1),T=!1,l=null,d=null,I=[],h=null,v=null,S=[],E=0,N={},p=null,g=null,M=!1}}}function U(){}function x(){O||(O=!0,Y(),document.addEventListener("keydown",function(t){(t.ctrlKey||t.metaKey)&&80===t.keyCode&&(A(),t.cancelBubble=!0,t.preventDefault(),t.stopImmediatePropagation())}))}function A(){window.print()}function B(t){Y();var n=tt(l,"getContext");N[n]=t}function L(t){Y(),m=t}function _(t){Y(),y=t}function D(t){Y(),b=t}function H(){Y();var t=tt(l,"navigateBack",[]);N[t]=function(t){if(!t)throw new Error("Back navigation is not supported in the current client or context.")}}function j(t){Y(c.content,c.settings,c.remove,c.task);var n=tt(l,"navigateCrossDomain",[t]);N[n]=function(t){if(!t)throw new Error("Cross-origin navigation is only supported for URLs matching the pattern registered in the manifest.")}}function F(t,n){Y();var e=tt(l,"getTabInstances",[n]);N[e]=t}function z(t,n){Y();var e=tt(l,"getUserJoinedTeams",[n]);N[e]=t}function W(t,n){Y();var e=tt(l,"getMruTabInstances",[n]);N[e]=t}function R(t){Y(c.content),tt(l,"shareDeepLink",[t.subEntityId,t.subEntityLabel,t.subEntityWebUrl])}function V(t){Y(c.content);var n=[t.entityId,t.title,t.description,t.type,t.objectUrl,t.downloadUrl,t.webPreviewUrl,t.webEditUrl,t.baseUrl,t.editFile,t.subEntityId];tt(l,"openFilePreview",n)}function J(t){Y(c.content);var n=[t.message,t.isDownloadComplete];tt(l,"showNotification",n)}function K(t){Y();var n=tt(l,"uploadCustomApp",[t]);N[n]=function(t,n){if(!t)throw new Error(n)}}function X(t){Y();var n=tt(l,"navigateToTab",[t]);N[n]=function(t){if(!t)throw new Error("Invalid internalTabInstanceId and/or channelId were/was provided")}}function Y(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];if(!T)throw new Error("The library has not yet been initialized");if(p&&t&&t.length>0){for(var e=!1,i=0;i<t.length;i++)if(t[i]===p){e=!0;break}if(!e)throw new Error("This call is not allowed in the '"+p+"' context")}}function $(t){if("id"in t.data){var n=t.data,e=N[n.id];e&&(e.apply(null,n.args),delete N[n.id])}else if("func"in t.data){n=t.data;var i=u[n.func];i&&i.apply(this,n.args)}}function q(t){return t===l?I:t===h?S:[]}function G(t){return t===l?d:t===h?v:null}function Q(t){for(var n=G(t),e=q(t);t&&n&&e.length>0;)t.postMessage(e.shift(),n)}function Z(t,n){var e=f.setInterval(function(){0===q(t).length&&(clearInterval(e),n())},100)}function tt(t,n,e){var i=function(t,n){return{id:E++,func:t,args:n||[]}}(n,e);if(M)f&&f.nativeInterface&&f.nativeInterface.framelessPostMessage(JSON.stringify(i));else{var r=G(t);t&&r?t.postMessage(i,r):q(t).push(i)}return i.id}function nt(t,n){return Y(),tt(l,t,n)}function et(t,n,e){var i=function(t,n){return{id:t,args:n||[]}}(n,e),r=G(t);t&&r&&t.postMessage(i,r)}function it(t){Y();var n=tt(l,"getChatMembers");N[n]=t}u.themeChange=function(t){m&&m(t);h&&tt(h,"themeChange",[t])},u.fullScreenChange=function(t){y&&y(t)},u.backButtonPress=function(){b&&b()||H()},function(t){var n,e;u["settings.save"]=function(t){var e=new i(t);n?n(e):e.notifySuccess()},u["settings.remove"]=function(){var t=new r;e?e(t):t.notifySuccess()},t.setValidityState=function(t){Y(c.settings,c.remove),tt(l,"settings.setValidityState",[t])},t.getSettings=function(t){Y(c.settings,c.remove);var n=tt(l,"settings.getSettings");N[n]=t},t.setSettings=function(t){Y(c.settings),tt(l,"settings.setSettings",[t])},t.registerOnSaveHandler=function(t){Y(c.settings),n=t},t.registerOnRemoveHandler=function(t){Y(c.remove),e=t};var i=function(){function t(t){this.notified=!1,this.result=t||{}}return t.prototype.notifySuccess=function(){this.ensureNotNotified(),tt(l,"settings.save.success"),this.notified=!0},t.prototype.notifyFailure=function(t){this.ensureNotNotified(),tt(l,"settings.save.failure",[t]),this.notified=!0},t.prototype.ensureNotNotified=function(){if(this.notified)throw new Error("The SaveEvent may only notify success or failure once.")},t}();var r=function(){function t(){this.notified=!1}return t.prototype.notifySuccess=function(){this.ensureNotNotified(),tt(l,"settings.remove.success"),this.notified=!0},t.prototype.notifyFailure=function(t){this.ensureNotNotified(),tt(l,"settings.remove.failure",[t]),this.notified=!0},t.prototype.ensureNotNotified=function(){if(this.notified)throw new Error("The removeEvent may only notify success or failure once.")},t}()}(w||(w={})),function(t){var n,e;function i(){r();try{h&&h.close()}finally{h=null,v=null}}function r(){e&&(clearInterval(e),e=0),delete u.initialize,delete u.navigateCrossDomain}function o(t){try{n&&n.failureCallback&&n.failureCallback(t)}finally{n=null,i()}}function a(t,n,e){if(t){var i=document.createElement("a");i.href=decodeURIComponent(t),i.host&&i.host!==window.location.host&&"outlook.office.com"===i.host&&i.search.indexOf("client_type=Win32_Outlook")>-1&&(n&&"result"===n&&(e&&(i.href=s(i.href,"result",e)),f.location.assign(s(i.href,"authSuccess",""))),n&&"reason"===n&&(e&&(i.href=s(i.href,"reason",e)),f.location.assign(s(i.href,"authFailure",""))))}}function s(t,n,e){var i=t.indexOf("#"),r=-1===i?"#":t.substr(i);return r=r+"&"+n+(""!==e?"="+e:""),(t=-1===i?t:t.substr(0,i))+r}u["authentication.authenticate.success"]=function(t){try{n&&n.successCallback&&n.successCallback(t)}finally{n=null,i()}},u["authentication.authenticate.failure"]=o,t.registerAuthenticationHandlers=function(t){n=t},t.authenticate=function(t){var a=void 0!==t?t:n;if(Y(c.content,c.settings,c.remove,c.task),"desktop"===g){var s=document.createElement("a");s.href=a.url;var d=tt(l,"authentication.authenticate",[s.href,a.width,a.height]);N[d]=function(t,n){t?a.successCallback(n):a.failureCallback(n)}}else!function(t){n=t,i();var a=n.width||600,s=n.height||400;a=Math.min(a,f.outerWidth-400),s=Math.min(s,f.outerHeight-200);var l=document.createElement("a");l.href=n.url;var d=void 0!==f.screenLeft?f.screenLeft:f.screenX,p=void 0!==f.screenTop?f.screenTop:f.screenY;d+=f.outerWidth/2-a/2,p+=f.outerHeight/2-s/2,(h=f.open(l.href,"_blank","toolbar=no, location=yes, status=no, menubar=no, scrollbars=yes, top="+p+", left="+d+", width="+a+", height="+s))?(r(),e=f.setInterval(function(){if(!h||h.closed)o("CancelledByUser");else{var t=v;try{v="*",tt(h,"ping")}finally{v=t}}},100),u.initialize=function(){return[c.authentication,g]},u.navigateCrossDomain=function(t){return!1}):o("FailedToOpenWindow")}(a)},t.getAuthToken=function(t){Y();var n=tt(l,"authentication.getAuthToken",[t.resources]);N[n]=function(n,e){n?t.successCallback(e):t.failureCallback(e)}},t.getUser=function(t){Y();var n=tt(l,"authentication.getUser");N[n]=function(n,e){n?t.successCallback(e):t.failureCallback(e)}},t.notifySuccess=function(t,n){a(n,"result",t),Y(c.authentication),tt(l,"authentication.authenticate.success",[t]),Z(l,function(){return setTimeout(function(){return f.close()},200)})},t.notifyFailure=function(t,n){a(n,"reason",t),Y(c.authentication),tt(l,"authentication.authenticate.failure",[t]),Z(l,function(){return setTimeout(function(){return f.close()},200)})}}(k||(k={})),function(t){t.startTask=function(t,n){Y(c.content);var e=tt(l,"tasks.startTask",[t]);N[e]=n},t.submitTask=function(t,n){Y(c.content,c.task),tt(l,"tasks.completeTask",[t,Array.isArray(n)?n:[n]])}}(C||(C={})),e.d(n,"microsoftTeams",function(){return i})}]);

@@ -0,797 +1,587 @@

export declare const enum HostClientType {
desktop = "desktop",
web = "web",
android = "android",
ios = "ios"
}
/**
* This is the root namespace for the JavaScript SDK.
* Namespace to interact with the menu-specific part of the SDK.
* This object is used to show View Configuration, Action Menu and Navigation Bar Menu.
*
* @private
* Hide from docs until feature is complete
*/
export declare namespace microsoftTeams {
const enum HostClientType {
desktop = "desktop",
web = "web",
android = "android",
ios = "ios"
}
export declare namespace menus {
/**
* Namespace to interact with the menu-specific part of the SDK.
* This object is used to show View Configuration, Action Menu and Navigation Bar Menu.
*
* @private
* Hide from docs until feature is complete
* Represents information about item in View Configuration.
*/
namespace menus {
interface ViewConfiguration {
/**
* Represents information about item in View Configuration.
* Unique identifier of view.
*/
interface ViewConfiguration {
/**
* Unique identifier of view.
*/
id: string;
/**
* Display title of the view.
*/
title: string;
/**
* Additional information for accessibility.
*/
contentDescription?: string;
}
id: string;
/**
* Represents information about menu item for Action Menu and Navigation Bar Menu.
* Display title of the view.
*/
class MenuItem {
/**
* Unique identifier for the menu item.
*/
id: string;
/**
* Display title of the menu item.
*/
title: string;
/**
* Display icon of the menu item. The icon value must be a string having SVG icon content.
*/
icon?: string;
/**
* Selected state display icon of the menu item. The icon value must be a string having SVG icon content.
*/
iconSelected?: string;
/**
* Additional information for accessibility.
*/
contentDescription?: string;
/**
* State of the menu item
*/
enabled: boolean;
/**
* Interface to show list of items on selection of menu item.
*/
viewData: ViewData;
}
title: string;
/**
* Represents information about view to show on Navigation Bar Menu item selection
* Additional information for accessibility.
*/
interface ViewData {
/**
* Display header title of the item list.
*/
listTitle?: string;
/**
* Type of the menu item.
*/
listType: MenuListType;
/**
* Array of MenuItem. Icon value will be required for all items in the list.
*/
listItems: MenuItem[];
}
/**
* Represents information about type of list to display in Navigation Bar Menu.
*/
enum MenuListType {
dropDown = "dropDown",
popOver = "popOver"
}
/**
* Registers list of view configurations and it's handler.
* Handler is responsible for listening selection of View Configuration.
* @param viewConfig List of view configurations. Minimum 1 value is required.
* @param handler The handler to invoke when the user selects view configuration.
*/
function setUpViews(viewConfig: ViewConfiguration[], handler: (id: string) => boolean): void;
/**
* Used to set menu items on the Navigation Bar. If icon is available, icon will be shown, otherwise title will be shown.
* @param items List of MenuItems for Navigation Bar Menu.
* @param handler The handler to invoke when the user selects menu item.
*/
function setNavBarMenu(items: MenuItem[], handler: (id: string) => boolean): void;
interface ActionMenuParameters {
/**
* Display title for Action Menu
*/
title: string;
/**
* List of MenuItems for Action Menu
*/
items: MenuItem[];
}
/**
* Used to show Action Menu.
* @param params Parameters for Menu Parameters
* @param handler The handler to invoke when the user selects menu item.
*/
function showActionMenu(params: ActionMenuParameters, handler: (id: string) => boolean): void;
contentDescription?: string;
}
/**
* Represents information about tabs for an app
* Represents information about menu item for Action Menu and Navigation Bar Menu.
*/
interface TabInformation {
teamTabs: TabInstance[];
}
/**
* Represents information about a tab instance
*/
interface TabInstance {
class MenuItem {
/**
* The name of the tab
* Unique identifier for the menu item.
*/
tabName: string;
id: string;
/**
* Internal: do not use
* @protected
* Display title of the menu item.
*/
internalTabInstanceId?: string;
title: string;
/**
* Last viewed time of this tab. null means unknown
* Display icon of the menu item. The icon value must be a string having SVG icon content.
*/
lastViewUnixEpochTime?: string;
icon?: string;
/**
* The developer-defined unique ID for the entity this content points to.
* Selected state display icon of the menu item. The icon value must be a string having SVG icon content.
*/
entityId?: string;
iconSelected?: string;
/**
* The Microsoft Teams ID for the channel with which the content is associated.
* Additional information for accessibility.
*/
channelId?: string;
contentDescription?: string;
/**
* The name for the channel with which the content is associated.
* State of the menu item
*/
channelName?: string;
enabled: boolean;
/**
* Is this tab in a favorite channel?
* Interface to show list of items on selection of menu item.
*/
channelIsFavorite?: boolean;
viewData: ViewData;
}
/**
* Represents information about view to show on Navigation Bar Menu item selection
*/
interface ViewData {
/**
* The Microsoft Teams ID for the team with which the content is associated.
* Display header title of the item list.
*/
teamId?: string;
listTitle?: string;
/**
* The name for the team with which the content is associated.
* Type of the menu item.
*/
teamName?: string;
listType: MenuListType;
/**
* Is this tab in a favorite team?
* Array of MenuItem. Icon value will be required for all items in the list.
*/
teamIsFavorite?: boolean;
/**
* The Office 365 group ID for the team with which the content is associated.
* This field is available only when the identity permission is requested in the manifest.
*/
groupId?: string;
/**
* Content URL of this tab
*/
url?: string;
/**
* Website URL of this tab
*/
websiteUrl?: string;
listItems: MenuItem[];
}
/**
* Indicates the team type, currently used to distinguish between different team
* types in Office 365 for Education (team types 1, 2, 3, and 4).
* Represents information about type of list to display in Navigation Bar Menu.
*/
const enum TeamType {
Standard = 0,
Edu = 1,
Class = 2,
Plc = 3,
Staff = 4
enum MenuListType {
dropDown = "dropDown",
popOver = "popOver"
}
/**
* Indicates the various types of roles of a user in a team.
* Registers list of view configurations and it's handler.
* Handler is responsible for listening selection of View Configuration.
* @param viewConfig List of view configurations. Minimum 1 value is required.
* @param handler The handler to invoke when the user selects view configuration.
*/
const enum UserTeamRole {
Admin = 0,
User = 1,
Guest = 2
}
function setUpViews(viewConfig: ViewConfiguration[], handler: (id: string) => boolean): void;
/**
* Indicates information about the tab instance for filtering purposes.
* Used to set menu items on the Navigation Bar. If icon is available, icon will be shown, otherwise title will be shown.
* @param items List of MenuItems for Navigation Bar Menu.
* @param handler The handler to invoke when the user selects menu item.
*/
interface TabInstanceParameters {
function setNavBarMenu(items: MenuItem[], handler: (id: string) => boolean): void;
interface ActionMenuParameters {
/**
* Flag allowing to select favorite channels only
* Display title for Action Menu
*/
favoriteChannelsOnly?: boolean;
title: string;
/**
* Flag allowing to select favorite teams only
* List of MenuItems for Action Menu
*/
favoriteTeamsOnly?: boolean;
items: MenuItem[];
}
/**
* @private
* Hide from docs
* --------
* Query parameters used when fetching team information
* Used to show Action Menu.
* @param params Parameters for Menu Parameters
* @param handler The handler to invoke when the user selects menu item.
*/
interface TeamInstanceParameters {
/**
* Flag allowing to select favorite teams only
*/
favoriteTeamsOnly?: boolean;
}
function showActionMenu(params: ActionMenuParameters, handler: (id: string) => boolean): void;
}
/**
* Represents information about tabs for an app
*/
export interface TabInformation {
teamTabs: TabInstance[];
}
/**
* Represents information about a tab instance
*/
export interface TabInstance {
/**
* @private
* Hide from docs
* --------
* Information on userJoined Teams
* The name of the tab
*/
interface UserJoinedTeamsInformation {
/**
* List of team information
*/
userJoinedTeams: TeamInformation[];
}
tabName: string;
/**
* Represends Team Information
* Internal: do not use
* @protected
*/
interface TeamInformation {
/**
* Id of the team
*/
teamId: string;
/**
* Team display name
*/
teamName: string;
/**
* Team description
*/
teamDescription?: string;
/**
* Thumbnail Uri
*/
thumbnailUri?: string;
/**
* The Office 365 group ID for the team with which the content is associated.
* This field is available only when the identity permission is requested in the manifest.
*/
groupId?: string;
/**
* Role of current user in the team
*/
userTeamRole?: UserTeamRole;
}
const enum TaskModuleDimension {
Large = "large",
Medium = "medium",
Small = "small"
}
internalTabInstanceId?: string;
/**
* Initializes the library. This must be called before any other SDK calls
* but after the frame is loaded successfully.
* Last viewed time of this tab. null means unknown
*/
function initialize(hostWindow?: any): void;
lastViewUnixEpochTime?: string;
/**
* Initializes the library. This must be called before any other SDK calls
* but after the frame is loaded successfully.
* The developer-defined unique ID for the entity this content points to.
*/
function _uninitialize(): void;
entityId?: string;
/**
* Enable print capability to support printing page using Ctrl+P and cmd+P
* The Microsoft Teams ID for the channel with which the content is associated.
*/
function enablePrintCapability(): void;
channelId?: string;
/**
* default print handler
* The name for the channel with which the content is associated.
*/
function print(): void;
channelName?: string;
/**
* Retrieves the current context the frame is running in.
* @param callback The callback to invoke when the {@link Context} object is retrieved.
* Is this tab in a favorite channel?
*/
function getContext(callback: (context: Context) => void): void;
channelIsFavorite?: boolean;
/**
* Registers a handler for theme changes.
* Only one handler can be registered at a time. A subsequent registration replaces an existing registration.
* @param handler The handler to invoke when the user changes their theme.
* The Microsoft Teams ID for the team with which the content is associated.
*/
function registerOnThemeChangeHandler(handler: (theme: string) => void): void;
teamId?: string;
/**
* Registers a handler for changes from or to full-screen view for a tab.
* Only one handler can be registered at a time. A subsequent registration replaces an existing registration.
* @param handler The handler to invoke when the user toggles full-screen view for a tab.
* The name for the team with which the content is associated.
*/
function registerFullScreenHandler(handler: (isFullScreen: boolean) => void): void;
teamName?: string;
/**
* Registers a handler for user presses of the Team client's back button. Experiences that maintain an internal
* navigation stack should use this handler to navigate the user back within their frame. If an app finds
* that after running its back button handler it cannot handle the event it should call the navigateBack
* method to ask the Teams client to handle it instead.
* @param handler The handler to invoke when the user presses their Team client's back button.
* Is this tab in a favorite team?
*/
function registerBackButtonHandler(handler: () => boolean): void;
teamIsFavorite?: boolean;
/**
* Navigates back in the Teams client. See registerBackButtonHandler for more information on when
* it's appropriate to use this method.
* The Office 365 group ID for the team with which the content is associated.
* This field is available only when the identity permission is requested in the manifest.
*/
function navigateBack(): void;
groupId?: string;
/**
* Navigates the frame to a new cross-domain URL. The domain of this URL must match at least one of the
* valid domains specified in the validDomains block of the manifest; otherwise, an exception will be
* thrown. This function needs to be used only when navigating the frame to a URL in a different domain
* than the current one in a way that keeps the app informed of the change and allows the SDK to
* continue working.
* @param url The URL to navigate the frame to.
* Content URL of this tab
*/
function navigateCrossDomain(url: string): void;
url?: string;
/**
* Allows an app to retrieve for this user tabs that are owned by this app.
* If no TabInstanceParameters are passed, the app defaults to favorite teams and favorite channels.
* @param callback The callback to invoke when the {@link TabInstanceParameters} object is retrieved.
* @param tabInstanceParameters OPTIONAL Flags that specify whether to scope call to favorite teams or channels.
* Website URL of this tab
*/
function getTabInstances(callback: (tabInfo: TabInformation) => void, tabInstanceParameters?: TabInstanceParameters): void;
websiteUrl?: string;
}
/**
* Indicates the team type, currently used to distinguish between different team
* types in Office 365 for Education (team types 1, 2, 3, and 4).
*/
export declare const enum TeamType {
Standard = 0,
Edu = 1,
Class = 2,
Plc = 3,
Staff = 4
}
/**
* Indicates the various types of roles of a user in a team.
*/
export declare const enum UserTeamRole {
Admin = 0,
User = 1,
Guest = 2
}
/**
* Indicates information about the tab instance for filtering purposes.
*/
export interface TabInstanceParameters {
/**
* @private
* Hide from docs
* ------
* Allows an app to retrieve information of all user joined teams
* @param callback The callback to invoke when the {@link TeamInstanceParameters} object is retrieved.
* @param teamInstanceParameters OPTIONAL Flags that specify whether to scope call to favorite teams
* Flag allowing to select favorite channels only
*/
function getUserJoinedTeams(callback: (userJoinedTeamsInformation: UserJoinedTeamsInformation) => void, teamInstanceParameters?: TeamInstanceParameters): void;
favoriteChannelsOnly?: boolean;
/**
* Allows an app to retrieve the most recently used tabs for this user.
* @param callback The callback to invoke when the {@link TabInformation} object is retrieved.
* @param tabInstanceParameters OPTIONAL Ignored, kept for future use
* Flag allowing to select favorite teams only
*/
function getMruTabInstances(callback: (tabInfo: TabInformation) => void, tabInstanceParameters?: TabInstanceParameters): void;
favoriteTeamsOnly?: boolean;
}
/**
* @private
* Hide from docs
* --------
* Query parameters used when fetching team information
*/
export interface TeamInstanceParameters {
/**
* Shares a deep link that a user can use to navigate back to a specific state in this page.
* @param deepLinkParameters ID and label for the link and fallback URL.
* Flag allowing to select favorite teams only
*/
function shareDeepLink(deepLinkParameters: DeepLinkParameters): void;
favoriteTeamsOnly?: boolean;
}
/**
* @private
* Hide from docs
* --------
* Information on userJoined Teams
*/
export interface UserJoinedTeamsInformation {
/**
* @private
* Hide from docs.
* ------
* Opens a client-friendly preview of the specified file.
* @param file The file to preview.
* List of team information
*/
function openFilePreview(filePreviewParameters: FilePreviewParameters): void;
interface ShowNotificationParameters {
message: string;
isDownloadComplete: boolean;
}
userJoinedTeams: TeamInformation[];
}
/**
* Represends Team Information
*/
export interface TeamInformation {
/**
* @private
* Hide from docs.
* ------
* download file.
* @param file The file to download.
* Id of the team
*/
function showNotification(showNotificationParameters: ShowNotificationParameters): void;
teamId: string;
/**
* @private
* Hide from docs.
* ------
* Upload a custom App manifest directly to both team and personal scopes.
* This method works just for the first party Apps.
* Team display name
*/
function uploadCustomApp(manifestBlob: Blob): void;
teamName: string;
/**
* Navigates the Microsoft Teams app to the specified tab instance.
* @param tabInstance The tab instance to navigate to.
* Team description
*/
function navigateToTab(tabInstance: TabInstance): void;
teamDescription?: string;
/**
* Namespace to interact with the settings-specific part of the SDK.
* This object is usable only on the settings frame.
* Thumbnail Uri
*/
namespace settings {
/**
* Sets the validity state for the settings.
* The initial value is false, so the user cannot save the settings until this is called with true.
* @param validityState Indicates whether the save or remove button is enabled for the user.
*/
function setValidityState(validityState: boolean): void;
/**
* Gets the settings for the current instance.
* @param callback The callback to invoke when the {@link Settings} object is retrieved.
*/
function getSettings(callback: (instanceSettings: Settings) => void): void;
/**
* Sets the settings for the current instance.
* This is an asynchronous operation; calls to getSettings are not guaranteed to reflect the changed state.
* @param settings The desired settings for this instance.
*/
function setSettings(instanceSettings: Settings): void;
/**
* Registers a handler for when the user attempts to save the settings. This handler should be used
* to create or update the underlying resource powering the content.
* The object passed to the handler must be used to notify whether to proceed with the save.
* Only one handler can be registered at a time. A subsequent registration replaces an existing registration.
* @param handler The handler to invoke when the user selects the save button.
*/
function registerOnSaveHandler(handler: (evt: SaveEvent) => void): void;
/**
* Registers a handler for user attempts to remove content. This handler should be used
* to remove the underlying resource powering the content.
* The object passed to the handler must be used to indicate whether to proceed with the removal.
* Only one handler may be registered at a time. Subsequent registrations will override the first.
* @param handler The handler to invoke when the user selects the remove button.
*/
function registerOnRemoveHandler(handler: (evt: RemoveEvent) => void): void;
interface Settings {
/**
* A suggested display name for the new content.
* In the settings for an existing instance being updated, this call has no effect.
*/
suggestedDisplayName?: string;
/**
* Sets the URL to use for the content of this instance.
*/
contentUrl: string;
/**
* Sets the URL for the removal configuration experience.
*/
removeUrl?: string;
/**
* Sets the URL to use for the external link to view the underlying resource in a browser.
*/
websiteUrl?: string;
/**
* The developer-defined unique ID for the entity to which this content points.
*/
entityId: string;
}
interface SaveEvent {
/**
* Object containing properties passed as arguments to the settings.save event.
*/
result: SaveParameters;
/**
* Indicates that the underlying resource has been created and the settings can be saved.
*/
notifySuccess(): void;
/**
* Indicates that creation of the underlying resource failed and that the settings cannot be saved.
* @param reason Specifies a reason for the failure. If provided, this string is displayed to the user; otherwise a generic error is displayed.
*/
notifyFailure(reason?: string): void;
}
interface RemoveEvent {
/**
* Indicates that the underlying resource has been removed and the content can be removed.
*/
notifySuccess(): void;
/**
* Indicates that removal of the underlying resource failed and that the content cannot be removed.
* @param reason Specifies a reason for the failure. If provided, this string is displayed to the user; otherwise a generic error is displayed.
*/
notifyFailure(reason?: string): void;
}
interface SaveParameters {
/**
* Connector's webhook Url returned as arguments to settings.save event as part of user clicking on Save
*/
webhookUrl?: string;
}
}
thumbnailUri?: string;
/**
* Namespace to interact with the authentication-specific part of the SDK.
* This object is used for starting or completing authentication flows.
* The Office 365 group ID for the team with which the content is associated.
* This field is available only when the identity permission is requested in the manifest.
*/
namespace authentication {
groupId?: string;
/**
* Role of current user in the team
*/
userTeamRole?: UserTeamRole;
}
export declare const enum TaskModuleDimension {
Large = "large",
Medium = "medium",
Small = "small"
}
/**
* Initializes the library. This must be called before any other SDK calls
* but after the frame is loaded successfully.
*/
export declare function initialize(hostWindow?: any): void;
/**
* Initializes the library. This must be called before any other SDK calls
* but after the frame is loaded successfully.
*/
export declare function _uninitialize(): void;
/**
* Enable print capability to support printing page using Ctrl+P and cmd+P
*/
export declare function enablePrintCapability(): void;
/**
* default print handler
*/
export declare function print(): void;
/**
* Retrieves the current context the frame is running in.
* @param callback The callback to invoke when the {@link Context} object is retrieved.
*/
export declare function getContext(callback: (context: Context) => void): void;
/**
* Registers a handler for theme changes.
* Only one handler can be registered at a time. A subsequent registration replaces an existing registration.
* @param handler The handler to invoke when the user changes their theme.
*/
export declare function registerOnThemeChangeHandler(handler: (theme: string) => void): void;
/**
* Registers a handler for changes from or to full-screen view for a tab.
* Only one handler can be registered at a time. A subsequent registration replaces an existing registration.
* @param handler The handler to invoke when the user toggles full-screen view for a tab.
*/
export declare function registerFullScreenHandler(handler: (isFullScreen: boolean) => void): void;
/**
* Registers a handler for user presses of the Team client's back button. Experiences that maintain an internal
* navigation stack should use this handler to navigate the user back within their frame. If an app finds
* that after running its back button handler it cannot handle the event it should call the navigateBack
* method to ask the Teams client to handle it instead.
* @param handler The handler to invoke when the user presses their Team client's back button.
*/
export declare function registerBackButtonHandler(handler: () => boolean): void;
/**
* Navigates back in the Teams client. See registerBackButtonHandler for more information on when
* it's appropriate to use this method.
*/
export declare function navigateBack(): void;
/**
* Navigates the frame to a new cross-domain URL. The domain of this URL must match at least one of the
* valid domains specified in the validDomains block of the manifest; otherwise, an exception will be
* thrown. This function needs to be used only when navigating the frame to a URL in a different domain
* than the current one in a way that keeps the app informed of the change and allows the SDK to
* continue working.
* @param url The URL to navigate the frame to.
*/
export declare function navigateCrossDomain(url: string): void;
/**
* Allows an app to retrieve for this user tabs that are owned by this app.
* If no TabInstanceParameters are passed, the app defaults to favorite teams and favorite channels.
* @param callback The callback to invoke when the {@link TabInstanceParameters} object is retrieved.
* @param tabInstanceParameters OPTIONAL Flags that specify whether to scope call to favorite teams or channels.
*/
export declare function getTabInstances(callback: (tabInfo: TabInformation) => void, tabInstanceParameters?: TabInstanceParameters): void;
/**
* @private
* Hide from docs
* ------
* Allows an app to retrieve information of all user joined teams
* @param callback The callback to invoke when the {@link TeamInstanceParameters} object is retrieved.
* @param teamInstanceParameters OPTIONAL Flags that specify whether to scope call to favorite teams
*/
export declare function getUserJoinedTeams(callback: (userJoinedTeamsInformation: UserJoinedTeamsInformation) => void, teamInstanceParameters?: TeamInstanceParameters): void;
/**
* Allows an app to retrieve the most recently used tabs for this user.
* @param callback The callback to invoke when the {@link TabInformation} object is retrieved.
* @param tabInstanceParameters OPTIONAL Ignored, kept for future use
*/
export declare function getMruTabInstances(callback: (tabInfo: TabInformation) => void, tabInstanceParameters?: TabInstanceParameters): void;
/**
* Shares a deep link that a user can use to navigate back to a specific state in this page.
* @param deepLinkParameters ID and label for the link and fallback URL.
*/
export declare function shareDeepLink(deepLinkParameters: DeepLinkParameters): void;
/**
* @private
* Hide from docs.
* ------
* Opens a client-friendly preview of the specified file.
* @param file The file to preview.
*/
export declare function openFilePreview(filePreviewParameters: FilePreviewParameters): void;
export interface ShowNotificationParameters {
message: string;
isDownloadComplete: boolean;
}
/**
* @private
* Hide from docs.
* ------
* download file.
* @param file The file to download.
*/
export declare function showNotification(showNotificationParameters: ShowNotificationParameters): void;
/**
* @private
* Hide from docs.
* ------
* Upload a custom App manifest directly to both team and personal scopes.
* This method works just for the first party Apps.
*/
export declare function uploadCustomApp(manifestBlob: Blob): void;
/**
* Navigates the Microsoft Teams app to the specified tab instance.
* @param tabInstance The tab instance to navigate to.
*/
export declare function navigateToTab(tabInstance: TabInstance): void;
/**
* Namespace to interact with the settings-specific part of the SDK.
* This object is usable only on the settings frame.
*/
export declare namespace settings {
/**
* Sets the validity state for the settings.
* The initial value is false, so the user cannot save the settings until this is called with true.
* @param validityState Indicates whether the save or remove button is enabled for the user.
*/
function setValidityState(validityState: boolean): void;
/**
* Gets the settings for the current instance.
* @param callback The callback to invoke when the {@link Settings} object is retrieved.
*/
function getSettings(callback: (instanceSettings: Settings) => void): void;
/**
* Sets the settings for the current instance.
* This is an asynchronous operation; calls to getSettings are not guaranteed to reflect the changed state.
* @param settings The desired settings for this instance.
*/
function setSettings(instanceSettings: Settings): void;
/**
* Registers a handler for when the user attempts to save the settings. This handler should be used
* to create or update the underlying resource powering the content.
* The object passed to the handler must be used to notify whether to proceed with the save.
* Only one handler can be registered at a time. A subsequent registration replaces an existing registration.
* @param handler The handler to invoke when the user selects the save button.
*/
function registerOnSaveHandler(handler: (evt: SaveEvent) => void): void;
/**
* Registers a handler for user attempts to remove content. This handler should be used
* to remove the underlying resource powering the content.
* The object passed to the handler must be used to indicate whether to proceed with the removal.
* Only one handler may be registered at a time. Subsequent registrations will override the first.
* @param handler The handler to invoke when the user selects the remove button.
*/
function registerOnRemoveHandler(handler: (evt: RemoveEvent) => void): void;
interface Settings {
/**
* Registers the authentication handlers
* @param authenticateParameters A set of values that configure the authentication pop-up.
* A suggested display name for the new content.
* In the settings for an existing instance being updated, this call has no effect.
*/
function registerAuthenticationHandlers(authenticateParameters: AuthenticateParameters): void;
suggestedDisplayName?: string;
/**
* Initiates an authentication request, which opens a new window with the specified settings.
* Sets the URL to use for the content of this instance.
*/
function authenticate(authenticateParameters?: AuthenticateParameters): void;
contentUrl: string;
/**
* @private
* Hide from docs.
* ------
* Requests an Azure AD token to be issued on behalf of the app. The token is acquired from the cache
* if it is not expired. Otherwise a request is sent to Azure AD to obtain a new token.
* @param authTokenRequest A set of values that configure the token request.
* Sets the URL for the removal configuration experience.
*/
function getAuthToken(authTokenRequest: AuthTokenRequest): void;
removeUrl?: string;
/**
* @private
* Hide from docs.
* ------
* Requests the decoded Azure AD user identity on behalf of the app.
* Sets the URL to use for the external link to view the underlying resource in a browser.
*/
function getUser(userRequest: UserRequest): void;
websiteUrl?: string;
/**
* Notifies the frame that initiated this authentication request that the request was successful.
* This function is usable only on the authentication window.
* This call causes the authentication window to be closed.
* @param result Specifies a result for the authentication. If specified, the frame that initiated the authentication pop-up receives this value in its callback.
* @param callbackUrl Specifies the url to redirect back to if the client is Win32 Outlook.
* The developer-defined unique ID for the entity to which this content points.
*/
function notifySuccess(result?: string, callbackUrl?: string): void;
entityId: string;
}
interface SaveEvent {
/**
* Notifies the frame that initiated this authentication request that the request failed.
* This function is usable only on the authentication window.
* This call causes the authentication window to be closed.
* @param result Specifies a result for the authentication. If specified, the frame that initiated the authentication pop-up receives this value in its callback.
* @param callbackUrl Specifies the url to redirect back to if the client is Win32 Outlook.
* Object containing properties passed as arguments to the settings.save event.
*/
function notifyFailure(reason?: string, callbackUrl?: string): void;
interface AuthenticateParameters {
/**
* The URL for the authentication pop-up.
*/
url: string;
/**
* The preferred width for the pop-up. This value can be ignored if outside the acceptable bounds.
*/
width?: number;
/**
* The preferred height for the pop-up. This value can be ignored if outside the acceptable bounds.
*/
height?: number;
/**
* A function that is called if the authentication succeeds, with the result returned from the authentication pop-up.
*/
successCallback?: (result?: string) => void;
/**
* A function that is called if the authentication fails, with the reason for the failure returned from the authentication pop-up.
*/
failureCallback?: (reason?: string) => void;
}
result: SaveParameters;
/**
* @private
* Hide from docs.
* ------
* Indicates that the underlying resource has been created and the settings can be saved.
*/
interface AuthTokenRequest {
/**
* An array of resource URIs identifying the target resources for which the token should be requested.
*/
resources: string[];
/**
* A function that is called if the token request succeeds, with the resulting token.
*/
successCallback?: (token: string) => void;
/**
* A function that is called if the token request fails, with the reason for the failure.
*/
failureCallback?: (reason: string) => void;
}
notifySuccess(): void;
/**
* @private
* Hide from docs.
* ------
* Indicates that creation of the underlying resource failed and that the settings cannot be saved.
* @param reason Specifies a reason for the failure. If provided, this string is displayed to the user; otherwise a generic error is displayed.
*/
interface UserRequest {
/**
* A function that is called if the token request succeeds, with the resulting token.
*/
successCallback?: (user: UserProfile) => void;
/**
* A function that is called if the token request fails, with the reason for the failure.
*/
failureCallback?: (reason: string) => void;
}
/**
* @private
* Hide from docs.
* ------
*/
interface UserProfile {
/**
* The intended recipient of the token. The application that receives the token must verify that the audience
* value is correct and reject any tokens intended for a different audience.
*/
aud: string;
/**
* Identifies how the subject of the token was authenticated.
*/
amr: string[];
/**
* Stores the time at which the token was issued. It is often used to measure token freshness.
*/
iat: number;
/**
* Identifies the security token service (STS) that constructs and returns the token. In the tokens that Azure AD
* returns, the issuer is sts.windows.net. The GUID in the issuer claim value is the tenant ID of the Azure AD
* directory. The tenant ID is an immutable and reliable identifier of the directory.
*/
iss: string;
/**
* Provides the last name, surname, or family name of the user as defined in the Azure AD user object.
*/
family_name: string;
/**
* Provides the first or "given" name of the user, as set on the Azure AD user object.
*/
given_name: string;
/**
* Provides a human-readable value that identifies the subject of the token. This value is not guaranteed to
* be unique within a tenant and is designed to be used only for display purposes.
*/
unique_name: string;
/**
* Contains a unique identifier of an object in Azure AD. This value is immutable and cannot be reassigned or
* reused. Use the object ID to identify an object in queries to Azure AD.
*/
oid: string;
/**
* Identifies the principal about which the token asserts information, such as the user of an application.
* This value is immutable and cannot be reassigned or reused, so it can be used to perform authorization
* checks safely. Because the subject is always present in the tokens the Azure AD issues, we recommended
* using this value in a general-purpose authorization system.
*/
sub: string;
/**
* An immutable, non-reusable identifier that identifies the directory tenant that issued the token. You can
* use this value to access tenant-specific directory resources in a multitenant application. For example,
* you can use this value to identify the tenant in a call to the Graph API.
*/
tid: string;
/**
* Defines the time interval within which a token is valid. The service that validates the token should verify
* that the current date is within the token lifetime; otherwise it should reject the token. The service might
* allow for up to five minutes beyond the token lifetime to account for any differences in clock time ("time
* skew") between Azure AD and the service.
*/
exp: number;
nbf: number;
/**
* Stores the user name of the user principal.
*/
upn: string;
/**
* Stores the version number of the token.
*/
ver: string;
}
notifyFailure(reason?: string): void;
}
interface Context {
interface RemoveEvent {
/**
* The Office 365 group ID for the team with which the content is associated.
* This field is available only when the identity permission is requested in the manifest.
* Indicates that the underlying resource has been removed and the content can be removed.
*/
groupId?: string;
notifySuccess(): void;
/**
* The Microsoft Teams ID for the team with which the content is associated.
* Indicates that removal of the underlying resource failed and that the content cannot be removed.
* @param reason Specifies a reason for the failure. If provided, this string is displayed to the user; otherwise a generic error is displayed.
*/
teamId?: string;
notifyFailure(reason?: string): void;
}
interface SaveParameters {
/**
* The name for the team with which the content is associated.
* Connector's webhook Url returned as arguments to settings.save event as part of user clicking on Save
*/
teamName?: string;
webhookUrl?: string;
}
}
/**
* Namespace to interact with the authentication-specific part of the SDK.
* This object is used for starting or completing authentication flows.
*/
export declare namespace authentication {
/**
* Registers the authentication handlers
* @param authenticateParameters A set of values that configure the authentication pop-up.
*/
function registerAuthenticationHandlers(authenticateParameters: AuthenticateParameters): void;
/**
* Initiates an authentication request, which opens a new window with the specified settings.
*/
function authenticate(authenticateParameters?: AuthenticateParameters): void;
/**
* @private
* Hide from docs.
* ------
* Requests an Azure AD token to be issued on behalf of the app. The token is acquired from the cache
* if it is not expired. Otherwise a request is sent to Azure AD to obtain a new token.
* @param authTokenRequest A set of values that configure the token request.
*/
function getAuthToken(authTokenRequest: AuthTokenRequest): void;
/**
* @private
* Hide from docs.
* ------
* Requests the decoded Azure AD user identity on behalf of the app.
*/
function getUser(userRequest: UserRequest): void;
/**
* Notifies the frame that initiated this authentication request that the request was successful.
* This function is usable only on the authentication window.
* This call causes the authentication window to be closed.
* @param result Specifies a result for the authentication. If specified, the frame that initiated the authentication pop-up receives this value in its callback.
* @param callbackUrl Specifies the url to redirect back to if the client is Win32 Outlook.
*/
function notifySuccess(result?: string, callbackUrl?: string): void;
/**
* Notifies the frame that initiated this authentication request that the request failed.
* This function is usable only on the authentication window.
* This call causes the authentication window to be closed.
* @param result Specifies a result for the authentication. If specified, the frame that initiated the authentication pop-up receives this value in its callback.
* @param callbackUrl Specifies the url to redirect back to if the client is Win32 Outlook.
*/
function notifyFailure(reason?: string, callbackUrl?: string): void;
interface AuthenticateParameters {
/**
* The Microsoft Teams ID for the channel with which the content is associated.
* The URL for the authentication pop-up.
*/
channelId?: string;
url: string;
/**
* The name for the channel with which the content is associated.
* The preferred width for the pop-up. This value can be ignored if outside the acceptable bounds.
*/
channelName?: string;
width?: number;
/**
* The developer-defined unique ID for the entity this content points to.
* The preferred height for the pop-up. This value can be ignored if outside the acceptable bounds.
*/
entityId: string;
height?: number;
/**
* The developer-defined unique ID for the sub-entity this content points to.
* This field should be used to restore to a specific state within an entity, such as scrolling to or activating a specific piece of content.
* A function that is called if the authentication succeeds, with the result returned from the authentication pop-up.
*/
subEntityId?: string;
successCallback?: (result?: string) => void;
/**
* The current locale that the user has configured for the app formatted as
* languageId-countryId (for example, en-us).
* A function that is called if the authentication fails, with the reason for the failure returned from the authentication pop-up.
*/
locale: string;
failureCallback?: (reason?: string) => void;
}
/**
* @private
* Hide from docs.
* ------
*/
interface AuthTokenRequest {
/**
* @deprecated Use loginHint or userPrincipalName.
* The UPN of the current user.
* Because a malicious party can run your content in a browser, this value should
* be used only as a hint as to who the user is and never as proof of identity.
* This field is available only when the identity permission is requested in the manifest.
* An array of resource URIs identifying the target resources for which the token should be requested.
*/
upn?: string;
resources: string[];
/**
* The Azure AD tenant ID of the current user.
* Because a malicious party can run your content in a browser, this value should
* be used only as a hint as to who the user is and never as proof of identity.
* This field is available only when the identity permission is requested in the manifest.
* A function that is called if the token request succeeds, with the resulting token.
*/
tid?: string;
successCallback?: (token: string) => void;
/**
* The current UI theme.
* A function that is called if the token request fails, with the reason for the failure.
*/
theme?: string;
/**
* Indication whether the tab is in full-screen mode.
*/
isFullScreen?: boolean;
/**
* The type of the team.
*/
teamType?: TeamType;
/**
* The root ShatePoint folder associated with the team.
*/
teamSiteUrl?: string;
/**
* The relative path to the SharePoint folder associated with the channel.
*/
channelRelativeUrl?: string;
/**
* Unique ID for the current Teams session for use in correlating telemetry data.
*/
sessionId?: string;
/**
* The user's role in the team.
* Because a malicious party can run your content in a browser, this value should
* be used only as a hint as to the user's role, and never as proof of her role.
*/
userTeamRole?: UserTeamRole;
/**
* The Microsoft Teams ID for the chat with which the content is associated.
*/
chatId?: string;
/**
* A value suitable for use as a login_hint when authenticating with Azure AD.
* Because a malicious party can run your content in a browser, this value should
* be used only as a hint as to who the user is and never as proof of identity.
* This field is available only when the identity permission is requested in the manifest.
*/
loginHint?: string;
/**
* The UPN of the current user. This may be an externally-authenticated UPN (e.g., guest users).
* Because a malicious party run your content in a browser, this value should
* be used only as a hint as to who the user is and never as proof of identity.
* This field is available only when the identity permission is requested in the manifest.
*/
userPrincipalName?: string;
/**
* The Azure AD object id of the current user.
* Because a malicious party run your content in a browser, this value should
* be used only as a hint as to who the user is and never as proof of identity.
* This field is available only when the identity permission is requested in the manifest.
*/
userObjectId?: string;
/**
* Indicates wheather team is archived.
* Apps should use this as a signal to prevent any changes to content associated with archived teams.
*/
isTeamArchived?: boolean;
/**
* The type of the host client. Possible values are : android, ios, web, desktop
*/
hostClientType?: HostClientType;
failureCallback?: (reason: string) => void;
}
interface DeepLinkParameters {
/**
* @private
* Hide from docs.
* ------
*/
interface UserRequest {
/**
* The developer-defined unique ID for the sub-entity to which this deep link points in the current entity.
* This field should be used to restore to a specific state within an entity, such as scrolling to or activating a specific piece of content.
* A function that is called if the token request succeeds, with the resulting token.
*/
subEntityId: string;
successCallback?: (user: UserProfile) => void;
/**
* The label for the sub-entity that should be displayed when the deep link is rendered in a client.
* A function that is called if the token request fails, with the reason for the failure.
*/
subEntityLabel: string;
/**
* The fallback URL to which to navigate the user if the client cannot render the page.
* This URL should lead directly to the sub-entity.
*/
subEntityWebUrl?: string;
failureCallback?: (reason: string) => void;
}

@@ -803,139 +593,344 @@ /**

*/
interface FilePreviewParameters {
interface UserProfile {
/**
* The developer-defined unique ID for the file.
* The intended recipient of the token. The application that receives the token must verify that the audience
* value is correct and reject any tokens intended for a different audience.
*/
entityId: string;
aud: string;
/**
* The display name of the file.
* Identifies how the subject of the token was authenticated.
*/
title: string;
amr: string[];
/**
* An optional description of the file.
* Stores the time at which the token was issued. It is often used to measure token freshness.
*/
description?: string;
iat: number;
/**
* The file extension; e.g. pptx, docx, etc.
* Identifies the security token service (STS) that constructs and returns the token. In the tokens that Azure AD
* returns, the issuer is sts.windows.net. The GUID in the issuer claim value is the tenant ID of the Azure AD
* directory. The tenant ID is an immutable and reliable identifier of the directory.
*/
type: string;
iss: string;
/**
* A url to the source of the file, used to open the content in the user's default browser
* Provides the last name, surname, or family name of the user as defined in the Azure AD user object.
*/
objectUrl: string;
family_name: string;
/**
* Optional; an alternate self-authenticating url used to preview the file in Mobile clients and offer it for download by the user
* Provides the first or "given" name of the user, as set on the Azure AD user object.
*/
downloadUrl?: string;
given_name: string;
/**
* Optional; an alternate url optimized for previewing the file in Teams web and desktop clients
* Provides a human-readable value that identifies the subject of the token. This value is not guaranteed to
* be unique within a tenant and is designed to be used only for display purposes.
*/
webPreviewUrl?: string;
unique_name: string;
/**
* Optional; an alternate url that allows editing of the file in Teams web and desktop clients
* Contains a unique identifier of an object in Azure AD. This value is immutable and cannot be reassigned or
* reused. Use the object ID to identify an object in queries to Azure AD.
*/
webEditUrl?: string;
oid: string;
/**
* Optional; the base url of the site where the file is hosted
* Identifies the principal about which the token asserts information, such as the user of an application.
* This value is immutable and cannot be reassigned or reused, so it can be used to perform authorization
* checks safely. Because the subject is always present in the tokens the Azure AD issues, we recommended
* using this value in a general-purpose authorization system.
*/
baseUrl?: string;
sub: string;
/**
* Optional; indicates whether the file should be opened in edit mode
* An immutable, non-reusable identifier that identifies the directory tenant that issued the token. You can
* use this value to access tenant-specific directory resources in a multitenant application. For example,
* you can use this value to identify the tenant in a call to the Graph API.
*/
editFile?: boolean;
tid: string;
/**
* Optional; the developer-defined unique ID for the sub-entity to return to when the file stage closes.
* This field should be used to restore to a specific state within an entity, such as scrolling to or activating a specific piece of content.
* Defines the time interval within which a token is valid. The service that validates the token should verify
* that the current date is within the token lifetime; otherwise it should reject the token. The service might
* allow for up to five minutes beyond the token lifetime to account for any differences in clock time ("time
* skew") between Azure AD and the service.
*/
subEntityId?: string;
}
/**
* @private
* Internal use only
* Sends a custom action message to Teams.
* @param actionName Specifies name of the custom action to be sent
* @param args Specifies additional arguments passed to the action
* @returns id of sent message
*/
function sendCustomMessage(actionName: string, args?: any[]): number;
interface TaskInfo {
exp: number;
nbf: number;
/**
* The url to be rendered in the webview/iframe.
* Stores the user name of the user principal.
*/
url?: string;
upn: string;
/**
* JSON defining an adaptive card.
* Stores the version number of the token.
*/
card?: string;
/**
* The requested height of the webview/iframe.
*/
height?: TaskModuleDimension | Number;
/**
* The requested width of the webview/iframe.
*/
width?: TaskModuleDimension | Number;
/**
* Title of the task module.
*/
title?: string;
/**
* If client doesnt support the URL, the URL that needs to be opened in the browser.
*/
fallbackUrl?: string;
/**
* Specifies a bot ID to send the result of the user's interaction with the task module.
* If specified, the bot will receive a task/complete invoke event with a JSON object
* in the event payload.
*/
completionBotId?: string;
ver: string;
}
}
export interface Context {
/**
* Namespace to interact with the task module-specific part of the SDK.
* This object is usable only on the content frame.
* The Office 365 group ID for the team with which the content is associated.
* This field is available only when the identity permission is requested in the manifest.
*/
namespace tasks {
/**
* Allows an app to open the task module.
* @param taskInfo An object containing the parameters of the task module
* @param submitHandler Handler to call when the task module is completed
*/
function startTask(taskInfo: TaskInfo, submitHandler?: (err: string, result: string) => void): void;
/**
* Submit the task module.
* @param result Contains the result to be sent to the bot or the app. Typically a JSON object or a serialized version of it
* @param appIds Helps to validate that the call originates from the same appId as the one that invoked the task module
*/
function submitTask(result?: string | object, appIds?: string | string[]): void;
}
groupId?: string;
/**
* @private
* Hide from docs
* --------
* Information about all members in a chat
* The Microsoft Teams ID for the team with which the content is associated.
*/
interface ChatMembersInformation {
members: ThreadMember[];
}
teamId?: string;
/**
* @private
* Hide from docs
* --------
* Information about a chat member
* The name for the team with which the content is associated.
*/
interface ThreadMember {
/**
* The member's user principal name in the current tenant.
*/
upn: string;
}
teamName?: string;
/**
* @private
* Hide from docs
* ------
* Allows an app to retrieve information of all chat members
* The Microsoft Teams ID for the channel with which the content is associated.
*/
channelId?: string;
/**
* The name for the channel with which the content is associated.
*/
channelName?: string;
/**
* The developer-defined unique ID for the entity this content points to.
*/
entityId: string;
/**
* The developer-defined unique ID for the sub-entity this content points to.
* This field should be used to restore to a specific state within an entity, such as scrolling to or activating a specific piece of content.
*/
subEntityId?: string;
/**
* The current locale that the user has configured for the app formatted as
* languageId-countryId (for example, en-us).
*/
locale: string;
/**
* @deprecated Use loginHint or userPrincipalName.
* The UPN of the current user.
* Because a malicious party can run your content in a browser, this value should
* be used only as a hint as to who the user is and never as proof of identity.
* This field is available only when the identity permission is requested in the manifest.
*/
upn?: string;
/**
* The Azure AD tenant ID of the current user.
* Because a malicious party can run your content in a browser, this value should
* be used only as a hint as to who the user is and never as proof of identity.
* This field is available only when the identity permission is requested in the manifest.
*/
tid?: string;
/**
* The current UI theme.
*/
theme?: string;
/**
* Indication whether the tab is in full-screen mode.
*/
isFullScreen?: boolean;
/**
* The type of the team.
*/
teamType?: TeamType;
/**
* The root ShatePoint folder associated with the team.
*/
teamSiteUrl?: string;
/**
* The relative path to the SharePoint folder associated with the channel.
*/
channelRelativeUrl?: string;
/**
* Unique ID for the current Teams session for use in correlating telemetry data.
*/
sessionId?: string;
/**
* The user's role in the team.
* Because a malicious party can run your content in a browser, this value should
* be used only as a hint as to the user's role, and never as proof of her role.
*/
userTeamRole?: UserTeamRole;
/**
* The Microsoft Teams ID for the chat with which the content is associated.
*/
chatId?: string;
/**
* A value suitable for use as a login_hint when authenticating with Azure AD.
* Because a malicious party can run your content in a browser, this value should
* be used only as a hint as to who the user is and never as proof of identity.
* This field is available only when the identity permission is requested in the manifest.
*/
loginHint?: string;
/**
* The UPN of the current user. This may be an externally-authenticated UPN (e.g., guest users).
* Because a malicious party run your content in a browser, this value should
* be used only as a hint as to who the members are and never as proof of membership.
* @param callback The callback to invoke when the {@link ChatMembersInformation} object is retrieved.
* be used only as a hint as to who the user is and never as proof of identity.
* This field is available only when the identity permission is requested in the manifest.
*/
function getChatMembers(callback: (chatMembersInformation: ChatMembersInformation) => void): void;
userPrincipalName?: string;
/**
* The Azure AD object id of the current user.
* Because a malicious party run your content in a browser, this value should
* be used only as a hint as to who the user is and never as proof of identity.
* This field is available only when the identity permission is requested in the manifest.
*/
userObjectId?: string;
/**
* Indicates wheather team is archived.
* Apps should use this as a signal to prevent any changes to content associated with archived teams.
*/
isTeamArchived?: boolean;
/**
* The type of the host client. Possible values are : android, ios, web, desktop
*/
hostClientType?: HostClientType;
}
export interface DeepLinkParameters {
/**
* The developer-defined unique ID for the sub-entity to which this deep link points in the current entity.
* This field should be used to restore to a specific state within an entity, such as scrolling to or activating a specific piece of content.
*/
subEntityId: string;
/**
* The label for the sub-entity that should be displayed when the deep link is rendered in a client.
*/
subEntityLabel: string;
/**
* The fallback URL to which to navigate the user if the client cannot render the page.
* This URL should lead directly to the sub-entity.
*/
subEntityWebUrl?: string;
}
/**
* @private
* Hide from docs.
* ------
*/
export interface FilePreviewParameters {
/**
* The developer-defined unique ID for the file.
*/
entityId: string;
/**
* The display name of the file.
*/
title: string;
/**
* An optional description of the file.
*/
description?: string;
/**
* The file extension; e.g. pptx, docx, etc.
*/
type: string;
/**
* A url to the source of the file, used to open the content in the user's default browser
*/
objectUrl: string;
/**
* Optional; an alternate self-authenticating url used to preview the file in Mobile clients and offer it for download by the user
*/
downloadUrl?: string;
/**
* Optional; an alternate url optimized for previewing the file in Teams web and desktop clients
*/
webPreviewUrl?: string;
/**
* Optional; an alternate url that allows editing of the file in Teams web and desktop clients
*/
webEditUrl?: string;
/**
* Optional; the base url of the site where the file is hosted
*/
baseUrl?: string;
/**
* Optional; indicates whether the file should be opened in edit mode
*/
editFile?: boolean;
/**
* Optional; the developer-defined unique ID for the sub-entity to return to when the file stage closes.
* This field should be used to restore to a specific state within an entity, such as scrolling to or activating a specific piece of content.
*/
subEntityId?: string;
}
/**
* @private
* Internal use only
* Sends a custom action message to Teams.
* @param actionName Specifies name of the custom action to be sent
* @param args Specifies additional arguments passed to the action
* @returns id of sent message
*/
export declare function sendCustomMessage(actionName: string, args?: any[]): number;
export interface TaskInfo {
/**
* The url to be rendered in the webview/iframe.
*/
url?: string;
/**
* JSON defining an adaptive card.
*/
card?: string;
/**
* The requested height of the webview/iframe.
*/
height?: TaskModuleDimension | Number;
/**
* The requested width of the webview/iframe.
*/
width?: TaskModuleDimension | Number;
/**
* Title of the task module.
*/
title?: string;
/**
* If client doesnt support the URL, the URL that needs to be opened in the browser.
*/
fallbackUrl?: string;
/**
* Specifies a bot ID to send the result of the user's interaction with the task module.
* If specified, the bot will receive a task/complete invoke event with a JSON object
* in the event payload.
*/
completionBotId?: string;
}
/**
* Namespace to interact with the task module-specific part of the SDK.
* This object is usable only on the content frame.
*/
export declare namespace tasks {
/**
* Allows an app to open the task module.
* @param taskInfo An object containing the parameters of the task module
* @param submitHandler Handler to call when the task module is completed
*/
function startTask(taskInfo: TaskInfo, submitHandler?: (err: string, result: string) => void): void;
/**
* Submit the task module.
* @param result Contains the result to be sent to the bot or the app. Typically a JSON object or a serialized version of it
* @param appIds Helps to validate that the call originates from the same appId as the one that invoked the task module
*/
function submitTask(result?: string | object, appIds?: string | string[]): void;
}
/**
* @private
* Hide from docs
* --------
* Information about all members in a chat
*/
export interface ChatMembersInformation {
members: ThreadMember[];
}
/**
* @private
* Hide from docs
* --------
* Information about a chat member
*/
export interface ThreadMember {
/**
* The member's user principal name in the current tenant.
*/
upn: string;
}
/**
* @private
* Hide from docs
* ------
* Allows an app to retrieve information of all chat members
* Because a malicious party run your content in a browser, this value should
* be used only as a hint as to who the members are and never as proof of membership.
* @param callback The callback to invoke when the {@link ChatMembersInformation} object is retrieved.
*/
export declare function getChatMembers(callback: (chatMembersInformation: ChatMembersInformation) => void): void;
{
"name": "@microsoft/teams-js",
"author": "Microsoft Teams",
"version": "1.4.0-beta.3.1",
"version": "1.4.0-beta.3.2",
"description": "Microsoft Client SDK for building app for Microsoft teams",

@@ -6,0 +6,0 @@ "main": "./dist/MicrosoftTeams.min.js",

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc