* feat(tvdb): get tv seasons/episodes with tvdb * fix: fix rate limiter index tvdb indexer * fix(usersettings): remove unused column tvdbtoken * refactor(tvdb): replace tvdb api by skyhook * fix: error during get episodes * fix: error if tmdb poster is null * refactor: clean tvdb indexer code * fix: wrong language with tmdb indexer * style: replace avalaible to available * style: tvdb.login to tvdb.test * fix(test): fix discover test * fix(test): wrong url tv-details * test(tvdb): add tvdb tests * style(tvdb): rename pokemon to correct tv show * refactor(indexer): remove unused getSeasonIdentifier method * refactor(settings): replace tvdb object to boolean type * refactor(tmdb): reduce still path condition * test(tvdb): change 'use' to 'tvdb' condition check * fix(tmdb): fix build fix build after rebase * fix(build): revert package.json * fix(tvdb): ensure that seasons contain data * refactor(swagger): fix /tvdb/test response * fix(scanner): add tvdb indexer for scanner * refactor(tvdb): remove skyhook api * refactor(tvdb): use tvdb api * fix(tvdb): rename tvdb to medatada * refactor(medata): add tvdb settings * refactor(metadata): rewrite metadata settings * refactor(metadata): refactor metadata routes * refactor(metadata): remove french comments * refactor(metadata): refactor tvdb api calls * style(prettier): run prettier * fix(scanner): fix jellyfin scanner with tvdb provider * fix(scanner): fix plex scanner tvdb provider * style(provider): change provider name in info section * style(provider): full provider name in select * style(provider): remove french comment * fix(tests): fix all cypress tests * refactor(tvdb): fix apikey * refactor(tmdb): apply prettier * refactor(tvdb): remove logger info * feat(metadata): replace fetch with axios for API calls * feat(provider): replace indexer by provider * fix(tests): fix cypress test * chore: add project-wide apikey for tvdb * chore: add correct application-wide key * fix(test): fix test with default provider tmdb anime * style(cypress): fix anime name variable * chore(i18n): remove french translation + apply i18n:extract * style(wording): standardize naming to "Metadata Provider" in UI text * docs(comments): translate from French to English * refactor(tvdb): remove unnecessary try/catch block * feat(i18n): add missing translations * fix(scanner): correct metadata provider ID from Tmdb to Tvdb * style(settings): clarify navigation label from "Metadata" to "Metadata Providers" * style(logs): update error log label from "Metadata" to "MetadataProvider" * refactor(tvdb): replace indexer by metadata providers * refactor(settings): remove metadata providers logo * fix(config): restore missing config/db/.gitkeep file --------- Co-authored-by: TOomaAh <ubuntu@PC> Co-authored-by: fallenbagel <98979876+Fallenbagel@users.noreply.github.com>
92 lines
2.3 KiB
TypeScript
92 lines
2.3 KiB
TypeScript
import defineMessages from '@app/utils/defineMessages';
|
|
import { useIntl } from 'react-intl';
|
|
import Select, { type StylesConfig } from 'react-select';
|
|
|
|
enum MetadataProviderType {
|
|
TMDB = 'tmdb',
|
|
TVDB = 'tvdb',
|
|
}
|
|
|
|
type MetadataProviderOptionType = {
|
|
testId?: string;
|
|
value: MetadataProviderType;
|
|
label: string;
|
|
};
|
|
|
|
const messages = defineMessages('components.MetadataSelector', {
|
|
tmdbLabel: 'The Movie Database (TMDB)',
|
|
tvdbLabel: 'TheTVDB',
|
|
selectMetdataProvider: 'Select a metadata provider',
|
|
});
|
|
|
|
interface MetadataSelectorProps {
|
|
testId: string;
|
|
value: MetadataProviderType;
|
|
onChange: (value: MetadataProviderType) => void;
|
|
isDisabled?: boolean;
|
|
}
|
|
|
|
const MetadataSelector = ({
|
|
testId = 'metadata-provider-selector',
|
|
value,
|
|
onChange,
|
|
isDisabled = false,
|
|
}: MetadataSelectorProps) => {
|
|
const intl = useIntl();
|
|
|
|
const metadataProviderOptions: MetadataProviderOptionType[] = [
|
|
{
|
|
testId: 'tmdb-option',
|
|
value: MetadataProviderType.TMDB,
|
|
label: intl.formatMessage(messages.tmdbLabel),
|
|
},
|
|
{
|
|
testId: 'tvdb-option',
|
|
value: MetadataProviderType.TVDB,
|
|
label: intl.formatMessage(messages.tvdbLabel),
|
|
},
|
|
];
|
|
|
|
const customStyles: StylesConfig<MetadataProviderOptionType, false> = {
|
|
option: (base) => ({
|
|
...base,
|
|
display: 'flex',
|
|
alignItems: 'center',
|
|
}),
|
|
singleValue: (base) => ({
|
|
...base,
|
|
display: 'flex',
|
|
alignItems: 'center',
|
|
}),
|
|
};
|
|
|
|
const formatOptionLabel = (option: MetadataProviderOptionType) => (
|
|
<div className="flex items-center">
|
|
<span data-testid={option.testId}>{option.label}</span>
|
|
</div>
|
|
);
|
|
|
|
return (
|
|
<div data-testid={testId}>
|
|
<Select
|
|
options={metadataProviderOptions}
|
|
isDisabled={isDisabled}
|
|
className="react-select-container"
|
|
classNamePrefix="react-select"
|
|
value={metadataProviderOptions.find((option) => option.value === value)}
|
|
onChange={(selectedOption) => {
|
|
if (selectedOption) {
|
|
onChange(selectedOption.value);
|
|
}
|
|
}}
|
|
placeholder={intl.formatMessage(messages.selectMetdataProvider)}
|
|
styles={customStyles}
|
|
formatOptionLabel={formatOptionLabel}
|
|
/>
|
|
</div>
|
|
);
|
|
};
|
|
|
|
export { MetadataProviderType };
|
|
export default MetadataSelector;
|