df9d12622d
Co-authored-by: gorbenko.pavel <gorbenko.pavel@tansu.kz> Reviewed-on: http://git.tnsu.kz/timur.gorodetskiy/request-portal/pulls/3
127 lines
4.1 KiB
TypeScript
127 lines
4.1 KiB
TypeScript
import * as React from 'react';
|
|
import * as ReactDom from 'react-dom';
|
|
import { Version } from '@microsoft/sp-core-library';
|
|
import {
|
|
type IPropertyPaneConfiguration,
|
|
PropertyPaneTextField
|
|
} from '@microsoft/sp-property-pane';
|
|
import { BaseClientSideWebPart } from '@microsoft/sp-webpart-base';
|
|
import { IReadonlyTheme } from '@microsoft/sp-component-base';
|
|
|
|
import * as strings from 'RequestPortalWebPartStrings';
|
|
import RequestPortal from './components/RequestPortal';
|
|
import { IRequestPortalProps } from './components/IRequestPortalProps';
|
|
import { initSP } from './shared/pnp/pnpjs';
|
|
import { ErrorOverlay } from './shared/ui';
|
|
|
|
export interface IRequestPortalWebPartProps {
|
|
description: string;
|
|
}
|
|
|
|
export default class RequestPortalWebPart extends BaseClientSideWebPart<IRequestPortalWebPartProps> {
|
|
|
|
private _isDarkTheme: boolean = false;
|
|
private _environmentMessage: string = '';
|
|
|
|
public render(): void {
|
|
const element: React.ReactElement = React.createElement(
|
|
ErrorOverlay,
|
|
undefined,
|
|
React.createElement<IRequestPortalProps>(RequestPortal, {
|
|
description: this.properties.description,
|
|
isDarkTheme: this._isDarkTheme,
|
|
environmentMessage: this._environmentMessage,
|
|
hasTeamsContext: !!this.context.sdks.microsoftTeams,
|
|
userDisplayName: this.context.pageContext.user.displayName,
|
|
context: this.context
|
|
})
|
|
);
|
|
|
|
ReactDom.render(element, this.domElement);
|
|
}
|
|
|
|
protected onInit(): Promise<void> {
|
|
initSP(this.context); // единый клиент PnPjs для записи в списки
|
|
return this._getEnvironmentMessage().then(message => {
|
|
this._environmentMessage = message;
|
|
});
|
|
}
|
|
|
|
|
|
|
|
private _getEnvironmentMessage(): Promise<string> {
|
|
if (!!this.context.sdks.microsoftTeams) { // running in Teams, office.com or Outlook
|
|
return this.context.sdks.microsoftTeams.teamsJs.app.getContext()
|
|
.then(context => {
|
|
let environmentMessage: string = '';
|
|
switch (context.app.host.name) {
|
|
case 'Office': // running in Office
|
|
environmentMessage = this.context.isServedFromLocalhost ? strings.AppLocalEnvironmentOffice : strings.AppOfficeEnvironment;
|
|
break;
|
|
case 'Outlook': // running in Outlook
|
|
environmentMessage = this.context.isServedFromLocalhost ? strings.AppLocalEnvironmentOutlook : strings.AppOutlookEnvironment;
|
|
break;
|
|
case 'Teams': // running in Teams
|
|
case 'TeamsModern':
|
|
environmentMessage = this.context.isServedFromLocalhost ? strings.AppLocalEnvironmentTeams : strings.AppTeamsTabEnvironment;
|
|
break;
|
|
default:
|
|
environmentMessage = strings.UnknownEnvironment;
|
|
}
|
|
|
|
return environmentMessage;
|
|
});
|
|
}
|
|
|
|
return Promise.resolve(this.context.isServedFromLocalhost ? strings.AppLocalEnvironmentSharePoint : strings.AppSharePointEnvironment);
|
|
}
|
|
|
|
protected onThemeChanged(currentTheme: IReadonlyTheme | undefined): void {
|
|
if (!currentTheme) {
|
|
return;
|
|
}
|
|
|
|
this._isDarkTheme = !!currentTheme.isInverted;
|
|
const {
|
|
semanticColors
|
|
} = currentTheme;
|
|
|
|
if (semanticColors) {
|
|
this.domElement.style.setProperty('--bodyText', semanticColors.bodyText || null);
|
|
this.domElement.style.setProperty('--link', semanticColors.link || null);
|
|
this.domElement.style.setProperty('--linkHovered', semanticColors.linkHovered || null);
|
|
}
|
|
|
|
}
|
|
|
|
protected onDispose(): void {
|
|
ReactDom.unmountComponentAtNode(this.domElement);
|
|
}
|
|
|
|
protected get dataVersion(): Version {
|
|
return Version.parse('1.0');
|
|
}
|
|
|
|
protected getPropertyPaneConfiguration(): IPropertyPaneConfiguration {
|
|
return {
|
|
pages: [
|
|
{
|
|
header: {
|
|
description: strings.PropertyPaneDescription
|
|
},
|
|
groups: [
|
|
{
|
|
groupName: strings.BasicGroupName,
|
|
groupFields: [
|
|
PropertyPaneTextField('description', {
|
|
label: strings.DescriptionFieldLabel
|
|
})
|
|
]
|
|
}
|
|
]
|
|
}
|
|
]
|
|
};
|
|
}
|
|
}
|