UNPKG

@grafana/ui

Version:
1 lines 4.32 kB
{"version":3,"file":"SetInterval.mjs","sources":["../../../../src/components/SetInterval/SetInterval.tsx"],"sourcesContent":["import { isEqual } from 'lodash';\nimport { PureComponent } from 'react';\nimport { interval, Subscription, Subject, of, NEVER } from 'rxjs';\nimport { tap, switchMap } from 'rxjs/operators';\n\nimport { stringToMs, SelectableValue } from '@grafana/data';\n\nimport { RefreshPicker } from '../RefreshPicker/RefreshPicker';\n\nexport function getIntervalFromString(strInterval: string): SelectableValue<number> {\n return {\n label: strInterval,\n value: stringToMs(strInterval),\n };\n}\n\ninterface Props {\n func: () => unknown;\n loading: boolean;\n interval: string;\n}\n\nexport class SetInterval extends PureComponent<Props> {\n private propsSubject: Subject<Props>;\n private subscription: Subscription | null;\n\n constructor(props: Props) {\n super(props);\n this.propsSubject = new Subject<Props>();\n this.subscription = null;\n }\n\n componentDidMount() {\n // Creating a subscription to propsSubject. This subject pushes values every time\n // SetInterval's props change\n this.subscription = this.propsSubject\n .pipe(\n // switchMap creates a new observables based on the input stream,\n // which becomes part of the propsSubject stream\n switchMap((props) => {\n // If the query is live, empty value is emitted. `of` creates single value,\n // which is merged to propsSubject stream\n if (RefreshPicker.isLive(props.interval)) {\n return of({});\n }\n\n // When query is loading, a new stream is merged. But it's a stream that emits no values(NEVER),\n // hence next call of this function will happen when query changes, and new props are passed into this component\n // When query is NOT loading, a new value is emitted, this time it's an interval value,\n // which makes tap function below execute on that interval basis.\n return props.loading ? NEVER : interval(stringToMs(props.interval));\n }),\n // tap will execute function passed via func prop\n // * on value from `of` stream merged if query is live\n // * on specified interval (triggered by values emitted by interval)\n tap(() => this.props.func())\n )\n .subscribe();\n\n // When component has mounted, propsSubject emits its first value\n this.propsSubject.next(this.props);\n }\n\n componentDidUpdate(prevProps: Props) {\n if (\n (RefreshPicker.isLive(prevProps.interval) && RefreshPicker.isLive(this.props.interval)) ||\n isEqual(prevProps, this.props)\n ) {\n return;\n }\n // if props changed, a new value is emitted from propsSubject\n this.propsSubject.next(this.props);\n }\n\n componentWillUnmount() {\n if (this.subscription) {\n this.subscription.unsubscribe();\n }\n\n this.propsSubject.unsubscribe();\n }\n\n render(): null {\n return null;\n }\n}\n"],"names":[],"mappings":";;;;;;;;AASO,SAAS,sBAAsB,WAAA,EAA8C;AAClF,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,WAAA;AAAA,IACP,KAAA,EAAO,WAAW,WAAW;AAAA,GAC/B;AACF;AAQO,MAAM,oBAAoB,aAAA,CAAqB;AAAA,EAIpD,YAAY,KAAA,EAAc;AACxB,IAAA,KAAA,CAAM,KAAK,CAAA;AACX,IAAA,IAAA,CAAK,YAAA,GAAe,IAAI,OAAA,EAAe;AACvC,IAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AAAA,EACtB;AAAA,EAEA,iBAAA,GAAoB;AAGlB,IAAA,IAAA,CAAK,YAAA,GAAe,KAAK,YAAA,CACtB,IAAA;AAAA;AAAA;AAAA,MAGC,SAAA,CAAU,CAAC,KAAA,KAAU;AAGnB,QAAA,IAAI,aAAA,CAAc,MAAA,CAAO,KAAA,CAAM,QAAQ,CAAA,EAAG;AACxC,UAAA,OAAO,EAAA,CAAG,EAAE,CAAA;AAAA,QACd;AAMA,QAAA,OAAO,MAAM,OAAA,GAAU,KAAA,GAAQ,SAAS,UAAA,CAAW,KAAA,CAAM,QAAQ,CAAC,CAAA;AAAA,MACpE,CAAC,CAAA;AAAA;AAAA;AAAA;AAAA,MAID,GAAA,CAAI,MAAM,IAAA,CAAK,KAAA,CAAM,MAAM;AAAA,MAE5B,SAAA,EAAU;AAGb,IAAA,IAAA,CAAK,YAAA,CAAa,IAAA,CAAK,IAAA,CAAK,KAAK,CAAA;AAAA,EACnC;AAAA,EAEA,mBAAmB,SAAA,EAAkB;AACnC,IAAA,IACG,aAAA,CAAc,MAAA,CAAO,SAAA,CAAU,QAAQ,KAAK,aAAA,CAAc,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAA,IACrF,OAAA,CAAQ,SAAA,EAAW,IAAA,CAAK,KAAK,CAAA,EAC7B;AACA,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,YAAA,CAAa,IAAA,CAAK,IAAA,CAAK,KAAK,CAAA;AAAA,EACnC;AAAA,EAEA,oBAAA,GAAuB;AACrB,IAAA,IAAI,KAAK,YAAA,EAAc;AACrB,MAAA,IAAA,CAAK,aAAa,WAAA,EAAY;AAAA,IAChC;AAEA,IAAA,IAAA,CAAK,aAAa,WAAA,EAAY;AAAA,EAChC;AAAA,EAEA,MAAA,GAAe;AACb,IAAA,OAAO,IAAA;AAAA,EACT;AACF;;;;"}