feat(frontend): move more stuff into pro only mode

This commit is contained in:
Viren070
2025-08-30 14:48:41 +01:00
parent 9a5339e138
commit c68bb0e60e
2 changed files with 228 additions and 188 deletions
+142 -108
View File
@@ -244,32 +244,48 @@ function Content() {
<FaBolt className="text-lg mr-3" />
Cache
</TabsTrigger>
<TabsTrigger value="resolution">
<BiSolidCameraMovie className="text-lg mr-3" />
Resolution
</TabsTrigger>
<TabsTrigger value="quality">
<MdMovieFilter className="text-lg mr-3" />
Quality
</TabsTrigger>
<TabsTrigger value="encode">
<FaFilm className="text-lg mr-3" />
Encode
</TabsTrigger>
<>
<TabsTrigger value="resolution">
<BiSolidCameraMovie className="text-lg mr-3" />
Resolution
</TabsTrigger>
</>
{mode == 'pro' && (
<>
<TabsTrigger value="quality">
<MdMovieFilter className="text-lg mr-3" />
Quality
</TabsTrigger>
</>
)}
{mode === 'pro' && (
<>
<TabsTrigger value="encode">
<FaFilm className="text-lg mr-3" />
Encode
</TabsTrigger>
</>
)}
{mode === 'pro' && (
<TabsTrigger value="stream-type">
<MdVideoLibrary className="text-lg mr-3" />
Stream Type
</TabsTrigger>
)}
<TabsTrigger value="visual-tag">
<MdHdrOn className="text-lg mr-3" />
Visual Tag
</TabsTrigger>
<TabsTrigger value="audio-tag">
<BsSpeakerFill className="text-lg mr-3" />
Audio Tag
</TabsTrigger>
{mode === 'pro' && (
<TabsTrigger value="visual-tag">
<MdHdrOn className="text-lg mr-3" />
Visual Tag
</TabsTrigger>
)}
{mode === 'pro' && (
<TabsTrigger value="audio-tag">
<BsSpeakerFill className="text-lg mr-3" />
Audio Tag
</TabsTrigger>
)}
{mode === 'pro' && (
<TabsTrigger value="audio-channel">
<MdSurroundSound className="text-lg mr-3" />
@@ -284,14 +300,20 @@ function Content() {
<MdPerson className="text-lg mr-3" />
Seeders
</TabsTrigger>
<TabsTrigger value="title-matching">
<FaEquals className="text-lg mr-3" />
Matching
</TabsTrigger>
<TabsTrigger value="keyword">
<MdTextFields className="text-lg mr-3" />
Keyword
</TabsTrigger>
{mode === 'pro' && (
<>
<TabsTrigger value="title-matching">
<FaEquals className="text-lg mr-3" />
Matching
</TabsTrigger>
</>
)}
{mode === 'pro' && (
<TabsTrigger value="keyword">
<MdTextFields className="text-lg mr-3" />
Keyword
</TabsTrigger>
)}
{mode === 'pro' && (
<TabsTrigger value="stream-expression">
<TbFilterCode className="text-lg mr-3" />
@@ -2059,38 +2081,43 @@ function Content() {
}));
}}
/>
<NumberInput
help="Limit for results by service"
label="Service Limit"
value={userData.resultLimits?.service || undefined}
min={0}
defaultValue={undefined}
onValueChange={(value) => {
setUserData((prev) => ({
...prev,
resultLimits: {
...prev.resultLimits,
service: value || undefined,
},
}));
}}
/>
<NumberInput
help="Limit for results by addon"
label="Addon Limit"
value={userData.resultLimits?.addon || undefined}
min={0}
defaultValue={undefined}
onValueChange={(value) => {
setUserData((prev) => ({
...prev,
resultLimits: {
...prev.resultLimits,
addon: value || undefined,
},
}));
}}
/>
{mode === 'pro' && (
<NumberInput
help="Limit for results by service"
label="Service Limit"
value={userData.resultLimits?.service || undefined}
min={0}
defaultValue={undefined}
onValueChange={(value) => {
setUserData((prev) => ({
...prev,
resultLimits: {
...prev.resultLimits,
service: value || undefined,
},
}));
}}
/>
)}
{mode === 'pro' && (
<NumberInput
help="Limit for results by addon"
label="Addon Limit"
value={userData.resultLimits?.addon || undefined}
min={0}
defaultValue={undefined}
onValueChange={(value) => {
setUserData((prev) => ({
...prev,
resultLimits: {
...prev.resultLimits,
addon: value || undefined,
},
}));
}}
/>
)}
<NumberInput
help="Limit for results by resolution"
label="Resolution Limit"
@@ -2107,54 +2134,61 @@ function Content() {
}));
}}
/>
<NumberInput
help="Limit for results by quality"
label="Quality Limit"
value={userData.resultLimits?.quality || undefined}
min={0}
defaultValue={undefined}
onValueChange={(value) => {
setUserData((prev) => ({
...prev,
resultLimits: {
...prev.resultLimits,
quality: value || undefined,
},
}));
}}
/>
<NumberInput
help="Limit for results by indexer"
label="Indexer Limit"
value={userData.resultLimits?.indexer || undefined}
min={0}
defaultValue={undefined}
onValueChange={(value) => {
setUserData((prev) => ({
...prev,
resultLimits: {
...prev.resultLimits,
indexer: value || undefined,
},
}));
}}
/>
<NumberInput
help="Limit for results by release group"
label="Release Group Limit"
value={userData.resultLimits?.releaseGroup || undefined}
min={0}
defaultValue={undefined}
onValueChange={(value) => {
setUserData((prev) => ({
...prev,
resultLimits: {
...prev.resultLimits,
releaseGroup: value || undefined,
},
}));
}}
/>
{mode === 'pro' && (
<NumberInput
help="Limit for results by quality"
label="Quality Limit"
value={userData.resultLimits?.quality || undefined}
min={0}
defaultValue={undefined}
onValueChange={(value) => {
setUserData((prev) => ({
...prev,
resultLimits: {
...prev.resultLimits,
quality: value || undefined,
},
}));
}}
/>
)}
{mode === 'pro' && (
<NumberInput
help="Limit for results by indexer"
label="Indexer Limit"
value={userData.resultLimits?.indexer || undefined}
min={0}
defaultValue={undefined}
onValueChange={(value) => {
setUserData((prev) => ({
...prev,
resultLimits: {
...prev.resultLimits,
indexer: value || undefined,
},
}));
}}
/>
)}
{mode === 'pro' && (
<NumberInput
help="Limit for results by release group"
label="Release Group Limit"
value={userData.resultLimits?.releaseGroup || undefined}
min={0}
defaultValue={undefined}
onValueChange={(value) => {
setUserData((prev) => ({
...prev,
resultLimits: {
...prev.resultLimits,
releaseGroup: value || undefined,
},
}));
}}
/>
)}
</div>
</SettingsCard>
</>
@@ -171,86 +171,92 @@ function Content() {
)}
</SettingsCard>
)}
<SettingsCard
title="External Downloads"
description="Adds a stream that automatically opens the stream in your browser below every stream for easier downloading"
>
<Switch
label="Enable"
side="right"
value={userData.externalDownloads}
onValueChange={(value) => {
setUserData((prev) => ({
...prev,
externalDownloads: value,
}));
}}
/>
</SettingsCard>
<SettingsCard
title="Statistic Streams"
description="AIOStreams will return the statistics of stream fetches and response times for each addon if enabled."
>
<Switch
label="Enable"
side="right"
value={userData.showStatistics}
onValueChange={(value) => {
setUserData((prev) => ({
...prev,
showStatistics: value,
}));
}}
/>
<Select
label="Statistics Position"
help="Whether to show the statistic streams at the top or bottom of the stream list."
disabled={!userData.showStatistics}
options={[
{ label: 'Top', value: 'top' },
{ label: 'Bottom', value: 'bottom' },
]}
value={userData.statisticsPosition || 'bottom'}
onValueChange={(value) => {
setUserData((prev) => ({
...prev,
statisticsPosition: value as 'top' | 'bottom',
}));
}}
/>
</SettingsCard>
<SettingsCard title="Hide Errors">
<Switch
label="Hide Errors"
help="AIOStreams will attempt to return the errors in responses to streams, catalogs etc. Turning this on will hide the errors."
side="right"
value={userData.hideErrors}
onValueChange={(value) => {
setUserData((prev) => ({
...prev,
hideErrors: value,
}));
}}
/>
<Combobox
disabled={userData.hideErrors}
label="Hide Errors for specific resources"
options={RESOURCES.map((resource) => ({
label: resource,
value: resource,
}))}
multiple
help="This lets you hide errors for specific resources. For example, you may want to hide errors for the catalog resource, but not for the stream resource."
emptyMessage="No resources found"
value={userData.hideErrorsForResources}
onValueChange={(value) => {
setUserData((prev) => ({
...prev,
hideErrorsForResources: value as (typeof RESOURCES)[number][],
}));
}}
/>
</SettingsCard>
{mode === 'pro' && (
<SettingsCard
title="External Downloads"
description="Adds a stream that automatically opens the stream in your browser below every stream for easier downloading"
>
<Switch
label="Enable"
side="right"
value={userData.externalDownloads}
onValueChange={(value) => {
setUserData((prev) => ({
...prev,
externalDownloads: value,
}));
}}
/>
</SettingsCard>
)}
{mode === 'pro' && (
<SettingsCard
title="Statistic Streams"
description="AIOStreams will return the statistics of stream fetches and response times for each addon if enabled."
>
<Switch
label="Enable"
side="right"
value={userData.showStatistics}
onValueChange={(value) => {
setUserData((prev) => ({
...prev,
showStatistics: value,
}));
}}
/>
<Select
label="Statistics Position"
help="Whether to show the statistic streams at the top or bottom of the stream list."
disabled={!userData.showStatistics}
options={[
{ label: 'Top', value: 'top' },
{ label: 'Bottom', value: 'bottom' },
]}
value={userData.statisticsPosition || 'bottom'}
onValueChange={(value) => {
setUserData((prev) => ({
...prev,
statisticsPosition: value as 'top' | 'bottom',
}));
}}
/>
</SettingsCard>
)}
{mode === 'pro' && (
<SettingsCard title="Hide Errors">
<Switch
label="Hide Errors"
help="AIOStreams will attempt to return the errors in responses to streams, catalogs etc. Turning this on will hide the errors."
side="right"
value={userData.hideErrors}
onValueChange={(value) => {
setUserData((prev) => ({
...prev,
hideErrors: value,
}));
}}
/>
<Combobox
disabled={userData.hideErrors}
label="Hide Errors for specific resources"
options={RESOURCES.map((resource) => ({
label: resource,
value: resource,
}))}
multiple
help="This lets you hide errors for specific resources. For example, you may want to hide errors for the catalog resource, but not for the stream resource."
emptyMessage="No resources found"
value={userData.hideErrorsForResources}
onValueChange={(value) => {
setUserData((prev) => ({
...prev,
hideErrorsForResources: value as (typeof RESOURCES)[number][],
}));
}}
/>
</SettingsCard>
)}
</div>
</>
);