/** Признак настольного/мобильного Teams в User-Agent (классический и новый клиент). */ const TEAMS_USER_AGENT = /\bTeams\//i; /** Страница открыта не на верхнем уровне окна, а внутри фрейма (вкладка Teams). */ function isInsideFrame(): boolean { try { return window.self !== window.top; } catch { // Доступ к window.top из чужого домена бросает исключение — это тоже фрейм. return true; } } /** * Открыт ли портал внутри Teams. Teams-контекста SPFx (sdks.microsoftTeams) * недостаточно: он есть только у приложения/вкладки SPFx. Если в Teams * закреплена обычная страница SharePoint (вкладка «Сайт»/«SharePoint»), веб-часть * думает, что она в браузере, — поэтому смотрим ещё на фрейм и User-Agent. * В браузере страница портала открыта на верхнем уровне и без «Teams/» в UA. */ export function isOpenedInTeams(hasTeamsContext: boolean): boolean { return hasTeamsContext || isInsideFrame() || TEAMS_USER_AGENT.test(navigator.userAgent); }