2988da0981
Biggest changes forced by this: alt tags for all images, resulting in new strings added to messages.json, and a new i18n paramter/prop added in a plot of places. Another change of note is that there are two new tslint.json files under ts/test and ts/styleguide to relax our rules a bit there. This required a change to our package.json script, as manually specifying the config file there made it ignore our tslint.json files in subdirectories
101 lines
2.3 KiB
TypeScript
101 lines
2.3 KiB
TypeScript
/**
|
|
* @prettier
|
|
*/
|
|
import React from 'react';
|
|
|
|
import * as MIME from '../types/MIME';
|
|
import { Lightbox } from './Lightbox';
|
|
import { Message } from './conversation/media-gallery/types/Message';
|
|
|
|
import { Localizer } from '../types/Util';
|
|
|
|
interface Item {
|
|
objectURL?: string;
|
|
contentType: MIME.MIMEType | undefined;
|
|
}
|
|
|
|
interface Props {
|
|
close: () => void;
|
|
i18n: Localizer;
|
|
messages: Array<Message>;
|
|
onSave?: ({ message }: { message: Message }) => void;
|
|
selectedIndex: number;
|
|
}
|
|
|
|
interface State {
|
|
selectedIndex: number;
|
|
}
|
|
|
|
const messageToItem = (message: Message): Item => ({
|
|
objectURL: message.objectURL,
|
|
contentType: message.attachments[0].contentType,
|
|
});
|
|
|
|
export class LightboxGallery extends React.Component<Props, State> {
|
|
public static defaultProps: Partial<Props> = {
|
|
selectedIndex: 0,
|
|
};
|
|
|
|
constructor(props: Props) {
|
|
super(props);
|
|
|
|
this.state = {
|
|
selectedIndex: this.props.selectedIndex,
|
|
};
|
|
}
|
|
|
|
public render() {
|
|
const { close, messages, onSave, i18n } = this.props;
|
|
const { selectedIndex } = this.state;
|
|
|
|
const selectedMessage: Message = messages[selectedIndex];
|
|
const selectedItem = messageToItem(selectedMessage);
|
|
|
|
const firstIndex = 0;
|
|
const onPrevious =
|
|
selectedIndex > firstIndex ? this.handlePrevious : undefined;
|
|
|
|
const lastIndex = messages.length - 1;
|
|
const onNext = selectedIndex < lastIndex ? this.handleNext : undefined;
|
|
|
|
const objectURL = selectedItem.objectURL || 'images/alert-outline.svg';
|
|
|
|
return (
|
|
<Lightbox
|
|
close={close}
|
|
onPrevious={onPrevious}
|
|
onNext={onNext}
|
|
onSave={onSave ? this.handleSave : undefined}
|
|
objectURL={objectURL}
|
|
contentType={selectedItem.contentType}
|
|
i18n={i18n}
|
|
/>
|
|
);
|
|
}
|
|
|
|
private handlePrevious = () => {
|
|
this.setState(prevState => ({
|
|
selectedIndex: Math.max(prevState.selectedIndex - 1, 0),
|
|
}));
|
|
};
|
|
|
|
private handleNext = () => {
|
|
this.setState((prevState, props) => ({
|
|
selectedIndex: Math.min(
|
|
prevState.selectedIndex + 1,
|
|
props.messages.length - 1
|
|
),
|
|
}));
|
|
};
|
|
|
|
private handleSave = () => {
|
|
const { messages, onSave } = this.props;
|
|
if (!onSave) {
|
|
return;
|
|
}
|
|
|
|
const { selectedIndex } = this.state;
|
|
const message = messages[selectedIndex];
|
|
onSave({ message });
|
|
};
|
|
}
|