fix: объявление в Teams видно и во вкладке-сайте SharePoint
Tests / frontend-test (push) Successful in 1m19s
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:
@@ -29,6 +29,7 @@ import { confirmDiscardFormChanges, markFormClean, markFormDirty } from '../shar
|
||||
import { Drawer } from './Drawer/Drawer';
|
||||
import { CategoryTabs } from './CategoryTabs/CategoryTabs';
|
||||
import { TeamsBrowserNotice } from './TeamsBrowserNotice/TeamsBrowserNotice';
|
||||
import { isOpenedInTeams } from '../shared/hostEnvironment';
|
||||
import { CATEGORIES, DEFAULT_CATEGORY_ID } from '../data/categories';
|
||||
import { REQUEST_TYPES } from '../data/requests';
|
||||
import SubmitFeature from '../features/submit/SubmitFeature';
|
||||
@@ -456,7 +457,7 @@ const RequestPortal: React.FC<IRequestPortalProps> = ({ hasTeamsContext, context
|
||||
onInput={markFormDirty}
|
||||
onChange={markFormDirty}
|
||||
>
|
||||
{hasTeamsContext && <TeamsBrowserNotice />}
|
||||
{isOpenedInTeams(hasTeamsContext) && <TeamsBrowserNotice />}
|
||||
<div className={styles.tabsWrap}>
|
||||
<CategoryTabs
|
||||
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);
|
||||
}
|
||||
Reference in New Issue
Block a user