Skip to content

Commit c911b46

Browse files
committed
fix
1 parent a8fecbd commit c911b46

28 files changed

Lines changed: 71 additions & 606 deletions

File tree

‎apps/codebattle/assets/css/style.scss‎

Lines changed: 14 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1345,23 +1345,6 @@ a {
13451345
width: 25px;
13461346
}
13471347

1348-
.cb-sort-arrow {
1349-
height: 0;
1350-
width: 0;
1351-
border-left: 5px solid transparent;
1352-
border-right: 5px solid transparent;
1353-
1354-
&.asc {
1355-
border-bottom: 5px solid #666;
1356-
margin-bottom: 3px;
1357-
}
1358-
1359-
&.desc {
1360-
border-top: 5px solid #666;
1361-
padding-bottom: 2px;
1362-
}
1363-
}
1364-
13651348
.cb-private-text {
13661349
color: var(--indigo);
13671350
}
@@ -1409,23 +1392,6 @@ a {
14091392
cursor: pointer;
14101393
}
14111394

1412-
.sort-arrows:before,
1413-
.sort-arrows:after {
1414-
border: 5px solid transparent;
1415-
content: '';
1416-
display: block;
1417-
}
1418-
1419-
.sort-arrows:before {
1420-
border-bottom-color: #666;
1421-
}
1422-
1423-
.sort-arrows:after {
1424-
border-top-color: #666;
1425-
margin-top: 2px;
1426-
margin-bottom: -5px;
1427-
}
1428-
14291395
.x-bottom-0 {
14301396
bottom: 0;
14311397
}
@@ -3285,6 +3251,19 @@ a.cb-text-light:hover {
32853251
max-width: 33.333%;
32863252
}
32873253

