about summary refs log tree commit diff
path: root/src/view/com/profile/ProfileHeader.tsx
diff options
context:
space:
mode:
Diffstat (limited to 'src/view/com/profile/ProfileHeader.tsx')
-rw-r--r--src/view/com/profile/ProfileHeader.tsx103
1 files changed, 93 insertions, 10 deletions
diff --git a/src/view/com/profile/ProfileHeader.tsx b/src/view/com/profile/ProfileHeader.tsx
index ee4df4fb9..3adffc44c 100644
--- a/src/view/com/profile/ProfileHeader.tsx
+++ b/src/view/com/profile/ProfileHeader.tsx
@@ -1,4 +1,4 @@
-import React from 'react'
+import React, {useMemo} from 'react'
 import {observer} from 'mobx-react-lite'
 import {
   ActivityIndicator,
@@ -9,12 +9,18 @@ import {
 } from 'react-native'
 import LinearGradient from 'react-native-linear-gradient'
 import {FontAwesomeIcon} from '@fortawesome/react-native-fontawesome'
+import {AtUri} from '../../../third-party/uri'
 import {ProfileViewModel} from '../../../state/models/profile-view'
 import {useStores} from '../../../state'
-import {EditProfileModel} from '../../../state/models/shell-ui'
+import {
+  ConfirmModel,
+  EditProfileModel,
+  InviteToSceneModel,
+} from '../../../state/models/shell-ui'
 import {pluralize} from '../../lib/strings'
 import {s, colors} from '../../lib/styles'
 import {getGradient} from '../../lib/asset-gen'
+import {DropdownBtn, DropdownItem} from '../util/DropdownBtn'
 import Toast from '../util/Toast'
 import {UserAvatar} from '../util/UserAvatar'
 import {UserBanner} from '../util/UserBanner'
@@ -22,10 +28,16 @@ import {UserInfoText} from '../util/UserInfoText'
 
 export const ProfileHeader = observer(function ProfileHeader({
   view,
+  onRefreshAll,
 }: {
   view: ProfileViewModel
+  onRefreshAll: () => void
 }) {
   const store = useStores()
+  const isMember = useMemo(
+    () => view.isScene && view.myState.member,
+    [view.myState.member],
+  )
 
   const onPressBack = () => {
     store.nav.tab.goBack()
@@ -49,9 +61,6 @@ export const ProfileHeader = observer(function ProfileHeader({
   const onPressEditProfile = () => {
     store.shell.openModal(new EditProfileModel(view))
   }
-  const onPressMenu = () => {
-    // TODO
-  }
   const onPressFollowers = () => {
     store.nav.navigate(`/profile/${view.handle}/followers`)
   }
@@ -61,6 +70,31 @@ export const ProfileHeader = observer(function ProfileHeader({
   const onPressMembers = () => {
     store.nav.navigate(`/profile/${view.handle}/members`)
   }
+  const onPressInviteMembers = () => {
+    store.shell.openModal(new InviteToSceneModel(view))
+  }
+  const onPressLeaveScene = () => {
+    store.shell.openModal(
+      new ConfirmModel(
+        'Leave this scene?',
+        `You'll be able to come back unless your invite is revoked.`,
+        onPressConfirmLeaveScene,
+      ),
+    )
+  }
+  const onPressConfirmLeaveScene = async () => {
+    if (view.myState.member) {
+      await store.api.app.bsky.graph.confirmation.delete({
+        did: store.me.did || '',
+        rkey: new AtUri(view.myState.member).rkey,
+      })
+      Toast.show(`Scene left`, {
+        duration: Toast.durations.LONG,
+        position: Toast.positions.TOP,
+      })
+    }
+    onRefreshAll()
+  }
 
   // loading
   // =
@@ -86,6 +120,23 @@ export const ProfileHeader = observer(function ProfileHeader({
   // =
   const gradient = getGradient(view.handle)
   const isMe = store.me.did === view.did
+  const isCreator = view.isScene && view.creator === store.me.did
+  let dropdownItems: DropdownItem[] | undefined
+  if (isCreator || isMember) {
+    dropdownItems = []
+    if (isCreator) {
+      dropdownItems.push({
+        label: 'Edit Profile',
+        onPress: () => {}, // TODO
+      })
+    }
+    if (isMember) {
+      dropdownItems.push({
+        label: 'Leave Scene...',
+        onPress: onPressLeaveScene,
+      })
+    }
+  }
   return (
     <View style={styles.outer}>
       <UserBanner handle={view.handle} />
@@ -136,11 +187,14 @@ export const ProfileHeader = observer(function ProfileHeader({
               )}
             </>
           )}
-          <TouchableOpacity
-            onPress={onPressMenu}
-            style={[styles.btn, styles.secondaryBtn]}>
-            <FontAwesomeIcon icon="ellipsis" style={[s.gray5]} />
-          </TouchableOpacity>
+          {view.isScene &&
+          (view.myState.member || view.creator === store.me.did) ? (
+            <DropdownBtn
+              items={dropdownItems}
+              style={[styles.btn, styles.secondaryBtn]}>
+              <FontAwesomeIcon icon="ellipsis" style={[s.gray5]} />
+            </DropdownBtn>
+          ) : undefined}
         </View>
         <View style={styles.displayNameLine}>
           <Text style={styles.displayName}>
@@ -224,6 +278,24 @@ export const ProfileHeader = observer(function ProfileHeader({
           </View>
         ) : undefined}
       </View>
+      {view.isScene && view.creator === store.me.did ? (
+        <View style={styles.sceneAdminContainer}>
+          <TouchableOpacity onPress={onPressInviteMembers}>
+            <LinearGradient
+              colors={[gradient[1], gradient[0]]}
+              start={{x: 0, y: 0}}
+              end={{x: 1, y: 1}}
+              style={[styles.btn, styles.gradientBtn, styles.sceneAdminBtn]}>
+              <FontAwesomeIcon
+                icon="user-plus"
+                style={[s.mr5, s.white]}
+                size={15}
+              />
+              <Text style={[s.bold, s.f15, s.white]}>Invite Members</Text>
+            </LinearGradient>
+          </TouchableOpacity>
+        </View>
+      ) : undefined}
     </View>
   )
 })
@@ -340,4 +412,15 @@ const styles = StyleSheet.create({
     alignItems: 'center',
     marginBottom: 5,
   },
+
+  sceneAdminContainer: {
+    borderColor: colors.gray1,
+    borderTopWidth: 1,
+    borderBottomWidth: 1,
+    paddingVertical: 12,
+    paddingHorizontal: 12,
+  },
+  sceneAdminBtn: {
+    paddingVertical: 8,
+  },
 })