Skip to content

Commit cc332b0

Browse files
committed
chore: add nitrogen postprocess to make HybridRiveViewManager open
Nitro 0.35 generates final ViewManager classes, preventing onDropViewInstance override needed for view lifecycle cleanup. Added a postprocess script to patch the generated class as open.
1 parent d00394a commit cc332b0

File tree

10 files changed

+38
-3
lines changed

10 files changed

+38
-3
lines changed

android/src/main/java/com/margelo/nitro/rive/HybridRiveView.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ class HybridRiveView(val context: ThemedReactContext) : HybridRiveViewSpec() {
5959
private var registeredFile: HybridRiveFile? = null
6060
//endregion
6161

62+
6263
//region View Props
6364
override var artboardName: String? = null
6465
set(value) {

android/src/main/java/com/rive/RivePackage.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import com.facebook.react.bridge.ReactApplicationContext
66
import com.facebook.react.module.model.ReactModuleInfoProvider
77
import com.facebook.react.uimanager.ViewManager
88
import com.margelo.nitro.rive.riveOnLoad
9-
109
class RivePackage : BaseReactPackage() {
1110
override fun createViewManagers(reactContext: ReactApplicationContext): List<ViewManager<in Nothing, in Nothing>> {
1211
if (BuildConfig.RIVE_SKIP_SETUP) {

example/assets/rive/counter.riv

857 KB
Binary file not shown.

expo-example/app/[pageId].tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import '@example/polyfills';
12
import { useLocalSearchParams, Stack } from 'expo-router';
23
import { PagesList, type PageItem } from '@example/PagesList';
34
import { View, Text, StyleSheet } from 'react-native';

expo-example/app/_layout.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import '@example/polyfills';
12
import {
23
DarkTheme,
34
DefaultTheme,

expo-example/app/index.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import '@example/polyfills';
12
import { useEffect, useState } from 'react';
23
import { StyleSheet, TouchableOpacity } from 'react-native';
34
import { useRouter } from 'expo-router';

expo-example/components/ui/icon-symbol.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ const MAPPING = {
2525
'paperplane.fill': 'send',
2626
'chevron.left.forwardslash.chevron.right': 'code',
2727
'chevron.right': 'chevron-right',
28+
'wrench.fill': 'build',
2829
} as IconMapping;
2930

3031
/**

nitrogen/generated/android/kotlin/com/margelo/nitro/rive/views/HybridRiveViewManager.kt

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@
3939
"lint": "eslint \"**/*.{js,ts,tsx}\"",
4040
"clean": "del-cli android/build example/android/build example/android/app/build example/ios/build lib",
4141
"prepare": "npx react-native-builder-bob@^0.40.0 build",
42-
"nitrogen": "nitrogen",
42+
"nitrogen": "nitrogen && npx tsx scripts/nitrogen-postprocess.ts",
4343
"release": "release-it",
4444
"dev:ios": "cd example && xed ios",
4545
"dev:android": "cd example && open -a \"/Applications/Android Studio.app\" ./android",

scripts/nitrogen-postprocess.ts

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
import { readFileSync, writeFileSync, existsSync } from 'fs';
2+
import { join } from 'path';
3+
4+
const ROOT = join(__dirname, '..');
5+
const MANAGER_FILE = join(
6+
ROOT,
7+
'nitrogen/generated/android/kotlin/com/margelo/nitro/rive/views/HybridRiveViewManager.kt'
8+
);
9+
10+
function makeHybridRiveViewManagerOpen() {
11+
if (!existsSync(MANAGER_FILE)) {
12+
console.warn('HybridRiveViewManager.kt not found, skipping');
13+
return;
14+
}
15+
16+
const content = readFileSync(MANAGER_FILE, 'utf-8');
17+
const updated = content.replace(
18+
'public class HybridRiveViewManager',
19+
'public open class HybridRiveViewManager'
20+
);
21+
22+
if (content === updated) {
23+
console.log('HybridRiveViewManager is already open');
24+
return;
25+
}
26+
27+
writeFileSync(MANAGER_FILE, updated);
28+
console.log('Made HybridRiveViewManager open');
29+
}
30+
31+
makeHybridRiveViewManagerOpen();

0 commit comments

Comments
 (0)