Skip to content

Commit 1114f13

Browse files
authored
Merge pull request #1186 from jboolean/custom-bag-front
Custom bag front
2 parents 1861861 + bb6e732 commit 1114f13

File tree

18 files changed

+423
-84
lines changed

18 files changed

+423
-84
lines changed

backend/src/business/merch/renderToteBag.ts

Lines changed: 29 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ const FRONTEND_BASE_URL = process.env.FRONTEND_BASE_URL as string;
88

99
// Install using `npx @puppeteer/browsers install chromium` locally
1010
const LOCAL_CHROMIUM_EXECUTABLE_PATH =
11-
'./chromium/mac_arm-1420837/chrome-mac/Chromium.app/Contents/MacOS/Chromium';
11+
'./chromium/mac_arm-1447349/chrome-mac/Chromium.app/Contents/MacOS/Chromium';
1212

1313
// Move center to account for tote bag bottom
1414
const LAT_OFFSET = -0.0007;
@@ -17,9 +17,15 @@ const ZOOM = 17;
1717
export default async function renderToteBag({
1818
lat,
1919
lng,
20+
style,
21+
foregroundColor,
22+
backgroundColor,
2023
}: {
2124
lat: number;
2225
lng: number;
26+
style?: string;
27+
foregroundColor?: string;
28+
backgroundColor?: string;
2329
}): Promise<Buffer> {
2430
const browser = await puppeteer.launch({
2531
args: IS_LOCAL ? puppeteer.defaultArgs() : chromium.args,
@@ -33,14 +39,28 @@ export default async function renderToteBag({
3339
const page = await browser.newPage();
3440
await page.setViewport({ width: 17 * 150, height: 33 * 150 });
3541

36-
await page.goto(
37-
`${FRONTEND_BASE_URL}/render-merch/tote-bag?noWelcome&noTipJar#${ZOOM}/${(
38-
lat + LAT_OFFSET
39-
).toFixed(6)}/${lng.toFixed(6)}`,
40-
{
41-
waitUntil: 'networkidle2',
42-
}
43-
);
42+
const urlParams = new URLSearchParams();
43+
urlParams.append('noWelcome', 'true');
44+
urlParams.append('noTipJar', 'true');
45+
if (style) {
46+
urlParams.append('style', style);
47+
}
48+
if (foregroundColor) {
49+
urlParams.append('foregroundColor', foregroundColor);
50+
}
51+
if (backgroundColor) {
52+
urlParams.append('backgroundColor', backgroundColor);
53+
}
54+
55+
const hash = `${ZOOM}/${(lat + LAT_OFFSET).toFixed(6)}/${lng.toFixed(6)}`;
56+
57+
const url = new URL('/render-merch/tote-bag', FRONTEND_BASE_URL);
58+
url.search = urlParams.toString();
59+
url.hash = hash;
60+
61+
await page.goto(url.toString(), {
62+
waitUntil: 'networkidle2',
63+
});
4464

4565
await page.waitForSelector('#render-content');
4666

backend/src/cron/renderMerchPrintfiles.ts

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,14 +31,21 @@ export default async function renderMerch(): Promise<void> {
3131
continue;
3232
}
3333

34-
const { lat, lng } = customizationOptions;
34+
const { lat, lng, style, foregroundColor, backgroundColor } =
35+
customizationOptions;
3536

3637
const variant = item.internalVariant;
3738

3839
let buffer: Buffer;
3940
switch (variant) {
4041
case MerchInternalVariant.TOTE_BAG_SMALL:
41-
buffer = await renderToteBag({ lat, lng });
42+
buffer = await renderToteBag({
43+
lat,
44+
lng,
45+
style,
46+
foregroundColor,
47+
backgroundColor,
48+
});
4249
break;
4350
default:
4451
absurd(variant);

backend/src/entities/MerchCustomizationOptions.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,14 @@
11
import MerchInternalVariant from '../enum/MerchInternalVariant';
22

3+
type Color = 'red' | 'green' | 'creme' | 'dark';
4+
35
interface ToteBagCustomizationOptions {
46
variant: MerchInternalVariant.TOTE_BAG_SMALL;
57
lat: number;
68
lng: number;
9+
style?: 'outline' | 'solid';
10+
foregroundColor?: Color;
11+
backgroundColor?: Color;
712
}
813

914
type MerchCustomizationOptions = ToteBagCustomizationOptions;

frontend/src/screens/App/screens/Merch/screens/Orders/components/CustomizeModal.less

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
@import '../../../../../../../shared/styles/utils.less';
2+
@import '../../../../../../../shared/styles/colors.less';
3+
@import '../../../../../../../shared/styles/viewport.less';
14
:local {
25
.content {
36
display: flex;
@@ -9,4 +12,46 @@
912
flex-grow: 1;
1013
margin: 0 -1rem;
1114
}
15+
16+
.frontStylePresets {
17+
flex-grow: 1;
18+
overflow-y: auto;
19+
20+
display: grid;
21+
grid-template-columns: repeat(3, 1fr);
22+
gap: 1rem;
23+
24+
@media screen and (max-width: @modal-width-max) {
25+
grid-template-columns: repeat(1, 1fr);
26+
}
27+
28+
.frontStylePresetInput {
29+
.visuallyhidden();
30+
31+
& + label {
32+
position: relative;
33+
border: 3px solid transparent;
34+
& > img {
35+
width: 100%;
36+
height: 100%;
37+
object-fit: cover;
38+
}
39+
border-radius: 3px;
40+
cursor: pointer;
41+
}
42+
43+
&:checked + label {
44+
&::after {
45+
content: '';
46+
position: absolute;
47+
top: 0;
48+
left: 0;
49+
right: 0;
50+
bottom: 0;
51+
box-shadow: inset 0 0 5px 1px fade(@font-color-dark, 40%);
52+
}
53+
border-color: @red;
54+
}
55+
}
56+
}
1257
}

0 commit comments

Comments
 (0)