Fix SonarCloud bugs: threading, React state, sorting

Backend:
- S2445: Make _connections readonly in MessageHub.cs to fix locking issue

Frontend:
- S6756: Use callback form of setState when referencing previous state
  - Collection.js, DiscoverMovie.js, ImportMovie.js
  - ImportMovieSelectMovie.js, EditQualityProfileModalContentConnector.js
- S2871: Add localeCompare for proper alphabetical sorting
  - Collection.js, DiscoverMovie.js, MovieIndex.tsx
- S1764: Remove duplicate condition in QualityProfileSelectInput.tsx
This commit is contained in:
admin 2025-12-19 15:15:24 -06:00
parent 220eba471b
commit 6d17e5eaff
8 changed files with 16 additions and 15 deletions

View file

@ -50,7 +50,7 @@ class ImportMovie extends Component {
onSelectAllChange = ({ value }) => {
// Only select non-dupes
this.setState(selectAll(this.state.selectedState, value));
this.setState((prevState) => selectAll(prevState.selectedState, value));
};
onSelectedChange = ({ id, value, shiftKey = false }) => {

View file

@ -78,7 +78,7 @@ class ImportMovieSelectMovie extends Component {
this._addListener();
}
this.setState({ isOpen: !this.state.isOpen });
this.setState((prevState) => ({ isOpen: !prevState.isOpen }));
};
onSearchInputChange = ({ value }) => {

View file

@ -151,7 +151,7 @@ class Collection extends Component {
return acc;
}, {});
const order = Object.keys(characters).sort();
const order = Object.keys(characters).sort((a, b) => a.localeCompare(b));
// Reverse if sorting descending
if (sortDirection === sortDirections.DESCENDING) {
@ -182,11 +182,13 @@ class Collection extends Component {
};
onSelectAllChange = ({ value }) => {
this.setState(selectAll(this.state.selectedState, value));
this.setState((prevState) => selectAll(prevState.selectedState, value));
};
onSelectAllPress = () => {
this.onSelectAllChange({ value: !this.state.allSelected });
this.setState((prevState) =>
selectAll(prevState.selectedState, !prevState.allSelected)
);
};
onRefreshMovieCollectionsPress = () => {

View file

@ -94,10 +94,7 @@ function QualityProfileSelectInput({
);
useEffect(() => {
if (
!value ||
!values.some((option) => option.key === value || option.key === value)
) {
if (!value || !values.some((option) => option.key === value)) {
const firstValue = values.find(
(option) => typeof option.key === 'number'
);

View file

@ -175,7 +175,7 @@ class DiscoverMovie extends Component {
return acc;
}, {});
const order = Object.keys(characters).sort();
const order = Object.keys(characters).sort((a, b) => a.localeCompare(b));
// Reverse if sorting descending
if (sortDirection === sortDirections.DESCENDING) {
@ -214,11 +214,13 @@ class DiscoverMovie extends Component {
};
onSelectAllChange = ({ value }) => {
this.setState(selectAll(this.state.selectedState, value));
this.setState((prevState) => selectAll(prevState.selectedState, value));
};
onSelectAllPress = () => {
this.onSelectAllChange({ value: !this.state.allSelected });
this.setState((prevState) =>
selectAll(prevState.selectedState, !prevState.allSelected)
);
};
onImportListSyncPress = () => {

View file

@ -219,7 +219,7 @@ const MovieIndex = withScrollPosition((props: Readonly<MovieIndexProps>) => {
return acc;
}, {});
const order = Object.keys(characters).sort();
const order = Object.keys(characters).sort((a, b) => a.localeCompare(b));
// Reverse if sorting descending
if (sortDirection === DESCENDING) {

View file

@ -474,7 +474,7 @@ class EditQualityProfileModalContentConnector extends Component {
};
onToggleEditGroupsMode = () => {
this.setState({ editGroups: !this.state.editGroups });
this.setState((prevState) => ({ editGroups: !prevState.editGroups }));
};
//

View file

@ -25,7 +25,7 @@ public async Task BroadcastMessage(SignalRMessage message)
public class MessageHub : Hub
{
private static HashSet<string> _connections = new HashSet<string>();
private static readonly HashSet<string> _connections = new HashSet<string>();
public static bool IsConnected
{