mirror of
https://github.com/Redocly/redoc.git
synced 2025-02-08 05:50:34 +03:00
45 lines
1.5 KiB
TypeScript
45 lines
1.5 KiB
TypeScript
|
import { RedocRawOptions } from '../components/OptionsProvider';
|
||
|
import { ThemeInterface } from '../theme';
|
||
|
import { isNumeric } from '../utils/helpers';
|
||
|
|
||
|
export class RedocNormalizedOptions {
|
||
|
theme: ThemeInterface;
|
||
|
scrollYOffset: () => number;
|
||
|
|
||
|
constructor(raw: RedocRawOptions) {
|
||
|
this.scrollYOffset = RedocNormalizedOptions.normalizeScrollYOffset(raw.scrollYOffset);
|
||
|
}
|
||
|
|
||
|
static normalizeScrollYOffset(value: RedocRawOptions['scrollYOffset']): () => number {
|
||
|
// just number is not valid selector and leads to crash so checking if isNumeric here
|
||
|
if (typeof value === 'string' && !isNumeric(value)) {
|
||
|
const el = document.querySelector(value);
|
||
|
if (!el) {
|
||
|
console.warn(
|
||
|
'scrollYOffset value is a selector to non-existing element. Using offset 0 by default',
|
||
|
);
|
||
|
}
|
||
|
const bottom = (el && el.getBoundingClientRect().bottom) || 0;
|
||
|
return () => bottom;
|
||
|
} else if (typeof value === 'number' || isNumeric(value)) {
|
||
|
return () => (typeof value === 'number' ? value : parseFloat(value));
|
||
|
} else if (typeof value === 'function') {
|
||
|
return () => {
|
||
|
const res = value();
|
||
|
if (typeof res !== 'number') {
|
||
|
console.warn(
|
||
|
`scrollYOffset should return number but returned value "${res}" of type ${typeof res}`,
|
||
|
);
|
||
|
}
|
||
|
return res;
|
||
|
};
|
||
|
} else if (value !== undefined) {
|
||
|
console.warn(
|
||
|
'Wrong value for scrollYOffset ReDoc option: should be string, number or function',
|
||
|
);
|
||
|
}
|
||
|
|
||
|
return () => 0;
|
||
|
}
|
||
|
}
|