diff --git a/native/components/spoiler.react.js b/native/components/spoiler.react.js
new file mode 100644
--- /dev/null
+++ b/native/components/spoiler.react.js
@@ -0,0 +1,44 @@
+// @flow
+
+import * as React from 'react';
+import type { ReactElement } from 'react-motion/lib/Types';
+import { Text } from 'react-native';
+
+import { useStyles } from '../themes/colors';
+
+type SpoilerProps = {
+  +text: ReactElement,
+  +children?: React.Node,
+};
+
+function Spoiler(props: SpoilerProps): React.Node {
+  const [isRevealed, setIsRevealed] = React.useState(false);
+  const styles = useStyles(unboundStyles);
+  const { text } = props;
+
+  const onSpoilerClick = React.useCallback(() => {
+    setIsRevealed(true);
+  }, []);
+
+  const memoizedText = React.useMemo(() => {
+    return (
+      <Text
+        onPress={onSpoilerClick}
+        style={!isRevealed ? styles.spoilerHidden : null}
+      >
+        {text}
+      </Text>
+    );
+  }, [onSpoilerClick, isRevealed, styles.spoilerHidden, text]);
+
+  return memoizedText;
+}
+
+const unboundStyles = {
+  spoilerHidden: {
+    color: 'spoiler',
+    backgroundColor: 'spoiler',
+  },
+};
+
+export default Spoiler;
diff --git a/native/markdown/rules.react.js b/native/markdown/rules.react.js
--- a/native/markdown/rules.react.js
+++ b/native/markdown/rules.react.js
@@ -9,6 +9,7 @@
 import { relativeMemberInfoSelectorForMembersOfThread } from 'lib/selectors/user-selectors';
 import * as SharedMarkdown from 'lib/shared/markdown';
 import type { RelativeMemberInfo } from 'lib/types/thread-types';
+import Spoiler from 'native/components/spoiler.react';
 
 import { useSelector } from '../redux/redux-utils';
 import MarkdownLink from './markdown-link.react';
@@ -198,11 +199,7 @@
         node: SharedMarkdown.SingleASTNode,
         output: SharedMarkdown.Output<SharedMarkdown.ReactElement>,
         state: SharedMarkdown.State,
-      ) => (
-        <Text key={state.key} style={styles.spoiler}>
-          {output(node.content, state)}
-        </Text>
-      ),
+      ) => <Spoiler key={state.key} text={output(node.content, state)} />,
     },
     inlineCode: {
       ...SimpleMarkdown.defaultRules.inlineCode,