1- import React , { Suspense , useRef , useState } from "react" ;
2- import { useEffectOnce } from "react-use" ;
1+ import React , { Suspense , useCallback , useRef , useState } from "react" ;
32import styled from "styled-components" ;
43
54import { Spinner } from "components" ;
65
76import { SynchronousJobReadWithStatus } from "core/request/LogsRequestError" ;
87import { JobsWithJobs } from "pages/ConnectionPage/pages/ConnectionItemPage/components/JobsList" ;
98
10- import { AttemptRead , JobStatus } from "../../core/request/AirbyteClient" ;
9+ import { AttemptRead , CheckConnectionReadStatus , JobStatus } from "../../core/request/AirbyteClient" ;
1110import { useAttemptLink } from "./attemptLinkUtils" ;
1211import ContentWrapper from "./components/ContentWrapper" ;
1312import ErrorDetails from "./components/ErrorDetails" ;
@@ -32,28 +31,29 @@ const LoadLogs = styled.div`
3231` ;
3332
3433interface JobItemProps {
35- shortInfo ?: boolean ;
3634 job : SynchronousJobReadWithStatus | JobsWithJobs ;
3735}
3836
3937const didJobSucceed = ( job : SynchronousJobReadWithStatus | JobsWithJobs ) => {
4038 return getJobStatus ( job ) !== "failed" ;
4139} ;
4240
43- export const getJobStatus : ( job : SynchronousJobReadWithStatus | JobsWithJobs ) => JobStatus = ( job ) => {
44- return ( job as JobsWithJobs ) . job ?. status ?? ( job as SynchronousJobReadWithStatus ) . status ;
41+ export const getJobStatus : (
42+ job : SynchronousJobReadWithStatus | JobsWithJobs
43+ ) => JobStatus | CheckConnectionReadStatus = ( job ) => {
44+ return "status" in job ? job . status : job . job . status ;
4545} ;
4646
4747export const getJobAttemps : ( job : SynchronousJobReadWithStatus | JobsWithJobs ) => AttemptRead [ ] | undefined = ( job ) => {
4848 return "attempts" in job ? job . attempts : undefined ;
4949} ;
5050
51- export const getJobId = ( job : SynchronousJobReadWithStatus | JobsWithJobs ) =>
52- ( job as SynchronousJobReadWithStatus ) . id ?? ( job as JobsWithJobs ) . job . id ;
51+ export const getJobId = ( job : SynchronousJobReadWithStatus | JobsWithJobs ) => ( "id" in job ? job . id : job . job . id ) ;
5352
54- export const JobItem : React . FC < JobItemProps > = ( { shortInfo , job } ) => {
53+ export const JobItem : React . FC < JobItemProps > = ( { job } ) => {
5554 const { jobId : linkedJobId } = useAttemptLink ( ) ;
56- const [ isOpen , setIsOpen ] = useState ( linkedJobId === getJobId ( job ) ) ;
55+ const alreadyScrolled = useRef ( false ) ;
56+ const [ isOpen , setIsOpen ] = useState ( ( ) => linkedJobId === String ( getJobId ( job ) ) ) ;
5757 const scrollAnchor = useRef < HTMLDivElement > ( null ) ;
5858
5959 const didSucceed = didJobSucceed ( job ) ;
@@ -62,26 +62,20 @@ export const JobItem: React.FC<JobItemProps> = ({ shortInfo, job }) => {
6262 setIsOpen ( ! isOpen ) ;
6363 } ;
6464
65- useEffectOnce ( ( ) => {
66- if ( linkedJobId ) {
67- scrollAnchor . current ?. scrollIntoView ( {
68- behavior : "smooth" ,
69- block : "start" ,
70- } ) ;
65+ const onDetailsToggled = useCallback ( ( ) => {
66+ if ( alreadyScrolled . current || linkedJobId !== String ( getJobId ( job ) ) ) {
67+ return ;
7168 }
72- } ) ;
69+ scrollAnchor . current ?. scrollIntoView ( {
70+ block : "start" ,
71+ } ) ;
72+ alreadyScrolled . current = true ;
73+ } , [ job , linkedJobId ] ) ;
7374
7475 return (
7576 < Item isFailed = { ! didSucceed } ref = { scrollAnchor } >
76- < MainInfo
77- shortInfo = { shortInfo }
78- isOpen = { isOpen }
79- isFailed = { ! didSucceed }
80- onExpand = { onExpand }
81- job = { job }
82- attempts = { getJobAttemps ( job ) }
83- />
84- < ContentWrapper isOpen = { isOpen } >
77+ < MainInfo isOpen = { isOpen } isFailed = { ! didSucceed } onExpand = { onExpand } job = { job } attempts = { getJobAttemps ( job ) } />
78+ < ContentWrapper isOpen = { isOpen } onToggled = { onDetailsToggled } >
8579 < div >
8680 < Suspense
8781 fallback = {
0 commit comments