diff --git a/src/plugins/start/developer-settings/definitions/RDTVersionSetting.tsx b/src/plugins/start/developer-settings/definitions/RDTVersionSetting.tsx
index f818e2a..674b218 100644
--- a/src/plugins/start/developer-settings/definitions/RDTVersionSetting.tsx
+++ b/src/plugins/start/developer-settings/definitions/RDTVersionSetting.tsx
@@ -1,15 +1,17 @@
import TableRowAssetIcon from '@revenge-mod/components/TableRowAssetIcon'
+import { CopyableSetting } from '~/plugins/start/settings/definitions/shared'
import { Setting } from '../constants'
import { RDTContext } from '../react-devtools'
import type { SettingsItem } from '@revenge-mod/discord/modules/settings'
-const RDTVersionSetting: SettingsItem = {
- parent: Setting.RevengeDeveloper,
- IconComponent: () => ,
- title: () => 'React DevTools',
- useDescription: () => __REACT_DEVTOOLS__!.version,
- usePredicate: () => RDTContext.active,
- type: 'static',
-}
+const RDTVersionSetting: SettingsItem = CopyableSetting(
+ {
+ parent: Setting.RevengeDeveloper,
+ IconComponent: () => ,
+ title: () => 'React DevTools',
+ usePredicate: () => RDTContext.active,
+ },
+ () => __REACT_DEVTOOLS__!.version,
+)
export default RDTVersionSetting
diff --git a/src/plugins/start/settings/definitions/ReactNativeVersionSetting.tsx b/src/plugins/start/settings/definitions/ReactNativeVersionSetting.tsx
index 8623ad7..e83af6d 100644
--- a/src/plugins/start/settings/definitions/ReactNativeVersionSetting.tsx
+++ b/src/plugins/start/settings/definitions/ReactNativeVersionSetting.tsx
@@ -1,18 +1,20 @@
import TableRowAssetIcon from '@revenge-mod/components/TableRowAssetIcon'
-import { Platform } from 'react-native'
import { Setting } from '../constants'
+import { CopyableSetting } from './shared'
import type { SettingsItem } from '@revenge-mod/discord/modules/settings'
-const { major, minor, patch, prerelease } =
- Platform.constants.reactNativeVersion
-const version = `${major}.${minor}.${patch}${prerelease ? `-${prerelease}` : ''}`
+const { 'OSS Release Version': ossReleaseVersion } =
+ // @ts-expect-error
+ HermesInternal.getRuntimeProperties()
-const ReactNativeVersionSetting: SettingsItem = {
- parent: Setting.Revenge,
- IconComponent: () => ,
- title: () => 'React Native',
- useDescription: () => version,
- type: 'static',
-}
+const ReactNativeVersionSetting: SettingsItem = CopyableSetting(
+ {
+ parent: Setting.Revenge,
+ IconComponent: () => ,
+ title: () => 'React Native',
+ },
+ // slice "for RN " off the version string
+ () => ossReleaseVersion.slice(7),
+)
export default ReactNativeVersionSetting
diff --git a/src/plugins/start/settings/definitions/ReactVersionSetting.tsx b/src/plugins/start/settings/definitions/ReactVersionSetting.tsx
index 312125d..9e24b4b 100644
--- a/src/plugins/start/settings/definitions/ReactVersionSetting.tsx
+++ b/src/plugins/start/settings/definitions/ReactVersionSetting.tsx
@@ -1,14 +1,16 @@
import TableRowAssetIcon from '@revenge-mod/components/TableRowAssetIcon'
import { version } from 'react'
import { Setting } from '../constants'
+import { CopyableSetting } from './shared'
import type { SettingsItem } from '@revenge-mod/discord/modules/settings'
-const ReactVersionSetting: SettingsItem = {
- parent: Setting.Revenge,
- IconComponent: () => ,
- title: () => 'React',
- useDescription: () => version,
- type: 'static',
-}
+const ReactVersionSetting: SettingsItem = CopyableSetting(
+ {
+ parent: Setting.Revenge,
+ IconComponent: () => ,
+ title: () => 'React',
+ },
+ () => version,
+)
export default ReactVersionSetting
diff --git a/src/plugins/start/settings/definitions/RevengeVersionSetting.tsx b/src/plugins/start/settings/definitions/RevengeVersionSetting.tsx
index 0778e3c..3618cdf 100644
--- a/src/plugins/start/settings/definitions/RevengeVersionSetting.tsx
+++ b/src/plugins/start/settings/definitions/RevengeVersionSetting.tsx
@@ -2,14 +2,16 @@ import TableRowAssetIcon from '@revenge-mod/components/TableRowAssetIcon'
import { BuildEnvironment, FullVersion } from '~/constants'
import RevengeIcon from '~assets/RevengeIcon'
import { Setting } from '../constants'
+import { CopyableSetting } from './shared'
import type { SettingsItem } from '@revenge-mod/discord/modules/settings'
-const RevengeVersionSetting: SettingsItem = {
- parent: Setting.Revenge,
- IconComponent: () => ,
- title: () => 'Revenge',
- useDescription: () => `${FullVersion} (${BuildEnvironment})`,
- type: 'static',
-}
+const RevengeVersionSetting: SettingsItem = CopyableSetting(
+ {
+ parent: Setting.Revenge,
+ IconComponent: () => ,
+ title: () => 'Revenge',
+ },
+ () => `${FullVersion} (${BuildEnvironment})`,
+)
export default RevengeVersionSetting
diff --git a/src/plugins/start/settings/definitions/shared.ts b/src/plugins/start/settings/definitions/shared.ts
new file mode 100644
index 0000000..f660c64
--- /dev/null
+++ b/src/plugins/start/settings/definitions/shared.ts
@@ -0,0 +1,23 @@
+import { ToastActionCreators } from '@revenge-mod/discord/actions'
+import { Clipboard } from '@revenge-mod/externals/react-native-clipboard'
+import { lookupGeneratedIconComponent } from '@revenge-mod/utils/discord'
+import type { SettingsItem } from '@revenge-mod/discord/modules/settings'
+
+const CopyIcon = lookupGeneratedIconComponent('CopyIcon')
+
+export const CopyableSetting = (
+ item: Omit,
+ description: () => string,
+): SettingsItem => ({
+ ...item,
+ useDescription: item.useDescription ?? (() => description()),
+ type: 'pressable',
+ onPress() {
+ Clipboard.setString(description())
+ ToastActionCreators.open({
+ key: 'REVENGE_SETTING_COPIED',
+ content: 'Copied to clipboard',
+ IconComponent: CopyIcon,
+ })
+ },
+})