Skip to content

Commit e983892

Browse files
committed
chore(web): started work on the web-implementation
1 parent 310dd03 commit e983892

10 files changed

+243
-0
lines changed

web/RNSharedElementContent.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import { Rect } from "./Rect";
2+
3+
export class RNSharedElementContent {
4+
public readonly size: Rect;
5+
6+
constructor(size: Rect) {
7+
this.size = size;
8+
}
9+
}

web/RNSharedElementNode.ts

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
import { RNSharedElementStyle } from "./RNSharedElementStyle";
2+
import { RNSharedElementContent } from "./RNSharedElementContent";
3+
4+
export type RNSharedElementNodeStyleCallback = (style: RNSharedElementStyle, node: RNSharedElementNode) => void;
5+
export type RNSharedElementNodeContentCallback = (content: RNSharedElementContent, node: RNSharedElementNode) => void;
6+
7+
export class RNSharedElementNode {
8+
public readonly domNode: Element;
9+
public readonly ancestorDomNode: Element;
10+
public readonly isParent: boolean;
11+
private hideRefCount: number = 0;
12+
private refCount: number = 1;
13+
private styleCache: RNSharedElementStyle | null = null;
14+
private styleCallbacks: RNSharedElementNodeStyleCallback[] | null = null;
15+
private contentCache: RNSharedElementContent | null = null;
16+
private contentCallbacks: RNSharedElementNodeContentCallback[] | null = null;
17+
18+
constructor(domNode: Element, isParent: boolean, ancestorDomNode: Element) {
19+
this.domNode = domNode;
20+
this.isParent = isParent;
21+
this.ancestorDomNode = ancestorDomNode;
22+
}
23+
24+
addRef() {
25+
return ++this.refCount;
26+
}
27+
28+
releaseRef() {
29+
return --this.refCount;
30+
}
31+
32+
addHideRef() {
33+
this.hideRefCount++;
34+
if (this.hideRefCount === 1) {
35+
//mHideAlpha = mView.getAlpha();
36+
//mView.setAlpha(0);
37+
}
38+
}
39+
40+
releaseHideRef() {
41+
this.hideRefCount--;
42+
if (this.hideRefCount == 0) {
43+
//mView.setAlpha(mHideAlpha);
44+
}
45+
}
46+
47+
requestStyle(callback: RNSharedElementNodeStyleCallback) {
48+
if (this.styleCache) {
49+
callback(this.styleCache, this);
50+
return;
51+
}
52+
this.styleCallbacks = this.styleCallbacks || [];
53+
this.styleCallbacks.push(callback);
54+
if (!this.fetchInitialStyle()) {
55+
//startRetryLoop();
56+
}
57+
}
58+
59+
private fetchInitialStyle(): boolean {
60+
// TODO
61+
return false;
62+
}
63+
64+
requestContent(callback: RNSharedElementNodeContentCallback) {
65+
if (this.contentCache) {
66+
callback(this.contentCache, this);
67+
return;
68+
}
69+
this.contentCallbacks = this.contentCallbacks || [];
70+
this.contentCallbacks.push(callback);
71+
if (!this.fetchInitialContent()) {
72+
//startRetryLoop();
73+
}
74+
}
75+
76+
private fetchInitialContent(): boolean {
77+
// TODO
78+
return false;
79+
}
80+
}

web/RNSharedElementNodeManager.ts

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import { RNSharedElementNode } from "./RNSharedElementNode";
2+
3+
export class RNSharedElementNodeManager {
4+
private nodes = new Map<Element, RNSharedElementNode>();
5+
6+
acquire(domNode: Element, isParent: boolean, ancestorDomNode: Element): RNSharedElementNode {
7+
let node = this.nodes.get(domNode);
8+
if (node) {
9+
node.addRef();
10+
return node;
11+
}
12+
node = new RNSharedElementNode(domNode, isParent, ancestorDomNode);
13+
this.nodes.set(domNode, node);
14+
return node;
15+
}
16+
17+
release(node: RNSharedElementNode) {
18+
const refCount = node.releaseRef();
19+
if (!refCount) {
20+
this.nodes.delete(node.domNode);
21+
}
22+
return refCount;
23+
}
24+
}

web/RNSharedElementStyle.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
2+
3+
export class RNSharedElementStyle {
4+
5+
constructor() {
6+
}
7+
8+
addHideRef() {
9+
// ToDO
10+
}
11+
12+
releaseHideRef() {
13+
// ToDO
14+
}
15+
16+
}

