- Add watchlist feature: eye icon per participant, "Watched Only" filter, DB table + migration, toggle API route, socket sync on reconnect - Make RecentPicksFeed collapsible on mobile participants tab (chevron toggle, defaults expanded) - Add AutodraftSettings to mobile controls tab (was desktop-only) - Pin Pause/Resume Draft and Exit Draft Room buttons to the bottom of the mobile controls tab Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
56 lines
1.9 KiB
TypeScript
56 lines
1.9 KiB
TypeScript
import { auth } from "~/lib/auth.server";
|
|
import { database } from "~/database/context";
|
|
import * as schema from "~/database/schema";
|
|
import { eq } from "drizzle-orm";
|
|
import { addToWatchlist, removeFromWatchlist, isOnWatchlist, getTeamWatchlist } from "~/models/watchlist";
|
|
import { getSocketIO } from "../../../server/socket";
|
|
|
|
import type { ActionFunctionArgs } from "react-router";
|
|
export async function action(args: ActionFunctionArgs) {
|
|
const { request } = args;
|
|
const session = await auth.api.getSession({ headers: args.request.headers });
|
|
const userId = session?.user.id ?? null;
|
|
|
|
if (!userId) {
|
|
return Response.json({ error: "Unauthorized" }, { status: 401 });
|
|
}
|
|
|
|
const formData = await request.formData();
|
|
const seasonId = formData.get("seasonId");
|
|
const teamId = formData.get("teamId");
|
|
const participantId = formData.get("participantId");
|
|
|
|
if (!seasonId || !teamId || !participantId) {
|
|
return Response.json({ error: "Missing required fields" }, { status: 400 });
|
|
}
|
|
|
|
const db = database();
|
|
|
|
const team = await db.query.teams.findFirst({
|
|
where: eq(schema.teams.id, teamId as string),
|
|
});
|
|
|
|
if (!team || team.ownerId !== userId) {
|
|
return Response.json({ error: "Unauthorized" }, { status: 403 });
|
|
}
|
|
|
|
const alreadyWatched = await isOnWatchlist(teamId as string, participantId as string);
|
|
|
|
if (alreadyWatched) {
|
|
await removeFromWatchlist({ seasonId: seasonId as string, teamId: teamId as string, participantId: participantId as string });
|
|
} else {
|
|
await addToWatchlist({
|
|
seasonId: seasonId as string,
|
|
teamId: teamId as string,
|
|
participantId: participantId as string,
|
|
});
|
|
}
|
|
|
|
const updatedWatchlist = await getTeamWatchlist(teamId as string, seasonId as string);
|
|
const participantIds = updatedWatchlist.map((item) => item.participantId);
|
|
|
|
const io = getSocketIO();
|
|
io.to(`team-${teamId}`).emit("watchlist-updated", { participantIds });
|
|
|
|
return Response.json({ success: true, participantIds });
|
|
}
|