4c851b4892
Tests / frontend-test (push) Successful in 1m19s
Если в Teams закреплена обычная страница SharePoint, SPFx не передаёт веб-части Teams-контекст, и объявление «открывайте в браузере» не показывалось. Теперь Teams определяется ещё по фрейму и User-Agent. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
24 lines
1.3 KiB
TypeScript
24 lines
1.3 KiB
TypeScript
/** Признак настольного/мобильного 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);
|
|
}
|