feat: added start enum to interaction status

improved error handling, consolidated types
pull/2789/head
William Grant 2 years ago
parent 454e382ce4
commit 96fcbf1345

@ -82,7 +82,7 @@ const ConversationListItem = (props: Props) => {
let isBlocked = useIsBlocked(conversationId); let isBlocked = useIsBlocked(conversationId);
const isSearch = useSelector(isSearching); const isSearch = useSelector(isSearching);
const selectedConvo = useSelectedConversationKey(); const selectedConvo = useSelectedConversationKey();
const conversationInteractionProps = useConversationInteractionState(conversationId); const interactionProps = useConversationInteractionState(conversationId);
const isSelectedConvo = conversationId === selectedConvo && !isNil(selectedConvo); const isSelectedConvo = conversationId === selectedConvo && !isNil(selectedConvo);
@ -132,11 +132,7 @@ const ConversationListItem = (props: Props) => {
<AvatarItem /> <AvatarItem />
<div className="module-conversation-list-item__content"> <div className="module-conversation-list-item__content">
<ConversationListItemHeaderItem /> <ConversationListItemHeaderItem />
{conversationInteractionProps?.interactionType ? ( {interactionProps ? <InteractionItem {...interactionProps} /> : <MessageItem />}
<InteractionItem {...conversationInteractionProps} />
) : (
<MessageItem />
)}
</div> </div>
</div> </div>
<Portal> <Portal>

@ -5,6 +5,7 @@ import { useIsPrivate, useIsPublic } from '../../../hooks/useParamSelector';
import { MessageBody } from '../../conversation/message/message-content/MessageBody'; import { MessageBody } from '../../conversation/message/message-content/MessageBody';
import { assertUnreachable } from '../../../types/sqlSharedTypes'; import { assertUnreachable } from '../../../types/sqlSharedTypes';
import { import {
ConversationInteractionProps,
ConversationInteractionStatus, ConversationInteractionStatus,
ConversationInteractionType, ConversationInteractionType,
} from '../../../interactions/conversationInteractions'; } from '../../../interactions/conversationInteractions';
@ -14,23 +15,16 @@ const StyledInteractionItemText = styled.div<{ isError: boolean }>`
${props => props.isError && 'color: var(--danger-color) !important;'} ${props => props.isError && 'color: var(--danger-color) !important;'}
`; `;
export type InteractionItemProps = { export const InteractionItem = (props: ConversationInteractionProps) => {
conversationId?: string;
interactionType?: ConversationInteractionType;
interactionStatus?: ConversationInteractionStatus;
};
export const InteractionItem = (props: InteractionItemProps) => {
const { conversationId, interactionStatus, interactionType } = props; const { conversationId, interactionStatus, interactionType } = props;
const isGroup = !useIsPrivate(conversationId); const isGroup = !useIsPrivate(conversationId);
const isCommunity = useIsPublic(conversationId); const isCommunity = useIsPublic(conversationId);
if (!conversationId || !interactionType) { if (isEmpty(conversationId) || isEmpty(interactionType) || isEmpty(interactionStatus)) {
return null; return null;
} }
let text = ''; let text = '';
switch (interactionType) { switch (interactionType) {
case ConversationInteractionType.Leave: case ConversationInteractionType.Leave:
const failText = isCommunity const failText = isCommunity

@ -10,10 +10,7 @@ import { StateType } from '../state/reducer';
import { getMessageReactsProps } from '../state/selectors/conversations'; import { getMessageReactsProps } from '../state/selectors/conversations';
import { isPrivateAndFriend } from '../state/selectors/selectedConversation'; import { isPrivateAndFriend } from '../state/selectors/selectedConversation';
import { CONVERSATION } from '../session/constants'; import { CONVERSATION } from '../session/constants';
import { import { ConversationInteractionProps } from '../interactions/conversationInteractions';
ConversationInteractionStatus,
ConversationInteractionType,
} from '../interactions/conversationInteractions';
export function useAvatarPath(convoId: string | undefined) { export function useAvatarPath(convoId: string | undefined) {
const convoProps = useConversationPropsById(convoId); const convoProps = useConversationPropsById(convoId);
@ -274,11 +271,7 @@ export function useIsTyping(conversationId?: string): boolean {
export function useConversationInteractionState( export function useConversationInteractionState(
conversationId?: string conversationId?: string
): { ): ConversationInteractionProps | null {
conversationId?: string;
interactionStatus?: ConversationInteractionStatus;
interactionType?: ConversationInteractionType;
} | null {
if (!conversationId) { if (!conversationId) {
return null; return null;
} }
@ -291,9 +284,12 @@ export function useConversationInteractionState(
const interactionType = convoProps.interactionType; const interactionType = convoProps.interactionType;
const interactionStatus = convoProps.interactionStatus; const interactionStatus = convoProps.interactionStatus;
window.log.debug( if (!interactionType || !interactionStatus) {
`WIP: useConversationInteractionState: ${conversationId} ${interactionType} ${interactionStatus}` window.log.warn(
`useConversationInteractionState() missing interactionType or interactionStatus`
); );
return null;
}
return { conversationId, interactionType, interactionStatus }; return { conversationId, interactionType, interactionStatus };
} }

@ -45,15 +45,22 @@ import { Storage, setLastProfileUpdateTimestamp } from '../util/storage';
import { UserGroupsWrapperActions } from '../webworker/workers/browser/libsession_worker_interface'; import { UserGroupsWrapperActions } from '../webworker/workers/browser/libsession_worker_interface';
export enum ConversationInteractionStatus { export enum ConversationInteractionStatus {
Success = 'success', Start = 'start',
Error = 'error',
Loading = 'loading', Loading = 'loading',
Error = 'error',
Complete = 'complete',
} }
export enum ConversationInteractionType { export enum ConversationInteractionType {
Leave = 'leave', Leave = 'leave',
} }
export type ConversationInteractionProps = {
conversationId: string;
interactionType: ConversationInteractionType;
interactionStatus: ConversationInteractionStatus;
};
export async function copyPublicKeyByConvoId(convoId: string) { export async function copyPublicKeyByConvoId(convoId: string) {
if (OpenGroupUtils.isOpenGroupV2(convoId)) { if (OpenGroupUtils.isOpenGroupV2(convoId)) {
const fromWrapper = await UserGroupsWrapperActions.getCommunityByFullUrl(convoId); const fromWrapper = await UserGroupsWrapperActions.getCommunityByFullUrl(convoId);
@ -251,18 +258,16 @@ export function showLeavePrivateConversationbyConvoId(conversationId: string, na
await updateConversationInteractionState({ await updateConversationInteractionState({
conversationId, conversationId,
type: ConversationInteractionType.Leave, type: ConversationInteractionType.Leave,
status: ConversationInteractionStatus.Start,
}); });
await getConversationController().delete1o1(conversationId, { await getConversationController().delete1o1(conversationId, {
fromSyncMessage: false, fromSyncMessage: false,
justHidePrivate: true, justHidePrivate: true,
}); });
onClickClose(); onClickClose();
// Note (Will): This is probably redundant since this is a destructive interaction and therefore the conversation will be undefined // Note (Will): This is probably redundant since this is a destructive interaction and therefore the conversation will be undefined
await updateConversationInteractionState({ await clearConversationInteractionState({ conversationId });
conversationId,
type: ConversationInteractionType.Leave,
status: ConversationInteractionStatus.Success,
});
} catch (err) { } catch (err) {
window.log.warn(`showLeavePrivateConversationbyConvoId error: ${err}`); window.log.warn(`showLeavePrivateConversationbyConvoId error: ${err}`);
await updateConversationInteractionState({ await updateConversationInteractionState({
@ -310,6 +315,7 @@ export function showLeaveGroupByConvoId(conversationId: string, name?: string) {
await updateConversationInteractionState({ await updateConversationInteractionState({
conversationId, conversationId,
type: ConversationInteractionType.Leave, type: ConversationInteractionType.Leave,
status: ConversationInteractionStatus.Start,
}); });
if (isPublic) { if (isPublic) {
await getConversationController().deleteCommunity(conversation.id, { await getConversationController().deleteCommunity(conversation.id, {
@ -322,12 +328,9 @@ export function showLeaveGroupByConvoId(conversationId: string, name?: string) {
}); });
} }
onClickClose(); onClickClose();
// Note (Will): This is probably redundant since this is a destructive interaction and therefore the conversation will be undefined // Note (Will): This is probably redundant since this is a destructive interaction and therefore the conversation will be undefined
await updateConversationInteractionState({ await clearConversationInteractionState({ conversationId });
conversationId,
type: ConversationInteractionType.Leave,
status: ConversationInteractionStatus.Success,
});
} catch (err) { } catch (err) {
window.log.warn(`showLeaveGroupByConvoId error: ${err}`); window.log.warn(`showLeaveGroupByConvoId error: ${err}`);
await updateConversationInteractionState({ await updateConversationInteractionState({
@ -653,6 +656,12 @@ export async function callRecipient(pubkey: string, canCall: boolean) {
} }
} }
/**
* Updates the interaction state for a conversation. Remember to run clearConversationInteractionState() when the interaction is complete and we don't want to show it in the UI anymore.
* @param conversationId
* @param type the type of conversation interaciton we are doing
* @param status the status of that interaction
*/
export async function updateConversationInteractionState({ export async function updateConversationInteractionState({
conversationId, conversationId,
type, type,
@ -660,18 +669,35 @@ export async function updateConversationInteractionState({
}: { }: {
conversationId: string; conversationId: string;
type: ConversationInteractionType; type: ConversationInteractionType;
status?: ConversationInteractionStatus; status: ConversationInteractionStatus;
}) { }) {
const convo = getConversationController().get(conversationId); const convo = getConversationController().get(conversationId);
if (convo) { if (convo) {
convo.set('interactionType', type); convo.set('interactionType', type);
convo.set('interactionStatus', status ? status : undefined); convo.set('interactionStatus', status);
await convo.commit(); await convo.commit();
window.log.debug( window.log.debug(
`WIP: updateConversationInteractionState for ${conversationId} to ${type}${ `WIP: updateConversationInteractionState for ${conversationId} to ${type} ${status}`
status ? ` ${status}` : ''
}`
); );
} }
} }
/**
* Clears the interaction state for a conversation. We would use this when we don't need to show anything in the UI once an action is complete.
* @param conversationId
*/
export async function clearConversationInteractionState({
conversationId,
}: {
conversationId: string;
}) {
const convo = getConversationController().get(conversationId);
if (convo) {
convo.set('interactionType', undefined);
convo.set('interactionStatus', undefined);
await convo.commit();
window.log.debug(`WIP: clearConversationInteractionState() for ${conversationId}`);
}
}

Loading…
Cancel
Save