1e67a5cc7f
* Factor out lighthouse-result processing code for FYP re-use. The FYP results will be in the same format as LH. * Recsys: add ability to pass in specific uuid to use For FYP, we want to pass the UUID as a param when searching for recommendations. The search comes before the recsys entry creation, so we need to generate the UUID first when searching, and then tell recsys to use that specific ID. * Redux: fetch and store FYP Note that the gid cannot be used as "hash" for the uri list -- it doesn't necessarily change when the list changes, so we can't use it to optimize redux. For now, just always update/render when re-fetched. * UI for FYP * Mark rendered FYPs * Pass the FYP ID down the same way as Collection ID Not ideal, but at least it's in the same pattern as existing code for now. The whole prop-drilling problem with the claim components will be fixed together later. * Include 'gid' and 'uuid' in recommendation search * Allow users to mark recommendations that they dislike * Pass auth-token to all FYP requests + remove beacon use beacons are unreliable and often blocked * Only show FYP for members * FYP readme page * small fixes * fyp Co-authored-by: Thomas Zarebczan <thomas.zarebczan@gmail.com>
129 lines
6 KiB
JavaScript
129 lines
6 KiB
JavaScript
import { createSelector } from 'reselect';
|
|
|
|
export const selectState = (state) => state.user || {};
|
|
|
|
export const selectAuthenticationIsPending = (state) => selectState(state).authenticationIsPending;
|
|
export const selectUserIsPending = (state) => selectState(state).userIsPending;
|
|
export const selectUser = (state) => selectState(state).user;
|
|
export const selectEmailAlreadyExists = (state) => selectState(state).emailAlreadyExists;
|
|
export const selectEmailDoesNotExist = (state) => selectState(state).emailDoesNotExist;
|
|
export const selectResendingVerificationEmail = (state) => selectState(state).resendingVerificationEmail;
|
|
|
|
export const selectUserEmail = createSelector(selectUser, (user) =>
|
|
user ? user.primary_email || user.latest_claimed_email : null
|
|
);
|
|
|
|
export const selectUserPhone = createSelector(selectUser, (user) => (user ? user.phone_number : null));
|
|
|
|
export const selectUserCountryCode = createSelector(selectUser, (user) => (user ? user.country_code : null));
|
|
|
|
export const selectEmailToVerify = createSelector(
|
|
selectState,
|
|
selectUserEmail,
|
|
(state, userEmail) => state.emailToVerify || userEmail
|
|
);
|
|
|
|
export const selectPhoneToVerify = createSelector(
|
|
selectState,
|
|
selectUserPhone,
|
|
(state, userPhone) => state.phoneToVerify || userPhone
|
|
);
|
|
|
|
export const selectYoutubeChannels = createSelector(selectUser, (user) => (user ? user.youtube_channels : null));
|
|
|
|
export const selectUserIsRewardApproved = createSelector(selectUser, (user) => user && user.is_reward_approved);
|
|
|
|
export const selectEmailNewIsPending = (state) => selectState(state).emailNewIsPending;
|
|
|
|
export const selectEmailNewErrorMessage = createSelector(selectState, (state) => {
|
|
const error = state.emailNewErrorMessage;
|
|
return typeof error === 'object' && error !== null ? error.message : error;
|
|
});
|
|
|
|
export const selectPasswordExists = (state) => selectState(state).passwordExistsForUser;
|
|
export const selectPasswordResetIsPending = (state) => selectState(state).passwordResetPending;
|
|
export const selectPasswordResetSuccess = (state) => selectState(state).passwordResetSuccess;
|
|
|
|
export const selectPasswordResetError = createSelector(selectState, (state) => {
|
|
const error = state.passwordResetError;
|
|
return typeof error === 'object' && error !== null ? error.message : error;
|
|
});
|
|
|
|
export const selectPasswordSetIsPending = (state) => selectState(state).passwordSetPending;
|
|
export const selectPasswordSetSuccess = (state) => selectState(state).passwordSetSuccess;
|
|
|
|
export const selectPasswordSetError = createSelector(selectState, (state) => {
|
|
const error = state.passwordSetError;
|
|
return typeof error === 'object' && error !== null ? error.message : error;
|
|
});
|
|
|
|
export const selectPhoneNewErrorMessage = (state) => selectState(state).phoneNewErrorMessage;
|
|
export const selectEmailVerifyIsPending = (state) => selectState(state).emailVerifyIsPending;
|
|
export const selectEmailVerifyErrorMessage = (state) => selectState(state).emailVerifyErrorMessage;
|
|
export const selectPhoneNewIsPending = (state) => selectState(state).phoneNewIsPending;
|
|
export const selectPhoneVerifyIsPending = (state) => selectState(state).phoneVerifyIsPending;
|
|
export const selectPhoneVerifyErrorMessage = (state) => selectState(state).phoneVerifyErrorMessage;
|
|
export const selectIdentityVerifyIsPending = (state) => selectState(state).identityVerifyIsPending;
|
|
export const selectIdentityVerifyErrorMessage = (state) => selectState(state).identityVerifyErrorMessage;
|
|
|
|
export const selectUserVerifiedEmail = createSelector(selectUser, (user) => user && user.has_verified_email);
|
|
|
|
export const selectUserIsVerificationCandidate = createSelector(
|
|
selectUser,
|
|
(user) => user && (!user.has_verified_email || !user.is_identity_verified)
|
|
);
|
|
|
|
export const selectUserInviteStatusIsPending = (state) => selectState(state).inviteStatusIsPending;
|
|
export const selectUserInvitesRemaining = (state) => selectState(state).invitesRemaining;
|
|
export const selectUserInvitees = (state) => selectState(state).invitees;
|
|
|
|
export const selectUserInviteStatusFailed = createSelector(
|
|
selectUserInvitesRemaining,
|
|
() => selectUserInvitesRemaining === null
|
|
);
|
|
|
|
export const selectUserInviteStatusFetched = (state) => {
|
|
// A successful fetch produces something; a failed fetch sets it to 'null'.
|
|
return selectUserInvitees(state) !== undefined;
|
|
};
|
|
|
|
export const selectUserInviteNewIsPending = (state) => selectState(state).inviteNewIsPending;
|
|
export const selectUserInviteNewErrorMessage = (state) => selectState(state).inviteNewErrorMessage;
|
|
export const selectUserInviteReferralLink = (state) => selectState(state).referralLink;
|
|
|
|
/**
|
|
* Returns the invitation referral code.
|
|
* Clients should use selectUserInviteStatusFetched to check if the info has been fetched.
|
|
*/
|
|
export const selectUserInviteReferralCode = createSelector(selectState, (state) =>
|
|
state.referralCode ? state.referralCode[0] : ''
|
|
);
|
|
|
|
export const selectYouTubeImportPending = (state) => selectState(state).youtubeChannelImportPending;
|
|
export const selectYouTubeImportError = (state) => selectState(state).youtubeChannelImportErrorMessage;
|
|
export const selectSetReferrerPending = (state) => selectState(state).referrerSetIsPending;
|
|
export const selectSetReferrerError = (state) => selectState(state).referrerSetError;
|
|
|
|
export const selectOdyseeMembershipName = (state) => selectState(state).odyseeMembershipName;
|
|
|
|
export const selectOdyseeMembershipIsPremiumPlus = (state) => {
|
|
const odyseeMembershipName = selectState(state).odyseeMembershipName;
|
|
if (!odyseeMembershipName) return undefined;
|
|
return selectState(state).odyseeMembershipName === 'Premium+';
|
|
};
|
|
|
|
export const selectHasOdyseeMembership = (state) => {
|
|
const membershipName = selectOdyseeMembershipName(state);
|
|
return Boolean(membershipName);
|
|
};
|
|
|
|
export const selectYouTubeImportVideosComplete = createSelector(selectState, (state) => {
|
|
const total = state.youtubeChannelImportTotal;
|
|
const complete = state.youtubeChannelImportComplete || 0;
|
|
|
|
if (total) {
|
|
return [complete, total];
|
|
}
|
|
});
|
|
|
|
export const makeSelectUserPropForProp = (prop) => createSelector(selectUser, (user) => (user ? user[prop] : null));
|