|
| 1 | +import type { dxElementWrapper } from '@js/core/renderer'; |
1 | 2 | import $ from '@js/core/renderer'; |
2 | 3 | import { Deferred } from '@js/core/utils/deferred'; |
3 | | -import { extend } from '@js/core/utils/extend'; |
4 | 4 | import { value as viewPort } from '@js/core/utils/view_port'; |
| 5 | +import type { Properties } from '@js/ui/tooltip'; |
5 | 6 | import Tooltip from '@js/ui/tooltip'; |
6 | 7 |
|
7 | | -let tooltip = null; |
8 | | -let removeTooltipElement = null; |
| 8 | +type CreateTooltipConfig = Properties & { |
| 9 | + content?: string; |
| 10 | +}; |
| 11 | + |
| 12 | +let tooltip: Tooltip | null = null; |
| 13 | +let clean: (() => void) | null = null; |
9 | 14 |
|
10 | | -const createTooltip = function (options) { |
11 | | - options = extend({ position: 'top' }, options); |
| 15 | +const createTooltip = (configuration: CreateTooltipConfig): void => { |
| 16 | + const options = { |
| 17 | + position: 'top', |
| 18 | + ...configuration, |
| 19 | + }; |
12 | 20 |
|
13 | 21 | const { content } = options; |
| 22 | + |
14 | 23 | delete options.content; |
15 | 24 |
|
16 | | - const $tooltip = $('<div>') |
| 25 | + let $tooltip: dxElementWrapper | null = $('<div>') |
17 | 26 | .html(content) |
18 | 27 | .appendTo(viewPort()); |
19 | 28 |
|
20 | | - // @ts-expect-error |
21 | | - removeTooltipElement = function () { |
22 | | - $tooltip.remove(); |
| 29 | + tooltip = new Tooltip($tooltip?.get(0), options as Properties); |
| 30 | + |
| 31 | + clean = (): void => { |
| 32 | + $tooltip?.remove(); |
| 33 | + $tooltip = null; |
| 34 | + tooltip = null; |
23 | 35 | }; |
24 | | - // @ts-expect-error |
25 | | - tooltip = new Tooltip($tooltip, options); |
26 | 36 | }; |
27 | 37 |
|
28 | | -const removeTooltip = function () { |
| 38 | +const removeTooltip = (): void => { |
29 | 39 | if (!tooltip) { |
30 | 40 | return; |
31 | 41 | } |
32 | | - // @ts-expect-error |
33 | | - removeTooltipElement(); |
34 | | - tooltip = null; |
| 42 | + |
| 43 | + clean?.(); |
35 | 44 | }; |
36 | 45 |
|
37 | | -export function show(options) { |
| 46 | +export function show(options: CreateTooltipConfig): Promise<boolean> { |
38 | 47 | removeTooltip(); |
39 | 48 | createTooltip(options); |
40 | | - // @ts-expect-error |
| 49 | + |
| 50 | + if (!tooltip) { |
| 51 | + return Deferred<boolean>() |
| 52 | + .resolve(false) |
| 53 | + .promise(); |
| 54 | + } |
| 55 | + |
41 | 56 | return tooltip.show(); |
42 | 57 | } |
43 | 58 |
|
44 | | -export function hide() { |
| 59 | +export function hide(): Promise<boolean> { |
45 | 60 | if (!tooltip) { |
46 | | - return Deferred().resolve(); |
| 61 | + return Deferred<boolean>() |
| 62 | + .resolve(false) |
| 63 | + .promise(); |
47 | 64 | } |
48 | | - // @ts-expect-error |
49 | | - return tooltip.hide() |
| 65 | + |
| 66 | + // eslint-disable-next-line @typescript-eslint/no-unsafe-return |
| 67 | + return tooltip |
| 68 | + .hide() |
| 69 | + // @ts-expect-error Deferred.promise() typings |
50 | 70 | .done(removeTooltip) |
51 | 71 | .promise(); |
52 | 72 | } |
0 commit comments