3254+
.cb-lobby-chat-card .text-muted {
3255+
color: #a6a6b3 !important;
3256+
}
3257+
3258+
.cb-lobby-chat-action {
3259+
display: inline-flex;
3260+
align-items: center;
3261+
justify-content: center;
3262+
width: 32px;
3263+
min-width: 32px;
3264+
height: 32px;
3265+
}
3266+
32883267
.cb-season-actions .btn {
32893268
flex: 1 1 0;
32903269
min-width: 0;
@@ -3688,7 +3667,7 @@ a.cb-text-light:hover {
36883667
font-size: 0.9rem;
36893668
}
36903669

3691-
.cb-messages-list > div {
3670+
.cb-messages-list > li {
36923671
padding: 0.3rem 0.45rem;
36933672
margin-bottom: 0.1rem !important;
36943673
border-radius: 6px;

‎apps/codebattle/assets/js/__tests__/PresentationalComponents.test.tsx‎

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import InfoMessage from '../widgets/components/InfoMessage';
99
import Loading from '../widgets/components/Loading';
1010
import LobbyLoading from '../widgets/pages/lobby/LobbyLoading';
1111
import MessageTimestamp from '../widgets/components/MessageTimestamp';
12+
import Messages from '../widgets/components/Messages';
1213
import PlayerLoading from '../widgets/components/PlayerLoading';
1314
import SystemMessage from '../widgets/components/SystemMessage';
1415
import Timer from '../widgets/components/Timer';
@@ -17,6 +18,10 @@ vi.mock('../widgets/utils/useTimer', () => ({
1718
default: () => ['01:02:03', 3723],
1819
}));
1920

21+
vi.mock('../widgets/utils/useStayScrolled', () => ({
22+
default: () => ({ stayScrolled: vi.fn(), scrollBottom: vi.fn() }),
23+
}));
24+
2025
describe('presentational components', () => {
2126
test('renders a game level badge', () => {
2227
render(<GameLevelBadge level="easy" />);
@@ -73,6 +78,16 @@ describe('presentational components', () => {
7378
expect(screen.getByText(/\d{2}:\d{2} [AP]M/)).toHaveClass('text-muted');
7479
});
7580

81+
test('renders chat messages as semantic list items', () => {
82+
render(<Messages messages={[{ id: 1, text: 'Connected', type: 'system' }]} />);
83+
84+
const list = screen.getByRole('list');
85+
86+
expect(list).toHaveClass('list-unstyled');
87+
expect(list.children).toHaveLength(1);
88+
expect(list.firstElementChild).toHaveRole('listitem');
89+
});
90+
7691
test('renders system message status styling', () => {
7792
render(<SystemMessage text="Unable to join the game" meta={{ status: 'error' }} />);
7893

‎apps/codebattle/assets/js/app.ts‎

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,6 @@ const mainChannelRoot = document.getElementById('main-channel-root');
9696
const tournamentThreejsStreamRoot = document.getElementById('tournament-threejs-stream-root');
9797
const tournamentStreamAdminRoot = document.getElementById('tournament-stream-admin-root');
9898
const lobbyRoot = document.getElementById('lobby-root');
99-
const ratingList = document.getElementById('rating-list');
10099
const registrationRoot = document.getElementById('registration');
101100
const settingsRoot = document.getElementById('settings');
102101
const soundToggleRoot = document.getElementById('sound-toggle-root');
@@ -118,7 +117,6 @@ const primaryWidgetRoots = [
118117
gameMlRoot,
119118
heatmapRoot,
120119
lobbyRoot,
121-
ratingList,
122120
userPageRoot,
123121
settingsRoot,
124122
registrationRoot,
@@ -150,15 +148,13 @@ if (primaryWidgetRoots.some(Boolean)) {
150148
renderTournamentStreamAdminPage,
151149
renderTournamentThreejsStreamPage,
152150
renderUserPage,
153-
renderUsersRating,
154151
}) => {
155152
if (adminConnectionsRoot) renderAdminPage(adminConnectionsRoot);
156153
if (gameWidgetRoot) renderGameWidget(gameWidgetRoot);
157154
if (gameThreejsRoot) renderGameThreejsPage(gameThreejsRoot);
158155
if (gameMlRoot) renderGameMlPage(gameMlRoot);
159156
if (heatmapRoot) renderHeatmapWidget(heatmapRoot);
160157
if (lobbyRoot) renderLobby(lobbyRoot);
161-
if (ratingList) renderUsersRating(ratingList);
162158
if (userPageRoot) renderUserPage(userPageRoot);
163159
if (settingsRoot) renderSettingPage(settingsRoot);
164160
if (registrationRoot) renderRegistrationPage(registrationRoot);

‎apps/codebattle/assets/js/widgets/App.tsx‎

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,6 @@ const InvitesContainer = React.lazy(() => import('./components/InvitesContainer'
6868
const MainChannelContainer = React.lazy(() => import('./components/MainChannelContainer'));
6969
const LobbyWidget = React.lazy(() => import('./pages/lobby'));
7070
const OnlineContainer = React.lazy(() => import('./components/OnlineContainer'));
71-
const RatingList = React.lazy(() => import('./pages/rating'));
7271
const Registration = React.lazy(() => import('./pages/registration'));
7372
const RoomWidget = React.lazy(() => import('./pages/RoomWidget'));
7473
const ThreejsGamePage = React.lazy(() => import('./pages/game/ThreejsGamePage'));
@@ -189,18 +188,6 @@ export function Lobby() {
189188
);
190189
}
191190

192-
export function UsersRating() {
193-
return (
194-
<Provider store={store}>
195-
<PersistGate loading={null} persistor={persistor}>
196-
<Suspense>
197-
<RatingList />
198-
</Suspense>
199-
</PersistGate>
200-
</Provider>
201-
);
202-
}
203-
204191
export function TournamentsSchedulePage() {
205192
return (
206193
<Provider store={store}>

‎apps/codebattle/assets/js/widgets/components/Messages.tsx‎

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ function Messages({
129129
const messageClassName = cn(
130130
className,
131131
'overflow-auto pt-0 pl-3 pr-2',
132-
'position-relative cb-messages-list flex-grow-1',
132+
'position-relative cb-messages-list flex-grow-1 list-unstyled',
133133
);
134134

135135
if (disabled) {
@@ -160,21 +160,22 @@ function Messages({
160160
const key = getKey(id, time, name, messages.length - index);
161161

162162
return (
163-
<Message
164-
id={id}
165-
name={name}
166-
userId={userId}
167-
currentUserId={currentUserId}
168-
text={text}
169-
key={key}
170-
type={type}
171-
time={time}
172-
meta={meta}
173-
displayMenu={displayMenu}
174-
onBanUser={onBanUser}
175-
onDeleteMessage={onDeleteMessage}
176-
canDeleteAny={canDeleteAny}
177-
/>
163+
<li key={key}>
164+
<Message
165+
id={id}
166+
name={name}
167+
userId={userId}
168+
currentUserId={currentUserId}
169+
text={text}
170+
type={type}
171+
time={time}
172+
meta={meta}
173+
displayMenu={displayMenu}
174+
onBanUser={onBanUser}
175+
onDeleteMessage={onDeleteMessage}
176+
canDeleteAny={canDeleteAny}
177+
/>
178+
</li>
178179
);
179180
})}
180181
</ul>

‎apps/codebattle/assets/js/widgets/index.tsx‎

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ import {
2121
TournamentPage,
2222
TournamentPlayerPage,
2323
UserPage,
24-
UsersRating,
2524
AdminPage,
2625
} from './App';
2726

@@ -64,7 +63,5 @@ export const renderTournamentPlayerPage = (domElement: HTMLElement) =>
6463
createRoot(domElement).render(<TournamentPlayerPage />);
6564
export const renderUserPage = (domElement: HTMLElement) =>
6665
createRoot(domElement).render(<UserPage />);
67-
export const renderUsersRating = (domElement: HTMLElement) =>
68-
createRoot(domElement).render(<UsersRating />);
6966
export const renderAdminPage = (domElement: HTMLElement) =>
7067
createRoot(domElement).render(<AdminPage />);
Lines changed: 0 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
11
import { camelizeKeys } from 'humps';
2-
import moment from 'moment';
3-
import qs from 'qs';
42

53
import { actions } from '../slices';
64

@@ -72,74 +70,4 @@ export const sendPremiumRequest =
7270
}
7371
};
7472

75-
const periodToTimeUnit = {
76-
weekly: 'week',
77-
monthly: 'month',
78-
};
79-
80-
const getDateByPeriod = (period: string) => {
81-
if (period === 'total') {
82-
return null;
83-
}
84-
return moment()
85-
.startOf(periodToTimeUnit[period as keyof typeof periodToTimeUnit] as moment.unitOfTime.StartOf)
86-
.utc()
87-
.format('YYYY-MM-DD');
88-
};
89-
90-
interface UsersRatingFilter {
91-
name?: string;
92-
period: string;
93-
withBots?: boolean;
94-
}
95-
96-
interface UsersRatingSort {
97-
attribute: string;
98-
direction: string;
99-
}
100-
101-
// Guards against stale responses: the rating search fires on every keystroke
102-
// with no debounce, so a slow response for a short prefix (which ILIKE-matches
103-
// many users) could resolve after the final query and clobber it with
104-
// irrelevant results. Only the latest request's response is applied.
105-
let latestRatingRequestId = 0;
106-
107-
export const getUsersRatingPage =
108-
(
109-
{ name, period, withBots }: UsersRatingFilter,
110-
{ attribute, direction }: UsersRatingSort,
111-
page: number,
112-
pageSize: number,
113-
) =>
114-
(dispatch: any) => {
115-
const queryParamsString = qs.stringify({
116-
page,
117-
page_size: pageSize,
118-
s: `${attribute}+${direction}`,
119-
q: {
120-
name_ilike: name,
121-
},
122-
date_from: getDateByPeriod(period),
123-
with_bots: withBots,
124-
});
125-
126-
latestRatingRequestId += 1;
127-
const requestId = latestRatingRequestId;
128-
129-
requestJson(`/api/v1/users?${queryParamsString}`)
130-
.then((data: any) => {
131-
if (requestId !== latestRatingRequestId) {
132-
return;
133-
}
134-
dispatch(actions.updateUsersRatingPage(camelizeKeys(data)));
135-
dispatch(actions.finishStoreInit());
136-
})
137-
.catch((error: any) => {
138-
if (requestId !== latestRatingRequestId) {
139-
return;
140-
}
141-
dispatch(actions.setError(error));
142-
});
143-
};
144-
14573
export default loadUserStats;

‎apps/codebattle/assets/js/widgets/pages/admin/AdminWidget.tsx‎

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,6 @@ const getPageLabel = (path?: string | null) => {
7979

8080
if (/^\/e\//.test(p)) return 'Event';
8181

82-
if (p === '/users') return 'Rating';
8382
if (p === '/users/new') return 'Sign Up';
8483
if (/^\/users\/[^/]+/.test(p)) return 'Profile';
8584

0 commit comments

Comments
 (0)