mirror of
https://github.com/balzack/databag.git
synced 2025-02-14 12:39:17 +00:00
support switching conversation without close
This commit is contained in:
parent
77bbb4cadc
commit
d6963d1978
@ -7,6 +7,8 @@ import { ChannelContext } from 'context/ChannelContext';
|
|||||||
export function useConversation() {
|
export function useConversation() {
|
||||||
|
|
||||||
const [state, setState] = useState({
|
const [state, setState] = useState({
|
||||||
|
cardId: null,
|
||||||
|
channelId: null,
|
||||||
topics: [],
|
topics: [],
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -17,6 +19,7 @@ export function useConversation() {
|
|||||||
const conversation = useContext(ConversationContext);
|
const conversation = useContext(ConversationContext);
|
||||||
const topics = useRef(new Map());
|
const topics = useRef(new Map());
|
||||||
const revision = useRef(null);
|
const revision = useRef(null);
|
||||||
|
const id = useRef({});
|
||||||
|
|
||||||
const updateState = (value) => {
|
const updateState = (value) => {
|
||||||
setState((s) => ({ ...s, ...value }));
|
setState((s) => ({ ...s, ...value }));
|
||||||
@ -101,10 +104,27 @@ export function useConversation() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (card.state.init && channel.state.init) {
|
if (id.current.channelId != channelId || id.current.cardId) {
|
||||||
updateConversation();
|
id.current = { cardId, channelId };
|
||||||
|
topics.current = new Map();
|
||||||
|
revision.current = null;
|
||||||
|
updateState({ cardId, channelId, topics: [] });
|
||||||
}
|
}
|
||||||
}, [card, channel]);
|
if (card.state.init && channel.state.init) {
|
||||||
|
if (cardId) {
|
||||||
|
if(card.state.cards.get(cardId)?.data.cardDetail.status != 'connected') {
|
||||||
|
window.alert("You are no longer connected to the host");
|
||||||
|
navigate('/user')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
updateConversation();
|
||||||
|
}
|
||||||
|
catch (err) {
|
||||||
|
console.log(err);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, [card, channel, cardId, channelId]);
|
||||||
|
|
||||||
return { state, actions };
|
return { state, actions };
|
||||||
}
|
}
|
||||||
|
@ -2,7 +2,7 @@ import React, { useRef, useState, useEffect } from 'react';
|
|||||||
import { VirtualListWrapper, VirtualItem } from './VirtualList.styled';
|
import { VirtualListWrapper, VirtualItem } from './VirtualList.styled';
|
||||||
import ReactResizeDetector from 'react-resize-detector';
|
import ReactResizeDetector from 'react-resize-detector';
|
||||||
|
|
||||||
export function VirtualList({ items, itemRenderer }) {
|
export function VirtualList({ id, items, itemRenderer }) {
|
||||||
|
|
||||||
const REDZONE = 256; // recenter on canvas if in canvas edge redzone
|
const REDZONE = 256; // recenter on canvas if in canvas edge redzone
|
||||||
const HOLDZONE = 512; // drop slots outside of holdzone of view
|
const HOLDZONE = 512; // drop slots outside of holdzone of view
|
||||||
@ -21,6 +21,7 @@ export function VirtualList({ items, itemRenderer }) {
|
|||||||
let containers = useRef([]);
|
let containers = useRef([]);
|
||||||
let anchorBottom = useRef(true);
|
let anchorBottom = useRef(true);
|
||||||
let listRef = useRef();
|
let listRef = useRef();
|
||||||
|
let view = useRef(null);
|
||||||
|
|
||||||
const addSlot = (id, slot) => {
|
const addSlot = (id, slot) => {
|
||||||
setSlots((m) => { m.set(id, slot); return new Map(m); })
|
setSlots((m) => { m.set(id, slot); return new Map(m); })
|
||||||
@ -34,6 +35,10 @@ export function VirtualList({ items, itemRenderer }) {
|
|||||||
setSlots((m) => { m.delete(id); return new Map(m); })
|
setSlots((m) => { m.delete(id); return new Map(m); })
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const clearSlots = () => {
|
||||||
|
setSlots((m) => { new Map() })
|
||||||
|
}
|
||||||
|
|
||||||
const growCanvasHeight = (val) => {
|
const growCanvasHeight = (val) => {
|
||||||
setCanvasHeight((h) => {
|
setCanvasHeight((h) => {
|
||||||
if (val > h) {
|
if (val > h) {
|
||||||
@ -51,8 +56,17 @@ export function VirtualList({ items, itemRenderer }) {
|
|||||||
}, [viewHeight]);
|
}, [viewHeight]);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
|
if (view.current != id) {
|
||||||
|
view.current = id;
|
||||||
|
latch.current = true;
|
||||||
|
containers.current = [];
|
||||||
|
anchorBottom.current = true;
|
||||||
|
scrollTop.current = 0;
|
||||||
|
listRef.current.scrollTo({ top: scrollTop.current, left: 0 });
|
||||||
|
clearSlots();
|
||||||
|
}
|
||||||
setItems();
|
setItems();
|
||||||
}, [items]);
|
}, [items, id]);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (latch.current) {
|
if (latch.current) {
|
||||||
|
@ -91,6 +91,10 @@ export function useCardContext() {
|
|||||||
cur.data.notifiedChannel = card.data.notifiedChannel;
|
cur.data.notifiedChannel = card.data.notifiedChannel;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
cur.channels = new Map();
|
||||||
|
cur.articles = new Map();
|
||||||
|
}
|
||||||
cur.revision = card.revision;
|
cur.revision = card.revision;
|
||||||
cards.current.set(card.id, cur);
|
cards.current.set(card.id, cur);
|
||||||
}
|
}
|
||||||
@ -137,7 +141,12 @@ export function useCardContext() {
|
|||||||
if (next.current == null) {
|
if (next.current == null) {
|
||||||
next.current = rev;
|
next.current = rev;
|
||||||
if (revision.current != rev) {
|
if (revision.current != rev) {
|
||||||
await updateCards();
|
try {
|
||||||
|
await updateCards();
|
||||||
|
}
|
||||||
|
catch(err) {
|
||||||
|
console.log(err);
|
||||||
|
}
|
||||||
updateState({ init: true, cards: cards.current });
|
updateState({ init: true, cards: cards.current });
|
||||||
revision.current = rev;
|
revision.current = rev;
|
||||||
}
|
}
|
||||||
@ -171,8 +180,11 @@ export function useCardContext() {
|
|||||||
},
|
},
|
||||||
getCardByGuid: getCardByGuid,
|
getCardByGuid: getCardByGuid,
|
||||||
getImageUrl: (cardId) => {
|
getImageUrl: (cardId) => {
|
||||||
let { data } = cards.current.get(cardId);
|
let card = cards.current.get(cardId);
|
||||||
return getCardImageUrl(access.current, cardId, data.profileRevision)
|
if (!card) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return getCardImageUrl(access.current, cardId, card.data.profileRevision)
|
||||||
},
|
},
|
||||||
addChannelTopic: async (cardId, channelId, message, assets) => {
|
addChannelTopic: async (cardId, channelId, message, assets) => {
|
||||||
let { cardProfile, cardDetail } = cards.current.get(cardId).data;
|
let { cardProfile, cardDetail } = cards.current.get(cardId).data;
|
||||||
@ -183,7 +195,7 @@ export function useCardContext() {
|
|||||||
getChannelRevision: (cardId, channelId) => {
|
getChannelRevision: (cardId, channelId) => {
|
||||||
let card = cards.current.get(cardId);
|
let card = cards.current.get(cardId);
|
||||||
let channel = card.channels.get(channelId);
|
let channel = card.channels.get(channelId);
|
||||||
return channel.revision;
|
return channel?.revision;
|
||||||
},
|
},
|
||||||
getChannelTopics: async (cardId, channelId, revision) => {
|
getChannelTopics: async (cardId, channelId, revision) => {
|
||||||
let card = cards.current.get(cardId);
|
let card = cards.current.get(cardId);
|
||||||
|
Loading…
Reference in New Issue
Block a user