Skip to content
This repository was archived by the owner on Sep 11, 2024. It is now read-only.

Commit 4222871

Browse files
authored
Merge pull request #5343 from matrix-org/t3chguy/ts/resizer
Convert resizer to Typescript
2 parents 9181e3e + 0149865 commit 4222871

File tree

7 files changed

+146
-118
lines changed

7 files changed

+146
-118
lines changed

src/components/structures/LoggedInView.tsx

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ import RoomListStore from "../../stores/room-list/RoomListStore";
5252
import NonUrgentToastContainer from "./NonUrgentToastContainer";
5353
import { ToggleRightPanelPayload } from "../../dispatcher/payloads/ToggleRightPanelPayload";
5454
import { IThreepidInvite } from "../../stores/ThreepidInviteStore";
55+
import { ICollapseConfig } from "../../resizer/distributors/collapse";
5556

5657
// We need to fetch each pinned message individually (if we don't already have it)
5758
// so each pinned message may trigger a request. Limit the number per room for sanity.
@@ -205,13 +206,8 @@ class LoggedInView extends React.Component<IProps, IState> {
205206
};
206207

207208
_createResizer() {
208-
const classNames = {
209-
handle: "mx_ResizeHandle",
210-
vertical: "mx_ResizeHandle_vertical",
211-
reverse: "mx_ResizeHandle_reverse",
212-
};
213209
let size;
214-
const collapseConfig = {
210+
const collapseConfig: ICollapseConfig = {
215211
toggleSize: 260 - 50,
216212
onCollapsed: (collapsed) => {
217213
if (collapsed) {
@@ -234,7 +230,11 @@ class LoggedInView extends React.Component<IProps, IState> {
234230
},
235231
};
236232
const resizer = new Resizer(this._resizeContainer.current, CollapseDistributor, collapseConfig);
237-
resizer.setClassNames(classNames);
233+
resizer.setClassNames({
234+
handle: "mx_ResizeHandle",
235+
vertical: "mx_ResizeHandle_vertical",
236+
reverse: "mx_ResizeHandle_reverse",
237+
});
238238
return resizer;
239239
}
240240

src/resizer/distributors/collapse.js renamed to src/resizer/distributors/collapse.ts

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
Copyright 2019 New Vector Ltd
2+
Copyright 2019 - 2020 The Matrix.org Foundation C.I.C.
33
44
Licensed under the Apache License, Version 2.0 (the "License");
55
you may not use this file except in compliance with the License.
@@ -16,28 +16,37 @@ limitations under the License.
1616

1717
import FixedDistributor from "./fixed";
1818
import ResizeItem from "../item";
19+
import Resizer, {IConfig} from "../resizer";
20+
import Sizer from "../sizer";
1921

20-
class CollapseItem extends ResizeItem {
21-
notifyCollapsed(collapsed) {
22+
export interface ICollapseConfig extends IConfig {
23+
toggleSize: number;
24+
onCollapsed?(collapsed: boolean, id: string, element: HTMLElement): void;
25+
}
26+
27+
class CollapseItem extends ResizeItem<ICollapseConfig> {
28+
notifyCollapsed(collapsed: boolean) {
2229
const callback = this.resizer.config.onCollapsed;
2330
if (callback) {
2431
callback(collapsed, this.id, this.domNode);
2532
}
2633
}
2734
}
2835

29-
export default class CollapseDistributor extends FixedDistributor {
30-
static createItem(resizeHandle, resizer, sizer) {
36+
export default class CollapseDistributor extends FixedDistributor<ICollapseConfig, CollapseItem> {
37+
static createItem(resizeHandle: HTMLDivElement, resizer: Resizer<ICollapseConfig>, sizer: Sizer) {
3138
return new CollapseItem(resizeHandle, resizer, sizer);
3239
}
3340

34-
constructor(item, config) {
41+
private readonly toggleSize: number;
42+
private isCollapsed = false;
43+
44+
constructor(item: CollapseItem) {
3545
super(item);
36-
this.toggleSize = config && config.toggleSize;
37-
this.isCollapsed = false;
46+
this.toggleSize = item.resizer?.config?.toggleSize;
3847
}
3948

40-
resize(newSize) {
49+
public resize(newSize: number) {
4150
const isCollapsedSize = newSize < this.toggleSize;
4251
if (isCollapsedSize && !this.isCollapsed) {
4352
this.isCollapsed = true;

src/resizer/distributors/fixed.js renamed to src/resizer/distributors/fixed.ts

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
Copyright 2019 New Vector Ltd
2+
Copyright 2019 - 2020 The Matrix.org Foundation C.I.C.
33
44
Licensed under the Apache License, Version 2.0 (the "License");
55
you may not use this file except in compliance with the License.
@@ -16,6 +16,7 @@ limitations under the License.
1616

1717
import ResizeItem from "../item";
1818
import Sizer from "../sizer";
19+
import Resizer, {IConfig} from "../resizer";
1920

2021
/**
2122
distributors translate a moving cursor into
@@ -27,29 +28,30 @@ they have two methods:
2728
within the container bounding box. For internal use.
2829
This method usually ends up calling `resize` once the start offset is subtracted.
2930
*/
30-
export default class FixedDistributor {
31-
static createItem(resizeHandle, resizer, sizer) {
31+
export default class FixedDistributor<C extends IConfig, I extends ResizeItem<any> = ResizeItem<C>> {
32+
static createItem(resizeHandle: HTMLDivElement, resizer: Resizer, sizer: Sizer): ResizeItem {
3233
return new ResizeItem(resizeHandle, resizer, sizer);
3334
}
3435

35-
static createSizer(containerElement, vertical, reverse) {
36+
static createSizer(containerElement: HTMLElement, vertical: boolean, reverse: boolean): Sizer {
3637
return new Sizer(containerElement, vertical, reverse);
3738
}
3839

39-
constructor(item) {
40-
this.item = item;
40+
private readonly beforeOffset: number;
41+
42+
constructor(public readonly item: I) {
4143
this.beforeOffset = item.offset();
4244
}
4345

44-
resize(size) {
46+
public resize(size: number) {
4547
this.item.setSize(size);
4648
}
4749

48-
resizeFromContainerOffset(offset) {
50+
public resizeFromContainerOffset(offset: number) {
4951
this.resize(offset - this.beforeOffset);
5052
}
5153

52-
start() {}
54+
public start() {}
5355

54-
finish() {}
56+
public finish() {}
5557
}

src/resizer/index.js renamed to src/resizer/index.ts

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
/*
2-
Copyright 2018 New Vector Ltd
32
Copyright 2019 The Matrix.org Foundation C.I.C.
43
54
Licensed under the Apache License, Version 2.0 (the "License");
@@ -15,6 +14,6 @@ See the License for the specific language governing permissions and
1514
limitations under the License.
1615
*/
1716

18-
export FixedDistributor from "./distributors/fixed";
19-
export CollapseDistributor from "./distributors/collapse";
20-
export Resizer from "./resizer";
17+
export {default as FixedDistributor} from "./distributors/fixed";
18+
export {default as CollapseDistributor} from "./distributors/collapse";
19+
export {default as Resizer} from "./resizer";
Lines changed: 36 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
Copyright 2019 New Vector Ltd
2+
Copyright 2019 - 2020 The Matrix.org Foundation C.I.C.
33
44
Licensed under the Apache License, Version 2.0 (the "License");
55
you may not use this file except in compliance with the License.
@@ -14,25 +14,30 @@ See the License for the specific language governing permissions and
1414
limitations under the License.
1515
*/
1616

17-
export default class ResizeItem {
18-
constructor(handle, resizer, sizer) {
19-
const id = handle.getAttribute("data-id");
20-
const reverse = resizer.isReverseResizeHandle(handle);
21-
const domNode = reverse ? handle.nextElementSibling : handle.previousElementSibling;
22-
23-
this.domNode = domNode;
24-
this.id = id;
25-
this.reverse = reverse;
26-
this.resizer = resizer;
27-
this.sizer = sizer;
17+
import Resizer, {IConfig} from "./resizer";
18+
import Sizer from "./sizer";
19+
20+
export default class ResizeItem<C extends IConfig = IConfig> {
21+
public readonly domNode: HTMLElement;
22+
protected readonly id: string;
23+
protected reverse: boolean;
24+
25+
constructor(
26+
handle: HTMLElement,
27+
public readonly resizer: Resizer<C>,
28+
public readonly sizer: Sizer,
29+
) {
30+
this.reverse = resizer.isReverseResizeHandle(handle);
31+
this.domNode = <HTMLElement>(this.reverse ? handle.nextElementSibling : handle.previousElementSibling);
32+
this.id = handle.getAttribute("data-id");
2833
}
2934

30-
_copyWith(handle, resizer, sizer) {
31-
const Ctor = this.constructor;
35+
private copyWith(handle: HTMLElement, resizer: Resizer, sizer: Sizer) {
36+
const Ctor = this.constructor as typeof ResizeItem;
3237
return new Ctor(handle, resizer, sizer);
3338
}
3439

35-
_advance(forwards) {
40+
private advance(forwards: boolean) {
3641
// opposite direction from fromResizeHandle to get back to handle
3742
let handle = this.reverse ?
3843
this.domNode.previousElementSibling :
@@ -45,63 +50,62 @@ export default class ResizeItem {
4550
} else {
4651
handle = handle.previousElementSibling;
4752
}
48-
} while (handle && !this.resizer.isResizeHandle(handle));
53+
} while (handle && !this.resizer.isResizeHandle(<HTMLElement>handle));
4954

5055
if (handle) {
51-
const nextHandle = this._copyWith(handle, this.resizer, this.sizer);
56+
const nextHandle = this.copyWith(<HTMLElement>handle, this.resizer, this.sizer);
5257
nextHandle.reverse = this.reverse;
5358
return nextHandle;
5459
}
5560
}
5661

57-
next() {
58-
return this._advance(true);
62+
public next() {
63+
return this.advance(true);
5964
}
6065

61-
previous() {
62-
return this._advance(false);
66+
public previous() {
67+
return this.advance(false);
6368
}
6469

65-
size() {
70+
public size() {
6671
return this.sizer.getItemSize(this.domNode);
6772
}
6873

69-
offset() {
74+
public offset() {
7075
return this.sizer.getItemOffset(this.domNode);
7176
}
7277

73-
setSize(size) {
78+
public setSize(size: number) {
7479
this.sizer.setItemSize(this.domNode, size);
7580
const callback = this.resizer.config.onResized;
7681
if (callback) {
7782
callback(size, this.id, this.domNode);
7883
}
7984
}
8085

81-
clearSize() {
86+
public clearSize() {
8287
this.sizer.clearItemSize(this.domNode);
8388
const callback = this.resizer.config.onResized;
8489
if (callback) {
8590
callback(null, this.id, this.domNode);
8691
}
8792
}
8893

89-
90-
first() {
94+
public first() {
9195
const firstHandle = Array.from(this.domNode.parentElement.children).find(el => {
92-
return this.resizer.isResizeHandle(el);
96+
return this.resizer.isResizeHandle(<HTMLElement>el);
9397
});
9498
if (firstHandle) {
95-
return this._copyWith(firstHandle, this.resizer, this.sizer);
99+
return this.copyWith(<HTMLElement>firstHandle, this.resizer, this.sizer);
96100
}
97101
}
98102

99-
last() {
103+
public last() {
100104
const lastHandle = Array.from(this.domNode.parentElement.children).reverse().find(el => {
101-
return this.resizer.isResizeHandle(el);
105+
return this.resizer.isResizeHandle(<HTMLElement>el);
102106
});
103107
if (lastHandle) {
104-
return this._copyWith(lastHandle, this.resizer, this.sizer);
108+
return this.copyWith(<HTMLElement>lastHandle, this.resizer, this.sizer);
105109
}
106110
}
107111
}

0 commit comments

Comments
 (0)