Skip to content

Commit

Permalink
Merge pull request #68 from Cognigy/bug/6292-background-image-url-enc…
Browse files Browse the repository at this point in the history
…oding

change the way background images are handled for messenger messages
  • Loading branch information
pedily authored Oct 30, 2019
2 parents f30316f + 0dc1583 commit 47f266c
Show file tree
Hide file tree
Showing 7 changed files with 25 additions and 23 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,9 @@ import { getMessengerSubtitle } from '../MessengerSubtitle';
import { Carousel } from 'react-responsive-carousel';

import './carousel.css';
import { element } from 'prop-types';
import { IWebchatConfig } from '@cognigy/webchat-client/lib/interfaces/webchat-config';
import { getFlexImage } from '../FlexImage';
import { config } from '../../../../../webchat/store/config/config-reducer';
import { getBackgroundImage } from '../../lib/css';

export interface IMessengerGenericTemplateProps extends IWithFBMActionEventHandler {
payload: IFBMGenericTemplatePayload;
Expand Down Expand Up @@ -62,28 +61,17 @@ export const getMessengerGenericTemplate = ({ React, styled }: MessagePluginFact
}
});

const FixedImage = styled.div<{ src: string }>(({ src }) => ({
const FixedImage = styled.div({
paddingTop: '50%',
backgroundSize: 'cover',
backgroundPosition: 'center center',
backgroundImage: `url("${encodeURI(src)}")`
}));
backgroundPosition: 'center center'
});

const GenericContent = styled(MessengerContent)({
flexGrow: 1
});

const MessengerGenericTemplate = class MessengerGenericTemplate extends React.Component<IMessengerGenericTemplateProps & React.HTMLProps<HTMLDivElement>, IMessengerGenericTemplateState> {
getImageStyles = (element: IFBMGenericTemplateElement) => {
const backgroundImage = `url("${encodeURI(element.image_url)}")`;

const styles: React.CSSProperties = {
backgroundImage
}

return styles;
}

renderElement = (element: IFBMGenericTemplateElement, index?: number) => {

const { onAction, ...divProps } = this.props;
Expand All @@ -93,8 +81,8 @@ export const getMessengerGenericTemplate = ({ React, styled }: MessagePluginFact

const image = image_url
? this.props.config.settings.dynamicImageAspectRatio
? <FlexImage src={image_url} />
: <FixedImage src={image_url} />
? <FlexImage style={{ backgroundImage: getBackgroundImage(image_url) }} />
: <FixedImage style={{ backgroundImage: getBackgroundImage(image_url) }} />
: null

return (
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import { getMessengerContent } from '../../MessengerContent';
import { getMessengerSubtitle } from '../../MessengerSubtitle';
import { getMessengerTitle } from '../../MessengerTitle';
import { getMessengerListButton } from '../../MessengerListButton';
import { getBackgroundImage } from '../../../lib/css';

interface IMessengerListTemplateElementProps extends IWithFBMActionEventHandler {
element: IFBMListTemplateElement;
Expand Down Expand Up @@ -41,7 +42,7 @@ export const getMessengerListTemplateElement = ({ React, styled }: MessagePlugin
const button = buttons && buttons[0];

const imgStyle: React.CSSProperties = {
backgroundImage: `url("${encodeURI(image_url)}")`
backgroundImage: getBackgroundImage(image_url)
}

return (
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import { getFlexImage } from '../../FlexImage';
import { IWebchatConfig } from '@cognigy/webchat-client/lib/interfaces/webchat-config';
import { getMessengerListButton } from '../../MessengerListButton';
import { getButtonLabel } from '../../MessengerButton/lib/messengerButtonHelpers';
import { getBackgroundImage } from '../../../lib/css';

interface IMessengerListTemplateHeaderElementProps extends IWithFBMActionEventHandler {
element: IFBMListTemplateElement;
Expand Down Expand Up @@ -80,7 +81,7 @@ export const getMessengerListTemplateHeaderElement = ({ React, styled }: Message

const image = config.settings.dynamicImageAspectRatio
? <FlexImage src={image_url} />
: <FixedImage style={{ backgroundImage: image_url ? `url("${encodeURI(image_url)}")` : undefined }} />
: <FixedImage style={{ backgroundImage: image_url ? getBackgroundImage(image_url) : undefined }} />

return (
<Root
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import { IWithFBMActionEventHandler } from '../../MessengerPreview.interface';
import { MessagePluginFactoryProps } from '../../../../../common/interfaces/message-plugin';
import { IWebchatConfig } from '@cognigy/webchat-client/lib/interfaces/webchat-config';
import { getFlexImage } from '../FlexImage';
import { getBackgroundImage } from '../../lib/css';

interface IProps extends IWithFBMActionEventHandler {
payload: IFBMMediaTemplatePayload;
Expand Down Expand Up @@ -49,7 +50,7 @@ export const getMessengerMediaTemplate = ({ React, styled }: MessagePluginFactor
if (media_type === 'image') {
const image = config.settings.dynamicImageAspectRatio
? <FlexImage src={url} />
: <FixedImage style={{ backgroundImage: `url("${encodeURI(url)}")` }} />
: <FixedImage style={{ backgroundImage: getBackgroundImage(url) }} />

return (
<MessengerFrame {...divProps}>
Expand Down
9 changes: 9 additions & 0 deletions src/plugins/messenger/MessengerPreview/lib/css.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
export const getBackgroundImage = (url: string) => {
const escapedUrl = url
// remove line breaks
.replace(/\n/g, '')
// escape " and \
.replace(/\"\\/g, char => `\${char}`);

return `url("${escapedUrl}")`
};
3 changes: 2 additions & 1 deletion src/webchat-ui/components/presentational/Avatar.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import React from 'react';
import { styled } from '../../style';
import { CSSProperties } from 'react';
import { getBackgroundImage } from '../../../plugins/messenger/MessengerPreview/lib/css';

interface IAvatarProps {
src: string;
Expand All @@ -11,7 +12,7 @@ export default styled.div<IAvatarProps>(({ theme, src }) => ({
height: theme.unitSize * 3,
width: theme.unitSize * 3,
border: `1px solid ${theme.greyWeakColor}`,
backgroundImage: `url('${src}')`,
backgroundImage: getBackgroundImage(src),
backgroundSize: "contain",
backgroundPosition: "center center",
backgroundRepeat: "no-repeat"
Expand Down
3 changes: 2 additions & 1 deletion src/webchat-ui/components/presentational/Logo.tsx
Original file line number Diff line number Diff line change
@@ -1,14 +1,15 @@
import * as React from 'react';
import { styled } from '../../style';
import { interactionCss } from '../../utils/css';
import { getBackgroundImage } from '../../../plugins/messenger/MessengerPreview/lib/css';

interface ILogoProps {
src: string;
}

export default styled.div<ILogoProps>(({ src }) => ({
...interactionCss,
backgroundImage: `url('${src}')`,
backgroundImage: getBackgroundImage(src),
backgroundSize: 'contain',
backgroundRepeat: 'no-repeat',
backgroundPosition: 'center center'
Expand Down

0 comments on commit 47f266c

Please sign in to comment.