last tickets

This commit is contained in:
Thomas Demirdjian
2025-11-24 15:35:14 +01:00
parent 471a3177e8
commit 72852ad92b
40 changed files with 1749 additions and 667 deletions
+55 -15
View File
@@ -3,7 +3,7 @@ import { useDataFromRef } from "react-native-minuit/src/hooks";
import useMinuit from "react-native-minuit/src/hooks/useMinuit";
import { createContext, useContext, useGlobal } from "reactn";
import { useCallback, useEffect, useState } from "react";
import { useCallback, useEffect, useMemo, useState } from "react";
import { checkIfEmailIsValid } from "../actions/signupActions";
import { showPremiumRequiredAlert } from "../components/Alert";
import firebase, {
@@ -18,9 +18,15 @@ import { getUserPreferredArtistName } from "../utils/artistName";
import { getLikeFieldPath, LIKE_TARGET } from "../utils/likes";
import { ensureAuthenticated } from "../utils/authRedirect";
import { isWeb } from "../hooks/useLayoutType";
import useUserLikedProjects from "../hooks/useUserLikedProjects";
const SONG_LIKES_FIELD = getLikeFieldPath(LIKE_TARGET.SONG);
const PLAYBACK_LIKES_FIELD = getLikeFieldPath(LIKE_TARGET.PLAYBACK);
const ACTIVE_SUBSCRIPTION_STATUSES = new Set([
"trialing",
"active",
"past_due",
"unpaid",
]);
export const UserDataContext = createContext();
@@ -61,21 +67,11 @@ export default ({ children }) => {
const userPlaybacks = Array.isArray(userProjects)
? userProjects.filter((project) => project.playbackUrl)
: [];
// Subscribe to user's liked projects
// Subscribe to user's liked projects (both new and legacy storage)
const {
data: userLikedProjects = [],
projects: userLikedProjects = [],
loading: userLikedProjectsLoading = true,
} = useDataFromRef({
ref: currentUID
? projectsRef
.where(SONG_LIKES_FIELD, "array-contains", currentUID)
.orderBy("updatedAt", "desc")
: null,
simpleRef: false,
listener: true,
condition: !!currentUID,
refreshArray: [currentUID],
});
} = useUserLikedProjects();
const {
data: userLikedPlaybacks = [],
loading: userLikedPlaybacksLoading = true,
@@ -421,6 +417,49 @@ export default ({ children }) => {
simpleRef: true,
});
const hasActiveSubscription = useMemo(() => {
const pickStatus = (value) => {
if (typeof value !== "string") return null;
const trimmed = value.trim();
return trimmed ? trimmed.toLowerCase() : null;
};
const statusCandidates = [
pickStatus(currentUserDoc?.stripeSubscriptionStatus),
pickStatus(currentUserDoc?.stripeSubscription?.status),
pickStatus(currentUserDoc?.stripeSubscription?.stripeSubscriptionStatus),
pickStatus(currentUserDoc?.stripeSubscription?.metadata?.status),
].filter(Boolean);
if (
statusCandidates.some((status) =>
ACTIVE_SUBSCRIPTION_STATUSES.has(status),
)
) {
return true;
}
const premiumUntil = currentUserDoc?.premiumUntil;
if (premiumUntil) {
const asDate =
premiumUntil?.toDate?.() ||
(premiumUntil?.seconds ? new Date(premiumUntil.seconds * 1000) : null);
if (asDate && asDate > new Date()) {
return true;
}
}
if (currentUserDoc?.premium?.active) {
return true;
}
const hasPremiumLevel =
typeof currentUserDoc?.premiumLevel === "string" &&
currentUserDoc.premiumLevel.trim().length > 0;
return hasPremiumLevel;
}, [currentUserDoc]);
return (
<UserDataContext.Provider
value={{
@@ -459,6 +498,7 @@ export default ({ children }) => {
createNewProject,
videos,
hasActiveSubscription,
}}
>
{children}