support topic creation

This commit is contained in:
balzack 2022-10-11 23:22:11 -07:00
parent fc6898fe68
commit c279408d0a
6 changed files with 52 additions and 12 deletions

View File

@ -1,7 +1,7 @@
import { checkResponse, fetchWithTimeout } from './fetchUtil'; import { checkResponse, fetchWithTimeout } from './fetchUtil';
export async function addChannel(server, token, cards, subject, description ) { export async function addChannel(server, token, subject, cards ) {
let data = { subject, description }; let data = { subject };
let params = { dataType: 'superbasic', data: JSON.stringify(data), groups: [], cards }; let params = { dataType: 'superbasic', data: JSON.stringify(data), groups: [], cards };
let channel = await fetchWithTimeout(`https://${server}/content/channels?agent=${token}`, { method: 'POST', body: JSON.stringify(params)} ); let channel = await fetchWithTimeout(`https://${server}/content/channels?agent=${token}`, { method: 'POST', body: JSON.stringify(params)} );
checkResponse(channel); checkResponse(channel);

View File

@ -111,7 +111,6 @@ export function useChannelContext() {
const { detailRevision, topicRevision, channelDetail, channelSummary } = channel.data; const { detailRevision, topicRevision, channelDetail, channelSummary } = channel.data;
const view = await store.actions.getChannelItemView(guid, channel.id); const view = await store.actions.getChannelItemView(guid, channel.id);
if (view == null) { if (view == null) {
console.log('alert: expected channel not synced');
let assembled = JSON.parse(JSON.stringify(channel)); let assembled = JSON.parse(JSON.stringify(channel));
assembled.data.channelDetail = await getChannelDetail(server, appToken, channel.id); assembled.data.channelDetail = await getChannelDetail(server, appToken, channel.id);
assembled.data.channelSummary = await getChannelSummary(server, appToken, channel.id); assembled.data.channelSummary = await getChannelSummary(server, appToken, channel.id);
@ -261,6 +260,10 @@ export function useChannelContext() {
const { server, appToken } = session.current; const { server, appToken } = session.current;
return await removeChannel(server, appToken, channelId); return await removeChannel(server, appToken, channelId);
}, },
add: async (subject, cards) => {
const { server, appToken } = session.current;
return await addChannel(server, appToken, subject, cards);
},
removeTopic: async (channelId, topicId) => { removeTopic: async (channelId, topicId) => {
const { server, appToken } = session.current; const { server, appToken } = session.current;
return await removeChannelTopic(server, appToken, channelId, topicId); return await removeChannelTopic(server, appToken, channelId, topicId);

View File

@ -1,5 +1,5 @@
import { useContext } from 'react'; import { useContext } from 'react';
import { FlatList, Modal, KeyboardAvoidingView, ScrollView, View, TextInput, TouchableOpacity, Text } from 'react-native'; import { Alert, FlatList, Modal, KeyboardAvoidingView, ScrollView, View, TextInput, TouchableOpacity, Text } from 'react-native';
import { styles } from './Channels.styled'; import { styles } from './Channels.styled';
import { useChannels } from './useChannels.hook'; import { useChannels } from './useChannels.hook';
import Ionicons from '@expo/vector-icons/AntDesign'; import Ionicons from '@expo/vector-icons/AntDesign';
@ -26,6 +26,22 @@ export function ChannelsTitle({ state, actions }) {
} }
export function ChannelsBody({ state, actions, openConversation }) { export function ChannelsBody({ state, actions, openConversation }) {
const addTopic = async () => {
try {
const channel = await actions.addTopic();
actions.hideAdding();
openConversation(null, channel.id)
}
catch (err) {
console.log(err);
Alert.alert(
'Failed to Create Topic',
'Please try again.'
)
}
}
return ( return (
<> <>
<FlatList style={styles.channels} <FlatList style={styles.channels}
@ -44,7 +60,7 @@ export function ChannelsBody({ state, actions, openConversation }) {
<View style={styles.addContainer}> <View style={styles.addContainer}>
<Text style={styles.addHeader}>New Topic:</Text> <Text style={styles.addHeader}>New Topic:</Text>
<View style={styles.inputField}> <View style={styles.inputField}>
<TextInput style={styles.input} value={state.subjectUpdate} onChangeText={actions.setSubjectUpdate} <TextInput style={styles.input} value={state.addSubject} onChangeText={actions.setAddSubject}
autoCapitalize="words" placeholder="Subject" /> autoCapitalize="words" placeholder="Subject" />
</View> </View>
<Text style={styles.label}>Members:</Text> <Text style={styles.label}>Members:</Text>
@ -56,7 +72,8 @@ export function ChannelsBody({ state, actions, openConversation }) {
{ state.connected.length > 0 && ( { state.connected.length > 0 && (
<FlatList style={styles.addMembers} <FlatList style={styles.addMembers}
data={state.connected} data={state.connected}
renderItem={({ item }) => <AddMember members={[]} item={item} />} renderItem={({ item }) => <AddMember members={state.addMembers} item={item}
setCard={actions.setAddMember} clearCard={actions.clearAddMember} />}
keyExtractor={item => item.cardId} keyExtractor={item => item.cardId}
/> />
)} )}
@ -64,8 +81,8 @@ export function ChannelsBody({ state, actions, openConversation }) {
<TouchableOpacity style={styles.cancel} onPress={actions.hideAdding}> <TouchableOpacity style={styles.cancel} onPress={actions.hideAdding}>
<Text>Cancel</Text> <Text>Cancel</Text>
</TouchableOpacity> </TouchableOpacity>
<TouchableOpacity style={styles.save} onPress={actions.hideAdding}> <TouchableOpacity style={styles.save} onPress={addTopic}>
<Text style={styles.saveText}>Save</Text> <Text style={styles.saveText}>Create</Text>
</TouchableOpacity> </TouchableOpacity>
</View> </View>
</View> </View>

View File

@ -4,11 +4,17 @@ import { styles } from './AddMember.styled';
import { useAddMember } from './useAddMember.hook'; import { useAddMember } from './useAddMember.hook';
import Colors from 'constants/Colors'; import Colors from 'constants/Colors';
export function AddMember({ members, item }) { export function AddMember({ members, item, setCard, clearCard }) {
const { state, actions } = useAddMember(item, members); const { state, actions } = useAddMember(item, members);
const setMember = () => { const setMember = (set) => {
if (set) {
setCard(item.cardId);
}
else {
clearCard(item.cardId);
}
}; };
return ( return (

View File

@ -18,7 +18,7 @@ export function useAddMember(item, members) {
} }
useEffect(() => { useEffect(() => {
const member = members.filter(contact => item.cardId === contact.cardId); const member = members.filter(contact => item.cardId === contact);
updateState({ member: member.length > 0 }); updateState({ member: member.length > 0 });
}, [members]); }, [members]);

View File

@ -16,6 +16,8 @@ export function useChannels() {
filter: null, filter: null,
adding: false, adding: false,
connected: [], connected: [],
addSubject: null,
addMembers: [],
}); });
const items = useRef([]); const items = useRef([]);
@ -186,12 +188,24 @@ export function useChannels() {
setFilter: (filter) => { setFilter: (filter) => {
updateState({ filter }); updateState({ filter });
}, },
setAddSubject: (addSubject) => {
updateState({ addSubject });
},
setAddMember: (cardId) => {
updateState({ addMembers: [ ...state.addMembers, cardId ] });
},
clearAddMember: (cardId) => {
updateState({ addMembers: state.addMembers.filter(item => item !== cardId) });
},
showAdding: () => { showAdding: () => {
updateState({ adding: true }); updateState({ adding: true, addSubject: null, addMembers: [] });
}, },
hideAdding: () => { hideAdding: () => {
updateState({ adding: false }); updateState({ adding: false });
}, },
addTopic: async () => {
return await channel.actions.add(state.addSubject, state.addMembers);
}
}; };
return { state, actions }; return { state, actions };