diff --git a/app/db/models/plusSuggestions/queries.server.ts b/app/db/models/plusSuggestions/queries.server.ts index 70a70ec6a..c51f8e462 100644 --- a/app/db/models/plusSuggestions/queries.server.ts +++ b/app/db/models/plusSuggestions/queries.server.ts @@ -51,7 +51,7 @@ export function findVisibleForUser( args: MonthYear & Pick & { includeBio?: boolean } ): FindVisibleForUser | undefined { - if (!args.plusTier) return; + if (typeof args.plusTier !== "number") return; return sortNewestPlayersToBeSuggestedFirst( mapFindVisibleForUserRowsToResult( findVisibleForUserStm.all(args), @@ -60,6 +60,12 @@ export function findVisibleForUser( ); } +export function findAll(args: MonthYear & { includeBio?: boolean }) { + // plusTier 0 is a bit hacky way to get all suggestions + // while reusing the query + return findVisibleForUser({ ...args, plusTier: 0 })!; +} + function mapFindVisibleForUserRowsToResult( rows: any[], includeBio?: boolean diff --git a/app/permissions.ts b/app/permissions.ts index 7ccaa9d78..2fbf41415 100644 --- a/app/permissions.ts +++ b/app/permissions.ts @@ -46,6 +46,7 @@ export function canAddCommentToSuggestionFE( return allTruthy([ !alreadyCommentedByUser(args), isPlusServerMember(args.user), + args.user?.plusTier && args.targetPlusTier >= args.user?.plusTier, ]); } diff --git a/app/routes/plus/suggestions.tsx b/app/routes/plus/suggestions.tsx index c98e86cc3..e3e07b590 100644 --- a/app/routes/plus/suggestions.tsx +++ b/app/routes/plus/suggestions.tsx @@ -18,7 +18,7 @@ import { nextNonCompletedVoting } from "~/modules/plus-server"; import { db } from "~/db"; import type * as plusSuggestions from "~/db/models/plusSuggestions/queries.server"; import type { PlusSuggestion, User } from "~/db/types"; -import { getUser, requireUser, useUser } from "~/modules/auth"; +import { requireUser, useUser } from "~/modules/auth"; import { canAddCommentToSuggestionFE, canSuggestNewUserFE, @@ -30,11 +30,12 @@ import { parseRequestFormData, validate } from "~/utils/remix"; import { makeTitle } from "~/utils/strings"; import { discordFullName } from "~/utils/strings"; import { actualNumber } from "~/utils/zod"; -import { FAQ_PAGE, LOG_IN_URL, userPage } from "~/utils/urls"; +import { userPage } from "~/utils/urls"; import { RelativeTime } from "~/components/RelativeTime"; import { databaseTimestampToDate } from "~/utils/dates"; import { PLUS_TIERS } from "~/constants"; import { assertUnreachable } from "~/utils/types"; +import { getUserId } from "~/modules/auth/user.server"; export const meta: MetaFunction = () => { return { @@ -133,7 +134,7 @@ export const action: ActionFunction = async ({ request }) => { }; export interface PlusSuggestionsLoaderData { - suggestions?: plusSuggestions.FindVisibleForUser; + suggestions: plusSuggestions.FindVisibleForUser; suggestedForTiers: number[]; } @@ -143,23 +144,18 @@ export const unstable_shouldReload: ShouldReloadFunction = ({ submission }) => { }; export const loader: LoaderFunction = async ({ request }) => { - const user = await getUser(request); - - if (!user) { - return json({ - suggestedForTiers: [], - }); - } + const user = await getUserId(request); return json({ - suggestions: db.plusSuggestions.findVisibleForUser({ + suggestions: db.plusSuggestions.findAll({ ...nextNonCompletedVoting(new Date()), - plusTier: user.plusTier, - }), - suggestedForTiers: db.plusSuggestions.tiersSuggestedFor({ - ...nextNonCompletedVoting(new Date()), - userId: user.id, }), + suggestedForTiers: user + ? db.plusSuggestions.tiersSuggestedFor({ + ...nextNonCompletedVoting(new Date()), + userId: user.id, + }) + : [], }); }; @@ -173,27 +169,6 @@ export default function PlusSuggestionsPage() { setSearchParams({ tier }); }; - if (!user) { - return ( -
-

- To view your suggestion status{" "} - -

-

- Not sure what the Plus Server is about? Read the{" "} - FAQ -

-
- ); - } - - if (!data.suggestions) { - return ; - } - const visibleSuggestions = tierVisible && data.suggestions[tierVisible] ? data.suggestions[tierVisible] @@ -205,7 +180,7 @@ export default function PlusSuggestionsPage() {
- +
(); - const user = useUser(); - // no need to show anything if they can't be suggested anyway... - if (user?.plusTier === 1) { - return null; - } - - if (data.suggestedForTiers.length === 0) { - if (hideText) return null; - - return ( -
- You are not suggested yet this month. -
- ); - } + if (data.suggestedForTiers.length === 0) return null; return (
- {!hideText ? ( -
- You are suggested to{" "} - {data.suggestedForTiers.map((tier) => `+${tier}`).join(" and ")} this - month. -
- ) : null} {canDeleteSuggestionOfThemselves() ? (
{data.suggestedForTiers.map((tier) => ( diff --git a/app/routes/plus/suggestions/comment.$tier.$userId.tsx b/app/routes/plus/suggestions/comment.$tier.$userId.tsx index 119144b6d..2b59bca49 100644 --- a/app/routes/plus/suggestions/comment.$tier.$userId.tsx +++ b/app/routes/plus/suggestions/comment.$tier.$userId.tsx @@ -21,7 +21,7 @@ import type { PlusSuggestionsLoaderData } from "../suggestions"; import { CommentTextarea } from "./new"; const commentActionSchema = z.object({ - text: z.preprocess( + comment: z.preprocess( trimmedString, z.string().min(1).max(PlUS_SUGGESTION_COMMENT_MAX_LENGTH) ), @@ -60,6 +60,7 @@ export const action: ActionFunction = async ({ request }) => { db.plusSuggestions.create({ authorId: user.id, ...data, + text: data.comment, ...nextNonCompletedVoting(new Date()), }); diff --git a/app/routes/plus/suggestions/new.tsx b/app/routes/plus/suggestions/new.tsx index 3ce8decfc..6bb4da77f 100644 --- a/app/routes/plus/suggestions/new.tsx +++ b/app/routes/plus/suggestions/new.tsx @@ -42,7 +42,7 @@ const commentActionSchema = z.object({ .min(Math.min(...PLUS_TIERS)) .max(Math.max(...PLUS_TIERS)) ), - text: z.preprocess( + comment: z.preprocess( trimmedString, z.string().min(1).max(PlUS_SUGGESTION_FIRST_COMMENT_MAX_LENGTH) ), @@ -80,7 +80,7 @@ export const action: ActionFunction = async ({ request }) => { authorId: user.id, suggestedId: suggested.id, tier: data.tier, - text: data.text, + text: data.comment, ...nextNonCompletedVoting(new Date()), }); @@ -222,7 +222,7 @@ export function CommentTextarea({ maxLength }: { maxLength: number }) { return (