feat: route ready-title issues through guided workflow
This commit is contained in:
@@ -586,13 +586,30 @@ export default function PortalClient({ workspace }: PortalClientProps) {
|
||||
|
||||
useEffect(() => {
|
||||
if (typeof window === 'undefined') return
|
||||
const raw = new URLSearchParams(window.location.search).get('item')
|
||||
if (!raw) {
|
||||
setPreselectedItemId(null)
|
||||
return
|
||||
}
|
||||
const parsed = Number.parseInt(raw, 10)
|
||||
const params = new URLSearchParams(window.location.search)
|
||||
const raw = params.get('item')
|
||||
const parsed = raw ? Number.parseInt(raw, 10) : Number.NaN
|
||||
setPreselectedItemId(Number.isNaN(parsed) || parsed <= 0 ? null : parsed)
|
||||
|
||||
const requestId = Number.parseInt(params.get('reportRequest') ?? '', 10)
|
||||
const title = params.get('title')?.trim()
|
||||
const type = params.get('type')
|
||||
const rawYear = Number.parseInt(params.get('year') ?? '', 10)
|
||||
if (requestId > 0 && title && (type === 'movie' || type === 'tv')) {
|
||||
const media: DiscoveryResult = {
|
||||
title,
|
||||
year: rawYear >= 1870 && rawYear <= 2200 ? rawYear : null,
|
||||
type,
|
||||
requestId,
|
||||
statusLabel: 'Ready to watch',
|
||||
accessible: true,
|
||||
}
|
||||
setIssueSelectedMedia(media)
|
||||
setIssueMediaTitle(media.title)
|
||||
setIssueMediaType(type)
|
||||
setIssueMediaQuery(`${media.title}${media.year ? ` (${media.year})` : ''}`)
|
||||
setIssueStep('problem')
|
||||
}
|
||||
}, [])
|
||||
|
||||
const loadMe = async () => {
|
||||
@@ -860,6 +877,14 @@ export default function PortalClient({ workspace }: PortalClientProps) {
|
||||
}
|
||||
const payload = await response.json() as IssueTargetOptions
|
||||
if (version !== issueOptionsVersion.current) return
|
||||
const verifiedMedia: DiscoveryResult = {
|
||||
...media,
|
||||
title: payload.title,
|
||||
type: payload.request_type,
|
||||
}
|
||||
setIssueSelectedMedia(verifiedMedia)
|
||||
setIssueMediaTitle(verifiedMedia.title)
|
||||
setIssueMediaType(payload.request_type)
|
||||
setIssueOptions(payload)
|
||||
setIssueOptionsMessage(payload.message ?? null)
|
||||
const firstSeason = payload.seasons.find((season) => season.season_number > 0) ?? payload.seasons[0]
|
||||
@@ -981,12 +1006,14 @@ export default function PortalClient({ workspace }: PortalClientProps) {
|
||||
setMediaServerError(null)
|
||||
setError(null)
|
||||
setStatus(null)
|
||||
const shouldLoadSelectedRequest = Boolean(issueSelectedMedia?.requestId && !issueOptions)
|
||||
setIssueStep(issueSelectedMedia && issueOptions ? 'symptoms' : 'media')
|
||||
setSelectedSeasonNumbers([])
|
||||
setSelectedEpisodeIds([])
|
||||
if (category === 'playback' || category === 'service_unavailable') {
|
||||
void checkMediaServer()
|
||||
}
|
||||
if (shouldLoadSelectedRequest && issueSelectedMedia) void loadIssueOptions(issueSelectedMedia)
|
||||
}
|
||||
|
||||
const toggleStringChoice = (
|
||||
@@ -1607,6 +1634,12 @@ export default function PortalClient({ workspace }: PortalClientProps) {
|
||||
<form className="issue-guided-form" onSubmit={createGuidedIssue}>
|
||||
<fieldset className="issue-wizard-fields" disabled={creating}>
|
||||
<IssueFlowStep {...stepProps('problem')} title="What is wrong?" summary={selectedIssueDefinition?.label ?? ''}>
|
||||
{issueSelectedMedia?.requestId ? (
|
||||
<div className="issue-prefilled-request">
|
||||
<div><span className="section-kicker">Reporting a problem with</span><strong>{issueSelectedMedia.title}{issueSelectedMedia.year ? ` (${issueSelectedMedia.year})` : ''}</strong><small>Request #{issueSelectedMedia.requestId} is already selected.</small></div>
|
||||
<a className="ghost-button" href={`/requests/${issueSelectedMedia.requestId}`}>Back to request</a>
|
||||
</div>
|
||||
) : null}
|
||||
<div className="issue-category-grid">
|
||||
{ISSUE_CATEGORIES.map((category) => (
|
||||
<button
|
||||
|
||||
Reference in New Issue
Block a user