about summary refs log tree commit diff
path: root/src/view/com/util/UserInfoText.tsx
diff options
context:
space:
mode:
Diffstat (limited to 'src/view/com/util/UserInfoText.tsx')
-rw-r--r--src/view/com/util/UserInfoText.tsx48
1 files changed, 48 insertions, 0 deletions
diff --git a/src/view/com/util/UserInfoText.tsx b/src/view/com/util/UserInfoText.tsx
new file mode 100644
index 000000000..39aef3306
--- /dev/null
+++ b/src/view/com/util/UserInfoText.tsx
@@ -0,0 +1,48 @@
+import React, {useState, useEffect} from 'react'
+import * as TodoSocialGetProfile from '../../../third-party/api/src/types/todo/social/getProfile'
+import {StyleProp, Text, TextStyle} from 'react-native'
+import {useStores} from '../../../state'
+
+export function UserInfoText({
+  did,
+  attr,
+  loading,
+  failed,
+  prefix,
+  style,
+}: {
+  did: string
+  attr?: keyof TodoSocialGetProfile.OutputSchema
+  loading?: string
+  failed?: string
+  prefix?: string
+  style?: StyleProp<TextStyle>
+}) {
+  attr = attr || 'name'
+  loading = loading || '...'
+  failed = failed || 'user'
+
+  const store = useStores()
+  const [profile, setProfile] = useState<
+    undefined | TodoSocialGetProfile.OutputSchema
+  >(undefined)
+  const [didFail, setFailed] = useState<boolean>(false)
+
+  useEffect(() => {
+    // TODO use caching to reduce loads
+    store.api.todo.social.getProfile({user: did}).then(
+      v => {
+        setProfile(v.data)
+      },
+      _err => {
+        setFailed(true)
+      },
+    )
+  }, [did, store.api.todo.social])
+
+  return (
+    <Text style={style}>
+      {didFail ? failed : profile ? `${prefix}${profile[attr]}` : loading}
+    </Text>
+  )
+}