@@ -67,7 +67,51 @@ export class SegmentButton implements ComponentInterface, ButtonInterface {
6767 this . updateState ( ) ;
6868 }
6969
70- connectedCallback ( ) {
70+ private getNextSiblingOfType < T extends Element > ( element : Element ) : T | null {
71+ let sibling = element . nextSibling ;
72+ while ( sibling ) {
73+ if ( sibling . nodeType === Node . ELEMENT_NODE && ( sibling as T ) !== null ) {
74+ return sibling as T ;
75+ }
76+ sibling = sibling . nextSibling ;
77+ }
78+ return null ;
79+ }
80+
81+ private waitForSegmentContent ( ionSegment : HTMLIonSegmentElement | null , contentId : string ) : Promise < HTMLElement > {
82+ return new Promise ( ( resolve , reject ) => {
83+ if ( ! ionSegment ) {
84+ reject ( new Error ( `Segment not found when looking for Segment Content` ) ) ;
85+ }
86+
87+ let timeoutId : any = null ;
88+ let animationFrameId : number ;
89+
90+ const check = ( ) => {
91+ const segmentView = this . getNextSiblingOfType < HTMLIonSegmentViewElement > ( ionSegment ! ) ; // Skip the text nodes
92+ const segmentContent = segmentView ?. querySelector (
93+ `ion-segment-content[id="${ contentId } "]`
94+ ) as HTMLIonSegmentContentElement | null ;
95+ if ( segmentContent ) {
96+ clearTimeout ( timeoutId ) ; // Clear the timeout if the segmentContent is found
97+ cancelAnimationFrame ( animationFrameId ) ;
98+ resolve ( segmentContent ) ;
99+ } else {
100+ animationFrameId = requestAnimationFrame ( check ) ; // Keep checking on the next animation frame
101+ }
102+ } ;
103+
104+ check ( ) ;
105+
106+ // Set a timeout to reject the promise
107+ timeoutId = setTimeout ( ( ) => {
108+ cancelAnimationFrame ( animationFrameId ) ;
109+ reject ( new Error ( `Unable to find Segment Content with id="${ contentId } within 1000 ms` ) ) ;
110+ } , 1000 ) ;
111+ } ) ;
112+ }
113+
114+ async connectedCallback ( ) {
71115 const segmentEl = ( this . segmentEl = this . el . closest ( 'ion-segment' ) ) ;
72116 if ( segmentEl ) {
73117 this . updateState ( ) ;
@@ -78,12 +122,13 @@ export class SegmentButton implements ComponentInterface, ButtonInterface {
78122 // Return if there is no contentId defined
79123 if ( ! this . contentId ) return ;
80124
81- // Attempt to find the Segment Content by its contentId
82- const segmentContent = document . getElementById ( this . contentId ) as HTMLIonSegmentContentElement | null ;
83-
84- // If no associated Segment Content exists, log an error and return
85- if ( ! segmentContent ) {
86- console . error ( `Segment Button: Unable to find Segment Content with id="${ this . contentId } ".` ) ;
125+ let segmentContent ;
126+ try {
127+ // Attempt to find the Segment Content by its contentId
128+ segmentContent = await this . waitForSegmentContent ( segmentEl , this . contentId ) ;
129+ } catch ( error ) {
130+ // If no associated Segment Content exists, log an error and return
131+ console . error ( 'Segment Button: ' , ( error as Error ) . message ) ;
87132 return ;
88133 }
89134
0 commit comments