working
This commit is contained in:
parent
31c476a48d
commit
ff469e2bf6
@ -1,9 +1,19 @@
|
|||||||
// @ts-check
|
// @ts-check
|
||||||
import { defineConfig } from 'astro/config';
|
import { defineConfig } from 'astro/config';
|
||||||
|
|
||||||
|
import node from '@astrojs/node';
|
||||||
|
|
||||||
// https://astro.build/config
|
// https://astro.build/config
|
||||||
export default defineConfig({
|
export default defineConfig({
|
||||||
site: "https://demo.site",
|
site: "https://demo.site",
|
||||||
|
|
||||||
// reidrects abc.xyz/ -> abc.xyz
|
// reidrects abc.xyz/ -> abc.xyz
|
||||||
trailingSlash: 'never'
|
trailingSlash: 'never',
|
||||||
|
|
||||||
|
// cookie stuff can't be prerendered
|
||||||
|
output: 'server',
|
||||||
|
|
||||||
|
adapter: node({
|
||||||
|
mode: 'standalone'
|
||||||
|
})
|
||||||
});
|
});
|
1659
package-lock.json
generated
1659
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@ -9,6 +9,7 @@
|
|||||||
"astro": "astro"
|
"astro": "astro"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"@astrojs/node": "^9.2.0",
|
||||||
"astro": "^5.2.5"
|
"astro": "^5.2.5"
|
||||||
}
|
}
|
||||||
}
|
}
|
4
src/core.ts
Normal file
4
src/core.ts
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
export enum Split {
|
||||||
|
A = "A",
|
||||||
|
B = "B",
|
||||||
|
}
|
5
src/env.d.ts
vendored
Normal file
5
src/env.d.ts
vendored
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
declare namespace App {
|
||||||
|
interface Locals {
|
||||||
|
split: Split
|
||||||
|
}
|
||||||
|
}
|
24
src/middleware.ts
Normal file
24
src/middleware.ts
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
import { defineMiddleware } from "astro:middleware";
|
||||||
|
import { Split } from "./core";
|
||||||
|
|
||||||
|
// Get/Set split cookie and put it on the Astro object
|
||||||
|
export const onRequest = defineMiddleware(async (context, next) => {
|
||||||
|
|
||||||
|
let split: Split;
|
||||||
|
|
||||||
|
// see if we are already running a split
|
||||||
|
let cookie = context.cookies.get("split")
|
||||||
|
if (!cookie) { // no split detected
|
||||||
|
let i = Math.floor(Math.random() * Object.keys(Split).length);
|
||||||
|
split = Object.values(Split)[i] as Split;
|
||||||
|
|
||||||
|
context.cookies.set("split", Split[split])
|
||||||
|
} else { // split detected!
|
||||||
|
let v = cookie.value;
|
||||||
|
split = v as unknown as Split;
|
||||||
|
}
|
||||||
|
|
||||||
|
context.locals.split = split
|
||||||
|
|
||||||
|
return next()
|
||||||
|
})
|
45
src/pages/checkout.astro
Normal file
45
src/pages/checkout.astro
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
---
|
||||||
|
import Base from "../partials/base.astro";
|
||||||
|
|
||||||
|
|
||||||
|
let email_error = false;
|
||||||
|
let addr_error = false;
|
||||||
|
|
||||||
|
// form submission
|
||||||
|
if (Astro.request.method === "POST") {
|
||||||
|
try {
|
||||||
|
const data = await Astro.request.formData()
|
||||||
|
const email = data.get("email")
|
||||||
|
const addr = data.get("address")
|
||||||
|
|
||||||
|
/*
|
||||||
|
some logic to process the order
|
||||||
|
...
|
||||||
|
*/
|
||||||
|
if (email == "") {
|
||||||
|
email_error = true
|
||||||
|
}
|
||||||
|
if (addr == "") {
|
||||||
|
addr_error = true
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!email_error && !addr_error) {
|
||||||
|
console.log("Order from:", email, "who was in funnel:", Astro.locals.split);
|
||||||
|
return Astro.redirect("/thank_you")
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.log(error)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
---
|
||||||
|
<Base title="Checkout" desc="$$$">
|
||||||
|
<h1>Checkout</h1>
|
||||||
|
|
||||||
|
<form method="post">
|
||||||
|
<input name="email" placeholder="Email" type="email">
|
||||||
|
<input name="address" placeholder="Mailing Address" type="text">
|
||||||
|
<button type="submit">Submit</button>
|
||||||
|
</form>
|
||||||
|
|
||||||
|
</Base>
|
@ -1,10 +1,26 @@
|
|||||||
---
|
---
|
||||||
|
import { Split } from "../core";
|
||||||
import Head from "../partials/base.astro"
|
import Head from "../partials/base.astro"
|
||||||
|
|
||||||
// Welcome to Astro! Wondering what to do next? Check out the Astro documentation at https://docs.astro.build
|
let hero;
|
||||||
// Don't want to use any of this? Delete everything in this file, the `assets`, `components`, and `layouts` directories, and start fresh.
|
|
||||||
|
switch (Astro.locals.split) {
|
||||||
|
case Split.A:
|
||||||
|
hero = "Hello"
|
||||||
|
break;
|
||||||
|
case Split.B:
|
||||||
|
hero = "Welcome"
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
hero = "Hello"
|
||||||
|
console.error("Non-exhaustive switch statement used!")
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
<Head title='Home' desc='Where the party is happeneing!'>
|
<Head title='Home' desc='Doing A/B testing'>
|
||||||
|
<h1>{hero}</h1>
|
||||||
<p>Hello world!</p>
|
<p>Hello world!</p>
|
||||||
|
<a href="/checkout">Checkout</a>
|
||||||
</Head>
|
</Head>
|
8
src/pages/thank_you.astro
Normal file
8
src/pages/thank_you.astro
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
---
|
||||||
|
import Base from "../partials/base.astro";
|
||||||
|
|
||||||
|
---
|
||||||
|
<Base title="Thank You!" desc="The landing page after a purchase">
|
||||||
|
<h1>Thank you!</h1>
|
||||||
|
<a href="/">Go home</a>
|
||||||
|
</Base>
|
Loading…
x
Reference in New Issue
Block a user