Skip to content

Commit 4c3340d

Browse files
refactor(textarea): Use resize observer controller (#1670)
* refactor(textarea): Use resize observer controller * refactor: Renamed resize observer controller types --------- Co-authored-by: Simeon Simeonoff <[email protected]>
1 parent 063b693 commit 4c3340d

File tree

4 files changed

+28
-38
lines changed

4 files changed

+28
-38
lines changed

src/components/common/controllers/resize-observer.ts

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,14 @@ import {
44
isServer,
55
} from 'lit';
66

7-
type ResizeControllerCallback = (
7+
type ResizeObserverControllerCallback = (
88
...args: Parameters<ResizeObserverCallback>
99
) => unknown;
1010

1111
/** Configuration for initializing a resize controller. */
12-
export interface ResizeControllerConfig {
12+
export interface ResizeObserverControllerConfig {
1313
/** The callback function to run when a resize mutation is triggered. */
14-
callback: ResizeControllerCallback;
14+
callback: ResizeObserverControllerCallback;
1515
/** Configuration options passed to the underlying ResizeObserver. */
1616
options?: ResizeObserverOptions;
1717
/**
@@ -23,15 +23,15 @@ export interface ResizeControllerConfig {
2323
target?: Element | null;
2424
}
2525

26-
class ResizeController implements ReactiveController {
26+
class ResizeObserverController implements ReactiveController {
2727
private readonly _host: ReactiveControllerHost & Element;
2828
private readonly _targets = new Set<Element>();
2929
private readonly _observer!: ResizeObserver;
30-
private readonly _config: ResizeControllerConfig;
30+
private readonly _config: ResizeObserverControllerConfig;
3131

3232
constructor(
3333
host: ReactiveControllerHost & Element,
34-
config: ResizeControllerConfig
34+
config: ResizeObserverControllerConfig
3535
) {
3636
this._host = host;
3737
this._config = config;
@@ -80,11 +80,11 @@ class ResizeController implements ReactiveController {
8080

8181
/**
8282
* Creates a new resize controller bound to the given `host`
83-
* with {@link ResizeControllerConfig | `config`}.
83+
* with {@link ResizeObserverControllerConfig | `config`}.
8484
*/
85-
export function createResizeController(
85+
export function createResizeObserverController(
8686
host: ReactiveControllerHost & Element,
87-
config: ResizeControllerConfig
88-
): ResizeController {
89-
return new ResizeController(host, config);
87+
config: ResizeObserverControllerConfig
88+
): ResizeObserverController {
89+
return new ResizeObserverController(host, config);
9090
}

src/components/tabs/tabs.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ import {
2222
type MutationControllerParams,
2323
createMutationController,
2424
} from '../common/controllers/mutation-observer.js';
25-
import { createResizeController } from '../common/controllers/resize-observer.js';
25+
import { createResizeObserverController } from '../common/controllers/resize-observer.js';
2626
import { watch } from '../common/decorators/watch.js';
2727
import { registerComponent } from '../common/definitions/register.js';
2828
import type { Constructor } from '../common/mixins/constructor.js';
@@ -86,7 +86,7 @@ export default class IgcTabsComponent extends EventEmitterMixin<
8686

8787
//#region Private state & properties
8888

89-
private readonly _resizeController = createResizeController(this, {
89+
private readonly _resizeController = createResizeObserverController(this, {
9090
callback: this._resizeCallback,
9191
options: { box: 'border-box' },
9292
target: null,

src/components/textarea/textarea.spec.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ import {
1616
isFocused,
1717
runValidationContainerTests,
1818
simulateInput,
19-
simulateScroll,
2019
} from '../common/utils.spec.js';
2120
import IgcTextareaComponent from './textarea.js';
2221

@@ -209,17 +208,20 @@ describe('Textarea component', () => {
209208
element.appendChild(text);
210209
await elementUpdated(element);
211210

212-
await simulateScroll(element, { top: yDelta, left: xDelta });
211+
element.scrollTo({ top: yDelta, left: xDelta });
213212
expect([textArea.scrollLeft, textArea.scrollTop]).to.eql([
214213
xDelta,
215214
yDelta,
216215
]);
217216

218-
await simulateScroll(element, { top: yDelta * 2, left: xDelta * 2 });
217+
element.scrollTo({ top: yDelta * 2, left: xDelta * 2 });
219218
expect([textArea.scrollLeft, textArea.scrollTop]).to.eql([
220219
xDelta * 2,
221220
yDelta * 2,
222221
]);
222+
223+
element.scrollTo(0, 0);
224+
expect([textArea.scrollLeft, textArea.scrollTop]).to.eql([0, 0]);
223225
});
224226
});
225227

src/components/textarea/textarea.ts

Lines changed: 10 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import { live } from 'lit/directives/live.js';
1010
import { type StyleInfo, styleMap } from 'lit/directives/style-map.js';
1111

1212
import { getThemeController, themes } from '../../theming/theming-decorator.js';
13+
import { createResizeObserverController } from '../common/controllers/resize-observer.js';
1314
import { watch } from '../common/decorators/watch.js';
1415
import { registerComponent } from '../common/definitions/register.js';
1516
import type { Constructor } from '../common/mixins/constructor.js';
@@ -83,7 +84,7 @@ export default class IgcTextareaComponent extends FormAssociatedRequiredMixin(
8384
public static styles = [styles, shared];
8485

8586
/* blazorSuppress */
86-
public static register() {
87+
public static register(): void {
8788
registerComponent(IgcTextareaComponent, IgcValidationContainerComponent);
8889
}
8990

@@ -102,8 +103,6 @@ export default class IgcTextareaComponent extends FormAssociatedRequiredMixin(
102103

103104
protected inputId = `textarea-${IgcTextareaComponent.increment()}`;
104105

105-
private observer!: ResizeObserver;
106-
107106
@queryAssignedNodes({ flatten: true })
108107
private projected!: Array<Node>;
109108

@@ -298,29 +297,18 @@ export default class IgcTextareaComponent extends FormAssociatedRequiredMixin(
298297
constructor() {
299298
super();
300299

300+
createResizeObserverController(this, {
301+
callback: this.setAreaHeight,
302+
});
303+
301304
this._formValue = createFormValueState(this, { initialValue: '' });
302305

303306
this.addEventListener('focus', this.handleFocus);
304307
this.addEventListener('blur', this.handleBlur);
305308
}
306309

307-
public override async connectedCallback() {
308-
super.connectedCallback();
309-
310-
await this.updateComplete;
311-
312-
this.setAreaHeight();
313-
this.observer = new ResizeObserver(() => this.setAreaHeight());
314-
this.observer.observe(this.input);
315-
}
316-
317-
public override disconnectedCallback(): void {
318-
this.observer.disconnect();
319-
super.disconnectedCallback();
320-
}
321-
322310
/** Selects all text within the control. */
323-
public select() {
311+
public select(): void {
324312
this.input.select();
325313
}
326314

@@ -329,7 +317,7 @@ export default class IgcTextareaComponent extends FormAssociatedRequiredMixin(
329317
start: number,
330318
end: number,
331319
direction: SelectionRangeDirection = 'none'
332-
) {
320+
): void {
333321
this.input.setSelectionRange(start, end, direction);
334322
}
335323

@@ -339,7 +327,7 @@ export default class IgcTextareaComponent extends FormAssociatedRequiredMixin(
339327
start: number,
340328
end: number,
341329
selectMode: RangeTextSelectMode = 'preserve'
342-
) {
330+
): void {
343331
this.input.setRangeText(replacement, start, end, selectMode);
344332
this.value = this.input.value;
345333
}
@@ -349,7 +337,7 @@ export default class IgcTextareaComponent extends FormAssociatedRequiredMixin(
349337
/* blazorSuppress */
350338
public override scrollTo(x: number, y: number): void;
351339
public override scrollTo(x?: unknown, y?: unknown): void {
352-
x !== undefined && y !== undefined
340+
x != null && y != null
353341
? this.input.scrollTo(x as number, y as number)
354342
: this.input.scrollTo(x as ScrollToOptions);
355343
}

0 commit comments

Comments
 (0)