@@ -2,7 +2,7 @@ import type { ComponentInterface } from '@stencil/core';
22import { Component , Element , Host , Prop , Method , State , Watch , forceUpdate , h } from '@stencil/core' ;
33import type { ButtonInterface } from '@utils/element-interface' ;
44import type { Attributes } from '@utils/helpers' ;
5- import { addEventListener , removeEventListener , inheritAttributes } from '@utils/helpers' ;
5+ import { addEventListener , removeEventListener , inheritAttributes , getNextSiblingOfType } from '@utils/helpers' ;
66import { hostContext } from '@utils/theme' ;
77
88import { getIonMode } from '../../global/ionic-global' ;
@@ -65,7 +65,41 @@ export class SegmentButton implements ComponentInterface, ButtonInterface {
6565 this . updateState ( ) ;
6666 }
6767
68- connectedCallback ( ) {
68+ private waitForSegmentContent ( ionSegment : HTMLIonSegmentElement | null , contentId : string ) : Promise < HTMLElement > {
69+ return new Promise ( ( resolve , reject ) => {
70+ let timeoutId : NodeJS . Timeout | undefined = undefined ;
71+ let animationFrameId : number ;
72+
73+ const check = ( ) => {
74+ if ( ! ionSegment ) {
75+ reject ( new Error ( `Segment not found when looking for Segment Content` ) ) ;
76+ return ;
77+ }
78+
79+ const segmentView = getNextSiblingOfType < HTMLIonSegmentViewElement > ( ionSegment ) ; // Skip the text nodes
80+ const segmentContent = segmentView ?. querySelector (
81+ `ion-segment-content[id="${ contentId } "]`
82+ ) as HTMLIonSegmentContentElement | null ;
83+ if ( segmentContent && timeoutId ) {
84+ clearTimeout ( timeoutId ) ; // Clear the timeout if the segmentContent is found
85+ cancelAnimationFrame ( animationFrameId ) ;
86+ resolve ( segmentContent ) ;
87+ } else {
88+ animationFrameId = requestAnimationFrame ( check ) ; // Keep checking on the next animation frame
89+ }
90+ } ;
91+
92+ check ( ) ;
93+
94+ // Set a timeout to reject the promise
95+ timeoutId = setTimeout ( ( ) => {
96+ cancelAnimationFrame ( animationFrameId ) ;
97+ reject ( new Error ( `Unable to find Segment Content with id="${ contentId } within 1000 ms` ) ) ;
98+ } , 1000 ) ;
99+ } ) ;
100+ }
101+
102+ async connectedCallback ( ) {
69103 const segmentEl = ( this . segmentEl = this . el . closest ( 'ion-segment' ) ) ;
70104 if ( segmentEl ) {
71105 this . updateState ( ) ;
@@ -76,12 +110,13 @@ export class SegmentButton implements ComponentInterface, ButtonInterface {
76110 // Return if there is no contentId defined
77111 if ( ! this . contentId ) return ;
78112
79- // Attempt to find the Segment Content by its contentId
80- const segmentContent = document . getElementById ( this . contentId ) as HTMLIonSegmentContentElement | null ;
81-
82- // If no associated Segment Content exists, log an error and return
83- if ( ! segmentContent ) {
84- console . error ( `Segment Button: Unable to find Segment Content with id="${ this . contentId } ".` ) ;
113+ let segmentContent ;
114+ try {
115+ // Attempt to find the Segment Content by its contentId
116+ segmentContent = await this . waitForSegmentContent ( segmentEl , this . contentId ) ;
117+ } catch ( error ) {
118+ // If no associated Segment Content exists, log an error and return
119+ console . error ( 'Segment Button: ' , ( error as Error ) . message ) ;
85120 return ;
86121 }
87122
0 commit comments