Diagonistic and Debugging Tools for Ditto in React Native
⚠️ Platform Compatibility Notice
These tools currently do not support the React Native MacOS platform. They are designed for mobile (iOS, Android) platforms where Ditto's peer-to-peer functionality and file system access are available.
This library requires the following peer dependencies to be installed in your app:
@dittolive/ditto
- Core Ditto SDK@dr.pogodin/react-native-fs
- File system operations for log export and data directory cleanupreact-native-zip-archive
- Directory compression for data export functionality
⚠️ iOS Target Version
Some tools require iOS version 15.5 or higher. You may need to update your iOS target version.
npm install @dittolive/ditto-react-native-tools @dittolive/ditto @dr.pogodin/react-native-fs react-native-zip-archive
or
yarn add @dittolive/ditto-react-native-tools @dittolive/ditto @dr.pogodin/react-native-fs react-native-zip-archive
After installing dependencies, run:
cd ios && pod install && cd ..
For React Native 0.77.1+, auto-linking should handle Android setup automatically. If you encounter linking issues, clean your build:
cd android && ./gradlew clean && cd ..
After installing this library, you need to configure your React Native app for Ditto.
Please follow the official Ditto React Native quickstart guide: React Native Setup
import React from 'react';
import { DittoProvider, PeersList, DiskUsage } from '@dittolive/ditto-react-native-tools';
import { Ditto } from '@dittolive/ditto';
// Initialize your Ditto instance
const ditto = new Ditto({
type: 'offlinePlayground',
appID: 'your-app-id',
offlineToken: 'your-offline-token',
});
function App() {
return (
<DittoProvider ditto={ditto}>
<PeersList
showConnectionDetails={true}
emptyMessage="No peers discovered yet"
/>
</DittoProvider>
);
}
Display and monitor Ditto peer connections in real-time.
import { PeersList } from '@dittolive/ditto-react-native-tools';
<PeersList
ditto={ditto}
showConnectionDetails={true}
style={{ flex: 1 }}
/>
Props:
ditto
(required): Your Ditto instanceshowConnectionDetails?: boolean
- Whether to show detailed connection information (default: true)style?: ViewStyle
- Custom styling for the componentheaderComponent?: () => React.ReactElement
- Optional header component
Monitor and display Ditto's disk usage breakdown with export functionality.
import { DiskUsage } from '@dittolive/ditto-react-native-tools';
<DiskUsage
ditto={ditto}
style={{ flex: 1 }}
onExportDataDirectory={() => console.log('Export data')}
/>
Props:
ditto
(required): Your Ditto instancestyle?: ViewStyle
- Custom styling for the componentonExportDataDirectory?: () => void
- Callback when export data directory button is pressed
Features:
- Automatic Log Export: The "Export Logs" button uses Ditto's built-in
Logger.exportToFile()
method to save log files - Disk Usage Display: Shows real-time disk usage breakdown for different Ditto components (store, replication, attachments, auth)
- Last Updated Time: Footer displays when the data was last refreshed
This repository includes a fully functional example app demonstrating all features. See the example directory for setup instructions and implementation details.
When making changes to the root library code and testing them in the example app, the project is setup with symlinks for testing.
package.json:
"@dittolive/ditto-react-native-tools": "file:.."
To stop packages from bleeding from the library to the example app, the example app's metro.config.js is setup to only use the modules we need from the library:
// Explicitly map only the modules we need from the library
extraNodeModules: (() => {
const modules = [
'react',
'react-native',
'@dittolive/ditto',
'@dr.pogodin/react-native-fs',
'react-native-zip-archive',
];
const result = {};
for (const mod of modules) {
try {
// Try to resolve the module from the example app first, then from the library
let resolvedPath;
try {
resolvedPath = path.dirname(require.resolve(`${mod}/package.json`, { paths: [path.resolve(__dirname, 'node_modules')] }));
} catch (e) {
resolvedPath = path.dirname(require.resolve(`${mod}/package.json`, { paths: [path.resolve(libraryPath, 'node_modules')] }));
}
if (fs.existsSync(resolvedPath)) {
result[mod] = resolvedPath;
}
} catch (e) {
// Module not found, skip
}
}
return result;
})(),
// Enable symlinks (default in RN 0.77.1, but explicit for clarity)
unstable_enableSymlinks: true,
After the initial setup, changes to the library source code will be immediately available in the example app:
-
Make changes to the library source code in
src/
-
Clean all caches and reset development environment:
cd example ./clear-cache.sh npx expo prebuild --clean
-
Start Metro (if not already running):
npx react-native start --reset-cache
-
Run the app:
# In a new terminal: yarn ios --simulator="iPhone 16 Pro" # or yarn android
Note: With this setup, changes to the library code are immediately reflected in the example app through Fast Refresh. No need to rebuild or reinstall the library after each change!
Important: The Metro configuration includes a custom resolver that directly points to the library's TypeScript source files, enabling live updates without compilation.
To build and deploy the example app to a connected Android device:
-
Enable Developer Mode on your Android device:
- Go to Settings → About phone
- Tap "Build number" 7 times
- Go back to Settings → Developer options
- Enable "USB debugging"
-
Connect your device via USB and verify connection:
adb devices
You should see your device listed (e.g.,
R5CN30DYCWA device
)
There are two methods to deploy to your device:
-
Clean previous builds (if needed):
cd example/android ./gradlew clean
-
Build the APK:
./gradlew assembleDebug
-
Install the APK:
adb install app/build/outputs/apk/debug/app-debug.apk
-
Start Metro bundler:
cd ../ # Back to example directory npx react-native start --reset-cache
-
Launch the app:
adb shell monkey -p com.ditto.example -c android.intent.category.LAUNCHER 1
cd example
yarn android
This command will automatically build and deploy to the connected device.
- App not launching: Make sure the Metro bundler is running before launching the app
- Device not found: Ensure USB debugging is enabled and the device is properly connected
If you need to revert to the standard file:..
dependency:
cd example
yarn unlink "@dittolive/ditto-react-native-tools"
yarn install --force
The example app uses environment variables for Ditto configuration. After changing values in the .env
file:
-
Restart Metro with cache reset:
npx react-native start --reset-cache
-
Rebuild the app to pick up the new environment values:
yarn ios --simulator="iPhone 16 Pro"
Note: Environment variables are compiled into the JavaScript bundle at build time, so you must rebuild the app after changing
.env
values.
This library utilizes the following open-source projects:
- Ditto - Edge sync platform for building real-time collaborative apps
- @dr.pogodin/react-native-fs - File system access for React Native apps
- react-native-zip-archive - ZIP archive creation and extraction for React Native
We greatly appreciate the maintainers and contributors of these projects for making this library possible.