mirror of
https://github.com/openfrontio/OpenFrontIO.git
synced 2026-06-22 17:16:38 +00:00
dd9ad7472f
## Description: 1. Remove SpawnAds and replace it with AdTimer which will delete the in-game ad after the first minute. 2. remove login blocker UI, we don't use it anymore 3. convert TerritoryPatternsModal & GutterAds to use event based when checking for flares 4. remove window.PageOS.session.newPageView(); because it was throwing an exception 5. Convert SpawnTimer to a lit element to give it a higher z-index to stay above the header ad ## Please complete the following: - [x] I have added screenshots for all UI updates - [x] I process any text displayed to the user through translateText() and I've added it to the en.json file - [x] I have added relevant tests to the test directory - [x] I confirm I have thoroughly tested these changes and take full responsibility for any bugs introduced ## Please put your Discord username so you can be contacted if a bug or regression is found: evan
118 lines
3.1 KiB
TypeScript
118 lines
3.1 KiB
TypeScript
import { UserMeResponse } from "../core/ApiSchemas";
|
|
import {
|
|
ColorPalette,
|
|
Cosmetics,
|
|
CosmeticsSchema,
|
|
Pattern,
|
|
} from "../core/CosmeticSchemas";
|
|
import { getApiBase, getAuthHeader } from "./jwt";
|
|
import { getPersistentID } from "./Main";
|
|
|
|
export async function handlePurchase(
|
|
pattern: Pattern,
|
|
colorPalette: ColorPalette | null,
|
|
) {
|
|
if (pattern.product === null) {
|
|
alert("This pattern is not available for purchase.");
|
|
return;
|
|
}
|
|
|
|
const response = await fetch(
|
|
`${getApiBase()}/stripe/create-checkout-session`,
|
|
{
|
|
method: "POST",
|
|
headers: {
|
|
"Content-Type": "application/json",
|
|
authorization: getAuthHeader(),
|
|
"X-Persistent-Id": getPersistentID(),
|
|
},
|
|
body: JSON.stringify({
|
|
priceId: pattern.product.priceId,
|
|
hostname: window.location.origin,
|
|
colorPaletteName: colorPalette?.name,
|
|
}),
|
|
},
|
|
);
|
|
|
|
if (!response.ok) {
|
|
console.error(
|
|
`Error purchasing pattern:${response.status} ${response.statusText}`,
|
|
);
|
|
if (response.status === 401) {
|
|
alert("You are not logged in. Please log in to purchase a pattern.");
|
|
} else {
|
|
alert("Something went wrong. Please try again later.");
|
|
}
|
|
return;
|
|
}
|
|
|
|
const { url } = await response.json();
|
|
|
|
// Redirect to Stripe checkout
|
|
window.location.href = url;
|
|
}
|
|
|
|
export async function fetchCosmetics(): Promise<Cosmetics | null> {
|
|
try {
|
|
const response = await fetch(`${getApiBase()}/cosmetics.json`);
|
|
if (!response.ok) {
|
|
console.error(`HTTP error! status: ${response.status}`);
|
|
return null;
|
|
}
|
|
const result = CosmeticsSchema.safeParse(await response.json());
|
|
if (!result.success) {
|
|
console.error(`Invalid cosmetics: ${result.error.message}`);
|
|
return null;
|
|
}
|
|
return result.data;
|
|
} catch (error) {
|
|
console.error("Error getting cosmetics:", error);
|
|
return null;
|
|
}
|
|
}
|
|
|
|
export function patternRelationship(
|
|
pattern: Pattern,
|
|
colorPalette: { name: string; isArchived?: boolean } | null,
|
|
userMeResponse: UserMeResponse | false,
|
|
affiliateCode: string | null,
|
|
): "owned" | "purchasable" | "blocked" {
|
|
const flares =
|
|
userMeResponse === false ? [] : (userMeResponse.player.flares ?? []);
|
|
if (flares.includes("pattern:*")) {
|
|
return "owned";
|
|
}
|
|
|
|
if (colorPalette === null) {
|
|
// For backwards compatibility only show non-colored patterns if they are owned.
|
|
if (flares.includes(`pattern:${pattern.name}`)) {
|
|
return "owned";
|
|
}
|
|
return "blocked";
|
|
}
|
|
|
|
const requiredFlare = `pattern:${pattern.name}:${colorPalette.name}`;
|
|
|
|
if (flares.includes(requiredFlare)) {
|
|
return "owned";
|
|
}
|
|
|
|
if (pattern.product === null) {
|
|
// We don't own it and it's not for sale, so don't show it.
|
|
return "blocked";
|
|
}
|
|
|
|
if (colorPalette?.isArchived) {
|
|
// We don't own the color palette, and it's archived, so don't show it.
|
|
return "blocked";
|
|
}
|
|
|
|
if (affiliateCode !== pattern.affiliateCode) {
|
|
// Pattern is for sale, but it's not the right store to show it on.
|
|
return "blocked";
|
|
}
|
|
|
|
// Patterns is for sale, and it's the right store to show it on.
|
|
return "purchasable";
|
|
}
|