Merge pull request #66 from cheir-mneme/fix/p2-ci-tooling

fix(ci): P2 improvements - editorconfig, integration tests, Prettier 3
This commit is contained in:
Cody Kickertz 2025-12-19 12:00:25 -06:00 committed by GitHub
commit f7fca51da7
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
110 changed files with 474 additions and 297 deletions

View file

@ -5,7 +5,7 @@ root = true
# NOTE: Requires **VS2019 16.3** or later
# Stylecop.ruleset
# Description: Rules for Radarr
# Description: Rules for Aletheia
# Code files
[*.cs]
@ -18,12 +18,6 @@ indent_size = 4
# Sort using and Import directives with System.* appearing first
dotnet_sort_system_directives_first = true
# Avoid "this." and "Me." if not necessary
dotnet_style_qualification_for_field = false:refactoring
dotnet_style_qualification_for_property = false:refactoring
dotnet_style_qualification_for_method = false:refactoring
dotnet_style_qualification_for_event = false:refactoring
# Indentation preferences
csharp_indent_block_contents = true
csharp_indent_braces = false
@ -32,10 +26,13 @@ csharp_indent_case_contents_when_block = true
csharp_indent_switch_labels = true
csharp_indent_labels = flush_left
# Avoid "this." and "Me." if not necessary
dotnet_style_qualification_for_field = false:suggestion
dotnet_style_qualification_for_property = false:suggestion
dotnet_style_qualification_for_method = false:suggestion
dotnet_style_qualification_for_event = false:suggestion
# Naming conventions
dotnet_naming_style.instance_field_style.capitalization = camel_case
dotnet_naming_style.instance_field_style.required_prefix = _

View file

