bug fix - mediatype not being assigned correctly

This commit is contained in:
Don Kirkham 2020-10-30 08:41:57 -05:00
parent f5d81dd70b
commit 8520b2cd03
1 changed files with 196 additions and 192 deletions

View File

@ -19,225 +19,229 @@ import * as strings from 'CarouselWebPartStrings';
import { DisplayMode } from '@microsoft/sp-core-library';
import { CommunicationColors } from '@uifabric/fluent-theme/lib/fluent/FluentColors';
import {
Spinner,
SpinnerSize,
MessageBar,
MessageBarType,
Label,
Icon,
ImageFit,
Image,
ImageLoadState,
Spinner,
SpinnerSize,
MessageBar,
MessageBarType,
Label,
Icon,
ImageFit,
Image,
ImageLoadState,
} from 'office-ui-fabric-react';
export default class Carousel extends React.Component<ICarouselProps, ICarouselState> {
private spService: spservices = null;
private _teamsContext: microsoftTeams.Context = null;
private spService: spservices = null;
private _teamsContext: microsoftTeams.Context = null;
public constructor(props: ICarouselProps) {
super(props);
this.spService = new spservices(this.props.context);
public constructor(props: ICarouselProps) {
super(props);
this.spService = new spservices(this.props.context);
if (this.props.context.microsoftTeams) {
this.props.context.microsoftTeams.getContext(context => {
this._teamsContext = context;
console.log('ctt', this._teamsContext.theme);
this.setState({ teamsTheme: this._teamsContext.theme });
});
if (this.props.context.microsoftTeams) {
this.props.context.microsoftTeams.getContext(context => {
this._teamsContext = context;
console.log('ctt', this._teamsContext.theme);
this.setState({ teamsTheme: this._teamsContext.theme });
});
}
}
this.state = {
isLoading: false,
errorMessage: '',
hasError: false,
teamsTheme: 'default',
photoIndex: 0,
carouselImages: [],
loadingImage: true
};
}
this.state = {
isLoading: false,
errorMessage: '',
hasError: false,
teamsTheme: 'default',
photoIndex: 0,
carouselImages: [],
loadingImage: true
};
}
private onConfigure() {
// Context of the web part
this.props.context.propertyPane.open();
}
private onConfigure() {
// Context of the web part
this.props.context.propertyPane.open();
}
private async loadPictures() {
private async loadPictures() {
this.setState({ isLoading: true, hasError: false });
const tenantUrl = `https://${location.host}`;
let galleryImages: ICarouselImages[] = [];
let carouselImages: React.ReactElement<HTMLElement>[] = [];
this.setState({ isLoading: true, hasError: false });
const tenantUrl = `https://${location.host}`;
let galleryImages: ICarouselImages[] = [];
let carouselImages: React.ReactElement<HTMLElement>[] = [];
try {
const images = await this.spService.getImages(this.props.siteUrl, this.props.list, this.props.numberImages);
try {
const images = await this.spService.getImages(this.props.siteUrl, this.props.list, this.props.numberImages);
for (const image of images) {
for (const image of images) {
if (image.FileSystemObjectType == 1) continue; // by pass folder item
const pURL = `${tenantUrl}/_api/v2.0/sharePoint:${image.File.ServerRelativeUrl}:/driveItem/thumbnails/0/large/content?preferNoRedirect=true `;
const thumbnailUrl = `${tenantUrl}/_api/v2.0/sharePoint:${image.File.ServerRelativeUrl}:/driveItem/thumbnails/0/c240x240/content?preferNoRedirect=true `;
if (image.FileSystemObjectType == 1) continue; // by pass folder item
const pURL = `${tenantUrl}/_api/v2.0/sharePoint:${image.File.ServerRelativeUrl}:/driveItem/thumbnails/0/large/content?preferNoRedirect=true `;
const thumbnailUrl = `${tenantUrl}/_api/v2.0/sharePoint:${image.File.ServerRelativeUrl}:/driveItem/thumbnails/0/c240x240/content?preferNoRedirect=true `;
let mediaType: string = '';
switch (image.File_x0020_Type) {
case ('jpg' || 'jpeg' || 'png' || 'tiff' || 'gif'):
mediaType = 'image';
break;
case ('mp4'):
mediaType = 'video';
break;
default:
continue;
break;
}
let mediaType: string = '';
switch (image.File_x0020_Type) {
case 'jpg':
case 'jpeg':
case 'png':
case 'tiff':
case 'gif':
mediaType = 'image';
break;
case 'mp4':
mediaType = 'video';
break;
default:
continue;
break;
}
galleryImages.push(
{
imageUrl: pURL,
mediaType: mediaType,
serverRelativeUrl: image.File.ServerRelativeUrl,
caption: image.Title ? image.Title : image.File.Name,
description: image.Description ? image.Description : '',
linkUrl: ''
},
);
galleryImages.push(
{
imageUrl: pURL,
mediaType: mediaType,
serverRelativeUrl: image.File.ServerRelativeUrl,
caption: image.Title ? image.Title : image.File.Name,
description: image.Description ? image.Description : '',
linkUrl: ''
},
);
// Create Carousel Slides from Images
// Create Carousel Slides from Images
carouselImages = galleryImages.map((galleryImage, i) => {
return (
<div className='slideLoading' >
carouselImages = galleryImages.map((galleryImage, i) => {
return (
<div className='slideLoading' >
{galleryImage.mediaType == 'video' ?
<div >
<Player
poster={galleryImage.imageUrl}
style={{ width: '100%', height: '400px' }}>
<BigPlayButton position="center" />
<source src={galleryImage.serverRelativeUrl}
/>
</Player>
</div>
:
<div>
<Image src={galleryImage.imageUrl}
onLoadingStateChange={async (loadState: ImageLoadState) => {
console.log('imageload Status ' + i, loadState, galleryImage.imageUrl);
if (loadState == ImageLoadState.loaded) {
this.setState({ loadingImage: false });
}
}}
height={'400px'}
imageFit={ImageFit.cover}
/>
<div style={{ background: 'rgba(0, 0, 0, 0.3)',overflow:'hidden', fontSize: FontSizes.size16, top:0, transition: '.7s ease', textAlign: 'left', width: '200px', height: '350px', position: 'absolute', color: '#ffffff', padding: '25px' }}>
<h2 style={{fontSize: FontSizes.size20, textTransform: 'uppercase', color: 'white' }}>{galleryImage.caption}</h2>
<p>{galleryImage.description}</p>
</div>
{galleryImage.mediaType == 'video' ?
<div >
<Player
poster={galleryImage.imageUrl}
style={{ width: '100%', height: '400px' }}>
<BigPlayButton position="center" />
<source src={galleryImage.serverRelativeUrl}
/>
</Player>
</div>
:
<div>
<Image src={galleryImage.imageUrl}
onLoadingStateChange={async (loadState: ImageLoadState) => {
console.log('imageload Status ' + i, loadState, galleryImage.imageUrl);
if (loadState == ImageLoadState.loaded) {
this.setState({ loadingImage: false });
}
}}
height={'400px'}
imageFit={ImageFit.cover}
/>
<div style={{ background: 'rgba(0, 0, 0, 0.3)', overflow: 'hidden', fontSize: FontSizes.size16, top: 0, transition: '.7s ease', textAlign: 'left', width: '200px', height: '350px', position: 'absolute', color: '#ffffff', padding: '25px' }}>
<h2 style={{ fontSize: FontSizes.size20, textTransform: 'uppercase', color: 'white' }}>{galleryImage.caption}</h2>
<p>{galleryImage.description}</p>
</div>
</div>
}
</div>
);
}
);
</div>
}
</div>
);
}
);
this.setState({ carouselImages: carouselImages, isLoading: false });
}
} catch (error) {
this.setState({ hasError: true, errorMessage: decodeURIComponent(error.message) });
}
}
this.setState({ carouselImages: carouselImages, isLoading: false });
}
} catch (error) {
this.setState({ hasError: true, errorMessage: decodeURIComponent(error.message) });
}
}
public async componentDidMount() {
await this.loadPictures();
}
public async componentDidMount() {
await this.loadPictures();
}
public async componentDidUpdate(prevProps: ICarouselProps) {
public async componentDidUpdate(prevProps: ICarouselProps) {
if (!this.props.list || !this.props.siteUrl) return;
// Get Properties change
if (prevProps.list !== this.props.list || prevProps.numberImages !== this.props.numberImages) {
/*
this.galleryImages = [];
this._carouselImages = [];
this.setState({ images: this.galleryImages, carouselImages: t.his._carouselImages, isLoading: false });
*/
await this.loadPictures();
}
}
public render(): React.ReactElement<ICarouselProps> {
const sliderSettings = {
dots: true,
infinite: true,
speed: 500,
slidesToShow: 1,
slidesToScroll: 1,
lazyLoad: 'progressive',
autoplaySpeed: 3000,
initialSlide: this.state.photoIndex,
arrows: true,
draggable: true,
adaptiveHeight: true,
useCSS: true,
useTransform: true,
};
if (!this.props.list || !this.props.siteUrl) return;
// Get Properties change
if (prevProps.list !== this.props.list || prevProps.numberImages !== this.props.numberImages) {
/*
this.galleryImages = [];
this._carouselImages = [];
this.setState({ images: this.galleryImages, carouselImages: t.his._carouselImages, isLoading: false });
*/
await this.loadPictures();
}
}
public render(): React.ReactElement<ICarouselProps> {
const sliderSettings = {
dots: true,
infinite: true,
speed: 500,
slidesToShow: 1,
slidesToScroll: 1,
lazyLoad: 'progressive',
autoplaySpeed: 3000,
initialSlide: this.state.photoIndex,
arrows: true,
draggable: true,
adaptiveHeight: true,
useCSS: true,
useTransform: true,
};
return (
<div className={styles.carousel}>
<div>
</div>
{
(!this.props.list) ?
<Placeholder iconName='Edit'
iconText={strings.WebpartConfigIconText}
description={strings.WebpartConfigDescription}
buttonLabel={strings.WebPartConfigButtonLabel}
hideButton={this.props.displayMode === DisplayMode.Read}
onConfigure={this.onConfigure.bind(this)} />
:
this.state.hasError ?
<MessageBar messageBarType={MessageBarType.error}>
{this.state.errorMessage}
</MessageBar>
:
this.state.isLoading ?
<Spinner size={SpinnerSize.large} label='loading images...' />
:
this.state.carouselImages.length == 0 ?
<div style={{ width: '300px', margin: 'auto' }}>
<Icon iconName="PhotoCollection"
style={{ fontSize: '250px', color: '#d9d9d9' }} />
<Label style={{ width: '250px', margin: 'auto', fontSize: FontSizes.size20 }}>No images in the library</Label>
</div>
:
<div style={{ width: '100%', height: '100%'}}>
return (
<div className={styles.carousel}>
<div>
</div>
{
(!this.props.list) ?
<Placeholder iconName='Edit'
iconText={strings.WebpartConfigIconText}
description={strings.WebpartConfigDescription}
buttonLabel={strings.WebPartConfigButtonLabel}
hideButton={this.props.displayMode === DisplayMode.Read}
onConfigure={this.onConfigure.bind(this)} />
:
this.state.hasError ?
<MessageBar messageBarType={MessageBarType.error}>
{this.state.errorMessage}
</MessageBar>
:
this.state.isLoading ?
<Spinner size={SpinnerSize.large} label='loading images...' />
:
this.state.carouselImages.length == 0 ?
<div style={{ width: '300px', margin: 'auto' }}>
<Icon iconName="PhotoCollection"
style={{ fontSize: '250px', color: '#d9d9d9' }} />
<Label style={{ width: '250px', margin: 'auto', fontSize: FontSizes.size20 }}>No images in the library</Label>
</div>
:
<div style={{ width: '100%', height: '100%' }}>
<div style={{ width: '100%'}}>
<Slider
{...sliderSettings}
autoplay={true}
onReInit={() => {
if (!this.state.loadingImage)
$(".slideLoading").removeClass("slideLoading");
}}>
{
this.state.carouselImages
}
</Slider>
</div>
{
this.state.loadingImage &&
<Spinner size={SpinnerSize.small} label={'Loading...'} style={{verticalAlign:'middle', right:'30%', top:20, position: 'absolute', fontSize: FontSizes.size18, color: CommunicationColors.primary }}></Spinner>
}
</div>
}
</div>
);
}
<div style={{ width: '100%' }}>
<Slider
{...sliderSettings}
autoplay={true}
onReInit={() => {
if (!this.state.loadingImage)
$(".slideLoading").removeClass("slideLoading");
}}>
{
this.state.carouselImages
}
</Slider>
</div>
{
this.state.loadingImage &&
<Spinner size={SpinnerSize.small} label={'Loading...'} style={{ verticalAlign: 'middle', right: '30%', top: 20, position: 'absolute', fontSize: FontSizes.size18, color: CommunicationColors.primary }}></Spinner>
}
</div>
}
</div>
);
}
}