last tickets
This commit is contained in:
@@ -28,11 +28,12 @@ const HIDDEN_ROUTE_NAMES = new Set([
|
||||
Routes.PouchReady,
|
||||
Routes.PhotoCover,
|
||||
Routes.ValidateCover,
|
||||
Routes.SongDownload,
|
||||
Routes.FinishCompose,
|
||||
Routes.GeneratingSong,
|
||||
Routes.ProductionOnboarding,
|
||||
Routes.Production,
|
||||
Routes.DownloadSongs,
|
||||
Routes.PlaybackDownload,
|
||||
Routes.DownloadPrices,
|
||||
Routes.SongDownloaded,
|
||||
Routes.StreamSong,
|
||||
|
||||
@@ -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}
|
||||
|
||||
Reference in New Issue
Block a user