fix: объявление в Teams видно и во вкладке-сайте SharePoint
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>
This commit is contained in:
Тимур Городецкий
2026-10-02 09:43:20 +05:00
parent 1e316a9558
commit 4c851b4892
2 changed files with 25 additions and 1 deletions
@@ -29,6 +29,7 @@ import { confirmDiscardFormChanges, markFormClean, markFormDirty } from '../shar
import { Drawer } from './Drawer/Drawer'; import { Drawer } from './Drawer/Drawer';
import { CategoryTabs } from './CategoryTabs/CategoryTabs'; import { CategoryTabs } from './CategoryTabs/CategoryTabs';
import { TeamsBrowserNotice } from './TeamsBrowserNotice/TeamsBrowserNotice'; import { TeamsBrowserNotice } from './TeamsBrowserNotice/TeamsBrowserNotice';
import { isOpenedInTeams } from '../shared/hostEnvironment';
import { CATEGORIES, DEFAULT_CATEGORY_ID } from '../data/categories'; import { CATEGORIES, DEFAULT_CATEGORY_ID } from '../data/categories';
import { REQUEST_TYPES } from '../data/requests'; import { REQUEST_TYPES } from '../data/requests';
import SubmitFeature from '../features/submit/SubmitFeature'; import SubmitFeature from '../features/submit/SubmitFeature';
@@ -456,7 +457,7 @@ const RequestPortal: React.FC<IRequestPortalProps> = ({ hasTeamsContext, context
onInput={markFormDirty} onInput={markFormDirty}
onChange={markFormDirty} onChange={markFormDirty}
> >
{hasTeamsContext && <TeamsBrowserNotice />} {isOpenedInTeams(hasTeamsContext) && <TeamsBrowserNotice />}
<div className={styles.tabsWrap}> <div className={styles.tabsWrap}>
<CategoryTabs <CategoryTabs
categories={CATEGORIES} categories={CATEGORIES}
@@ -0,0 +1,23 @@
/** Признак настольного/мобильного 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);
}