mirror of
https://github.com/balzack/databag.git
synced 2025-02-12 03:29:16 +00:00
refactor of webapp contact component
This commit is contained in:
parent
e7e8817747
commit
9a85e1116a
@ -33,7 +33,7 @@ export function useProfile() {
|
||||
}
|
||||
|
||||
useEffect(() => {
|
||||
const { node, name, handle, location, description, image, imageUrl } = profile.state.identity;
|
||||
const { node, name, handle, location, description, image } = profile.state.identity;
|
||||
let url = !image ? null : profile.state.imageUrl;
|
||||
let editImage = !image ? avatar : url;
|
||||
updateState({ name, location, description, node, handle, url,
|
||||
|
@ -6,152 +6,138 @@ import { DatabaseOutlined, CloseOutlined, RightOutlined, BookOutlined, Environme
|
||||
|
||||
export function Contact({ close, guid, listing }) {
|
||||
|
||||
const [ modal, modalContext ] = Modal.useModal();
|
||||
const { state, actions } = useContact(guid, listing, close);
|
||||
|
||||
const Image = (
|
||||
<div class="logo">
|
||||
<Logo url={state.logo} width={'100%'} radius={8} />
|
||||
</div>
|
||||
);
|
||||
|
||||
const updateContact = async (action) => {
|
||||
try {
|
||||
await action();
|
||||
}
|
||||
catch (err) {
|
||||
console.log(err);
|
||||
Modal.error({
|
||||
modal.error({
|
||||
title: 'Failed to Update Contact',
|
||||
content: 'Please try again.',
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
const Details = (
|
||||
<div class="details">
|
||||
<div class="name">
|
||||
{ state.name && (
|
||||
<div class="data">{ state.name }</div>
|
||||
)}
|
||||
{ !state.name && (
|
||||
<div class="data notset">name</div>
|
||||
)}
|
||||
</div>
|
||||
{ state.node && (
|
||||
<div class="location">
|
||||
<DatabaseOutlined />
|
||||
<div class="data">{ state.node }</div>
|
||||
</div>
|
||||
)}
|
||||
<div class="location">
|
||||
<EnvironmentOutlined />
|
||||
{ state.location && (
|
||||
<div class="data">{ state.location }</div>
|
||||
)}
|
||||
{ !state.location && (
|
||||
<div class="data notset">location</div>
|
||||
)}
|
||||
</div>
|
||||
<div class="description">
|
||||
<BookOutlined />
|
||||
{ state.description && (
|
||||
<div class="data">{ state.description }</div>
|
||||
)}
|
||||
{ !state.description && (
|
||||
<div class="data notset">description</div>
|
||||
)}
|
||||
</div>
|
||||
|
||||
{ state.status === 'connected' && (
|
||||
<div class="controls">
|
||||
<div class={ state.buttonStatus } onClick={() => updateContact(actions.disconnect)}>Disconnect</div>
|
||||
<div class={ state.buttonStatus } onClick={() => updateContact(actions.disconnectRemove)}>Delete Contact</div>
|
||||
</div>
|
||||
)}
|
||||
|
||||
{ state.status === 'pending' && (
|
||||
<div class="controls">
|
||||
<div class={ state.buttonStatus } onClick={() => updateContact(actions.confirmContact)}>Save Contact</div>
|
||||
<div class={ state.buttonStatus } onClick={() => updateContact(actions.connect)}>Save and Accept</div>
|
||||
<div class={ state.buttonStatus } onClick={() => updateContact(actions.remove)}>Ignore Request</div>
|
||||
</div>
|
||||
)}
|
||||
|
||||
{ state.status === 'request received' && (
|
||||
<div class="controls">
|
||||
<div class={ state.buttonStatus } onClick={() => updateContact(actions.saveConnect)}>Accept Connection</div>
|
||||
<div class={ state.buttonStatus } onClick={() => updateContact(actions.disconnect)}>Ignore Request</div>
|
||||
</div>
|
||||
)}
|
||||
|
||||
{ state.status === 'request sent' && (
|
||||
<div class="controls">
|
||||
<div class={ state.buttonStatus } onClick={() => updateContact(actions.disconnect)}>Cancel Request</div>
|
||||
<div class={ state.buttonStatus } onClick={() => updateContact(actions.disconnectRemove)}>Delete Contact</div>
|
||||
</div>
|
||||
)}
|
||||
|
||||
{ state.status === 'saved' && (
|
||||
<div class="controls">
|
||||
<div class={ state.buttonStatus } onClick={() => updateContact(actions.connect)}>Request Connection</div>
|
||||
<div class={ state.buttonStatus } onClick={() => updateContact(actions.remove)}>Delete Contact</div>
|
||||
</div>
|
||||
)}
|
||||
|
||||
{ state.status === 'unsaved' && (
|
||||
<div class="controls">
|
||||
<div class={ state.buttonStatus } onClick={() => updateContact(actions.saveContact)}>Save Contact</div>
|
||||
<div class={ state.buttonStatus } onClick={() => updateContact(actions.saveConnect)}>Save and Request</div>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
);
|
||||
|
||||
|
||||
return (
|
||||
<ContactWrapper>
|
||||
{ state.init && state.display === 'xlarge' && (
|
||||
<>
|
||||
<div class="header">
|
||||
<div class="handle">{ state.handle }</div>
|
||||
<div class="close" onClick={close}>
|
||||
{ modalContext }
|
||||
{ state.display === 'xlarge' && (
|
||||
<div className="header">
|
||||
<div className="handle">{ state.handle }</div>
|
||||
<div className="close" onClick={close}>
|
||||
<RightOutlined />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="content">
|
||||
{ Image }
|
||||
{ Details }
|
||||
</div>
|
||||
|
||||
<div class="footer">
|
||||
<div class="status">Status: { state.status }</div>
|
||||
</div>
|
||||
</>
|
||||
)}
|
||||
{ state.init && state.display !== 'xlarge' && (
|
||||
<div class="view">
|
||||
<div class="title">
|
||||
<div class="close" />
|
||||
<div class="handle">{ state.handle }</div>
|
||||
{ state.display !== 'xlarge' && (
|
||||
<div className="view">
|
||||
<div className="title">
|
||||
<div className="close" />
|
||||
<div className="handle">{ state.handle }</div>
|
||||
{ state.display === 'small' && (
|
||||
<div class="close" onClick={close}>
|
||||
<div className="close" onClick={close}>
|
||||
<CloseOutlined />
|
||||
</div>
|
||||
)}
|
||||
{ state.display !== 'small' && (
|
||||
<div class="close" onClick={close}>
|
||||
<div className="close" onClick={close}>
|
||||
<RightOutlined />
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
{ Image }
|
||||
{ Details }
|
||||
<div class="footer">
|
||||
<div>contact { state.status }</div>
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
|
||||
<div className={ state.display === 'xlarge' ? 'midContent' : 'rightContent' }>
|
||||
<div className="logo">
|
||||
<Logo url={state.logo} width={'100%'} radius={8} />
|
||||
</div>
|
||||
<div className="details">
|
||||
<div className="name">
|
||||
{ state.name && (
|
||||
<div className="data">{ state.name }</div>
|
||||
)}
|
||||
{ !state.name && (
|
||||
<div className="data notset">name</div>
|
||||
)}
|
||||
</div>
|
||||
{ state.node && (
|
||||
<div className="location">
|
||||
<DatabaseOutlined />
|
||||
<div className="data">{ state.node }</div>
|
||||
</div>
|
||||
)}
|
||||
<div className="location">
|
||||
<EnvironmentOutlined />
|
||||
{ state.location && (
|
||||
<div className="data">{ state.location }</div>
|
||||
)}
|
||||
{ !state.location && (
|
||||
<div className="data notset">location</div>
|
||||
)}
|
||||
</div>
|
||||
<div className="description">
|
||||
<BookOutlined />
|
||||
{ state.description && (
|
||||
<div className="data">{ state.description }</div>
|
||||
)}
|
||||
{ !state.description && (
|
||||
<div className="data notset">description</div>
|
||||
)}
|
||||
</div>
|
||||
|
||||
{ state.status === 'connected' && (
|
||||
<div className="controls">
|
||||
<div className={ state.buttonStatus } onClick={() => updateContact(actions.disconnect)}>Disconnect</div>
|
||||
<div className={ state.buttonStatus } onClick={() => updateContact(actions.disconnectRemove)}>Delete Contact</div>
|
||||
</div>
|
||||
)}
|
||||
|
||||
{ state.status === 'pending' && (
|
||||
<div className="controls">
|
||||
<div className={ state.buttonStatus } onClick={() => updateContact(actions.confirmContact)}>Save Contact</div>
|
||||
<div className={ state.buttonStatus } onClick={() => updateContact(actions.connect)}>Save and Accept</div>
|
||||
<div className={ state.buttonStatus } onClick={() => updateContact(actions.remove)}>Ignore Request</div>
|
||||
</div>
|
||||
)}
|
||||
|
||||
{ state.status === 'request received' && (
|
||||
<div className="controls">
|
||||
<div className={ state.buttonStatus } onClick={() => updateContact(actions.saveConnect)}>Accept Connection</div>
|
||||
<div className={ state.buttonStatus } onClick={() => updateContact(actions.disconnect)}>Ignore Request</div>
|
||||
</div>
|
||||
)}
|
||||
|
||||
{ state.status === 'request sent' && (
|
||||
<div className="controls">
|
||||
<div className={ state.buttonStatus } onClick={() => updateContact(actions.disconnect)}>Cancel Request</div>
|
||||
<div className={ state.buttonStatus } onClick={() => updateContact(actions.disconnectRemove)}>Delete Contact</div>
|
||||
</div>
|
||||
)}
|
||||
|
||||
{ state.status === 'saved' && (
|
||||
<div className="controls">
|
||||
<div className={ state.buttonStatus } onClick={() => updateContact(actions.connect)}>Request Connection</div>
|
||||
<div className={ state.buttonStatus } onClick={() => updateContact(actions.remove)}>Delete Contact</div>
|
||||
</div>
|
||||
)}
|
||||
|
||||
{ state.status === 'unsaved' && (
|
||||
<div className="controls">
|
||||
<div className={ state.buttonStatus } onClick={() => updateContact(actions.saveContact)}>Save Contact</div>
|
||||
<div className={ state.buttonStatus } onClick={() => updateContact(actions.saveConnect)}>Save and Request</div>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="footer">
|
||||
<div className="status">Status: { state.status }</div>
|
||||
</div>
|
||||
</ContactWrapper>
|
||||
);
|
||||
}
|
||||
|
@ -34,7 +34,7 @@ export const ContactWrapper = styled.div`
|
||||
}
|
||||
}
|
||||
|
||||
.content {
|
||||
.midContent {
|
||||
min-height: 0;
|
||||
width: 100%;
|
||||
overflow: auto;
|
||||
@ -42,11 +42,22 @@ export const ContactWrapper = styled.div`
|
||||
flex-direction: row;
|
||||
justify-content: center;
|
||||
padding-top: 32px;
|
||||
}
|
||||
|
||||
.rightContent {
|
||||
min-height: 0;
|
||||
width: 100%;
|
||||
overflow: auto;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.logo {
|
||||
position: relative;
|
||||
width: 20vw;
|
||||
margin-right: 32px;
|
||||
margin-left: 32px;
|
||||
}
|
||||
|
||||
.details {
|
||||
@ -92,11 +103,9 @@ export const ContactWrapper = styled.div`
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.view {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
overflow: auto;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
@ -126,52 +135,6 @@ export const ContactWrapper = styled.div`
|
||||
align-items: center;
|
||||
}
|
||||
}
|
||||
|
||||
.logo {
|
||||
position: relative;
|
||||
width: 50%;
|
||||
margin-bottom: 16px;
|
||||
}
|
||||
|
||||
.details {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
|
||||
.name {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
align-items: center;
|
||||
|
||||
.data {
|
||||
padding-right: 8px;
|
||||
font-size: 24px;
|
||||
font-weight: bold;
|
||||
}
|
||||
}
|
||||
|
||||
.location {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
align-items: center;
|
||||
padding-bottom: 8px;
|
||||
|
||||
.data {
|
||||
padding-left: 8px;
|
||||
}
|
||||
}
|
||||
|
||||
.description {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
align-items: center;
|
||||
padding-bottom: 8px;
|
||||
|
||||
.data {
|
||||
padding-left: 8px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.controls {
|
||||
|
@ -16,7 +16,6 @@ export function useContact(guid, listing, close) {
|
||||
handle: null,
|
||||
node: null,
|
||||
removed: false,
|
||||
init: false,
|
||||
status: null,
|
||||
busy: false,
|
||||
buttonStatus: 'button idle',
|
||||
@ -43,39 +42,30 @@ export function useContact(guid, listing, close) {
|
||||
}
|
||||
|
||||
useEffect(() => {
|
||||
let logo, name, location, description, handle, node, status, cardId;
|
||||
let contact = getCardByGuid(card.state.cards, guid);
|
||||
const contact = getCardByGuid(card.state.cards, guid);
|
||||
if (contact) {
|
||||
let cardProfile = contact?.data?.cardProfile;
|
||||
let cardDetail = contact?.data?.cardDetail;
|
||||
cardId = contact.id;
|
||||
handle = cardProfile.handle;
|
||||
node = cardProfile.node;
|
||||
logo = card.actions.getCardImageUrl(contact.id);
|
||||
name = cardProfile.name;
|
||||
location = cardProfile.location;
|
||||
description = cardProfile.description;
|
||||
status = statusMap(cardDetail.status);
|
||||
const profile = contact?.data?.cardProfile;
|
||||
const detail = contact?.data?.cardDetail;
|
||||
const { imageSet, name, location, description, handle, node } = profile;
|
||||
const status = statusMap(detail.status);
|
||||
const cardId = contact.id;
|
||||
const logo = imageSet ? card.actions.getCardImageUrl(cardId) : null;
|
||||
updateState({ logo, name, location, description, handle, node, status, cardId });
|
||||
}
|
||||
else if (listing) {
|
||||
handle = listing.handle;
|
||||
cardId = null;
|
||||
node = listing.node;
|
||||
logo = listing.imageSet ? getListingImageUrl(listing.node, listing.guid) : null;
|
||||
name = listing.name;
|
||||
location = listing.location;
|
||||
description = listing.description;
|
||||
status = 'unsaved';
|
||||
const { imageSet, name, location, description, handle, node } = listing;
|
||||
const logo = imageSet ? getListingImageUrl(node, guid) : null;
|
||||
updateState({ logo, name, location, description, handle, node, status: 'unsaved', cardId: null });
|
||||
}
|
||||
else {
|
||||
updateState({ removed: true });
|
||||
}
|
||||
updateState({ init: true, logo, name, location, description, handle, node, status, cardId });
|
||||
}, [card, guid, listing]);
|
||||
// eslint-disable-next-line
|
||||
}, [card.state, guid, listing]);
|
||||
|
||||
useEffect(() => {
|
||||
updateState({ display: viewport.state.display });
|
||||
}, [viewport]);
|
||||
}, [viewport.state]);
|
||||
|
||||
const applyAction = async (action) => {
|
||||
if (!state.busy) {
|
||||
|
Loading…
Reference in New Issue
Block a user