Skip to content

Commit eb379d5

Browse files
committed
Added Signup Page
1 parent bcc200c commit eb379d5

File tree

15 files changed

+190
-68
lines changed

15 files changed

+190
-68
lines changed

component/FeatureFlagComponent.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,10 @@ const FeatureFlagComponent = ({...props}) => {
1818
console.log('feature_flag_component_click')
1919
}
2020

21+
const featureUrl = clientId
22+
? `/demo/${clientId}/feature.png`
23+
: `/images/feature.png`
24+
2125
return (
2226
<section id="features">
2327

@@ -26,7 +30,7 @@ const FeatureFlagComponent = ({...props}) => {
2630
id="feature-flag"
2731
onClick={() => addEvent(optimizelyClient, userId)} style={featureFlagStyle}>
2832

29-
<Image src={`/demo/${clientId}/feature.png`}
33+
<Image src={featureUrl}
3034
width="1200"
3135
height="400"
3236
alt="feature-flag" />
Lines changed: 3 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,10 @@
11
import Link from "next/link";
2-
import styles from '../styles/BannerForPlpFilter.module.css'
2+
import styles from '../styles/SegmentationFilter.module.css'
33

4-
const BannerForPlpFilter = ({...props}) => {
4+
const SegmentationAlgorithmFilter = ({...props}) => {
55

66
return (
77
<div className={`row ${styles.plpFilter}`}>
8-
<ul className={`col-6 ${styles.tags}`} >
9-
<li>
10-
<b className={`${styles.title}`}>Banner Example:</b>
11-
</li>
12-
<li>
13-
<Link href="/plp?utc_campaign=vip" className={`${styles.tag}`}>
14-
VIP
15-
</Link>
16-
</li>
17-
<li>
18-
<Link href="/plp?utc_campaign=new" className={`${styles.tag}`}>
19-
NEW
20-
</Link>
21-
</li>
22-
<li>
23-
<Link href="/plp?utc_campaign=marketing" className={`${styles.tag}`}>
24-
MARKETING BANNER
25-
</Link>
26-
</li>
27-
28-
</ul>
29-
308
<ul className={`col-6 ${styles.tags}`} >
319
<li >
3210
<b className={`${styles.title}`}>Menu Example:</b>
@@ -56,4 +34,4 @@ const BannerForPlpFilter = ({...props}) => {
5634
)
5735
}
5836

59-
export default BannerForPlpFilter;
37+
export default SegmentationAlgorithmFilter;

component/BannerForPlpSegments.js renamed to component/SegmentationQueryStringBanner.js

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import React from 'react'
22

3-
const BannerForPlpSegments = ({...props}) => {
3+
const SegmentationQueryStringBanner = ({...props}) => {
44

55
const { componentMessage, discount } = props;
66

@@ -15,7 +15,7 @@ const BannerForPlpSegments = ({...props}) => {
1515
{discount ?
1616
<ul className="actions">
1717
<li>
18-
<a href="/news" className="button icon solid fa-file">
18+
<a href="/signup" className="button icon solid fa-file">
1919
Order now and get a {discount}% discount (passed in via FX)
2020
</a>
2121
</li>
@@ -26,4 +26,5 @@ const BannerForPlpSegments = ({...props}) => {
2626
)
2727
}
2828

29-
export default BannerForPlpSegments;
29+
export default SegmentationQueryStringBanner;
30+

component/SegmentationUrlFilter.js

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import Link from "next/link";
2+
import styles from '../styles/SegmentationFilter.module.css'
3+
4+
const SegmentationMenuFilter = ({...props}) => {
5+
6+
return (
7+
<div className={`row ${styles.plpFilter}`}>
8+
<ul className={`col-12 ${styles.tags}`} >
9+
<li>
10+
<b className={`${styles.title}`}>Segmentation Examples:</b>
11+
</li>
12+
<li>
13+
<Link href="/signup?utc_campaign=newsletter_campaign" className={`${styles.tag}`}>
14+
Campaign Promotion
15+
</Link>
16+
</li>
17+
<li>
18+
<Link href="/signup?utc_campaign=returning" className={`${styles.tag}`}>
19+
New vs. Returning Visitor
20+
</Link>
21+
</li>
22+
<li>
23+
<Link href="/signup?device_type=website" className={`${styles.tag}`}>
24+
Device Type
25+
</Link>
26+
</li>
27+
28+
</ul>
29+
</div>
30+
)
31+
}
32+
33+
export default SegmentationMenuFilter;

layout/TopHeader.js

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,16 +9,16 @@ export default function TopHeader() {
99
path: "/"
1010
},
1111
{
12-
name: "Segmentation Examples",
12+
name: "Campaign/Personalisation",
13+
path: "/signup"
14+
},
15+
{
16+
name: "Algorithm",
1317
path: "/plp"
1418
},
15-
{ name: "Content Examples",
19+
{ name: "Recommendations & CMS Connector",
1620
path: "/news"
1721
},
18-
{
19-
name: "Landing Page",
20-
path: "/landingpage"
21-
},
2222
{ name: "Code",
2323
path: "https://github.com/jondjones-poc/optimizely-fullstack-demo"
2424
}

pages/plp.js

Lines changed: 28 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,7 @@ import React, { useEffect, useState } from "react";
22
import { useRouter } from 'next/router'
33
import { getOptimizelyProjectsDataFile, getUserId } from "../utils/optimizelyConnector";
44
import { createInstance } from "@optimizely/optimizely-sdk";
5-
import BannerForPlpFilter from "../component/BannerForPlpFilter";
6-
import BannerForPlpSegments from "../component/BannerForPlpSegments";
5+
import SegmentationAlgorithmFilter from "../component/SegmentationAlgorithmFilter";
76

87
const imageStyle = {
98
width: '100%'
@@ -13,12 +12,13 @@ const featureStyle = {
1312
paddingBottom: '5rem'
1413
};
1514

15+
16+
1617
export default function ProductListingPage({...props}) {
1718

18-
const { datafile, clientId } = props;
19+
const { datafile, clientId, imageExists } = props;
20+
const imageFolder = imageExists ? clientId : 'default';
1921

20-
const [ componentMessage, setComponentMessage ] = useState();
21-
const [ discountAmount, setDiscountAmount ] = useState();
2222
const [ categoryFilterVersion, setCategoryFilterVersion ] = useState(0);
2323
const [ sizeFilterVersion, setSizeFilterVersion ] = useState(0);
2424

@@ -27,9 +27,8 @@ export default function ProductListingPage({...props}) {
2727
});
2828

2929
const router = useRouter()
30-
const { segment = '', utc_campaign = '', algorithm = '' } = router.query
31-
console.log('Segments', segment)
32-
console.log('UTC campaign', utc_campaign)
30+
const { algorithm = '' } = router.query
31+
console.log('imageExists', imageExists)
3332

3433
// Demo of setting IDS to variations, useful for integration testing
3534
const userId = algorithm || getUserId(router);
@@ -41,36 +40,23 @@ export default function ProductListingPage({...props}) {
4140

4241
// Passing attributes for personalization
4342
{
44-
algorithm: algorithm,
45-
segment: segment,
46-
user: segment,
47-
utc_campaign: utc_campaign
43+
algorithm: algorithm
4844
}
4945
);
5046
});
5147

48+
5249
useEffect(() => {
5350
optimizelyClient.onReady().then(() => {
5451

55-
const personalisationDecision = optimizelyUserContext.decide('personalisation');
56-
console.log('personalisationDecision', personalisationDecision);
57-
58-
const componentMessage = personalisationDecision.variables.component_message;
59-
const discountAmount = personalisationDecision.variables.discount_amount;
60-
6152
const filtertestDecision = optimizelyUserContext.decide('plp_-_filter_tests');
6253
console.log('plp_-_filter_tests', filtertestDecision);
6354

6455
const categoryFilterVersion = filtertestDecision.variables.category_filter_version;
6556
const sizeFilterVersion = filtertestDecision.variables.size_filter_version;
6657

67-
if (discountAmount && discountAmount >= 0) {
68-
setDiscountAmount(discountAmount);
69-
}
70-
7158
setCategoryFilterVersion(categoryFilterVersion);
7259
setSizeFilterVersion(sizeFilterVersion);
73-
setComponentMessage(componentMessage);
7460
});
7561
}, [optimizelyUserContext, optimizelyClient]);
7662

@@ -81,9 +67,7 @@ export default function ProductListingPage({...props}) {
8167
<section id="feature" style={featureStyle}>
8268
<div className="container">
8369

84-
<BannerForPlpFilter />
85-
86-
<BannerForPlpSegments discount={discountAmount} componentMessage={componentMessage} />
70+
<SegmentationAlgorithmFilter />
8771

8872
<div className="row">
8973
<div id="sidebar" className="col-3 col-12-medium">
@@ -100,23 +84,23 @@ export default function ProductListingPage({...props}) {
10084
<div className="col-4 col-6-medium col-12-small">
10185
<section>
10286
<a href="#" className="image featured">
103-
<img src={`demo/${clientId}/item.png`} alt="Item 1" />
87+
<img src={`demo/${imageFolder}/item.png`} alt="Item 1" />
10488
</a>
10589
<p><img src={`images/landing1.png`} alt="Item 1" /></p>
10690
</section>
10791
</div>
10892
<div className="col-4 col-6-medium col-12-small">
10993
<section>
11094
<a href="#" className="image featured">
111-
<img src={`demo/${clientId}/item.png`} alt="Item 2" />
95+
<img src={`demo/${imageFolder}/item.png`} alt="Item 2" />
11296
</a>
11397
<p><img src={`images/landing2.png`} alt="Item 2" /></p>
11498
</section>
11599
</div>
116100
<div className="col-4 col-6-medium col-12-small">
117101
<section>
118102
<a href="#" className="image featured">
119-
<img src={`demo/${clientId}/item.png`} alt="Item 3" />
103+
<img src={`demo/${imageFolder}/item.png`} alt="Item 3" />
120104
</a>
121105
<p><img src={`images/landing3.png`} alt="Item 3" /></p>
122106
</section>
@@ -130,13 +114,27 @@ export default function ProductListingPage({...props}) {
130114
)
131115
}
132116

117+
118+
133119
export async function getServerSideProps(context) {
134120

135121
const datafile = await getOptimizelyProjectsDataFile();
136122

123+
const isImageFound = async (imageName) => {
124+
var result = await fetch(`https://optimizely-demo.netlify.app/demo/${imageName}/item.png`, {
125+
method: "HEAD",
126+
});
127+
128+
return result.status === 200
129+
};
130+
131+
const userAgent = context.req.headers['client'] || null;
132+
const imageExists = await isImageFound(userAgent);
133+
137134
return {
138135
props: {
139-
datafile
136+
datafile,
137+
imageExists
140138
}
141139
}
142140
}

pages/signup.js

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
import React, { useEffect, useState } from "react";
2+
import { useRouter } from 'next/router'
3+
import { getOptimizelyProjectsDataFile, getUserId } from "../utils/optimizelyConnector";
4+
import { createInstance } from "@optimizely/optimizely-sdk";
5+
import SegmentationQueryStringBanner from "../component/SegmentationQueryStringBanner";
6+
import SegmentationUrlFilter from "../component/SegmentationUrlFilter";
7+
import Image from 'next/image';
8+
9+
const featureStyle = {
10+
paddingBottom: '5rem'
11+
};
12+
13+
const bannerStyle = {
14+
textAlign: 'center'
15+
};
16+
17+
export default function ProductListingPage({...props}) {
18+
19+
const { datafile, clientId } = props;
20+
21+
const [ componentMessage, setComponentMessage ] = useState();
22+
const [ discountAmount, setDiscountAmount ] = useState();
23+
const [ deviceType, setDeviceType ] = useState();
24+
25+
const optimizelyClient = createInstance({
26+
datafile: datafile,
27+
});
28+
29+
const router = useRouter()
30+
const { device_type = '', utc_campaign = '', algorithm = '' } = router.query
31+
console.log('Device_type', device_type)
32+
console.log('UTC Campaign', utc_campaign)
33+
console.log('Algorithm', algorithm)
34+
35+
// Demo of setting IDS to variations, useful for integration testing
36+
const userId = algorithm || getUserId(router);
37+
let optimizelyUserContext;
38+
39+
optimizelyClient.onReady().then(() => {
40+
optimizelyUserContext = optimizelyClient.createUserContext(
41+
userId,
42+
// Passing attributes for personalization
43+
{
44+
devicetype: device_type,
45+
utc_campaign: utc_campaign
46+
}
47+
);
48+
});
49+
50+
useEffect(() => {
51+
optimizelyClient.onReady().then(() => {
52+
53+
const personalisationDecision = optimizelyUserContext.decide('personalisation');
54+
console.log('personalisationDecision', personalisationDecision);
55+
56+
const componentMessage = personalisationDecision.variables.component_message;
57+
const discountAmount = personalisationDecision.variables.discount_amount;
58+
59+
setDiscountAmount(discountAmount);
60+
setComponentMessage(componentMessage);
61+
});
62+
}, [optimizelyUserContext, optimizelyClient]);
63+
64+
return (
65+
<>
66+
67+
<section id="feature" style={featureStyle}>
68+
<div className="container">
69+
70+
<SegmentationUrlFilter />
71+
72+
<div className="row">
73+
74+
<div id="content" className="col-12 col-12-medium imp-medium">
75+
76+
<SegmentationQueryStringBanner discount={discountAmount} componentMessage={componentMessage} />
77+
78+
</div>
79+
<div id="content" className="col-12 col-12-medium imp-medium" style={bannerStyle}>
80+
81+
<Image src={`/images/hero.png`}
82+
width="1200"
83+
height="400"
84+
alt="feature-flag" />
85+
86+
</div>
87+
88+
</div>
89+
90+
</div>
91+
</section>
92+
</>
93+
)
94+
}
95+
96+
export async function getServerSideProps(context) {
97+
98+
const datafile = await getOptimizelyProjectsDataFile();
99+
100+
return {
101+
props: {
102+
datafile
103+
}
104+
}
105+
}

0 commit comments

Comments
 (0)