+ {/* Pinned above the filters and the search box, where the hub's claims tab keeps it —
+ and inside the sticky block rather than over it, because two stickies would both
+ claim `top-0` and overlap. A request sent from here otherwise left no trace on the
+ surface that sent it: the claim card looks exactly as it did before. */}
+ {outboundRequest && currentUserId ? (
+
+ ) : null}
+
) : null
@@ -2263,9 +2386,7 @@ export function DebateRematchPageClient({ sessionId }: { sessionId: string }) {
? `Nothing recommended for you and ${remoteName} yet.`
: source === 'mine'
? 'You haven’t taken a position on any claims yet.'
- : source === 'featured'
- ? 'No featured claims are available to debate yet.'
- : 'No other eligible claims are available yet.'
+ : 'No other eligible claims are available yet.'
}
// Four dead ends, and each has a different way out. Ordered by how much the viewer has
// to give up: clearing their filters, then dropping the toggle, then leaving the tab or
@@ -2295,9 +2416,9 @@ export function DebateRematchPageClient({ sessionId }: { sessionId: string }) {
// resolve, and the catalogue next door is the whole of the way out of it.
{ label: 'Explore claims', onClick: () => setTab('explore') }
: source === 'mine'
- ? // The same dead end one level down: a viewer who has answered nothing cannot
- // fill this list from here, and the whole corpus is one pick away.
- { label: 'Show all claims', onClick: () => setChosenSource('all') }
+ ? // The same dead end one tab over: a viewer who has answered nothing
+ // cannot fill this list from here, and the whole corpus is next door.
+ { label: 'Show all claims', onClick: () => setTab('explore') }
: undefined
}
>
diff --git a/apps/web/app/space/[id]/(space)/debates/rematches/[sessionId]/rematch-pair-header.tsx b/apps/web/app/space/[id]/(space)/debates/rematches/[sessionId]/rematch-pair-header.tsx
index bc6252a083..476552cb9b 100644
--- a/apps/web/app/space/[id]/(space)/debates/rematches/[sessionId]/rematch-pair-header.tsx
+++ b/apps/web/app/space/[id]/(space)/debates/rematches/[sessionId]/rematch-pair-header.tsx
@@ -72,9 +72,6 @@ export type PairHeaderToast =
| { kind: 'opponent-talking'; onUnmute: () => void; onDismiss: () => void }
| { kind: 'talking-while-muted'; onUnmute: () => void; onDismiss: () => void };
-/** Both sides of a locked pairing, once the pair have agreed what they are debating. */
-export type PairHeaderPositions = { localAgrees: boolean; opponentAgrees: boolean };
-
/**
* "Jenna Ruiz" -> "Jenna". The notice and the toasts address the opponent directly, and a display
* handle read out in the middle of a sentence reads like a username, not like the person talking.
@@ -90,9 +87,6 @@ type RematchPairHeaderProps = {
voice: PairHeaderVoice;
notice?: PairHeaderNotice | null;
toast?: PairHeaderToast | null;
- /** Set once the pair lock a claim — the claim sits above the cards and each card takes a side chip. */
- lockedClaim?: { claim: string; spaceName?: string | null } | null;
- positions?: PairHeaderPositions | null;
/** Opens the opponent's profile in the side panel — see `useOpenDebaterProfile`. */
onOpenOpponentSpace: (event: React.MouseEvent) => void;
/**
@@ -112,8 +106,6 @@ export function RematchPairHeader({
voice,
notice,
toast,
- lockedClaim,
- positions,
onOpenOpponentSpace,
leaveAction,
}: RematchPairHeaderProps) {
@@ -131,17 +123,10 @@ export function RematchPairHeader({
* other person mutes, and a control whose name moves is harder to use than one that is quiet.
*/
const opponentStatusId = React.useId();
- const opponentStatus = [
- voice.kind === 'live' ? opponentMicLabel(voice.opponentState, opponentName) : null,
- positions ? `${opponentName} ${positions.opponentAgrees ? 'agrees' : 'disagrees'}` : null,
- ]
- .filter(Boolean)
- .join('. ');
+ const opponentStatus = voice.kind === 'live' ? opponentMicLabel(voice.opponentState, opponentName) : '';
return (
- {lockedClaim ? : null}
-
{/* Them, then the badge, then you — the home side of a scoreboard, and the side a reader's
eye lands on last. Three tracks on desktop, stacked on a phone: two 150px cards side by
side at 375px leave no room for a labelled pill, and a labelled pill is the entire point
@@ -152,18 +137,11 @@ export function RematchPairHeader({
name={opponentName}
state={voice.kind === 'live' ? voice.opponentState : 'waiting'}
showMicState={voice.kind === 'live'}
- agrees={positions?.opponentAgrees}
onOpen={onOpenOpponentSpace}
describedBy={opponentStatusId}
/>
-
+
{/* The spoken half of the nudges: a region that is always mounted and only changes text. A
@@ -191,15 +169,6 @@ function toastAnnouncement(toast: PairHeaderToast, opponentName: string) {
: `You’re talking while muted.`;
}
-function LockedClaim({ claim, spaceName }: { claim: string; spaceName?: string | null }) {
- return (
-
- {spaceName ? {spaceName} : null}
-
{claim}
-
- );
-}
-
function VsBadge() {
return (
@@ -251,7 +220,6 @@ function PairCardBody({
nameTitle,
state,
action,
- footer,
}: {
avatar: React.ReactNode;
name: string;
@@ -260,8 +228,6 @@ function PairCardBody({
state?: React.ReactNode;
/** The corner: Leave on your side, View profile on theirs. */
action?: React.ReactNode;
- /** Below the whole row, spanning the card — the locked position chip. */
- footer?: React.ReactNode;
}) {
return (
<>
@@ -275,7 +241,6 @@ function PairCardBody({
{action ?
{action}
: null}
- {footer}
>
);
}
@@ -284,13 +249,11 @@ function YouCard({
local,
voice,
opponentName,
- agrees,
leaveAction,
}: {
local: PairHeaderParticipant | null;
voice: PairHeaderVoice;
opponentName: string;
- agrees?: boolean;
leaveAction?: React.ReactNode;
}) {
const live = voice.kind === 'live';
@@ -393,7 +356,6 @@ function YouCard({
>
}
action={leaveAction}
- footer={agrees === undefined ? null :