react-native-yoga-jsi 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +27 -0
- package/README.md +166 -0
- package/android/CMakeLists.txt +72 -0
- package/android/build.gradle +190 -0
- package/android/gradle.properties +6 -0
- package/android/src/main/AndroidManifestNew.xml +3 -0
- package/android/src/main/cpp/cpp-adapter.cpp +17 -0
- package/android/src/main/java/com/yogajsi/YogaJSIModule.java +51 -0
- package/android/src/main/java/com/yogajsi/YogaJSIPackage.java +25 -0
- package/cpp/configCreation.h +91 -0
- package/cpp/macros.h +111 -0
- package/cpp/nodeCreation.h +65 -0
- package/cpp/nodeProperties.h +609 -0
- package/cpp/yogaJSI.h +23 -0
- package/ios/YogaJSIModule.h +5 -0
- package/ios/YogaJSIModule.mm +40 -0
- package/lib/commonjs/coreTypes.js +133 -0
- package/lib/commonjs/coreTypes.js.map +1 -0
- package/lib/commonjs/derived/index.js +39 -0
- package/lib/commonjs/derived/index.js.map +1 -0
- package/lib/commonjs/derived/styleHandler.js +326 -0
- package/lib/commonjs/derived/styleHandler.js.map +1 -0
- package/lib/commonjs/derived/useOnDepsChaneg.js +20 -0
- package/lib/commonjs/derived/useOnDepsChaneg.js.map +1 -0
- package/lib/commonjs/derived/useStyle.js +52 -0
- package/lib/commonjs/derived/useStyle.js.map +1 -0
- package/lib/commonjs/derived/utils.js +67 -0
- package/lib/commonjs/derived/utils.js.map +1 -0
- package/lib/commonjs/index.js +46 -0
- package/lib/commonjs/index.js.map +1 -0
- package/lib/commonjs/package.json +1 -0
- package/lib/module/coreTypes.js +129 -0
- package/lib/module/coreTypes.js.map +1 -0
- package/lib/module/derived/index.js +6 -0
- package/lib/module/derived/index.js.map +1 -0
- package/lib/module/derived/styleHandler.js +322 -0
- package/lib/module/derived/styleHandler.js.map +1 -0
- package/lib/module/derived/useOnDepsChaneg.js +17 -0
- package/lib/module/derived/useOnDepsChaneg.js.map +1 -0
- package/lib/module/derived/useStyle.js +49 -0
- package/lib/module/derived/useStyle.js.map +1 -0
- package/lib/module/derived/utils.js +61 -0
- package/lib/module/derived/utils.js.map +1 -0
- package/lib/module/index.js +21 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/package.json +1 -0
- package/lib/typescript/src/coreTypes.d.ts +259 -0
- package/lib/typescript/src/coreTypes.d.ts.map +1 -0
- package/lib/typescript/src/derived/index.d.ts +4 -0
- package/lib/typescript/src/derived/index.d.ts.map +1 -0
- package/lib/typescript/src/derived/styleHandler.d.ts +69 -0
- package/lib/typescript/src/derived/styleHandler.d.ts.map +1 -0
- package/lib/typescript/src/derived/useOnDepsChaneg.d.ts +3 -0
- package/lib/typescript/src/derived/useOnDepsChaneg.d.ts.map +1 -0
- package/lib/typescript/src/derived/useStyle.d.ts +15 -0
- package/lib/typescript/src/derived/useStyle.d.ts.map +1 -0
- package/lib/typescript/src/derived/utils.d.ts +21 -0
- package/lib/typescript/src/derived/utils.d.ts.map +1 -0
- package/lib/typescript/src/index.d.ts +6 -0
- package/lib/typescript/src/index.d.ts.map +1 -0
- package/package.json +147 -0
- package/react-native-yoga-jsi.podspec +40 -0
- package/src/coreTypes.ts +298 -0
- package/src/derived/index.ts +3 -0
- package/src/derived/styleHandler.ts +433 -0
- package/src/derived/useOnDepsChaneg.ts +20 -0
- package/src/derived/useStyle.ts +79 -0
- package/src/derived/utils.ts +86 -0
- package/src/index.ts +22 -0
@@ -0,0 +1,433 @@
|
|
1
|
+
import {
|
2
|
+
Align,
|
3
|
+
BoxSizing,
|
4
|
+
Direction,
|
5
|
+
Display,
|
6
|
+
Edge,
|
7
|
+
FlexDirection,
|
8
|
+
Gutter,
|
9
|
+
Justify,
|
10
|
+
Overflow,
|
11
|
+
PositionType,
|
12
|
+
Wrap,
|
13
|
+
type Node as YogaNode,
|
14
|
+
} from '../coreTypes';
|
15
|
+
|
16
|
+
export type AlignContent =
|
17
|
+
| 'flex-start'
|
18
|
+
| 'flex-end'
|
19
|
+
| 'center'
|
20
|
+
| 'stretch'
|
21
|
+
| 'space-between'
|
22
|
+
| 'space-around'
|
23
|
+
| 'space-evenly';
|
24
|
+
|
25
|
+
export type AlignItems =
|
26
|
+
| 'flex-start'
|
27
|
+
| 'flex-end'
|
28
|
+
| 'center'
|
29
|
+
| 'stretch'
|
30
|
+
| 'baseline';
|
31
|
+
|
32
|
+
export type JustifyContent =
|
33
|
+
| 'flex-start'
|
34
|
+
| 'flex-end'
|
35
|
+
| 'center'
|
36
|
+
| 'space-between'
|
37
|
+
| 'space-around'
|
38
|
+
| 'space-evenly';
|
39
|
+
|
40
|
+
export type NodeStyle = {
|
41
|
+
alignContent?: AlignContent;
|
42
|
+
alignItems?: AlignItems;
|
43
|
+
alignSelf?: AlignItems;
|
44
|
+
aspectRatio?: number;
|
45
|
+
borderBottomWidth?: number;
|
46
|
+
borderEndWidth?: number;
|
47
|
+
borderLeftWidth?: number;
|
48
|
+
borderRightWidth?: number;
|
49
|
+
borderStartWidth?: number;
|
50
|
+
borderTopWidth?: number;
|
51
|
+
borderWidth?: number;
|
52
|
+
borderInlineWidth?: number;
|
53
|
+
borderBlockWidth?: number;
|
54
|
+
bottom?: number | `${number}%`;
|
55
|
+
boxSizing?: 'border-box' | 'content-box';
|
56
|
+
direction?: 'ltr' | 'rtl';
|
57
|
+
display?: 'none' | 'flex';
|
58
|
+
end?: number | `${number}%`;
|
59
|
+
flex?: number;
|
60
|
+
flexBasis?: number | 'auto' | `${number}%`;
|
61
|
+
flexDirection?: 'row' | 'column' | 'row-reverse' | 'column-reverse';
|
62
|
+
rowGap?: number;
|
63
|
+
gap?: number;
|
64
|
+
columnGap?: number;
|
65
|
+
flexGrow?: number;
|
66
|
+
flexShrink?: number;
|
67
|
+
flexWrap?: 'wrap' | 'nowrap' | 'wrap-reverse';
|
68
|
+
height?: number | 'auto' | `${number}%`;
|
69
|
+
justifyContent?: JustifyContent;
|
70
|
+
left?: number | `${number}%`;
|
71
|
+
margin?: number | 'auto' | `${number}%`;
|
72
|
+
marginBottom?: number | 'auto' | `${number}%`;
|
73
|
+
marginEnd?: number | 'auto' | `${number}%`;
|
74
|
+
marginLeft?: number | 'auto' | `${number}%`;
|
75
|
+
marginRight?: number | 'auto' | `${number}%`;
|
76
|
+
marginStart?: number | 'auto' | `${number}%`;
|
77
|
+
marginTop?: number | 'auto' | `${number}%`;
|
78
|
+
marginInline?: number | 'auto' | `${number}%`;
|
79
|
+
marginBlock?: number | 'auto' | `${number}%`;
|
80
|
+
maxHeight?: number | `${number}%`;
|
81
|
+
maxWidth?: number | `${number}%`;
|
82
|
+
minHeight?: number | `${number}%`;
|
83
|
+
minWidth?: number | `${number}%`;
|
84
|
+
overflow?: 'visible' | 'hidden' | 'scroll';
|
85
|
+
padding?: number | `${number}%`;
|
86
|
+
paddingBottom?: number | `${number}%`;
|
87
|
+
paddingEnd?: number | `${number}%`;
|
88
|
+
paddingLeft?: number | `${number}%`;
|
89
|
+
paddingRight?: number | `${number}%`;
|
90
|
+
paddingStart?: number | `${number}%`;
|
91
|
+
paddingTop?: number | `${number}%`;
|
92
|
+
paddingInline?: number | `${number}%`;
|
93
|
+
paddingBlock?: number | `${number}%`;
|
94
|
+
position?: 'absolute' | 'relative' | 'static';
|
95
|
+
right?: number | `${number}%`;
|
96
|
+
start?: number | `${number}%`;
|
97
|
+
top?: number | `${number}%`;
|
98
|
+
insetInline?: number | `${number}%`;
|
99
|
+
insetBlock?: number | `${number}%`;
|
100
|
+
inset?: number | `${number}%`;
|
101
|
+
width?: number | 'auto' | `${number}%`;
|
102
|
+
};
|
103
|
+
|
104
|
+
export function applyStyle(node: YogaNode, style: NodeStyle = {}): void {
|
105
|
+
for (const key of Object.keys(style)) {
|
106
|
+
try {
|
107
|
+
switch (key) {
|
108
|
+
case 'alignContent':
|
109
|
+
node.setAlignContent(alignContent(style.alignContent));
|
110
|
+
break;
|
111
|
+
case 'alignItems':
|
112
|
+
node.setAlignItems(alignItems(style.alignItems));
|
113
|
+
break;
|
114
|
+
case 'alignSelf':
|
115
|
+
node.setAlignSelf(alignItems(style.alignSelf));
|
116
|
+
break;
|
117
|
+
case 'aspectRatio':
|
118
|
+
node.setAspectRatio(style.aspectRatio);
|
119
|
+
break;
|
120
|
+
case 'borderBottomWidth':
|
121
|
+
node.setBorder(Edge.Bottom, style.borderBottomWidth);
|
122
|
+
break;
|
123
|
+
case 'borderEndWidth':
|
124
|
+
node.setBorder(Edge.End, style.borderEndWidth);
|
125
|
+
break;
|
126
|
+
case 'borderLeftWidth':
|
127
|
+
node.setBorder(Edge.Left, style.borderLeftWidth);
|
128
|
+
break;
|
129
|
+
case 'borderRightWidth':
|
130
|
+
node.setBorder(Edge.Right, style.borderRightWidth);
|
131
|
+
break;
|
132
|
+
case 'borderStartWidth':
|
133
|
+
node.setBorder(Edge.Start, style.borderStartWidth);
|
134
|
+
break;
|
135
|
+
case 'borderTopWidth':
|
136
|
+
node.setBorder(Edge.Top, style.borderTopWidth);
|
137
|
+
break;
|
138
|
+
case 'borderWidth':
|
139
|
+
node.setBorder(Edge.All, style.borderWidth);
|
140
|
+
break;
|
141
|
+
case 'borderInlineWidth':
|
142
|
+
node.setBorder(Edge.Horizontal, style.borderInlineWidth);
|
143
|
+
break;
|
144
|
+
case 'borderBlockWidth':
|
145
|
+
node.setBorder(Edge.Vertical, style.borderBlockWidth);
|
146
|
+
break;
|
147
|
+
case 'bottom':
|
148
|
+
node.setPosition(Edge.Bottom, style.bottom);
|
149
|
+
break;
|
150
|
+
case 'boxSizing':
|
151
|
+
node.setBoxSizing(boxSizing(style.boxSizing));
|
152
|
+
break;
|
153
|
+
case 'direction':
|
154
|
+
node.setDirection(direction(style.direction));
|
155
|
+
break;
|
156
|
+
case 'display':
|
157
|
+
node.setDisplay(display(style.display));
|
158
|
+
break;
|
159
|
+
case 'end':
|
160
|
+
node.setPosition(Edge.End, style.end);
|
161
|
+
break;
|
162
|
+
case 'flex':
|
163
|
+
node.setFlex(style.flex);
|
164
|
+
break;
|
165
|
+
case 'flexBasis':
|
166
|
+
node.setFlexBasis(style.flexBasis);
|
167
|
+
break;
|
168
|
+
case 'flexDirection':
|
169
|
+
node.setFlexDirection(flexDirection(style.flexDirection));
|
170
|
+
break;
|
171
|
+
case 'rowGap':
|
172
|
+
node.setGap(Gutter.Row, style.rowGap);
|
173
|
+
break;
|
174
|
+
case 'gap':
|
175
|
+
node.setGap(Gutter.All, style.gap);
|
176
|
+
break;
|
177
|
+
case 'columnGap':
|
178
|
+
node.setGap(Gutter.Column, style.columnGap);
|
179
|
+
break;
|
180
|
+
case 'flexGrow':
|
181
|
+
node.setFlexGrow(style.flexGrow);
|
182
|
+
break;
|
183
|
+
case 'flexShrink':
|
184
|
+
node.setFlexShrink(style.flexShrink);
|
185
|
+
break;
|
186
|
+
case 'flexWrap':
|
187
|
+
node.setFlexWrap(flexWrap(style.flexWrap));
|
188
|
+
break;
|
189
|
+
case 'height':
|
190
|
+
node.setHeight(style.height);
|
191
|
+
break;
|
192
|
+
case 'justifyContent':
|
193
|
+
node.setJustifyContent(justifyContent(style.justifyContent));
|
194
|
+
break;
|
195
|
+
case 'left':
|
196
|
+
node.setPosition(Edge.Left, style.left);
|
197
|
+
break;
|
198
|
+
case 'margin':
|
199
|
+
node.setMargin(Edge.All, style.margin);
|
200
|
+
break;
|
201
|
+
case 'marginBottom':
|
202
|
+
node.setMargin(Edge.Bottom, style.marginBottom);
|
203
|
+
break;
|
204
|
+
case 'marginEnd':
|
205
|
+
node.setMargin(Edge.End, style.marginEnd);
|
206
|
+
break;
|
207
|
+
case 'marginLeft':
|
208
|
+
node.setMargin(Edge.Left, style.marginLeft);
|
209
|
+
break;
|
210
|
+
case 'marginRight':
|
211
|
+
node.setMargin(Edge.Right, style.marginRight);
|
212
|
+
break;
|
213
|
+
case 'marginStart':
|
214
|
+
node.setMargin(Edge.Start, style.marginStart);
|
215
|
+
break;
|
216
|
+
case 'marginTop':
|
217
|
+
node.setMargin(Edge.Top, style.marginTop);
|
218
|
+
break;
|
219
|
+
case 'marginInline':
|
220
|
+
node.setMargin(Edge.Horizontal, style.marginInline);
|
221
|
+
break;
|
222
|
+
case 'marginBlock':
|
223
|
+
node.setMargin(Edge.Vertical, style.marginBlock);
|
224
|
+
break;
|
225
|
+
case 'maxHeight':
|
226
|
+
node.setMaxHeight(style.maxHeight);
|
227
|
+
break;
|
228
|
+
case 'maxWidth':
|
229
|
+
node.setMaxWidth(style.maxWidth);
|
230
|
+
break;
|
231
|
+
case 'minHeight':
|
232
|
+
node.setMinHeight(style.minHeight);
|
233
|
+
break;
|
234
|
+
case 'minWidth':
|
235
|
+
node.setMinWidth(style.minWidth);
|
236
|
+
break;
|
237
|
+
case 'overflow':
|
238
|
+
node.setOverflow(overflow(style.overflow));
|
239
|
+
break;
|
240
|
+
case 'padding':
|
241
|
+
node.setPadding(Edge.All, style.padding);
|
242
|
+
break;
|
243
|
+
case 'paddingBottom':
|
244
|
+
node.setPadding(Edge.Bottom, style.paddingBottom);
|
245
|
+
break;
|
246
|
+
case 'paddingEnd':
|
247
|
+
node.setPadding(Edge.End, style.paddingEnd);
|
248
|
+
break;
|
249
|
+
case 'paddingLeft':
|
250
|
+
node.setPadding(Edge.Left, style.paddingLeft);
|
251
|
+
break;
|
252
|
+
case 'paddingRight':
|
253
|
+
node.setPadding(Edge.Right, style.paddingRight);
|
254
|
+
break;
|
255
|
+
case 'paddingStart':
|
256
|
+
node.setPadding(Edge.Start, style.paddingStart);
|
257
|
+
break;
|
258
|
+
case 'paddingTop':
|
259
|
+
node.setPadding(Edge.Top, style.paddingTop);
|
260
|
+
break;
|
261
|
+
case 'paddingInline':
|
262
|
+
node.setPadding(Edge.Horizontal, style.paddingInline);
|
263
|
+
break;
|
264
|
+
case 'paddingBlock':
|
265
|
+
node.setPadding(Edge.Vertical, style.paddingBlock);
|
266
|
+
break;
|
267
|
+
case 'position':
|
268
|
+
node.setPositionType(position(style.position));
|
269
|
+
break;
|
270
|
+
case 'right':
|
271
|
+
node.setPosition(Edge.Right, style.right);
|
272
|
+
break;
|
273
|
+
case 'start':
|
274
|
+
node.setPosition(Edge.Start, style.start);
|
275
|
+
break;
|
276
|
+
case 'top':
|
277
|
+
node.setPosition(Edge.Top, style.top);
|
278
|
+
break;
|
279
|
+
case 'insetInline':
|
280
|
+
node.setPosition(Edge.Horizontal, style.insetInline);
|
281
|
+
break;
|
282
|
+
case 'insetBlock':
|
283
|
+
node.setPosition(Edge.Vertical, style.insetBlock);
|
284
|
+
break;
|
285
|
+
case 'inset':
|
286
|
+
node.setPosition(Edge.All, style.inset);
|
287
|
+
break;
|
288
|
+
case 'width':
|
289
|
+
node.setWidth(style.width);
|
290
|
+
break;
|
291
|
+
}
|
292
|
+
} catch (e) {
|
293
|
+
// TODO: Handle this better
|
294
|
+
console.warn(`Failed to apply style "${key}" to node: ${e}`);
|
295
|
+
}
|
296
|
+
}
|
297
|
+
}
|
298
|
+
|
299
|
+
function alignContent(str?: AlignContent): Align {
|
300
|
+
switch (str) {
|
301
|
+
case 'flex-start':
|
302
|
+
return Align.FlexStart;
|
303
|
+
case 'flex-end':
|
304
|
+
return Align.FlexEnd;
|
305
|
+
case 'center':
|
306
|
+
return Align.Center;
|
307
|
+
case 'stretch':
|
308
|
+
return Align.Stretch;
|
309
|
+
case 'space-between':
|
310
|
+
return Align.SpaceBetween;
|
311
|
+
case 'space-around':
|
312
|
+
return Align.SpaceAround;
|
313
|
+
case 'space-evenly':
|
314
|
+
return Align.SpaceEvenly;
|
315
|
+
}
|
316
|
+
throw new Error(`"${str}" is not a valid value for alignContent`);
|
317
|
+
}
|
318
|
+
|
319
|
+
function alignItems(str?: AlignItems): Align {
|
320
|
+
switch (str) {
|
321
|
+
case 'flex-start':
|
322
|
+
return Align.FlexStart;
|
323
|
+
case 'flex-end':
|
324
|
+
return Align.FlexEnd;
|
325
|
+
case 'center':
|
326
|
+
return Align.Center;
|
327
|
+
case 'stretch':
|
328
|
+
return Align.Stretch;
|
329
|
+
case 'baseline':
|
330
|
+
return Align.Baseline;
|
331
|
+
}
|
332
|
+
throw new Error(`"${str}" is not a valid value for alignItems`);
|
333
|
+
}
|
334
|
+
|
335
|
+
function boxSizing(str?: 'border-box' | 'content-box'): BoxSizing {
|
336
|
+
switch (str) {
|
337
|
+
case 'border-box':
|
338
|
+
return BoxSizing.BorderBox;
|
339
|
+
case 'content-box':
|
340
|
+
return BoxSizing.ContentBox;
|
341
|
+
}
|
342
|
+
throw new Error(`"${str}" is not a valid value for boxSizing`);
|
343
|
+
}
|
344
|
+
|
345
|
+
function direction(str?: 'ltr' | 'rtl'): Direction {
|
346
|
+
switch (str) {
|
347
|
+
case 'ltr':
|
348
|
+
return Direction.LTR;
|
349
|
+
case 'rtl':
|
350
|
+
return Direction.RTL;
|
351
|
+
}
|
352
|
+
throw new Error(`"${str}" is not a valid value for direction`);
|
353
|
+
}
|
354
|
+
|
355
|
+
function display(str?: 'none' | 'flex'): Display {
|
356
|
+
switch (str) {
|
357
|
+
case 'none':
|
358
|
+
return Display.None;
|
359
|
+
case 'flex':
|
360
|
+
return Display.Flex;
|
361
|
+
}
|
362
|
+
throw new Error(`"${str}" is not a valid value for display`);
|
363
|
+
}
|
364
|
+
|
365
|
+
function flexDirection(
|
366
|
+
str?: 'row' | 'column' | 'row-reverse' | 'column-reverse',
|
367
|
+
): FlexDirection {
|
368
|
+
switch (str) {
|
369
|
+
case 'row':
|
370
|
+
return FlexDirection.Row;
|
371
|
+
case 'column':
|
372
|
+
return FlexDirection.Column;
|
373
|
+
case 'row-reverse':
|
374
|
+
return FlexDirection.RowReverse;
|
375
|
+
case 'column-reverse':
|
376
|
+
return FlexDirection.ColumnReverse;
|
377
|
+
}
|
378
|
+
throw new Error(`"${str}" is not a valid value for flexDirection`);
|
379
|
+
}
|
380
|
+
|
381
|
+
function flexWrap(str?: 'wrap' | 'nowrap' | 'wrap-reverse'): Wrap {
|
382
|
+
switch (str) {
|
383
|
+
case 'wrap':
|
384
|
+
return Wrap.Wrap;
|
385
|
+
case 'nowrap':
|
386
|
+
return Wrap.NoWrap;
|
387
|
+
case 'wrap-reverse':
|
388
|
+
return Wrap.WrapReverse;
|
389
|
+
}
|
390
|
+
throw new Error(`"${str}" is not a valid value for flexWrap`);
|
391
|
+
}
|
392
|
+
|
393
|
+
function justifyContent(str?: JustifyContent): Justify {
|
394
|
+
switch (str) {
|
395
|
+
case 'flex-start':
|
396
|
+
return Justify.FlexStart;
|
397
|
+
case 'flex-end':
|
398
|
+
return Justify.FlexEnd;
|
399
|
+
case 'center':
|
400
|
+
return Justify.Center;
|
401
|
+
case 'space-between':
|
402
|
+
return Justify.SpaceBetween;
|
403
|
+
case 'space-around':
|
404
|
+
return Justify.SpaceAround;
|
405
|
+
case 'space-evenly':
|
406
|
+
return Justify.SpaceEvenly;
|
407
|
+
}
|
408
|
+
throw new Error(`"${str}" is not a valid value for justifyContent`);
|
409
|
+
}
|
410
|
+
|
411
|
+
function overflow(str?: 'visible' | 'hidden' | 'scroll'): Overflow {
|
412
|
+
switch (str) {
|
413
|
+
case 'visible':
|
414
|
+
return Overflow.Visible;
|
415
|
+
case 'hidden':
|
416
|
+
return Overflow.Hidden;
|
417
|
+
case 'scroll':
|
418
|
+
return Overflow.Scroll;
|
419
|
+
}
|
420
|
+
throw new Error(`"${str}" is not a valid value for overflow`);
|
421
|
+
}
|
422
|
+
|
423
|
+
function position(str?: 'absolute' | 'relative' | 'static'): PositionType {
|
424
|
+
switch (str) {
|
425
|
+
case 'absolute':
|
426
|
+
return PositionType.Absolute;
|
427
|
+
case 'relative':
|
428
|
+
return PositionType.Relative;
|
429
|
+
case 'static':
|
430
|
+
return PositionType.Static;
|
431
|
+
}
|
432
|
+
throw new Error(`"${str}" is not a valid value for position`);
|
433
|
+
}
|
@@ -0,0 +1,20 @@
|
|
1
|
+
import { useMemo, useRef, type DependencyList } from 'react';
|
2
|
+
|
3
|
+
// runs before useEffect & useLayoutEffect
|
4
|
+
export function useOnDepsChange<T extends unknown[]>(
|
5
|
+
cb: ((...args: T) => void) | undefined,
|
6
|
+
deps: DependencyList,
|
7
|
+
...args: T
|
8
|
+
) {
|
9
|
+
const isOnMount = useRef(true);
|
10
|
+
|
11
|
+
useMemo(() => {
|
12
|
+
if (cb == undefined) return;
|
13
|
+
|
14
|
+
if (isOnMount.current) {
|
15
|
+
isOnMount.current = false;
|
16
|
+
return;
|
17
|
+
}
|
18
|
+
cb(...args);
|
19
|
+
}, deps);
|
20
|
+
}
|
@@ -0,0 +1,79 @@
|
|
1
|
+
import { useEffect, useMemo, useRef, type DependencyList } from 'react';
|
2
|
+
import { Direction, type Node } from '../coreTypes';
|
3
|
+
import { generateStyledLayout, type NodeTree } from './utils';
|
4
|
+
import { useOnDepsChange } from './useOnDepsChaneg';
|
5
|
+
|
6
|
+
type GetNodeFn<T extends string> = (key: T) => Record<T, Node>[T];
|
7
|
+
|
8
|
+
type Config<T extends string, U, V> = {
|
9
|
+
// size?: Size;
|
10
|
+
direction?: Direction;
|
11
|
+
onInit: (nodeKey: T, node: Node) => U;
|
12
|
+
onUpdate?: (nodeKey: T, node: Node, value: U) => void;
|
13
|
+
onUnmount?: (nodeKey: T, node: Node, value: U) => void;
|
14
|
+
onValueGet: (nodeKey: T, node: Node, value: U) => V;
|
15
|
+
onDepsChange?: (getNodeFn: GetNodeFn<T>) => void;
|
16
|
+
};
|
17
|
+
|
18
|
+
// type Size = {
|
19
|
+
// width: number;
|
20
|
+
// height: number;
|
21
|
+
// };
|
22
|
+
|
23
|
+
type RefRecord<T extends string, U> = Record<T, U>;
|
24
|
+
|
25
|
+
export function useStyle<T extends string, U, V>(
|
26
|
+
layoutTree: NodeTree<T>,
|
27
|
+
config: Config<T, U, V>,
|
28
|
+
deps: DependencyList = [],
|
29
|
+
) {
|
30
|
+
const initialValueStore = useRef<RefRecord<T, U>>({} as RefRecord<T, U>);
|
31
|
+
|
32
|
+
const [parsedLayout, getNodeStyle] = useMemo(() => {
|
33
|
+
const root = layoutTree.key;
|
34
|
+
const parsedLayout = generateStyledLayout(layoutTree);
|
35
|
+
|
36
|
+
const rootNode = parsedLayout.getNode(root);
|
37
|
+
|
38
|
+
rootNode.calculateLayout(undefined, undefined);
|
39
|
+
parsedLayout.forEach((node, key) => {
|
40
|
+
initialValueStore.current[key] = config.onInit(key, node);
|
41
|
+
});
|
42
|
+
|
43
|
+
if (config.onUpdate !== undefined) {
|
44
|
+
rootNode.setDirtiedFunc(() => {
|
45
|
+
rootNode.calculateLayout('auto', 'auto', config.direction);
|
46
|
+
parsedLayout.forEach((node, key) => {
|
47
|
+
config.onUpdate!(key, node, initialValueStore.current[key]);
|
48
|
+
});
|
49
|
+
});
|
50
|
+
}
|
51
|
+
|
52
|
+
const getNodeStyle = (key: T) => {
|
53
|
+
return config.onValueGet(
|
54
|
+
key,
|
55
|
+
parsedLayout.getNode(key),
|
56
|
+
initialValueStore.current[key],
|
57
|
+
);
|
58
|
+
};
|
59
|
+
|
60
|
+
return [parsedLayout, getNodeStyle] as const;
|
61
|
+
}, []);
|
62
|
+
|
63
|
+
const getNodeFn = (key: T) => parsedLayout.getNode(key);
|
64
|
+
|
65
|
+
useOnDepsChange(config.onDepsChange, deps, getNodeFn);
|
66
|
+
|
67
|
+
useEffect(() => {
|
68
|
+
return () => {
|
69
|
+
if (config.onUnmount !== undefined) {
|
70
|
+
parsedLayout.forEach((node, key) => {
|
71
|
+
config.onUnmount!(key, node, initialValueStore.current[key]);
|
72
|
+
});
|
73
|
+
}
|
74
|
+
parsedLayout.free();
|
75
|
+
};
|
76
|
+
}, []);
|
77
|
+
|
78
|
+
return [getNodeStyle, getNodeFn] as const;
|
79
|
+
}
|
@@ -0,0 +1,86 @@
|
|
1
|
+
import type { Node } from '../coreTypes';
|
2
|
+
import Yoga from '../index';
|
3
|
+
import { applyStyle, type NodeStyle } from './styleHandler';
|
4
|
+
|
5
|
+
export type NodeTree<T extends string> = {
|
6
|
+
key: T;
|
7
|
+
style?: NodeStyle;
|
8
|
+
children?: NodeTree<T>[];
|
9
|
+
};
|
10
|
+
|
11
|
+
export type NodeTreeKeys<T> = T extends NodeTree<infer K> ? K : never;
|
12
|
+
|
13
|
+
export function createLayout<T extends string>(styles: NodeTree<T>) {
|
14
|
+
return styles;
|
15
|
+
}
|
16
|
+
|
17
|
+
class Layout<T extends string> {
|
18
|
+
layout: Record<T, Node>;
|
19
|
+
rootKey: T;
|
20
|
+
|
21
|
+
constructor(rootKey: T) {
|
22
|
+
const config = Yoga.Config.create();
|
23
|
+
config.setPointScaleFactor(0);
|
24
|
+
const root = Yoga.Node.create(config);
|
25
|
+
this.rootKey = rootKey;
|
26
|
+
this.layout = {
|
27
|
+
[rootKey]: root,
|
28
|
+
} as Record<T, Node>;
|
29
|
+
}
|
30
|
+
|
31
|
+
addNodeTo(parentKey: T, key: T, index: number) {
|
32
|
+
const parent = this.layout[parentKey];
|
33
|
+
const child = Yoga.Node.create();
|
34
|
+
parent.insertChild(child, index);
|
35
|
+
this.layout[key] = child;
|
36
|
+
return child;
|
37
|
+
}
|
38
|
+
|
39
|
+
getNode(key: T) {
|
40
|
+
return this.layout[key];
|
41
|
+
}
|
42
|
+
|
43
|
+
free() {
|
44
|
+
this.getNode(this.rootKey).freeRecursive();
|
45
|
+
}
|
46
|
+
|
47
|
+
forEach(cb: (node: Node, key: T) => void) {
|
48
|
+
for (const key in this.layout) {
|
49
|
+
cb(this.layout[key], key);
|
50
|
+
}
|
51
|
+
}
|
52
|
+
}
|
53
|
+
|
54
|
+
type TreeItem<T extends string> = NodeTree<T> | NodeTree<T>[];
|
55
|
+
|
56
|
+
export function generateStyledLayout<T extends string>(layout: NodeTree<T>) {
|
57
|
+
const layoutTree = new Layout(layout.key);
|
58
|
+
console.log('applying to: ', layout.key);
|
59
|
+
applyStyle(layoutTree.layout[layout.key], layout.style);
|
60
|
+
(function _parse(
|
61
|
+
treeItem: TreeItem<T>,
|
62
|
+
index: number,
|
63
|
+
isArray: boolean,
|
64
|
+
parentKey: T | null,
|
65
|
+
) {
|
66
|
+
if (isArray) {
|
67
|
+
(treeItem as NodeTree<T>[]).forEach((o, i) => {
|
68
|
+
_parse(o, i, false, parentKey);
|
69
|
+
});
|
70
|
+
} else {
|
71
|
+
treeItem = treeItem as NodeTree<T>;
|
72
|
+
if (parentKey !== null) {
|
73
|
+
const addedNode = layoutTree.addNodeTo(parentKey, treeItem.key, index);
|
74
|
+
console.log('applying to: ', treeItem.key);
|
75
|
+
applyStyle(addedNode, treeItem.style);
|
76
|
+
}
|
77
|
+
if (treeItem.children) {
|
78
|
+
_parse(treeItem.children, 0, true, treeItem.key);
|
79
|
+
}
|
80
|
+
}
|
81
|
+
|
82
|
+
return layoutTree;
|
83
|
+
})(layout, 0, false, null);
|
84
|
+
|
85
|
+
return layoutTree;
|
86
|
+
}
|
package/src/index.ts
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
import { NativeModules } from 'react-native';
|
2
|
+
import type { Yoga } from './coreTypes';
|
3
|
+
// import * as derived from './derived';
|
4
|
+
// import * as coreTypes from './coreTypes';
|
5
|
+
|
6
|
+
(function () {
|
7
|
+
NativeModules.YogaJSI.install();
|
8
|
+
})();
|
9
|
+
|
10
|
+
//@ts-expect-error gotta fix it later
|
11
|
+
const YogaModule: {
|
12
|
+
Yoga: Yoga;
|
13
|
+
} = global;
|
14
|
+
|
15
|
+
export default YogaModule.Yoga;
|
16
|
+
export * from './derived';
|
17
|
+
export * from './coreTypes';
|
18
|
+
|
19
|
+
// module.exports = YogaModule.Yoga;
|
20
|
+
// module.exports.default = YogaModule.Yoga;
|
21
|
+
// module.exports.derived = derived;
|
22
|
+
// module.exports.coreTypes = coreTypes;
|