@ -93,10 +93,21 @@ jobs:
cp _tests/net8.0/linux-x64/publish/*.json _tests/ 2>/dev/null || true
find _tests -name "Radarr.Test.Dummy" -exec chmod a+x {} \;
- name: Test with coverage
- name: Unit tests with coverage
shell: bash
run: ./test.sh Linux Unit Coverage
- name: Integration tests
shell: bash
run: |
mkdir -p bin
cp -r _output/net8.0/linux-x64/publish/* bin/
chmod +x bin/Radarr
./test.sh Linux Integration Test
# Integration tests may fail in CI without full environment setup
# Remove continue-on-error once tests are stable
continue-on-error: true
- name: Report test results
uses: dorny/test-reporter@v2
if: always()

View file

@ -27,7 +27,9 @@ interface BlocklistFilterModalProps {
isOpen: boolean;
}
export default function BlocklistFilterModal(props: Readonly<BlocklistFilterModalProps>) {
export default function BlocklistFilterModal(
props: Readonly<BlocklistFilterModalProps>
) {
const sectionItems = useSelector(createBlocklistSelector());
const filterBuilderProps = useSelector(createFilterBuilderPropsSelector());
const customFilterType = 'blocklist';

View file

@ -74,7 +74,10 @@ interface HistoryEventTypeCellProps {
data: HistoryData;
}
function HistoryEventTypeCell({ eventType, data }: Readonly<HistoryEventTypeCellProps>) {
function HistoryEventTypeCell({
eventType,
data,
}: Readonly<HistoryEventTypeCellProps>) {
const iconName = getIconName(eventType, data);
const iconKind = getIconKind(eventType);
const tooltip = getTooltip(eventType, data);

View file

@ -27,7 +27,9 @@ interface HistoryFilterModalProps {
isOpen: boolean;
}
export default function HistoryFilterModal(props: Readonly<HistoryFilterModalProps>) {
export default function HistoryFilterModal(
props: Readonly<HistoryFilterModalProps>
) {
const sectionItems = useSelector(createHistorySelector());
const filterBuilderProps = useSelector(createFilterBuilderPropsSelector());
const customFilterType = 'history';

View file

@ -27,7 +27,9 @@ interface QueueFilterModalProps {
isOpen: boolean;
}
export default function QueueFilterModal(props: Readonly<QueueFilterModalProps>) {
export default function QueueFilterModal(
props: Readonly<QueueFilterModalProps>
) {
const sectionItems = useSelector(createQueueSelector());
const filterBuilderProps = useSelector(createFilterBuilderPropsSelector());
const customFilterType = 'queue';

View file

@ -63,8 +63,7 @@ export interface AppSectionItemState<T> {
}
export interface AppSectionProviderState<T>
extends AppSectionDeleteState,
AppSectionSaveState {
extends AppSectionDeleteState, AppSectionSaveState {
isFetching: boolean;
isPopulated: boolean;
isTesting?: boolean;

View file

@ -6,7 +6,8 @@ import AppSectionState, {
} from './AppSectionState';
interface BlocklistAppState
extends AppSectionState<Blocklist>,
extends
AppSectionState<Blocklist>,
AppSectionFilterState<Blocklist>,
PagedAppSectionState,
TableAppSectionState {

View file

@ -15,8 +15,7 @@ interface CalendarOptions {
}
interface CalendarAppState
extends AppSectionState<CalendarItem>,
AppSectionFilterState<CalendarItem> {
extends AppSectionState<CalendarItem>, AppSectionFilterState<CalendarItem> {
searchMissingCommandId: number | null;
start: moment.Moment;
end: moment.Moment;

View file

@ -4,7 +4,6 @@ import AppSectionState, {
import { CustomFilter } from './AppState';
interface CustomFiltersAppState
extends AppSectionState<CustomFilter>,
AppSectionDeleteState {}
extends AppSectionState<CustomFilter>, AppSectionDeleteState {}
export default CustomFiltersAppState;

View file

@ -8,7 +8,8 @@ import History from 'typings/History';
export type MovieHistoryAppState = AppSectionState<History>;
interface HistoryAppState
extends AppSectionState<History>,
extends
AppSectionState<History>,
AppSectionFilterState<History>,
PagedAppSectionState,
TableAppSectionState {}

View file

@ -6,7 +6,8 @@ import AppSectionState, {
import MovieCollection from 'typings/MovieCollection';
interface MovieCollectionAppState
extends AppSectionState<MovieCollection>,
extends
AppSectionState<MovieCollection>,
AppSectionFilterState<MovieCollection>,
AppSectionSaveState {
itemMap: Record<number, number>;

View file

@ -4,7 +4,6 @@ import AppSectionState, {
import { MovieFile } from 'MovieFile/MovieFile';
interface MovieFilesAppState
extends AppSectionState<MovieFile>,
AppSectionDeleteState {}
extends AppSectionState<MovieFile>, AppSectionDeleteState {}
export default MovieFilesAppState;

View file

@ -56,9 +56,7 @@ export interface MovieIndexAppState {
}
interface MoviesAppState
extends AppSectionState<Movie>,
AppSectionDeleteState,
AppSectionSaveState {
extends AppSectionState<Movie>, AppSectionDeleteState, AppSectionSaveState {
itemMap: Record<number, number>;
deleteOptions: {

View file

@ -22,7 +22,8 @@ export interface QueueDetailsAppState extends AppSectionState<Queue> {
}
export interface QueuePagedAppState
extends AppSectionState<Queue>,
extends
AppSectionState<Queue>,
AppSectionFilterState<Queue>,
PagedAppSectionState,
TableAppSectionState {

View file

@ -4,7 +4,6 @@ import AppSectionState, {
import Release from 'typings/Release';
interface ReleasesAppState
extends AppSectionState<Release>,
AppSectionFilterState<Release> {}
extends AppSectionState<Release>, AppSectionFilterState<Release> {}
export default ReleasesAppState;

View file

@ -5,7 +5,8 @@ import AppSectionState, {
import RootFolder from 'typings/RootFolder';
interface RootFolderAppState
extends AppSectionState<RootFolder>,
extends
AppSectionState<RootFolder>,
AppSectionDeleteState,
AppSectionSaveState {}

View file

@ -32,44 +32,46 @@ type Presets<T> = T & {
};
export interface AutoTaggingAppState
extends AppSectionState<AutoTagging>,
extends
AppSectionState<AutoTagging>,
AppSectionDeleteState,
AppSectionSaveState {}
export interface AutoTaggingSpecificationAppState
extends AppSectionState<AutoTaggingSpecification>,
extends
AppSectionState<AutoTaggingSpecification>,
AppSectionDeleteState,
AppSectionSaveState,
AppSectionSchemaState<AutoTaggingSpecification> {}
export interface DelayProfileAppState
extends AppSectionState<DelayProfile>,
extends
AppSectionState<DelayProfile>,
AppSectionDeleteState,
AppSectionSaveState {}
export interface DownloadClientAppState
extends AppSectionState<DownloadClient>,
extends
AppSectionState<DownloadClient>,
AppSectionDeleteState,
AppSectionSaveState {
isTestingAll: boolean;
}
export interface GeneralAppState
extends AppSectionItemState<General>,
AppSectionSaveState {}
extends AppSectionItemState<General>, AppSectionSaveState {}
export interface MediaManagementAppState
extends AppSectionItemState<MediaManagement>,
AppSectionSaveState {}
extends AppSectionItemState<MediaManagement>, AppSectionSaveState {}
export interface NamingAppState
extends AppSectionItemState<NamingConfig>,
AppSectionSaveState {}
extends AppSectionItemState<NamingConfig>, AppSectionSaveState {}
export type NamingExamplesAppState = AppSectionItemState<NamingExample>;
export interface ImportListAppState
extends AppSectionState<ImportList>,
extends
AppSectionState<ImportList>,
AppSectionDeleteState,
AppSectionSaveState,
AppSectionSchemaState<Presets<ImportList>> {
@ -77,11 +79,11 @@ export interface ImportListAppState
}
export interface IndexerOptionsAppState
extends AppSectionItemState<IndexerOptions>,
AppSectionSaveState {}
extends AppSectionItemState<IndexerOptions>, AppSectionSaveState {}
export interface IndexerAppState
extends AppSectionState<Indexer>,
extends
AppSectionState<Indexer>,
AppSectionDeleteState,
AppSectionSaveState,
AppSectionSchemaState<Presets<Indexer>> {
@ -89,30 +91,30 @@ export interface IndexerAppState
}
export interface NotificationAppState
extends AppSectionState<Notification>,
AppSectionDeleteState {}
extends AppSectionState<Notification>, AppSectionDeleteState {}
export interface QualityProfilesAppState
extends AppSectionState<QualityProfile>,
extends
AppSectionState<QualityProfile>,
AppSectionItemSchemaState<QualityProfile> {}
export interface ReleaseProfilesAppState
extends AppSectionState<ReleaseProfile>,
AppSectionSaveState {
extends AppSectionState<ReleaseProfile>, AppSectionSaveState {
pendingChanges: Partial<ReleaseProfile>;
}
export interface CustomFormatAppState
extends AppSectionState<CustomFormat>,
extends
AppSectionState<CustomFormat>,
AppSectionDeleteState,
AppSectionSaveState {}
export interface ImportListOptionsSettingsAppState
extends AppSectionItemState<ImportListOptionsSettings>,
AppSectionSaveState {}
extends AppSectionItemState<ImportListOptionsSettings>, AppSectionSaveState {}
export interface ImportListExclusionsSettingsAppState
extends AppSectionState<ImportListExclusion>,
extends
AppSectionState<ImportListExclusion>,
AppSectionSaveState,
PagedAppSectionState,
AppSectionDeleteState {

View file

@ -21,7 +21,8 @@ export interface TagDetail extends ModelBase {
}
export interface TagDetailAppState
extends AppSectionState<TagDetail>,
extends
AppSectionState<TagDetail>,
AppSectionDeleteState,
AppSectionSaveState {}

View file

@ -10,13 +10,15 @@ interface WantedMovie extends Movie {
}
interface WantedCutoffUnmetAppState
extends AppSectionState<WantedMovie>,
extends
AppSectionState<WantedMovie>,
AppSectionFilterState<WantedMovie>,
PagedAppSectionState,
TableAppSectionState {}
interface WantedMissingAppState
extends AppSectionState<WantedMovie>,
extends
AppSectionState<WantedMovie>,
AppSectionFilterState<WantedMovie>,
PagedAppSectionState,
TableAppSectionState {}

View file

@ -27,7 +27,9 @@ interface CalendarFilterModalProps {
isOpen: boolean;
}
export default function CalendarFilterModal(props: Readonly<CalendarFilterModalProps>) {
export default function CalendarFilterModal(
props: Readonly<CalendarFilterModalProps>
) {
const sectionItems = useSelector(createCalendarSelector());
const filterBuilderProps = useSelector(createFilterBuilderPropsSelector());
const customFilterType = 'calendar';

View file

@ -3,8 +3,10 @@ import { CalendarView } from 'Calendar/calendarViews';
import Button, { ButtonProps } from 'Components/Link/Button';
import titleCase from 'Utilities/String/titleCase';
interface CalendarHeaderViewButtonProps
extends Omit<ButtonProps, 'children' | 'onPress'> {
interface CalendarHeaderViewButtonProps extends Omit<
ButtonProps,
'children' | 'onPress'
> {
view: CalendarView;
selectedView: CalendarView;
onPress: (view: CalendarView) => void;

View file

@ -7,8 +7,7 @@ import AddNewMovieCollectionMovieModalContent, {
AddNewMovieCollectionMovieModalContentProps,
} from './AddNewMovieCollectionMovieModalContent';
interface AddNewCollectionMovieModalProps
extends AddNewMovieCollectionMovieModalContentProps {
interface AddNewCollectionMovieModalProps extends AddNewMovieCollectionMovieModalContentProps {
isOpen: boolean;
}

View file

@ -6,8 +6,7 @@ import EditMovieCollectionModalContent, {
EditMovieCollectionModalContentProps,
} from './EditMovieCollectionModalContent';
interface EditMovieCollectionModalProps
extends EditMovieCollectionModalContentProps {
interface EditMovieCollectionModalProps extends EditMovieCollectionModalContentProps {
isOpen: boolean;
}

View file

@ -6,7 +6,9 @@ export interface DescriptionListItemTitleProps {
children?: ReactNode;
}
function DescriptionListItemTitle(props: Readonly<DescriptionListItemTitleProps>) {
function DescriptionListItemTitle(
props: Readonly<DescriptionListItemTitleProps>
) {
const { className = styles.title, children } = props;
return <dt className={className}>{children}</dt>;

View file

@ -10,7 +10,11 @@ interface FieldSetProps {
children?: React.ReactNode;
}
function FieldSet({ size = sizes.MEDIUM, legend, children }: Readonly<FieldSetProps>) {
function FieldSet({
size = sizes.MEDIUM,
legend,
children,
}: Readonly<FieldSetProps>) {
return (
<fieldset className={styles.fieldSet}>
<legend

View file

@ -46,7 +46,9 @@ export interface FileBrowserModalContentProps {
onModalClose: () => void;
}
function FileBrowserModalContent(props: Readonly<FileBrowserModalContentProps>) {
function FileBrowserModalContent(
props: Readonly<FileBrowserModalContentProps>
) {
const { name, value, includeFiles = true, onChange, onModalClose } = props;
const dispatch = useDispatch();

View file

@ -4,7 +4,9 @@ import createLanguagesSelector from 'Store/Selectors/createLanguagesSelector';
import FilterBuilderRowValue from './FilterBuilderRowValue';
import FilterBuilderRowValueProps from './FilterBuilderRowValueProps';
function LanguageFilterBuilderRowValue(props: Readonly<FilterBuilderRowValueProps>) {
function LanguageFilterBuilderRowValue(
props: Readonly<FilterBuilderRowValueProps>
) {
const { items } = useSelector(createLanguagesSelector());
return <FilterBuilderRowValue {...props} tagList={items} />;

View file

@ -6,7 +6,9 @@ import sortByProp from 'Utilities/Array/sortByProp';
import FilterBuilderRowValue from './FilterBuilderRowValue';
import FilterBuilderRowValueProps from './FilterBuilderRowValueProps';
function MovieFilterBuilderRowValue(props: Readonly<FilterBuilderRowValueProps>) {
function MovieFilterBuilderRowValue(
props: Readonly<FilterBuilderRowValueProps>
) {
const allMovies: Movie[] = useSelector(createAllMoviesSelector());
const tagList = allMovies

View file

@ -60,7 +60,9 @@ const statusTagList = [
},
];
function QueueStatusFilterBuilderRowValue(props: Readonly<FilterBuilderRowValueProps>) {
function QueueStatusFilterBuilderRowValue(
props: Readonly<FilterBuilderRowValueProps>
) {
return <FilterBuilderRowValue {...props} tagList={statusTagList} />;
}

View file

@ -25,8 +25,10 @@ import usePrevious from 'Helpers/Hooks/usePrevious';
import { InputChanged } from 'typings/inputs';
import styles from './AutoSuggestInput.css';
interface AutoSuggestInputProps<T>
extends Omit<AutosuggestPropsBase<T>, 'renderInputComponent' | 'inputProps'> {
interface AutoSuggestInputProps<T> extends Omit<
AutosuggestPropsBase<T>,
'renderInputComponent' | 'inputProps'
> {
forwardedRef?: MutableRefObject<Autosuggest<T> | null>;
className?: string;
inputContainerClassName?: string;

View file

@ -90,65 +90,68 @@ const componentMap: Record<InputType, ElementType> = {
type PickProps<V, C extends InputType> = C extends 'text'
? TextInputProps
: C extends 'autoComplete'
? AutoCompleteInputProps
: C extends 'availabilitySelect'
? AvailabilitySelectInputProps
: C extends 'captcha'
? CaptchaInputProps
: C extends 'check'
? CheckInputProps
: C extends 'date'
? TextInputProps
: C extends 'device'
? DeviceInputProps
: C extends 'downloadClientSelect'
? DownloadClientSelectInputProps
: C extends 'dynamicSelect'
? ProviderOptionSelectInputProps
: C extends 'file'
? TextInputProps
: C extends 'float'
? TextInputProps
: C extends 'indexerFlagsSelect'
? IndexerFlagsSelectInputProps
: C extends 'indexerSelect'
? IndexerSelectInputProps
: C extends 'keyValueList'
? KeyValueListInputProps
: C extends 'languageSelect'
? LanguageSelectInputProps
: C extends 'monitorMoviesSelect'
? MonitorMoviesSelectInputProps
: C extends 'movieTag'
? MovieTagInputProps<V>
: C extends 'number'
? NumberInputProps
: C extends 'oauth'
? OAuthInputProps
: C extends 'password'
? TextInputProps
: C extends 'path'
? PathInputProps
: C extends 'qualityProfileSelect'
? QualityProfileSelectInputProps
: C extends 'rootFolderSelect'
? RootFolderSelectInputProps
: C extends 'select'
? // eslint-disable-next-line @typescript-eslint/no-explicit-any
EnhancedSelectInputProps<any, V>
: C extends 'tag'
? MovieTagInputProps<V>
: C extends 'tagSelect'
? TagSelectInputProps
: C extends 'text'
? TextInputProps
: C extends 'textArea'
? TextAreaProps
: C extends 'textTag'
? TextTagInputProps
: C extends 'umask'
? UMaskInputProps
: never;
? AutoCompleteInputProps
: C extends 'availabilitySelect'
? AvailabilitySelectInputProps
: C extends 'captcha'
? CaptchaInputProps
: C extends 'check'
? CheckInputProps
: C extends 'date'
? TextInputProps
: C extends 'device'
? DeviceInputProps
: C extends 'downloadClientSelect'
? DownloadClientSelectInputProps
: C extends 'dynamicSelect'
? ProviderOptionSelectInputProps
: C extends 'file'
? TextInputProps
: C extends 'float'
? TextInputProps
: C extends 'indexerFlagsSelect'
? IndexerFlagsSelectInputProps
: C extends 'indexerSelect'
? IndexerSelectInputProps
: C extends 'keyValueList'
? KeyValueListInputProps
: C extends 'languageSelect'
? LanguageSelectInputProps
: C extends 'monitorMoviesSelect'
? MonitorMoviesSelectInputProps
: C extends 'movieTag'
? MovieTagInputProps<V>
: C extends 'number'
? NumberInputProps
: C extends 'oauth'
? OAuthInputProps
: C extends 'password'
? TextInputProps
: C extends 'path'
? PathInputProps
: C extends 'qualityProfileSelect'
? QualityProfileSelectInputProps
: C extends 'rootFolderSelect'
? RootFolderSelectInputProps
: C extends 'select'
? EnhancedSelectInputProps<
// eslint-disable-next-line @typescript-eslint/no-explicit-any
any,
V
>
: C extends 'tag'
? MovieTagInputProps<V>
: C extends 'tagSelect'
? TagSelectInputProps
: C extends 'text'
? TextInputProps
: C extends 'textArea'
? TextAreaProps
: C extends 'textTag'
? TextTagInputProps
: C extends 'umask'
? UMaskInputProps
: never;
export interface FormInputGroupValues<T> {
key: T;

View file

@ -24,8 +24,10 @@ function parseValue(
return newValue;
}
export interface NumberInputProps
extends Omit<TextInputProps, 'value' | 'onChange'> {
export interface NumberInputProps extends Omit<
TextInputProps,
'value' | 'onChange'
> {
value?: number | null;
min?: number;
max?: number;

View file

@ -5,11 +5,10 @@ import EnhancedSelectInput, {
EnhancedSelectInputValue,
} from './EnhancedSelectInput';
export interface AvailabilitySelectInputProps
extends Omit<
EnhancedSelectInputProps<EnhancedSelectInputValue<string>, string>,
'values'
> {
export interface AvailabilitySelectInputProps extends Omit<
EnhancedSelectInputProps<EnhancedSelectInputValue<string>, string>,
'values'
> {
includeNoChange?: boolean;
includeNoChangeDisabled?: boolean;
includeMixed?: boolean;
@ -42,7 +41,9 @@ const movieAvailabilityOptions: IMovieAvailabilityOption[] = [
},
];
function AvailabilitySelectInput(props: Readonly<AvailabilitySelectInputProps>) {
function AvailabilitySelectInput(
props: Readonly<AvailabilitySelectInputProps>
) {
const {
includeNoChange = false,
includeNoChangeDisabled = true,

View file

@ -51,11 +51,10 @@ function createDownloadClientsSelector(
);
}
export interface DownloadClientSelectInputProps
extends Omit<
EnhancedSelectInputProps<EnhancedSelectInputValue<number>, number>,
'values'
> {
export interface DownloadClientSelectInputProps extends Omit<
EnhancedSelectInputProps<EnhancedSelectInputValue<number>, number>,
'values'
> {
name: string;
value: number;
includeAny?: boolean;

View file

@ -119,7 +119,7 @@ export interface EnhancedSelectInputValue<V> {
export interface EnhancedSelectInputProps<
T extends EnhancedSelectInputValue<V>,
V
V,
> {
className?: string;
disabledClassName?: string;

View file

@ -5,15 +5,19 @@ import EnhancedSelectInputOption, {
} from './EnhancedSelectInputOption';
import styles from './HintedSelectInputOption.css';
interface HintedSelectInputOptionProps
extends Omit<EnhancedSelectInputOptionProps, 'isSelected'> {
interface HintedSelectInputOptionProps extends Omit<
EnhancedSelectInputOptionProps,
'isSelected'
> {
value: string;
hint?: React.ReactNode;
dividerAfter?: boolean;
isSelected?: boolean;
}
function HintedSelectInputOption(props: Readonly<HintedSelectInputOptionProps>) {
function HintedSelectInputOption(
props: Readonly<HintedSelectInputOptionProps>
) {
const {
id,
value,

View file

@ -15,7 +15,7 @@ interface HintedSelectInputSelectedValueProps<T, V> {
function HintedSelectInputSelectedValue<
T extends EnhancedSelectInputValue<V>,
V extends number | string
V extends number | string,
>(props: HintedSelectInputSelectedValueProps<T, V>) {
const {
selectedValue,

View file

@ -6,16 +6,17 @@ import EnhancedSelectInput, {
EnhancedSelectInputValue,
} from './EnhancedSelectInput';
export interface MonitorMoviesSelectInputProps
extends Omit<
EnhancedSelectInputProps<EnhancedSelectInputValue<string>, string>,
'values'
> {
export interface MonitorMoviesSelectInputProps extends Omit<
EnhancedSelectInputProps<EnhancedSelectInputValue<string>, string>,
'values'
> {
includeNoChange?: boolean;
includeMixed?: boolean;
}
function MonitorMoviesSelectInput(props: Readonly<MonitorMoviesSelectInputProps>) {
function MonitorMoviesSelectInput(
props: Readonly<MonitorMoviesSelectInputProps>
) {
const {
includeNoChange = false,
includeMixed = false,

View file

@ -69,11 +69,10 @@ function createProviderOptionsSelector(
);
}
export interface ProviderOptionSelectInputProps
extends Omit<
EnhancedSelectInputProps<EnhancedSelectInputValue<unknown>, unknown>,
'values'
> {
export interface ProviderOptionSelectInputProps extends Omit<
EnhancedSelectInputProps<EnhancedSelectInputValue<unknown>, unknown>,
'values'
> {
provider: string;
providerData: ProviderOptions;
name: string;

View file

@ -56,14 +56,13 @@ function createQualityProfilesSelector(
);
}
export interface QualityProfileSelectInputProps
extends Omit<
EnhancedSelectInputProps<
EnhancedSelectInputValue<number | string>,
number | string
>,
'values'
> {
export interface QualityProfileSelectInputProps extends Omit<
EnhancedSelectInputProps<
EnhancedSelectInputValue<number | string>,
number | string
>,
'values'
> {
name: string;
includeNoChange?: boolean;
includeNoChangeDisabled?: boolean;

View file

@ -19,17 +19,15 @@ import RootFolderSelectInputSelectedValue from './RootFolderSelectInputSelectedV
const ADD_NEW_KEY = 'addNew';
export interface RootFolderSelectInputValue
extends EnhancedSelectInputValue<string> {
export interface RootFolderSelectInputValue extends EnhancedSelectInputValue<string> {
freeSpace?: number;
isMissing?: boolean;
}
export interface RootFolderSelectInputProps
extends Omit<
EnhancedSelectInputProps<EnhancedSelectInputValue<string>, string>,
'value' | 'values'
> {
export interface RootFolderSelectInputProps extends Omit<
EnhancedSelectInputProps<EnhancedSelectInputValue<string>, string>,
'value' | 'values'
> {
name: string;
value?: string;
includeMissingValue?: boolean;

View file

@ -7,8 +7,7 @@ import EnhancedSelectInputOption, {
} from './EnhancedSelectInputOption';
import styles from './RootFolderSelectInputOption.css';
interface RootFolderSelectInputOptionProps
extends EnhancedSelectInputOptionProps {
interface RootFolderSelectInputOptionProps extends EnhancedSelectInputOptionProps {
id: string;
value: string;
freeSpace?: number;

View file

@ -8,8 +8,10 @@ import React, {
import { InputChanged } from 'typings/inputs';
import styles from './SelectInput.css';
export interface SelectInputOption
extends Pick<ComponentProps<'option'>, 'disabled'> {
export interface SelectInputOption extends Pick<
ComponentProps<'option'>,
'disabled'
> {
key: string | number;
value: string | number | (() => string | number);
}

View file

@ -8,11 +8,10 @@ interface TextTag extends TagBase {
name: string;
}
export interface TextTagInputProps
extends Omit<
TagInputProps<TextTag>,
'tags' | 'tagList' | 'onTagAdd' | 'onTagDelete'
> {
export interface TextTagInputProps extends Omit<
TagInputProps<TextTag>,
'tags' | 'tagList' | 'onTagAdd' | 'onTagDelete'
> {
name: string;
value: string | string[];
onChange: (change: InputChanged<string[]>) => unknown;

View file

@ -11,11 +11,10 @@ import styles from './Icon.css';
export type IconName = FontAwesomeIconProps['icon'];
export type IconKind = Extract<Kind, keyof typeof styles>;
export interface IconProps
extends Omit<
FontAwesomeIconProps,
'icon' | 'spin' | 'name' | 'title' | 'size'
> {
export interface IconProps extends Omit<
FontAwesomeIconProps,
'icon' | 'spin' | 'name' | 'title' | 'size'
> {
containerClassName?: ComponentProps<'span'>['className'];
name: IconName;
kind?: IconKind;

View file

@ -6,7 +6,8 @@ import Link, { LinkProps } from './Link';
import styles from './IconButton.css';
export interface IconButtonProps
extends Omit<LinkProps, 'name' | 'kind'>,
extends
Omit<LinkProps, 'name' | 'kind'>,
Pick<IconProps, 'name' | 'kind' | 'size' | 'isSpinning'> {
iconClassName?: IconProps['className'];
}

View file

@ -33,7 +33,10 @@ function getLabelForMediaType(mediaType?: MediaType) {
}
}
function MediaTypeBadge({ mediaType, className }: Readonly<MediaTypeBadgeProps>) {
function MediaTypeBadge({
mediaType,
className,
}: Readonly<MediaTypeBadgeProps>) {
return (
<Label
className={className}

View file

@ -1,8 +1,10 @@
import React, { useCallback } from 'react';
import SelectedMenuItem, { SelectedMenuItemProps } from './SelectedMenuItem';
interface FilterMenuItemProps
extends Omit<SelectedMenuItemProps, 'isSelected' | 'onPress'> {
interface FilterMenuItemProps extends Omit<
SelectedMenuItemProps,
'isSelected' | 'onPress'
> {
filterKey: string | number;
selectedFilterKey: string | number;
onPress: (filter: number | string) => void;

View file

@ -5,8 +5,10 @@ import MenuButton, { MenuButtonProps } from 'Components/Menu/MenuButton';
import { icons } from 'Helpers/Props';
import styles from './ToolbarMenuButton.css';
export interface ToolbarMenuButtonProps
extends Omit<MenuButtonProps, 'children'> {
export interface ToolbarMenuButtonProps extends Omit<
MenuButtonProps,
'children'
> {
className?: string;
iconName: IconName;
showIndicator?: boolean;

View file

@ -14,7 +14,10 @@ interface ModalErrorProps extends ErrorBoundaryErrorProps {
onModalClose: () => void;
}
function ModalError({ onModalClose, ...otherProps }: Readonly<ModalErrorProps>) {
function ModalError({
onModalClose,
...otherProps
}: Readonly<ModalErrorProps>) {
return (
<ModalContent onModalClose={onModalClose}>
<ModalHeader>{translate('Error')}</ModalHeader>

View file

@ -39,18 +39,17 @@ interface AddNewMovieSuggestion {
title: string;
}
export interface SuggestedMovie
extends Pick<
Movie,
| 'title'
| 'year'
| 'titleSlug'
| 'sortTitle'
| 'images'
| 'alternateTitles'
| 'tmdbId'
| 'imdbId'
> {
export interface SuggestedMovie extends Pick<
Movie,
| 'title'
| 'year'
| 'titleSlug'
| 'sortTitle'
| 'images'
| 'alternateTitles'
| 'tmdbId'
| 'imdbId'
> {
firstCharacter: string;
tags: Tag[];
}
@ -125,7 +124,8 @@ function MovieSearchInput() {
const { bindShortcut, unbindShortcut } = useKeyboardShortcuts();
const [value, setValue] = useState('');
const [_requestLoading, setRequestLoading] = useState(false);
// eslint-disable-next-line react/hook-use-state
const [, setRequestLoading] = useState(false);
const [suggestions, setSuggestions] = useState<MovieSuggestion[]>([]);
const autosuggestRef = useRef<Autosuggest>(null);

View file

@ -7,7 +7,10 @@ export interface PageJumpBarItemProps {
onItemPress: (label: string) => void;
}
function PageJumpBarItem({ label, onItemPress }: Readonly<PageJumpBarItemProps>) {
function PageJumpBarItem({
label,
onItemPress,
}: Readonly<PageJumpBarItemProps>) {
const handlePress = useCallback(() => {
onItemPress(label);
}, [label, onItemPress]);

View file

@ -15,7 +15,13 @@ interface MessageProps {
type: Extract<MessageType, keyof typeof styles>;
}
function Message({ id, hideAfter, name, message, type }: Readonly<MessageProps>) {
function Message({
id,
hideAfter,
name,
message,
type,
}: Readonly<MessageProps>) {
const dispatch = useDispatch();
const dismissTimeout = useRef<ReturnType<typeof setTimeout>>();

View file

@ -219,7 +219,10 @@ interface PageSidebarProps {
isSidebarVisible: boolean;
}
function PageSidebar({ isSidebarVisible, isSmallScreen }: Readonly<PageSidebarProps>) {
function PageSidebar({
isSidebarVisible,
isSmallScreen,
}: Readonly<PageSidebarProps>) {
const dispatch = useDispatch();
const location = useLocation();
const sidebarRef = useRef(null);

View file

@ -15,7 +15,9 @@ interface PageToolbarOverflowMenuItemProps {
onPress?: (event: SyntheticEvent<Element, Event>) => void;
}
function PageToolbarOverflowMenuItem(props: Readonly<PageToolbarOverflowMenuItemProps>) {
function PageToolbarOverflowMenuItem(
props: Readonly<PageToolbarOverflowMenuItemProps>
) {
const {
iconName,
spinningName,

View file

@ -13,7 +13,10 @@ interface FavoriteFolderRowProps {
onPress: (folder: string) => unknown;
}
function FavoriteFolderRow({ folder, onPress }: Readonly<FavoriteFolderRowProps>) {
function FavoriteFolderRow({
folder,
onPress,
}: Readonly<FavoriteFolderRowProps>) {
const dispatch = useDispatch();
const handlePress = useCallback(() => {

View file

@ -10,7 +10,9 @@ interface SelectIndexerFlagsModalProps {
onModalClose(): void;
}
function SelectIndexerFlagsModal(props: Readonly<SelectIndexerFlagsModalProps>) {
function SelectIndexerFlagsModal(
props: Readonly<SelectIndexerFlagsModalProps>
) {
const {
isOpen,
indexerFlags,

View file

@ -8,8 +8,10 @@ import InteractiveImportModalContent, {
InteractiveImportModalContentProps,
} from './Interactive/InteractiveImportModalContent';
interface InteractiveImportModalProps
extends Omit<InteractiveImportModalContentProps, 'modalTitle'> {
interface InteractiveImportModalProps extends Omit<
InteractiveImportModalContentProps,
'modalTitle'
> {
isOpen: boolean;
folder?: string;
downloadId?: string;

View file

@ -45,7 +45,9 @@ function createFilteredLanguagesSelector() {
});
}
function SelectLanguageModalContent(props: Readonly<SelectLanguageModalContentProps>) {
function SelectLanguageModalContent(
props: Readonly<SelectLanguageModalContentProps>
) {
const { modalTitle, onLanguagesSelect, onModalClose } = props;
const { isFetching, isPopulated, error, items } = useSelector(

View file

@ -99,7 +99,9 @@ function Row({ index, style, data }: ListChildComponentProps<RowItemData>) {
);
}
function SelectMovieModalContent(props: Readonly<SelectMovieModalContentProps>) {
function SelectMovieModalContent(
props: Readonly<SelectMovieModalContentProps>
) {
const { modalTitle, onMovieSelect, onModalClose } = props;
const listRef = useRef<List<RowItemData>>(null);

View file

@ -8,7 +8,9 @@ interface SelectMovieModalTableHeaderProps {
columns: Column[];
}
function SelectMovieModalTableHeader(props: Readonly<SelectMovieModalTableHeaderProps>) {
function SelectMovieModalTableHeader(
props: Readonly<SelectMovieModalTableHeaderProps>
) {
const { columns } = props;
return (

View file

@ -10,7 +10,12 @@ interface SelectMovieRowProps {
year: number;
}
function SelectMovieRow({ title, year, tmdbId, imdbId }: Readonly<SelectMovieRowProps>) {
function SelectMovieRow({
title,
year,
tmdbId,
imdbId,
}: Readonly<SelectMovieRowProps>) {
return (
<>
<VirtualTableRowCell className={styles.title}>

View file

@ -56,7 +56,9 @@ interface SelectQualityModalContentProps {
onModalClose(): void;
}
function SelectQualityModalContent(props: Readonly<SelectQualityModalContentProps>) {
function SelectQualityModalContent(
props: Readonly<SelectQualityModalContentProps>
) {
const { modalTitle, onQualitySelect, onModalClose } = props;
const [qualityId, setQualityId] = useState(props.qualityId);

View file

@ -10,7 +10,9 @@ interface SelectReleaseGroupModalProps {
onModalClose(): void;
}
function SelectReleaseGroupModal(props: Readonly<SelectReleaseGroupModalProps>) {
function SelectReleaseGroupModal(
props: Readonly<SelectReleaseGroupModalProps>
) {
const {
isOpen,
releaseGroup,

View file

@ -125,7 +125,9 @@ interface InteractiveSearchProps {
searchPayload: InteractiveSearchPayload;
}
function InteractiveSearch({ searchPayload }: Readonly<InteractiveSearchProps>) {
function InteractiveSearch({
searchPayload,
}: Readonly<InteractiveSearchProps>) {
const {
isFetching,
isPopulated,

View file

@ -12,7 +12,9 @@ interface SelectDownloadClientModalProps {
onModalClose(): void;
}
function SelectDownloadClientModal(props: Readonly<SelectDownloadClientModalProps>) {
function SelectDownloadClientModal(
props: Readonly<SelectDownloadClientModalProps>
) {
const { isOpen, protocol, modalTitle, onDownloadClientSelect, onModalClose } =
props;

View file

@ -47,7 +47,9 @@ interface OverrideMatchModalContentProps {
onModalClose(): void;
}
function OverrideMatchModalContent(props: Readonly<OverrideMatchModalContentProps>) {
function OverrideMatchModalContent(
props: Readonly<OverrideMatchModalContentProps>
) {
const modalTitle = translate('ManualGrab');
const {
indexerId,

View file

@ -17,8 +17,10 @@ import MovieCredit from 'typings/MovieCredit';
import translate from 'Utilities/String/translate';
import styles from '../MovieCreditPoster.css';
export interface MovieCastPosterProps
extends Pick<MovieCredit, 'personName' | 'images' | 'character'> {
export interface MovieCastPosterProps extends Pick<
MovieCredit,
'personName' | 'images' | 'character'
> {
tmdbId: number;
posterWidth: number;
posterHeight: number;

View file

@ -17,8 +17,10 @@ import MovieCredit from 'typings/MovieCredit';
import translate from 'Utilities/String/translate';
import styles from '../MovieCreditPoster.css';
export interface MovieCrewPosterProps
extends Pick<MovieCredit, 'personName' | 'images' | 'job'> {
export interface MovieCrewPosterProps extends Pick<
MovieCredit,
'personName' | 'images' | 'job'
> {
tmdbId: number;
posterWidth: number;
posterHeight: number;

View file

@ -17,7 +17,9 @@ interface MovieIndexSearchMenuItemProps {
selectedFilterKey: string;
}
function MovieIndexSearchMenuItem(props: Readonly<MovieIndexSearchMenuItemProps>) {
function MovieIndexSearchMenuItem(
props: Readonly<MovieIndexSearchMenuItemProps>
) {
const isSearching = useSelector(createCommandExecutingSelector(MOVIE_SEARCH));
const {
items,

View file

@ -41,7 +41,9 @@ interface MovieIndexOverviewInfoProps {
sortKey: string;
}
const infoRowHeight = Number.parseInt(dimensions.movieIndexOverviewInfoRowHeight);
const infoRowHeight = Number.parseInt(
dimensions.movieIndexOverviewInfoRowHeight
);
const rows = [
{

View file

@ -8,7 +8,9 @@ interface MovieIndexOverviewInfoRowProps {
label: string;
}
function MovieIndexOverviewInfoRow(props: Readonly<MovieIndexOverviewInfoRowProps>) {
function MovieIndexOverviewInfoRow(
props: Readonly<MovieIndexOverviewInfoRowProps>
) {
const { title, iconName, label } = props;
return (

View file

@ -15,7 +15,9 @@ const columnPaddingSmallScreen = Number.parseInt(
dimensions.movieIndexColumnPaddingSmallScreen
);
const progressBarHeight = Number.parseInt(dimensions.progressBarSmallHeight);
const detailedProgressBarHeight = Number.parseInt(dimensions.progressBarMediumHeight);
const detailedProgressBarHeight = Number.parseInt(
dimensions.progressBarMediumHeight
);
const bodyPadding = Number.parseInt(dimensions.pageContentBodyPadding);
const bodyPaddingSmallScreen = Number.parseInt(
dimensions.pageContentBodyPaddingSmallScreen

View file

@ -20,7 +20,9 @@ const columnPaddingSmallScreen = Number.parseInt(
dimensions.movieIndexColumnPaddingSmallScreen
);
const progressBarHeight = Number.parseInt(dimensions.progressBarSmallHeight);
const detailedProgressBarHeight = Number.parseInt(dimensions.progressBarMediumHeight);
const detailedProgressBarHeight = Number.parseInt(
dimensions.progressBarMediumHeight
);
const ADDITIONAL_COLUMN_COUNT: Record<string, number> = {
small: 3,
@ -100,7 +102,9 @@ function getWindowScrollTopPosition() {
return document.documentElement.scrollTop || document.body.scrollTop || 0;
}
export default function MovieIndexPosters(props: Readonly<MovieIndexPostersProps>) {
export default function MovieIndexPosters(
props: Readonly<MovieIndexPostersProps>
) {
const {
scrollerRef,
items,

View file

@ -30,7 +30,10 @@ function PosterDateRow({
}
return (
<div className={styles.title} title={`${label}: ${formatDate(date, longDateFormat)}`}>
<div
className={styles.title}
title={`${label}: ${formatDate(date, longDateFormat)}`}
>
<Icon name={icon} />{' '}
{getRelativeDate({
date,

View file

@ -30,7 +30,9 @@ const selectDeleteOptions = createSelector(
(deleteOptions) => deleteOptions
);
function DeleteMovieModalContent(props: Readonly<DeleteMovieModalContentProps>) {
function DeleteMovieModalContent(
props: Readonly<DeleteMovieModalContentProps>
) {
const { movieIds, onModalClose } = props;
const { addImportExclusion } = useSelector(selectDeleteOptions);

View file

@ -6,12 +6,16 @@ import PageToolbarButton, {
import { icons } from 'Helpers/Props';
import translate from 'Utilities/String/translate';
interface MovieIndexSelectAllButtonProps
extends Omit<PageToolbarButtonProps, 'iconName'> {
interface MovieIndexSelectAllButtonProps extends Omit<
PageToolbarButtonProps,
'iconName'
> {
isSelectMode: boolean;
}
function MovieIndexSelectAllButton(props: Readonly<MovieIndexSelectAllButtonProps>) {
function MovieIndexSelectAllButton(
props: Readonly<MovieIndexSelectAllButtonProps>
) {
const { isSelectMode, overflowComponent } = props;
const [selectState, selectDispatch] = useSelect();
const { allSelected, allUnselected } = selectState;

View file

@ -8,7 +8,9 @@ interface MovieIndexSelectAllMenuItemProps {
isSelectMode: boolean;
}
function MovieIndexSelectAllMenuItem(props: Readonly<MovieIndexSelectAllMenuItemProps>) {
function MovieIndexSelectAllMenuItem(
props: Readonly<MovieIndexSelectAllMenuItemProps>
) {
const { isSelectMode } = props;
const [selectState, selectDispatch] = useSelect();
const { allSelected, allUnselected } = selectState;

View file

@ -9,7 +9,9 @@ interface MovieIndexSelectModeButtonProps extends PageToolbarButtonProps {
onPress: () => void;
}
function MovieIndexSelectModeButton(props: Readonly<MovieIndexSelectModeButtonProps>) {
function MovieIndexSelectModeButton(
props: Readonly<MovieIndexSelectModeButtonProps>
) {
const { label, iconName, isSelectMode, overflowComponent, onPress } = props;
const [, selectDispatch] = useSelect();

View file

@ -21,7 +21,9 @@ interface OrganizeMoviesModalContentProps {
onModalClose: () => void;
}
function OrganizeMoviesModalContent(props: Readonly<OrganizeMoviesModalContentProps>) {
function OrganizeMoviesModalContent(
props: Readonly<OrganizeMoviesModalContentProps>
) {
const { movieIds, onModalClose } = props;
const allMovies: Movie[] = useSelector(createAllMoviesSelector());

View file

@ -4,12 +4,17 @@ import MovieImage, { MovieImageProps } from './MovieImage';
const posterPlaceholder =
'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKgAAAD3CAMAAAC+Te+kAAAAZlBMVEUvLi8vLy8vLzAvMDAwLy8wLzAwMDAwMDEwMTExMDAxMDExMTExMTIxMjIyMjIyMjMyMzMzMjMzMzMzMzQzNDQ0NDQ0NDU0NTU1NTU1NTY1NjY2NTY2NjY2Njc2Nzc3Njc3Nzc3NziHChLWAAAAAWJLR0QAiAUdSAAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB+MKCgEdHeShUbsAAALZSURBVHja7dxNcuwgDEZR1qAVmP1vMrNUJe91GfTzCSpXo575lAymjYWGXRIDKFCgQIECBQoUKFCgQIECBQoUKFCgQIECBQoUKFCgQIECBQoUKNA/AZ3fcTR0/owjofNDnAadnwPoPnS+xTXQeQZ0rkQ/dC4H0Gzo7ITO3bgGOnug/2PcAF3Mczt0fUj0QncG7znQBupw3PkWqh8qpkagpnyqjuArkkxaC02kRqGypCZANVYFdJZCdy9WTRVB5znQ6qTmjFFBWnOhdg20Lqnp0CpqAbRmAJRAK5JaA32zngTNvv910OSkVkJTs1oLtWugeTkNQZ/nkT2rotBHldUwNE6VQTVWGTQ6AHKggqGaBS23JkKf0hUgE1qa01Ro5fzPhoapR0HtCGg4q0poSCqFRgaAFhqxqqEr1EOgmdJaqHdaHQq1I6CunPZAHdY2aIJUBN2V9kE3H1Wd0BXrNVA7BLpgdUCtALo8pZqhdgd0Z6OyE7q1pdoH3dv7tS7o7iZ1E3R/N70Huuz795cQao65vvkqooT+vEgDdPcbj2s3zxTv9Qt/7cuhdgfUo2yAOplyqNuphfqZSqhFmEJo0HkcdPZCo0rRymRxpwSawHR+YtyBZihfvi+nQO0OqCmcYahGqYPGS4qCUJkzBpUpJdCkordyaFZxXi1UUpaZAJ2XQFOLh8ug2XXjVdD0+vYiqLIO3w1VH8EogtoxUPnpGxe04zyTA1p57i4T2nTmbnnnUuLMg1afYE2C1h+1zYEKjlknQLtPg9tb3YzU+dL054qOBb8cvcz3DlqBZhUmhdrnKo9j+pR0rkN5UHkznZHPtJIYN2TTCe1poTUyk9nWPO0bt8Ys7Ug34mlUMONtPUXMaEdXnXN1MnUzN2Z9q3Lr8XQN1DaLQJpXpiamZwltYdIUHShQoECBAgUKFChQoECBAgUKFChQoECBAgUKFChQoECBAgUKFCjQ+vgCff/mEp/vtiIAAAAASUVORK5CYII=';
interface MovieHeadshotProps
extends Omit<MovieImageProps, 'coverType' | 'placeholder'> {
interface MovieHeadshotProps extends Omit<
MovieImageProps,
'coverType' | 'placeholder'
> {
size?: 250 | 500;
}
function MovieHeadshot({ size = 250, ...otherProps }: Readonly<MovieHeadshotProps>) {
function MovieHeadshot({
size = 250,
...otherProps
}: Readonly<MovieHeadshotProps>) {
return (
<MovieImage
{...otherProps}

View file

@ -4,12 +4,17 @@ import MovieImage, { MovieImageProps } from './MovieImage';
const posterPlaceholder =
'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKgAAAD3CAMAAAC+Te+kAAAAZlBMVEUvLi8vLy8vLzAvMDAwLy8wLzAwMDAwMDEwMTExMDAxMDExMTExMTIxMjIyMjIyMjMyMzMzMjMzMzMzMzQzNDQ0NDQ0NDU0NTU1NTU1NTY1NjY2NTY2NjY2Njc2Nzc3Njc3Nzc3NziHChLWAAAAAWJLR0QAiAUdSAAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB+MKCgEdHeShUbsAAALZSURBVHja7dxNcuwgDEZR1qAVmP1vMrNUJe91GfTzCSpXo575lAymjYWGXRIDKFCgQIECBQoUKFCgQIECBQoUKFCgQIECBQoUKFCgQIECBQoUKNA/AZ3fcTR0/owjofNDnAadnwPoPnS+xTXQeQZ0rkQ/dC4H0Gzo7ITO3bgGOnug/2PcAF3Mczt0fUj0QncG7znQBupw3PkWqh8qpkagpnyqjuArkkxaC02kRqGypCZANVYFdJZCdy9WTRVB5znQ6qTmjFFBWnOhdg20Lqnp0CpqAbRmAJRAK5JaA32zngTNvv910OSkVkJTs1oLtWugeTkNQZ/nkT2rotBHldUwNE6VQTVWGTQ6AHKggqGaBS23JkKf0hUgE1qa01Ro5fzPhoapR0HtCGg4q0poSCqFRgaAFhqxqqEr1EOgmdJaqHdaHQq1I6CunPZAHdY2aIJUBN2V9kE3H1Wd0BXrNVA7BLpgdUCtALo8pZqhdgd0Z6OyE7q1pdoH3dv7tS7o7iZ1E3R/N70Huuz795cQao65vvkqooT+vEgDdPcbj2s3zxTv9Qt/7cuhdgfUo2yAOplyqNuphfqZSqhFmEJo0HkcdPZCo0rRymRxpwSawHR+YtyBZihfvi+nQO0OqCmcYahGqYPGS4qCUJkzBpUpJdCkordyaFZxXi1UUpaZAJ2XQFOLh8ug2XXjVdD0+vYiqLIO3w1VH8EogtoxUPnpGxe04zyTA1p57i4T2nTmbnnnUuLMg1afYE2C1h+1zYEKjlknQLtPg9tb3YzU+dL054qOBb8cvcz3DlqBZhUmhdrnKo9j+pR0rkN5UHkznZHPtJIYN2TTCe1poTUyk9nWPO0bt8Ys7Ug34mlUMONtPUXMaEdXnXN1MnUzN2Z9q3Lr8XQN1DaLQJpXpiamZwltYdIUHShQoECBAgUKFChQoECBAgUKFChQoECBAgUKFChQoECBAgUKFCjQ+vgCff/mEp/vtiIAAAAASUVORK5CYII=';
interface MoviePosterProps
extends Omit<MovieImageProps, 'coverType' | 'placeholder'> {
interface MoviePosterProps extends Omit<
MovieImageProps,
'coverType' | 'placeholder'
> {
size?: 250 | 500;
}
function MoviePoster({ size = 250, ...otherProps }: Readonly<MoviePosterProps>) {
function MoviePoster({
size = 250,
...otherProps
}: Readonly<MoviePosterProps>) {
return (
<MovieImage
{...otherProps}

View file

@ -12,8 +12,7 @@ import MovieInteractiveSearchModalContent, {
MovieInteractiveSearchModalContentProps,
} from './MovieInteractiveSearchModalContent';
interface MovieInteractiveSearchModalProps
extends MovieInteractiveSearchModalContentProps {
interface MovieInteractiveSearchModalProps extends MovieInteractiveSearchModalContentProps {
isOpen: boolean;
}

View file

@ -11,7 +11,9 @@ interface ExtraFileDetailsPopoverProps {
languageTags?: string[];
}
function ExtraFileDetailsPopover(props: Readonly<ExtraFileDetailsPopoverProps>) {
function ExtraFileDetailsPopover(
props: Readonly<ExtraFileDetailsPopoverProps>
) {
const { type, title, languageTags = [] } = props;
const details = [];

View file

@ -6,7 +6,9 @@ interface MovieFileLanguagesProps {
movieFileId: number;
}
function MovieFileLanguages({ movieFileId }: Readonly<MovieFileLanguagesProps>) {
function MovieFileLanguages({
movieFileId,
}: Readonly<MovieFileLanguagesProps>) {
const movieFile = useMovieFile(movieFileId);
return <MovieLanguages languages={movieFile?.languages ?? []} />;

View file

@ -13,7 +13,9 @@ interface AdvancedSettingsButtonProps {
showLabel: boolean;
}
function AdvancedSettingsButton({ showLabel }: Readonly<AdvancedSettingsButtonProps>) {
function AdvancedSettingsButton({
showLabel,
}: Readonly<AdvancedSettingsButtonProps>) {
const showAdvancedSettings = useSelector(
(state: AppState) => state.settings.advancedSettings
);

View file

@ -7,7 +7,9 @@ interface ManageCustomFormatsModalProps {
onModalClose(): void;
}
function ManageCustomFormatsModal(props: Readonly<ManageCustomFormatsModalProps>) {
function ManageCustomFormatsModal(
props: Readonly<ManageCustomFormatsModalProps>
) {
const { isOpen, onModalClose } = props;
return (

View file

@ -33,7 +33,9 @@ function isDeletingSelector() {
);
}
function ManageCustomFormatsModalRow(props: Readonly<ManageCustomFormatsModalRowProps>) {
function ManageCustomFormatsModalRow(
props: Readonly<ManageCustomFormatsModalRowProps>
) {
const {
id,
isSelected,

View file

@ -7,7 +7,9 @@ interface ManageDownloadClientsModalProps {
onModalClose(): void;
}
function ManageDownloadClientsModal(props: Readonly<ManageDownloadClientsModalProps>) {
function ManageDownloadClientsModal(
props: Readonly<ManageDownloadClientsModalProps>
) {
const { isOpen, onModalClose } = props;
return (

View file

@ -3,8 +3,10 @@ import { useDispatch } from 'react-redux';
import MenuItem, { MenuItemProps } from 'Components/Menu/MenuItem';
import { selectImportListSchema } from 'Store/Actions/settingsActions';
interface AddImportListPresetMenuItemProps
extends Omit<MenuItemProps, 'children'> {
interface AddImportListPresetMenuItemProps extends Omit<
MenuItemProps,
'children'
> {
name: string;
implementation: string;
implementationName: string;

View file

@ -9,7 +9,9 @@ interface ManageImportListsEditModalProps {
onModalClose(): void;
}
function ManageImportListsEditModal(props: Readonly<ManageImportListsEditModalProps>) {
function ManageImportListsEditModal(
props: Readonly<ManageImportListsEditModalProps>
) {
const { isOpen, importListIds, onSavePress, onModalClose } = props;
return (

View file

@ -26,7 +26,9 @@ interface ManageImportListsModalRowProps {
onSelectedChange(result: SelectStateInputProps): void;
}
function ManageImportListsModalRow(props: Readonly<ManageImportListsModalRowProps>) {
function ManageImportListsModalRow(
props: Readonly<ManageImportListsModalRowProps>
) {
const {
id,
isSelected,

View file

@ -3,8 +3,10 @@ import { useDispatch } from 'react-redux';
import MenuItem, { MenuItemProps } from 'Components/Menu/MenuItem';
import { selectIndexerSchema } from 'Store/Actions/settingsActions';
interface AddIndexerPresetMenuItemProps
extends Omit<MenuItemProps, 'children'> {
interface AddIndexerPresetMenuItemProps extends Omit<
MenuItemProps,
'children'
> {
name: string;
implementation: string;
implementationName: string;

View file

@ -9,7 +9,9 @@ interface ManageIndexersEditModalProps {
onModalClose(): void;
}
function ManageIndexersEditModal(props: Readonly<ManageIndexersEditModalProps>) {
function ManageIndexersEditModal(
props: Readonly<ManageIndexersEditModalProps>
) {
const { isOpen, indexerIds, onSavePress, onModalClose } = props;
return (

View file

@ -84,7 +84,9 @@ interface ManageIndexersModalContentProps {
onModalClose(): void;
}
function ManageIndexersModalContent(props: Readonly<ManageIndexersModalContentProps>) {
function ManageIndexersModalContent(
props: Readonly<ManageIndexersModalContentProps>
) {
const { onModalClose } = props;
const {

View file

@ -8,8 +8,10 @@ import EditMetadataModalContent, {
EditMetadataModalContentProps,
} from './EditMetadataModalContent';
interface EditMetadataModalProps
extends Omit<EditMetadataModalContentProps, 'advancedSettings'> {
interface EditMetadataModalProps extends Omit<
EditMetadataModalContentProps,
'advancedSettings'
> {
isOpen: boolean;
}

View file

@ -7,7 +7,9 @@ interface QualityProfileNameProps {
qualityProfileId: number;
}
function QualityProfileName({ qualityProfileId }: Readonly<QualityProfileNameProps>) {
function QualityProfileName({
qualityProfileId,
}: Readonly<QualityProfileNameProps>) {
const qualityProfile = useSelector(
createQualityProfileSelectorForHook(qualityProfileId)
);

View file

@ -7,8 +7,7 @@ import EditSpecificationModalContent, {
EditSpecificationModalContentProps,
} from './EditSpecificationModalContent';
interface EditSpecificationModalProps
extends EditSpecificationModalContentProps {
interface EditSpecificationModalProps extends EditSpecificationModalContentProps {
isOpen: boolean;
onModalClose: () => void;
}

View file

@ -6,7 +6,11 @@ interface TagInUseProps {
count: number;
}
export default function TagInUse({ label, labelPlural, count }: Readonly<TagInUseProps>) {
export default function TagInUse({
label,
labelPlural,
count,
}: Readonly<TagInUseProps>) {
if (count === 0) {
return null;
}

Some files were not shown because too many files have changed in this diff Show more