import type { ComponentInterface } from '@stencil/core'; import { Component, Element, Host, Prop, h } from '@stencil/core'; import { ENABLE_HTML_CONTENT_DEFAULT } from '@utils/config'; import { sanitizeDOMString } from '@utils/sanitization'; import { arrowDown, caretBackSharp } from 'ionicons/icons'; import { config } from '../../global/config'; import { getIonMode } from '../../global/ionic-global'; import type { IonicSafeString } from '../../utils/sanitization'; import { supportsRubberBandScrolling } from '../refresher/refresher.utils'; import type { SpinnerTypes } from '../spinner/spinner-configs'; import { SPINNERS } from '../spinner/spinner-configs'; @Component({ tag: 'ion-refresher-content', }) export class RefresherContent implements ComponentInterface { private customHTMLEnabled = config.get('innerHTMLTemplatesEnabled', ENABLE_HTML_CONTENT_DEFAULT); @Element() el!: HTMLIonRefresherContentElement; /** * A static icon or a spinner to display when you begin to pull down. * A spinner name can be provided to gradually show tick marks * when pulling down on iOS devices. */ @Prop({ mutable: true }) pullingIcon?: SpinnerTypes | string | null; /** * The text you want to display when you begin to pull down. * `pullingText` can accept either plaintext or HTML as a string. * To display characters normally reserved for HTML, they * must be escaped. For example `` would become * `<Ionic>` * * For more information: [Security Documentation](https://ionicframework.com/docs/faq/security) * * Content is parsed as plaintext by default. * `innerHTMLTemplatesEnabled` must be set to `true` in the Ionic config * before custom HTML can be used. */ @Prop() pullingText?: string | IonicSafeString; /** * An animated SVG spinner that shows when refreshing begins */ @Prop({ mutable: true }) refreshingSpinner?: SpinnerTypes | null; /** * The text you want to display when performing a refresh. * `refreshingText` can accept either plaintext or HTML as a string. * To display characters normally reserved for HTML, they * must be escaped. For example `` would become * `<Ionic>` * * For more information: [Security Documentation](https://ionicframework.com/docs/faq/security) * * Content is parsed as plaintext by default. * `innerHTMLTemplatesEnabled` must be set to `true` in the Ionic config * before custom HTML can be used. */ @Prop() refreshingText?: string | IonicSafeString; componentWillLoad() { if (this.pullingIcon === undefined) { /** * The native iOS refresher uses a spinner instead of * an icon, so we need to see if this device supports * the native iOS refresher. */ const hasRubberBandScrolling = supportsRubberBandScrolling(); const mode = getIonMode(this); const overflowRefresher = hasRubberBandScrolling ? 'lines' : arrowDown; this.pullingIcon = config.get( 'refreshingIcon', mode === 'ios' && hasRubberBandScrolling ? config.get('spinner', overflowRefresher) : 'circular' ); } if (this.refreshingSpinner === undefined) { const mode = getIonMode(this); this.refreshingSpinner = config.get( 'refreshingSpinner', config.get('spinner', mode === 'ios' ? 'lines' : 'circular') ); } } private renderPullingText() { const { customHTMLEnabled, pullingText } = this; if (customHTMLEnabled) { return
; } return
{pullingText}
; } private renderRefreshingText() { const { customHTMLEnabled, refreshingText } = this; if (customHTMLEnabled) { return
; } return
{refreshingText}
; } render() { const pullingIcon = this.pullingIcon; const hasSpinner = pullingIcon != null && (SPINNERS[pullingIcon] as any) !== undefined; const mode = getIonMode(this); return (
{this.pullingIcon && hasSpinner && (
{mode === 'md' && this.pullingIcon === 'circular' && (
)}
)} {this.pullingIcon && !hasSpinner && (
)} {this.pullingText !== undefined && this.renderPullingText()}
{this.refreshingSpinner && (
)} {this.refreshingText !== undefined && this.renderRefreshingText()}
); } }