Skip to content

Commit e4f66ca

Browse files
committed
Cancel challenges
1 parent 790986d commit e4f66ca

File tree

4 files changed

+65
-17
lines changed

4 files changed

+65
-17
lines changed

src/UI/components/single/Chat.tsx

+49-12
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ export default function Chat(props: Readonly<HTMLAttributes<HTMLDivElement>>) {
7373
type={message.type}
7474
hld={message.hld}
7575
prev={arr[index - 1]}
76+
cancelled={message.cancelled}
7677
/>
7778
</ErrorBoundary>
7879
)) : null}
@@ -100,44 +101,80 @@ const options = {
100101
} as const;
101102

102103
export function ChallengeMessage(
103-
{ message, user }: Readonly<{
104+
{ message, user, cancelled }: Readonly<{
104105
message: string;
105106
user: string;
107+
cancelled?: boolean;
106108
}>,
107109
) {
108110
const { client } = useClientContext();
109111
const currentRoom = useClientStore(state => state.currentRoom);
110112

113+
111114
function acceptChallenge() {
112115
assert(currentRoom, 'currentRoom');
113116
client.send('/accept', currentRoom.ID);
114117
}
115118

119+
function cancelChallenge() {
120+
assert(currentRoom, 'currentRoom');
121+
client.send('/reject', currentRoom.ID);
122+
}
123+
116124
const formatID = message.split('|')[0];
117125
const format = client.formatName(formatID) || { gen: 9, name: `Unknown(${formatID})` };
126+
if (cancelled) {
127+
return (
128+
<div className="p-2 bg-gray-100 rounded-md flex flex-col justify-center items-center">
129+
Challenge from <Username user={user} bold /> was cancelled
130+
</div>
131+
);
132+
}
118133
return (
119134
<div className="p-2 bg-blue-pastel rounded-md flex flex-col justify-center items-center">
120-
You received a challenge from <Username user={user} bold />
121-
<strong>
122-
<span className='text-sm text-gray-125'>[Gen {format.gen}]</span> {format.name}
123-
</strong>
124-
<Button
125-
onClick={() => {
126-
acceptChallenge();
127-
}}
128-
>Accept</Button>
135+
{ user === client.username ? (
136+
<>
137+
<div>Waiting for opponent to accept challenge</div>
138+
<strong>
139+
<span className='text-sm text-gray-125'>[Gen {format.gen}]</span> {format.name}
140+
</strong>
141+
</>
142+
) :
143+
<>
144+
<div>You received a challenge from <Username user={user} bold /></div>
145+
<strong>
146+
<span className='text-sm text-gray-125'>[Gen {format.gen}]</span> {format.name}
147+
</strong>
148+
<div className="flex justify-center items-center gap-4">
149+
<Button
150+
variant="secondary"
151+
onClick={() => {
152+
acceptChallenge();
153+
}}
154+
>Accept</Button>
155+
156+
<Button
157+
variant="secondary"
158+
onClick={() => {
159+
cancelChallenge();
160+
}}
161+
>Decline</Button>
162+
</div>
163+
</>
164+
}
129165
</div>
130166
);
131167
}
132168

133169
export function MessageComponent(
134-
{ message, user, type, time, hld, prev }: Readonly<{
170+
{ message, user, type, time, hld, prev, cancelled }: Readonly<{
135171
message: string;
136172
user: string;
137173
type: MessageType;
138174
time?: Date;
139175
hld?: boolean | null;
140176
prev?: Message;
177+
cancelled?: boolean;
141178
}>,
142179
) {
143180
if (type === 'boxedHTML') {
@@ -171,7 +208,7 @@ export function MessageComponent(
171208
);
172209
}
173210
if (type === 'challenge') {
174-
return <ChallengeMessage message={message} user={user} />;
211+
return <ChallengeMessage message={message} user={user} cancelled={cancelled} />;
175212
}
176213
if (type === 'log') {
177214
return (

src/client/client.ts

+12-3
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ interface UseClientStoreType {
2424
// messages: Message[]; // only messages from the current room
2525
messages: Record<Room['ID'], Message[]>; // messages from all rooms
2626
newMessage: (room: Room, message: Message) => void;
27+
updateMessages: (room: Room) => void;
2728
notifications: Record<Room['ID'], RoomNotifications>;
2829
clearNotifications: (roomID: Room['ID']) => void;
2930
addUnread: (room: Room) => void;
@@ -58,6 +59,12 @@ export const useClientStore = create<UseClientStoreType>((set) => ({
5859
};
5960
});
6061
},
62+
updateMessages: (room: Room) => {
63+
// copy all messages from changed room
64+
set((state) => ({
65+
messages: { ...state.messages, [room.ID]: [...room.messages] },
66+
}));
67+
},
6168
notifications: {},
6269
addUnread: (room: Room) => {
6370
set((state) => {
@@ -839,9 +846,7 @@ export class Client {
839846
const room = this.requiresRoom('pm', inferredRoomid);
840847
if (!room) return false;
841848
room.endChallenge();
842-
this.events.dispatchEvent(
843-
new CustomEvent('message', { detail: { room: inferredRoomid, end: true } }),
844-
);
849+
useClientStore.getState().updateMessages(room);
845850
} else {
846851
// start challenge
847852
this.addMessageToRoom(
@@ -1331,6 +1336,10 @@ export class Client {
13311336
type = 'challenge';
13321337
content = content.slice(11);
13331338
break;
1339+
case '/nonotify':
1340+
type = 'log';
1341+
content = content.slice(9);
1342+
break;
13341343
default:
13351344
break;
13361345
}

src/client/message.ts

+1
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ export type Message = {
2020
/** true if message is highlighted, false if not, null if not parsed yet */
2121
hld: boolean | null
2222
name?: string; // only defined for uhtml messages
23+
cancelled?: boolean; // only defined for challenge messages
2324
};
2425

2526
export default function ({

src/client/room/room.ts

+3-2
Original file line numberDiff line numberDiff line change
@@ -58,14 +58,15 @@ export class Room {
5858
}
5959

6060
endChallenge() {
61-
const challengeMessage = this.messages.find((m) => m.type === 'challenge');
61+
const challengeMessage = this.messages.find((m) => m.type === 'challenge' && !m.cancelled);
6262
if (!challengeMessage) {
6363
console.error(
6464
`endChallenge(): Tried to end non-existent challenge message for room ${this.name}`,
6565
);
6666
return;
6767
}
68-
this.messages.splice(this.messages.indexOf(challengeMessage), 1);
68+
// this.messages.splice(this.messages.indexOf(challengeMessage), 1);
69+
challengeMessage.cancelled = true;
6970
}
7071

7172
addMessage(

0 commit comments

Comments
 (0)