web/RNSharedElementTransition.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import { RNSharedElementTransitionItemType } from './types';
2+
import { RNSharedElementTransitionItem } from './RNSharedElementTransitionItem';
3+
import { RNSharedElementNode } from './RNSharedElementNode';
4+
import { RNSharedElementNodeManager } from './RNSharedElementNodeManager';
5+
6+
export class RNSharedElementTransition {
7+
private items: RNSharedElementTransitionItem[];
8+
9+
constructor(nodeManager: RNSharedElementNodeManager) {
10+
this.items = [
11+
new RNSharedElementTransitionItem(nodeManager, 'start'),
12+
new RNSharedElementTransitionItem(nodeManager, 'end'),
13+
]
14+
}
15+
16+
setItemNode(itemType: RNSharedElementTransitionItemType, node: RNSharedElementNode) {
17+
this.items[itemType].node = node;
18+
}
19+
20+
21+
}

web/RNSharedElementTransitionItem.ts

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
import { RNSharedElementNodeManager } from './RNSharedElementNodeManager';
2+
import { RNSharedElementNode } from './RNSharedElementNode';
3+
import { RNSharedElementContent } from './RNSharedElementContent';
4+
import { RNSharedElementStyle } from './RNSharedElementStyle';
5+
6+
export class RNSharedElementTransitionItem {
7+
private _hidden: boolean = false;
8+
public readonly name: string;
9+
private _node: RNSharedElementNode | null = null;
10+
private _nodeManager: RNSharedElementNodeManager;
11+
public needsStyle: boolean = false;
12+
public style: RNSharedElementStyle | null = null;
13+
public needsContent: boolean = false;
14+
public content: RNSharedElementContent | null = null;
15+
16+
constructor(nodeManager: RNSharedElementNodeManager, name: string) {
17+
this._nodeManager = nodeManager;
18+
this.name = name;
19+
}
20+
21+
get node(): RNSharedElementNode | null {
22+
return this._node;
23+
}
24+
set node(node: RNSharedElementNode | null) {
25+
if (this._node === node) {
26+
if (node != null) this._nodeManager.release(node);
27+
return;
28+
}
29+
if (this._node != null) {
30+
if (this._hidden) this._node.releaseHideRef();
31+
this._nodeManager.release(this._node);
32+
}
33+
this._node = node;
34+
this._hidden = false;
35+
this.needsStyle = node != null;
36+
this.style = null;
37+
this.needsContent = (node != null);
38+
this.content = null;
39+
}
40+
41+
get hidden(): boolean {
42+
return this._hidden;
43+
}
44+
set hidden(hidden: boolean) {
45+
if (this._hidden == hidden) return;
46+
this._hidden = hidden;
47+
if (!this._node) return;
48+
if (hidden) {
49+
this._node.addHideRef();
50+
} else {
51+
this._node.releaseHideRef();
52+
}
53+
}
54+
55+
}

web/RNSharedElementView.ts

Whitespace-only changes.

web/Rect.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
export class Rect {
2+
public x: number = 0;
3+
public y: number = 0;
4+
public width: number = 0;
5+
public height: number = 0;
6+
}

web/WORK_IN_PROGRESS.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Nothing working here yet, come back later

web/types.ts

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
export enum RNSharedElementTransitionItemType {
2+
Start = 0,
3+
End = 1
4+
};
5+
6+
export enum RNSharedElementAnimation {
7+
Move = 0,
8+
Fade = 1,
9+
FadeIn = 2,
10+
FadeOut = 3
11+
}
12+
13+
export enum RNSharedElementResize {
14+
Auto = 0,
15+
Stretch = 1,
16+
Clip = 2,
17+
None = 3
18+
}
19+
20+
export enum RNSharedElementAlign {
21+
Auto = 0,
22+
LEFT_TOP = 1,
23+
LEFT_CENTER = 2,
24+
LEFT_BOTTOM = 3 ,
25+
RIGHT_TOP = 4,
26+
RIGHT_CENTER = 5,
27+
RIGHT_BOTTOM = 6,
28+
CENTER_TOP = 7,
29+
CENTER_CENTER = 8,
30+
CENTER_BOTTOM = 9
31+
}

0 commit comments

Comments
 (0)