From 7c9b811ca6e47879ce51667f046aece2d00213ad Mon Sep 17 00:00:00 2001 From: balzack Date: Wed, 20 Sep 2023 17:59:45 -0700 Subject: [PATCH] implementing refactored contact view for drawers --- app/mobile/src/session/Session.jsx | 2 +- app/mobile/src/session/contact/Contact.jsx | 494 +++++++----------- .../src/session/contact/Contact.styled.js | 106 +++- app/mobile/src/session/profile/Profile.jsx | 6 +- 4 files changed, 291 insertions(+), 317 deletions(-) diff --git a/app/mobile/src/session/Session.jsx b/app/mobile/src/session/Session.jsx index 394d1691..73e7ecc2 100644 --- a/app/mobile/src/session/Session.jsx +++ b/app/mobile/src/session/Session.jsx @@ -301,7 +301,7 @@ function ContactDrawerScreen({ navParams }) { ( - + )}> diff --git a/app/mobile/src/session/contact/Contact.jsx b/app/mobile/src/session/contact/Contact.jsx index 27f64678..6a04afdf 100644 --- a/app/mobile/src/session/contact/Contact.jsx +++ b/app/mobile/src/session/contact/Contact.jsx @@ -11,299 +11,6 @@ import FntIcons from 'react-native-vector-icons/FontAwesome5'; import MatIcons from 'react-native-vector-icons/MaterialCommunityIcons'; import MtrIcons from 'react-native-vector-icons/MaterialIcons'; -export function ContactHeader({ contact }) { - const handle = contact?.node ? `${contact?.handle}@${contact?.node}` : contact?.handle; - return ( - { handle } - ) -} - -export function ContactBody({ contact }) { - - const { state, actions } = useContact(contact); - - const getStatusText = (status) => { - if (status === 'confirmed') { - return 'saved'; - } - if (status === 'pending') { - return 'unknown contact request'; - } - if (status === 'connecting') { - return 'request sent'; - } - if (status === 'connected') { - return 'connected'; - } - if (status === 'requested') { - return 'request received'; - } - return 'unsaved'; - } - - const setContact = async (action) => { - try { - await action(); - } - catch (err) { - console.log(err); - Alert.alert( - 'Failed to Update Contact', - 'Please try again.', - ); - } - } - - const cancelRequest = () => { - Alert.alert( - "Closing Request", - "Confirm?", - [ - { text: "Cancel", - onPress: () => {}, - }, - { text: "Close", onPress: () => { - setContact(actions.disconnectContact); - }} - ] - ); - } - - const disconnectContact = () => { - Alert.alert( - "Disconnecting Contact", - "Confirm?", - [ - { text: "Cancel", - onPress: () => {}, - }, - { text: "Disconnect", onPress: () => { - setContact(actions.disconnectContact); - }} - ] - ); - } - - const saveAndConnect = () => { - setContact(actions.saveAndConnect); - } - - const confirmAndConnect = () => { - setContact(actions.confirmAndConnect); - } - - const saveContact = () => { - setContact(actions.saveContact); - } - - const confirmContact = () => { - setContact(actions.confirmContact); - } - - const ignoreContact = () => { - setContact(actions.ignoreContact); - } - - const deleteContact = () => { - Alert.alert( - "Deleting Contact", - "Confirm?", - [ - { text: "Cancel", - onPress: () => {}, - }, - { text: "Delete", onPress: () => { - setContact(actions.deleteContact); - }} - ] - ); - } - - const closeDelete = () => { - Alert.alert( - "Deleting Contact", - "Confirm?", - [ - { text: "Cancel", - onPress: () => {}, - }, - { text: "Delete", onPress: () => { - setContact(actions.closeDelete); - }} - ] - ); - } - - const blockContact = () => { - Alert.alert( - "Blocking Contact", - "Confirm?", - [ - { text: "Cancel", - onPress: () => {}, - }, - { text: "Block", onPress: () => { - setContact(actions.blockContact); - }} - ] - ); - } - - const reportContact = () => { - Alert.alert( - "Report Contact", - "Confirm?", - [ - { text: "Cancel", - onPress: () => {}, - }, - { text: "Report", onPress: () => { - setContact(actions.reportContact); - }} - ] - ); - } - - const connectContact = () => { - setContact(actions.connectContact); - } - - return ( - - { `[${getStatusText(state.status)}]` } - - - - - - { state.name } - - - - - - { state.location } - - - - - - { state.description } - - - - { state.status === 'connected' && ( - <> - - Disconnect - - - Delete Contact - - - Block Contact - - - Report Contact - - { state.offsync && ( - - Resync Contact - - )} - - )} - { state.status === 'connecting' && ( - <> - - Close Request - - - Delete Contact - - - Block Contact - - - Report Contact - - - )} - { state.status === 'confirmed' && ( - <> - - Request Connection - - - Delete Contact - - - Block Contact - - - Report Contact - - - )} - { state.status === 'pending' && ( - <> - - Save and Connect - - - Save Contact - - - Ignore Request - - - Block Contact - - - Report Contact - - - )} - { state.status === 'requested' && ( - <> - - Accept Connection - - - Ignore Request - - - Deny Request - - - Delete Contact - - - Block Contact - - - Report Contact - - - )} - { state.status == null && ( - <> - - Save and Connect - - - Save Contact - - - Report Contact - - - )} - - - ); -} - export function Contact({ contact, drawer, back }) { const [busy, setBusy] = useState(false); @@ -353,7 +60,176 @@ export function Contact({ contact, drawer, back }) { return ( <> { drawer && ( - CONTACT DRAWER + + { state.username } + + + + + { state.status === 'offsync' && ( + + { state.strings.offsync } + + )} + { state.status === 'connected' && ( + + { state.strings.connected } + + )} + { state.status === 'connecting' && ( + + { state.strings.connecting } + + )} + { state.status === 'requested' && ( + + { state.strings.requested } + + )} + { state.status === 'received' && ( + + { state.strings.received } + + )} + { state.status === 'pending' && ( + + { state.strings.pending } + + )} + { state.status === 'confirmed' && ( + + { state.strings.confirmed } + + )} + { state.status === 'unsaved' && ( + + { state.strings.unsaved } + + )} + + + { state.name && ( + { state.name } + )} + { !state.name && ( + { state.strings.name } + )} + + + + { state.location && ( + { state.location } + )} + { !state.location && ( + Location + )} + + + + { state.description && ( + { state.description } + )} + { !state.description && ( + Description + )} + + + { busy && ( + + )} + { !busy && ( + + { state.status === 'offsync' && ( + + + { state.strings.actionResync } + + )} + { state.status === 'unsaved' && ( + setAction(actions.saveAndConnect)}> + + { state.strings.actionConnect } + + )} + { state.status === 'confirmed' && ( + setAction(actions.connectContact)}> + + { state.strings.actionConnect } + + )} + { state.status === 'received' && ( + setAction(actions.connectContact)}> + + { state.strings.actionAccept } + + )} + { state.status === 'pending' && ( + setAction(actions.confirmAndConnect)}> + + { state.strings.actionAccept } + + )} + { state.status === 'received' && ( + setAction(actions.disconnectContact)}> + + { state.strings.actionIgnore } + + )} + { state.status === 'pending' && ( + setAction(actions.ignoreContact)}> + + { state.strings.actionIgnore } + + )} + { state.status === 'connected' && ( + promptAction(actions.disconnectPrompt, actions.disconnectContact)}> + + { state.strings.actionDisconnect } + + )} + { state.status === 'connecting' && ( + setAction(actions.disconnectContact)}> + + { state.strings.actionCancel } + + )} + { state.status === 'pending' && ( + setAction(actions.confirmContact)}> + + { state.strings.actionSave } + + )} + { state.status === 'unsaved' && ( + setAction(actions.saveContact)}> + + { state.strings.actionSave } + + )} + { (state.status === 'connected' || state.status === 'connecting' || state.status === 'received') && ( + promptAction(actions.deletePrompt, actions.closeDelete)}> + + { state.strings.actionDelete } + + )} + { state.status === 'confirmed' && ( + promptAction(actions.deletePrompt, actions.deleteContact)}> + + { state.strings.actionDelete } + + )} + { state.status !== 'unsaved' && state.status !== 'pending' && ( + promptAction(actions.blockPrompt, actions.blockContact)}> + + { state.strings.actionBlock } + + )} + promptAction(actions.reportPrompt, actions.reportContact)}> + + { state.strings.actionReport } + + + )} + )} { !drawer && ( @@ -450,90 +326,90 @@ export function Contact({ contact, drawer, back }) { { state.status === 'offsync' && ( - + { state.strings.actionResync } )} { state.status === 'unsaved' && ( setAction(actions.saveAndConnect)}> - + { state.strings.actionConnect } )} { state.status === 'confirmed' && ( setAction(actions.connectContact)}> - + { state.strings.actionConnect } )} { state.status === 'received' && ( setAction(actions.connectContact)}> - + { state.strings.actionAccept } )} { state.status === 'pending' && ( setAction(actions.confirmAndConnect)}> - + { state.strings.actionAccept } )} { state.status === 'received' && ( setAction(actions.disconnectContact)}> - + { state.strings.actionIgnore } )} { state.status === 'pending' && ( setAction(actions.ignoreContact)}> - + { state.strings.actionIgnore } )} { state.status === 'connected' && ( promptAction(actions.disconnectPrompt, actions.disconnectContact)}> - + { state.strings.actionDisconnect } )} { state.status === 'connecting' && ( setAction(actions.disconnectContact)}> - + { state.strings.actionCancel } )} { state.status === 'pending' && ( setAction(actions.confirmContact)}> - + { state.strings.actionSave } )} { state.status === 'unsaved' && ( setAction(actions.saveContact)}> - + { state.strings.actionSave } )} { (state.status === 'connected' || state.status === 'connecting' || state.status === 'received') && ( promptAction(actions.deletePrompt, actions.closeDelete)}> - + { state.strings.actionDelete } )} { state.status === 'confirmed' && ( promptAction(actions.deletePrompt, actions.deleteContact)}> - + { state.strings.actionDelete } )} { state.status !== 'unsaved' && state.status !== 'pending' && ( promptAction(actions.blockPrompt, actions.blockContact)}> - + { state.strings.actionBlock } )} promptAction(actions.reportPrompt, actions.reportContact)}> - + { state.strings.actionReport } diff --git a/app/mobile/src/session/contact/Contact.styled.js b/app/mobile/src/session/contact/Contact.styled.js index 98018cbe..96e21607 100644 --- a/app/mobile/src/session/contact/Contact.styled.js +++ b/app/mobile/src/session/contact/Contact.styled.js @@ -2,6 +2,102 @@ import { StyleSheet } from 'react-native'; import { Colors } from 'constants/Colors'; export const styles = StyleSheet.create({ + drawerContainer: { + width: '100%', + display: 'flex', + alignItems: 'center', + }, + drawerHeader: { + fontFamily: 'roboto', + color: Colors.text, + fontSize: 20, + padding: 16, + }, + drawerFrame: { + width: '80%', + maxWidth: 400, + paddingBottom: 32, + }, + drawerLogo: { + aspectRatio: 1, + resizeMode: 'contain', + borderRadius: 8, + width: null, + height: null, + }, + drawerLogoEdit: { + position: 'absolute', + top: 0, + display: 'flex', + flexDirection: 'row', + alignItems: 'center', + alignSelf: 'center', + backgroundColor: Colors.drawerBase, + paddingLeft: 8, + paddingRight: 8, + borderBottomLeftRadius: 6, + borderBottomRightRadius: 6, + }, + drawerEditDivider: { + width: '80%', + display: 'flex', + flexDirection: 'row', + alignItems: 'center', + }, + drawerLine: { + borderWidth: 1, + borderColor: Colors.areaBase, + flexGrow: 1, + }, + drawerDivider: { + width: '80%', + borderWidth: 1, + borderColor: Colors.areaBase, + marginTop: 16, + marginBottom: 32, + }, + drawerName: { + width: '80%', + paddingLeft: 8, + paddingRight: 8, + }, + drawerNameSet: { + color: Colors.text, + fontFamily: 'roboto', + fontSize: 48, + flexGrow: 1, + flexShrink: 1, + }, + drawerNameUnset: { + color: Colors.inputPlaceholder, + fontFamily: 'roboto', + fontSize: 48, + fontStyle: 'italic', + flexGrow: 1, + }, + drawerNameEdit: { + display: 'flex', + flexDirection: 'row', + alignItems: 'center', + paddingLeft: 8, + paddingRight: 8, + }, + drawerEntry: { + width: '80%', + display: 'flex', + alignItems: 'center', + flexDirection: 'row', + padding: 8, + }, + drawerActions: { + display: 'flex', + flexDirection: 'row', + alignItems: 'flex-end', + justifyContent: 'center', + }, + drawerStatus: { + paddingBottom: 8, + }, container: { width: '100%', height: '100%', @@ -150,7 +246,7 @@ export const styles = StyleSheet.create({ borderRadius: 8, backgroundColor: Colors.unsaved, }, - statusOffysnc: { + statusOffsync: { paddingLeft: 8, paddingRight: 8, paddingTop: 2, @@ -160,6 +256,7 @@ export const styles = StyleSheet.create({ }, statusLabel: { color: Colors.text, + fontSize: 16, }, attributes: { marginLeft: 16, @@ -173,12 +270,12 @@ export const styles = StyleSheet.create({ actions: { marginLeft: 16, marginRight: 16, - paddingLeft: 16, + paddingLeft: 4, paddingRight: 16, backgroundColor: Colors.areaBase, borderRadius: 8, marginTop: 24, - height: 80, + height: 72, }, actionList: { alignItems: 'flex-end', @@ -186,7 +283,8 @@ export const styles = StyleSheet.create({ action: { display: 'flex', alignItems: 'center', - paddingRight: 24, + paddingRight: 12, + paddingLeft: 12, paddingBottom: 12, }, actionIcon: { diff --git a/app/mobile/src/session/profile/Profile.jsx b/app/mobile/src/session/profile/Profile.jsx index c562b9fe..7455281d 100644 --- a/app/mobile/src/session/profile/Profile.jsx +++ b/app/mobile/src/session/profile/Profile.jsx @@ -74,7 +74,7 @@ export function Profile({ drawer }) { <> { drawer && ( - { state.username } + { state.username } @@ -120,8 +120,8 @@ export function Profile({ drawer }) { setVisible(!state.searchable)}> { state.strings.visibleRegistry } - + )}