supporting installations with unset federated host

This commit is contained in:
balzack 2023-05-20 00:42:53 -07:00
parent 6b6d756515
commit 170dce9173
12 changed files with 53 additions and 33 deletions

View File

@ -1,12 +1,7 @@
import { checkResponse, fetchWithTimeout } from './fetchUtil'; import { checkResponse, fetchWithTimeout } from './fetchUtil';
export async function getListingMessage(server, guid) { export async function getListingMessage(server, guid) {
let host = ""; let listing = await fetchWithTimeout(`https://${server}/account/listing/${guid}/message`, { method: 'GET' });
if (server) {
host = `https://${server}`;
}
let listing = await fetchWithTimeout(`${host}/account/listing/${guid}/message`, { method: 'GET' });
checkResponse(listing); checkResponse(listing);
return await listing.json(); return await listing.json();
} }

View File

@ -226,7 +226,7 @@ export function useCardContext() {
const { detail, profile, cardId } = entry.card; const { detail, profile, cardId } = entry.card;
const { notifiedView, notifiedProfile, notifiedArticle, notifiedChannel } = entry.card; const { notifiedView, notifiedProfile, notifiedArticle, notifiedChannel } = entry.card;
const cardServer = profile?.node; const cardServer = profile?.node ? profile.node : server;
const cardToken = `${profile?.guid}.${detail?.token}`; const cardToken = `${profile?.guid}.${detail?.token}`;
if (entry.card.notifiedProfile !== cardRevision.profile) { if (entry.card.notifiedProfile !== cardRevision.profile) {
@ -373,7 +373,7 @@ export function useCardContext() {
addTopic: async (cardId, channelId, type, message, files) => { addTopic: async (cardId, channelId, type, message, files) => {
const { detail, profile } = cards.current.get(cardId)?.card || {}; const { detail, profile } = cards.current.get(cardId)?.card || {};
const cardToken = `${profile?.guid}.${detail?.token}`; const cardToken = `${profile?.guid}.${detail?.token}`;
const node = profile?.node; const node = profile?.node ? profile.node : access.current?.server;
if (files?.length > 0) { if (files?.length > 0) {
const topicId = await addContactChannelTopic(node, cardToken, channelId, null, null, null); const topicId = await addContactChannelTopic(node, cardToken, channelId, null, null, null);
upload.actions.addTopic(node, cardToken, channelId, topicId, files, async (assets) => { upload.actions.addTopic(node, cardToken, channelId, topicId, files, async (assets) => {
@ -396,27 +396,32 @@ export function useCardContext() {
removeTopic: async (cardId, channelId, topicId) => { removeTopic: async (cardId, channelId, topicId) => {
const { detail, profile } = (cards.current.get(cardId) || {}).card; const { detail, profile } = (cards.current.get(cardId) || {}).card;
const cardToken = `${profile?.guid}.${detail?.token}`; const cardToken = `${profile?.guid}.${detail?.token}`;
return await removeContactChannelTopic(profile?.node, cardToken, channelId, topicId); const node = profile?.node ? profile.node : access.current.server;
return await removeContactChannelTopic(node, cardToken, channelId, topicId);
}, },
setTopicSubject: async (cardId, channelId, topicId, type, subject) => { setTopicSubject: async (cardId, channelId, topicId, type, subject) => {
const { detail, profile } = (cards.current.get(cardId) || {}).card; const { detail, profile } = (cards.current.get(cardId) || {}).card;
const cardToken = `${profile?.guid}.${detail?.token}`; const cardToken = `${profile?.guid}.${detail?.token}`;
return await setContactChannelTopicSubject(profile?.node, cardToken, channelId, topicId, type, subject); const node = profile?.node ? profile.node : access.current.server;
return await setContactChannelTopicSubject(node, cardToken, channelId, topicId, type, subject);
}, },
getTopicAssetUrl: (cardId, channelId, topicId, assetId) => { getTopicAssetUrl: (cardId, channelId, topicId, assetId) => {
const { detail, profile } = (cards.current.get(cardId) || {}).card; const { detail, profile } = (cards.current.get(cardId) || {}).card;
const cardToken = `${profile?.guid}.${detail?.token}`; const cardToken = `${profile?.guid}.${detail?.token}`;
return getContactChannelTopicAssetUrl(profile?.node, cardToken, channelId, topicId, assetId); const node = profile?.node ? profile.node : access.current.server;
return getContactChannelTopicAssetUrl(node, cardToken, channelId, topicId, assetId);
}, },
getTopics: async (cardId, channelId, revision, count, begin, end) => { getTopics: async (cardId, channelId, revision, count, begin, end) => {
const { detail, profile } = (cards.current.get(cardId) || {}).card; const { detail, profile } = (cards.current.get(cardId) || {}).card;
const cardToken = `${profile?.guid}.${detail?.token}`; const cardToken = `${profile?.guid}.${detail?.token}`;
return await getContactChannelTopics(profile?.node, cardToken, channelId, revision, count, begin, end); const node = profile?.node ? profile.node : access.current.server;
return await getContactChannelTopics(node, cardToken, channelId, revision, count, begin, end);
}, },
getTopic: async (cardId, channelId, topicId) => { getTopic: async (cardId, channelId, topicId) => {
const { detail, profile } = (cards.current.get(cardId) || {}).card; const { detail, profile } = (cards.current.get(cardId) || {}).card;
const cardToken = `${profile?.guid}.${detail?.token}`; const cardToken = `${profile?.guid}.${detail?.token}`;
return await getContactChannelTopic(profile?.node, cardToken, channelId, topicId); const node = profile?.node ? profile.node : access.current.server;
return await getContactChannelTopic(node, cardToken, channelId, topicId);
}, },
setContactRevision: async (cardId, revision) => { setContactRevision: async (cardId, revision) => {
const { guid } = acccess.current || {}; const { guid } = acccess.current || {};
@ -473,21 +478,25 @@ export function useCardContext() {
}, },
addChannelAlert: async (cardId, channelId) => { addChannelAlert: async (cardId, channelId) => {
const { detail, profile } = (cards.current.get(cardId) || {}).card; const { detail, profile } = (cards.current.get(cardId) || {}).card;
return await addFlag(profile?.node, profile?.guid, channelId); const node = profile?.node ? profile.node : access.current.server;
return await addFlag(node, profile?.guid, channelId);
}, },
addTopicAlert: async (cardId, channelId, topicId) => { addTopicAlert: async (cardId, channelId, topicId) => {
const { detail, profile } = (cards.current.get(cardId) || {}).card; const { detail, profile } = (cards.current.get(cardId) || {}).card;
return await addFlag(profile?.node, profile?.guid, channelId, topicId); const node = profile?.node ? profile.node : access.current.server;
return await addFlag(node, profile?.guid, channelId, topicId);
}, },
getChannelNotifications: async (cardId, channelId) => { getChannelNotifications: async (cardId, channelId) => {
const { detail, profile } = (cards.current.get(cardId) || {}).card; const { detail, profile } = (cards.current.get(cardId) || {}).card;
const token = `${profile?.guid}.${detail?.token}`; const token = `${profile?.guid}.${detail?.token}`;
return await getContactChannelNotifications(profile?.node, token, channelId); const node = profile?.node ? profile.node : access.current.server;
return await getContactChannelNotifications(node, token, channelId);
}, },
setChannelNotifications: async (cardId, channelId, notify) => { setChannelNotifications: async (cardId, channelId, notify) => {
const { detail, profile } = (cards.current.get(cardId) || {}).card; const { detail, profile } = (cards.current.get(cardId) || {}).card;
const token = `${profile?.guid}.${detail?.token}`; const token = `${profile?.guid}.${detail?.token}`;
return await setContactChannelNotifications(profile?.node, token, channelId, notify); const node = profile?.node ? profile.node : access.current.server;
return await setContactChannelNotifications(node, token, channelId, notify);
}, },
getTopicItems: async (cardId, channelId) => { getTopicItems: async (cardId, channelId) => {
const { guid } = access.current || {}; const { guid } = access.current || {};

View File

@ -10,6 +10,7 @@ export function useProfileContext() {
const [state, setState] = useState({ const [state, setState] = useState({
offsync: false, offsync: false,
identity: {}, identity: {},
server: null,
imageUrl: null, imageUrl: null,
}); });
const store = useContext(StoreContext); const store = useContext(StoreContext);
@ -55,7 +56,7 @@ export function useProfileContext() {
const identity = await store.actions.getProfile(guid); const identity = await store.actions.getProfile(guid);
const revision = await store.actions.getProfileRevision(guid); const revision = await store.actions.getProfileRevision(guid);
const imageUrl = identity?.image ? getProfileImageUrl(server, token, revision) : null; const imageUrl = identity?.image ? getProfileImageUrl(server, token, revision) : null;
updateState({ offsync: false, identity, imageUrl }); updateState({ offsync: false, identity, imageUrl, server });
setRevision.current = revision; setRevision.current = revision;
curRevision.current = revision; curRevision.current = revision;
access.current = session; access.current = session;

View File

@ -129,7 +129,7 @@ function ContactStackScreen({ addChannel }) {
navigation.navigate('contact') navigation.navigate('contact')
} }
const openRegistry = (navigation) => { const openRegistry = (navigation) => {
setServer(profile.state.identity.node); setServer(profile.state.server);
setHandle(null); setHandle(null);
setSearch(false); setSearch(false);
navigation.navigate('registry'); navigation.navigate('registry');
@ -352,7 +352,7 @@ export function Session({ sharing, clearSharing }) {
for (let i = 0; i < state.ringing.length; i++) { for (let i = 0; i < state.ringing.length; i++) {
const call = state.ringing[i]; const call = state.ringing[i];
const { img, cardId, callId, name, handle, contactNode } = call || {}; const { img, cardId, callId, name, handle, contactNode } = call || {};
const label = name ? name : `${handle}@${contactNode}`; const label = name ? name : contactNode ? `${handle}@${contactNode}` : handle;
const key = `${cardId}:${callId}` const key = `${cardId}:${callId}`
incoming.push( incoming.push(
<View key={key} style={styles.ringEntry}> <View key={key} style={styles.ringEntry}>

View File

@ -2,6 +2,7 @@ import { useState, useEffect, useRef, useContext } from 'react';
import { CardContext } from 'context/CardContext'; import { CardContext } from 'context/CardContext';
import { RingContext } from 'context/RingContext'; import { RingContext } from 'context/RingContext';
import { AccountContext } from 'context/AccountContext'; import { AccountContext } from 'context/AccountContext';
import { ProfileContext } from 'context/ProfileContext';
export function useCards(filter, sort) { export function useCards(filter, sort) {
@ -10,6 +11,7 @@ export function useCards(filter, sort) {
enableIce: false, enableIce: false,
}); });
const profile = useContext(ProfileContext);
const account = useContext(AccountContext); const account = useContext(AccountContext);
const card = useContext(CardContext); const card = useContext(CardContext);
const ring = useContext(RingContext); const ring = useContext(RingContext);
@ -97,7 +99,8 @@ export function useCards(filter, sort) {
const actions = { const actions = {
call: async (card) => { call: async (card) => {
const { cardId, guid, node, token } = card || {}; const { cardId, guid, node, token } = card || {};
await ring.actions.call(cardId, node, `${guid}.${token}`); const server = node ? node : profile.state.server;
await ring.actions.call(cardId, server, `${guid}.${token}`);
}, },
}; };

View File

@ -6,8 +6,9 @@ import { Logo } from 'utils/Logo';
import { Colors } from 'constants/Colors'; import { Colors } from 'constants/Colors';
export function ContactHeader({ contact }) { export function ContactHeader({ contact }) {
const handle = contact?.node ? `${contact?.handle}@${contact?.node}` : contact?.handle;
return ( return (
<Text style={styles.headerText}>{ `${contact?.handle}@${contact?.node}` }</Text> <Text style={styles.headerText}>{ handle }</Text>
) )
} }

View File

@ -1,5 +1,6 @@
import { useState, useEffect, useRef, useContext } from 'react'; import { useState, useEffect, useRef, useContext } from 'react';
import { CardContext } from 'context/CardContext'; import { CardContext } from 'context/CardContext';
import { ProfileContext } from 'context/ProfileContext';
import { getListingMessage } from 'api/getListingMessage'; import { getListingMessage } from 'api/getListingMessage';
import { getListingImageUrl } from 'api/getListingImageUrl'; import { getListingImageUrl } from 'api/getListingImageUrl';
import { addFlag } from 'api/addFlag'; import { addFlag } from 'api/addFlag';
@ -22,6 +23,7 @@ export function useContact(contact) {
}); });
const card = useContext(CardContext); const card = useContext(CardContext);
const profile = useContext(ProfileContext);
const updateState = (value) => { const updateState = (value) => {
setState((s) => ({ ...s, ...value })); setState((s) => ({ ...s, ...value }));
@ -29,18 +31,21 @@ export function useContact(contact) {
useEffect(() => { useEffect(() => {
const contactCard = getCardByGuid(card.state.cards, contact?.guid); const contactCard = getCardByGuid(card.state.cards, contact?.guid);
const { server } = profile.state;
if (contactCard) { if (contactCard) {
const { offsync, profile, detail, cardId } = contactCard.card; const { offsync, profile, detail, cardId } = contactCard.card;
const { name, handle, node, location, description, guid, imageSet, revision } = profile; const { name, handle, node, location, description, guid, imageSet, revision } = profile;
const host = node ? node : server;
const logo = imageSet ? card.actions.getCardImageUrl(cardId) : 'avatar'; const logo = imageSet ? card.actions.getCardImageUrl(cardId) : 'avatar';
updateState({ offsync, name, handle, node, location, description, logo, cardId, guid, status: detail.status }); updateState({ offsync, name, handle, node: server, location, description, logo, cardId, guid, status: detail.status });
} }
else { else {
const { guid, handle, node, name, location, description, imageSet } = contact || {}; const { guid, handle, node, name, location, description, imageSet } = contact || {};
const logo = imageSet ? getListingImageUrl(node, guid) : 'avatar'; const host = node ? node : server;
updateState({ guid, handle, node, name, location, description, logo, offsync: false, status: null }); const logo = imageSet ? getListingImageUrl(server, guid) : 'avatar';
} updateState({ guid, handle, node: host, name, location, description, logo, offsync: false, status: null });
}, [contact, card.state]); }
}, [contact, card.state, profile.state]);
const applyAction = async (action) => { const applyAction = async (action) => {
if (!state.busy) { if (!state.busy) {

View File

@ -12,9 +12,10 @@ import { BlockedMessages } from './blockedMessages/BlockedMessages';
export function ProfileHeader() { export function ProfileHeader() {
const { state, actions } = useProfile(); const { state, actions } = useProfile();
const handle = state.node ? `${state.handle}@${state.node}` : state.handle;
return ( return (
<Text style={styles.headerText}>{ `${state.handle}@${state.node}` }</Text> <Text style={styles.headerText}>{ handle }</Text>
) )
} }

View File

@ -65,7 +65,7 @@ export function Registry({ closeRegistry, openContact }) {
useEffect(() => { useEffect(() => {
setSearch(false); setSearch(false);
setHandle(null); setHandle(null);
setServer(profile.state.identity?.node); setServer(profile.state.server);
}, [profile.state]); }, [profile.state]);
return ( return (

View File

@ -6,6 +6,7 @@ import { useRegistryItem } from './useRegistryItem.hook';
export function RegistryItem({ item, openContact }) { export function RegistryItem({ item, openContact }) {
const { state, actions } = useRegistryItem(item); const { state, actions } = useRegistryItem(item);
const handle = item.node ? `${item.handle}i@${item.node}` : item.handle;
const select = () => { const select = () => {
const { guid, name, handle, node, location, description, imageSet } = item; const { guid, name, handle, node, location, description, imageSet } = item;
@ -20,7 +21,7 @@ export function RegistryItem({ item, openContact }) {
<Logo src={item.logo} width={32} height={32} radius={6} /> <Logo src={item.logo} width={32} height={32} radius={6} />
<View style={styles.detail}> <View style={styles.detail}>
<Text style={styles.name} numberOfLines={1} ellipsizeMode={'tail'}>{ item.name }</Text> <Text style={styles.name} numberOfLines={1} ellipsizeMode={'tail'}>{ item.name }</Text>
<Text style={styles.handle} numberOfLines={1} ellipsizeMode={'tail'}>{ `${item.handle}@${item.node}` }</Text> <Text style={styles.handle} numberOfLines={1} ellipsizeMode={'tail'}>{ handle }</Text>
</View> </View>
</TouchableOpacity> </TouchableOpacity>
)} )}

View File

@ -45,8 +45,9 @@ export function useRegistry(search, handle, server) {
const setAccountItem = (item) => { const setAccountItem = (item) => {
const { guid, name, handle, node, location, description, imageSet } = item; const { guid, name, handle, node, location, description, imageSet } = item;
const logo = imageSet ? getListingImageUrl(node, guid) : 'avatar'; const server = node ? node : profile.state.server;
return { guid, name, handle, node, location, description, guid, imageSet, logo }; const logo = imageSet ? getListingImageUrl(server, guid) : 'avatar';
return { guid, name, handle, server, location, description, guid, imageSet, logo };
}; };
const actions = {}; const actions = {};

View File

@ -6,6 +6,7 @@ import { StoreContext } from 'context/StoreContext';
import { CardContext } from 'context/CardContext'; import { CardContext } from 'context/CardContext';
import { ChannelContext } from 'context/ChannelContext'; import { ChannelContext } from 'context/ChannelContext';
import { RingContext } from 'context/RingContext'; import { RingContext } from 'context/RingContext';
import { ProfileContext } from 'context/ProfileContext';
export function useSession() { export function useSession() {
@ -30,6 +31,7 @@ export function useSession() {
const ring = useContext(RingContext); const ring = useContext(RingContext);
const channel = useContext(ChannelContext); const channel = useContext(ChannelContext);
const card = useContext(CardContext); const card = useContext(CardContext);
const profile = useContext(ProfileContext);
const store = useContext(StoreContext); const store = useContext(StoreContext);
const dimensions = useWindowDimensions(); const dimensions = useWindowDimensions();
const navigate = useNavigate(); const navigate = useNavigate();
@ -50,8 +52,9 @@ export function useSession() {
const { imageSet, name, handle, node, guid } = contact.card?.profile || {}; const { imageSet, name, handle, node, guid } = contact.card?.profile || {};
const { token } = contact.card?.detail || {}; const { token } = contact.card?.detail || {};
const contactToken = `${guid}.${token}`; const contactToken = `${guid}.${token}`;
const server = node ? node : profile.state.server;
const img = imageSet ? card.actions.getCardImageUrl(cardId) : null; const img = imageSet ? card.actions.getCardImageUrl(cardId) : null;
ringing.push({ cardId, img, name, handle, contactNode: node, callId, contactToken, calleeToken, iceUrl, iceUsername, icePassword }); ringing.push({ cardId, img, name, handle, contactNode: server, callId, contactToken, calleeToken, iceUrl, iceUsername, icePassword });
} }
} }
}); });