'use client'; import { useRef, useState } from 'react'; import { GitMerge as GitCompareArrows, CircleNotch as LoaderCircle } from '@phosphor-icons/react'; import { runPairwiseAlignment } from '@/lib/api'; import { ClaySegmented } from '@/components/ui'; import { PairwiseResultDisplay } from '@/components/alignment/PairwiseResultDisplay'; import type { BlastHitSummary, PairwiseAlignResult } from '@/types/pipeline'; interface PairwiseAlignViewProps { hit: BlastHitSummary; querySequence?: string; } type AlignMode = 'global' | 'local'; function getStoredAlignMode(): AlignMode { if (typeof window === 'undefined') return 'global'; return sessionStorage.getItem('blast_align_mode') === 'local' ? 'local' : 'global'; } export function PairwiseAlignView({ hit, querySequence }: PairwiseAlignViewProps) { const [result, setResult] = useState(null); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); const [mode, setMode] = useState(getStoredAlignMode); const hasRun = useRef(false); const run = async (m: AlignMode) => { if (!querySequence) return; setLoading(true); setError(null); setResult(null); try { const res = await runPairwiseAlignment({ hit_accession: hit.accession, query_sequence: querySequence, mode: m, }); setResult(res); } catch (e: any) { const detail = e?.response?.data?.detail; setError( typeof detail === 'string' && detail ? detail : 'Pairwise alignment failed. Please try again.', ); } finally { setLoading(false); } }; const handleRun = () => { hasRun.current = true; run(mode); }; const handleModeChange = (m: AlignMode) => { setMode(m); sessionStorage.setItem('blast_align_mode', m); if (hasRun.current) run(m); }; if (!querySequence) { return (

Query sequence is not available in this view, so pairwise re-alignment is disabled.

); } return (
vs {hit.accession}
{error && (
Alignment failed: {error}
)} {result && (
)}
); }