public groups announcements

This commit is contained in:
PhilReact 2024-12-16 04:23:17 +02:00
parent f481dee813
commit f88a44294d
3 changed files with 68 additions and 48 deletions

View File

@ -6,7 +6,7 @@ import { objectToBase64 } from "../../qdn/encryption/group-encryption";
import ShortUniqueId from "short-unique-id"; import ShortUniqueId from "short-unique-id";
import { LoadingSnackbar } from "../Snackbar/LoadingSnackbar"; import { LoadingSnackbar } from "../Snackbar/LoadingSnackbar";
import { getBaseApi, getFee } from "../../background"; import { getBaseApi, getFee } from "../../background";
import { decryptPublishes, getTempPublish, saveTempPublish } from "./GroupAnnouncements"; import { decryptPublishes, getTempPublish, handleUnencryptedPublishes, saveTempPublish } from "./GroupAnnouncements";
import { AnnouncementList } from "./AnnouncementList"; import { AnnouncementList } from "./AnnouncementList";
import { Spacer } from "../../common/Spacer"; import { Spacer } from "../../common/Spacer";
import ArrowBackIcon from '@mui/icons-material/ArrowBack'; import ArrowBackIcon from '@mui/icons-material/ArrowBack';
@ -22,7 +22,8 @@ export const AnnouncementDiscussion = ({
secretKey, secretKey,
setSelectedAnnouncement, setSelectedAnnouncement,
show, show,
myName myName,
isPrivate
}) => { }) => {
const [isSending, setIsSending] = useState(false); const [isSending, setIsSending] = useState(false);
const [isLoading, setIsLoading] = useState(false); const [isLoading, setIsLoading] = useState(false);
@ -49,7 +50,7 @@ export const AnnouncementDiscussion = ({
} }
}; };
const getData = async ({ identifier, name }) => { const getData = async ({ identifier, name }, isPrivate) => {
try { try {
const res = await fetch( const res = await fetch(
@ -57,7 +58,7 @@ export const AnnouncementDiscussion = ({
); );
if(!res?.ok) return if(!res?.ok) return
const data = await res.text(); const data = await res.text();
const response = await decryptPublishes([{ data }], secretKey); const response = isPrivate === false ? handleUnencryptedPublishes([data]) : await decryptPublishes([{ data }], secretKey);
const messageData = response[0]; const messageData = response[0];
setData((prev) => { setData((prev) => {
@ -132,10 +133,10 @@ export const AnnouncementDiscussion = ({
extra: {}, extra: {},
message: htmlContent, message: htmlContent,
}; };
const secretKeyObject = await getSecretKey(false, true); const secretKeyObject = isPrivate === false ? null : await getSecretKey(false, true);
const message64: any = await objectToBase64(message); const message64: any = await objectToBase64(message);
const encryptSingle = await encryptChatMessage( const encryptSingle = isPrivate === false ? message64 : await encryptChatMessage(
message64, message64,
secretKeyObject secretKeyObject
); );
@ -169,7 +170,7 @@ export const AnnouncementDiscussion = ({
}; };
const getComments = React.useCallback( const getComments = React.useCallback(
async (selectedAnnouncement) => { async (selectedAnnouncement, isPrivate) => {
try { try {
setIsLoading(true); setIsLoading(true);
@ -190,7 +191,7 @@ export const AnnouncementDiscussion = ({
setComments(responseData); setComments(responseData);
setIsLoading(false); setIsLoading(false);
for (const data of responseData) { for (const data of responseData) {
getData({ name: data.name, identifier: data.identifier }); getData({ name: data.name, identifier: data.identifier }, isPrivate);
} }
} catch (error) { } catch (error) {
} finally { } finally {
@ -220,7 +221,7 @@ export const AnnouncementDiscussion = ({
setComments((prev)=> [...prev, ...responseData]); setComments((prev)=> [...prev, ...responseData]);
setIsLoading(false); setIsLoading(false);
for (const data of responseData) { for (const data of responseData) {
getData({ name: data.name, identifier: data.identifier }); getData({ name: data.name, identifier: data.identifier }, isPrivate);
} }
} catch (error) { } catch (error) {
@ -245,11 +246,12 @@ export const AnnouncementDiscussion = ({
}, [tempPublishedList, comments]); }, [tempPublishedList, comments]);
React.useEffect(() => { React.useEffect(() => {
if (selectedAnnouncement && secretKey && !firstMountRef.current) { if(!secretKey && isPrivate) return
getComments(selectedAnnouncement); if (selectedAnnouncement && !firstMountRef.current && isPrivate !== null) {
getComments(selectedAnnouncement, isPrivate);
firstMountRef.current = true firstMountRef.current = true
} }
}, [selectedAnnouncement, secretKey]); }, [selectedAnnouncement, secretKey, isPrivate]);
return ( return (
<div <div
style={{ style={{

View File

@ -94,18 +94,7 @@ export const decryptPublishes = async (encryptedMessages: any[], secretKey) => {
.then((response) => { .then((response) => {
if (!response?.error) { if (!response?.error) {
res(response); res(response);
// if(hasInitialized.current){
// setMessages((prev) => [...prev, ...formatted]);
// } else {
// const formatted = response.map((item) => ({
// ...item,
// id: item.signature,
// text: item.text,
// unread: false
// }));
// setMessages(formatted);
// hasInitialized.current = true;
// }
return; return;
} }
rej(response.error); rej(response.error);
@ -117,6 +106,20 @@ export const decryptPublishes = async (encryptedMessages: any[], secretKey) => {
}); });
} catch (error) {} } catch (error) {}
}; };
export const handleUnencryptedPublishes = (publishes) => {
let publishesData = []
publishes.forEach((pub)=> {
try {
const decodedData = JSON.parse(atob(pub))
if(decodedData){
publishesData.push({decryptedData: decodedData})
}
} catch (error) {
}
})
return publishesData
};
export const GroupAnnouncements = ({ export const GroupAnnouncements = ({
selectedGroup, selectedGroup,
secretKey, secretKey,
@ -127,6 +130,7 @@ export const GroupAnnouncements = ({
isAdmin, isAdmin,
hide, hide,
myName, myName,
isPrivate
}) => { }) => {
const [messages, setMessages] = useState([]); const [messages, setMessages] = useState([]);
const [isSending, setIsSending] = useState(false); const [isSending, setIsSending] = useState(false);
@ -160,7 +164,7 @@ export const GroupAnnouncements = ({
})(); })();
}, [selectedGroup]); }, [selectedGroup]);
const getAnnouncementData = async ({ identifier, name, resource }) => { const getAnnouncementData = async ({ identifier, name, resource }, isPrivate) => {
try { try {
let data = dataPublishes.current[`${name}-${identifier}`]; let data = dataPublishes.current[`${name}-${identifier}`];
if ( if (
@ -180,9 +184,9 @@ export const GroupAnnouncements = ({
data = data.data; data = data.data;
} }
const response = await decryptPublishes([{ data }], secretKey); const response = isPrivate === false ? handleUnencryptedPublishes([data]) : await decryptPublishes([{ data }], secretKey);
const messageData = response[0]; const messageData = response[0];
if(!messageData) return
setAnnouncementData((prev) => { setAnnouncementData((prev) => {
return { return {
...prev, ...prev,
@ -195,11 +199,11 @@ export const GroupAnnouncements = ({
}; };
useEffect(() => { useEffect(() => {
if (!secretKey || hasInitializedWebsocket.current) return; if ((!secretKey && isPrivate) || hasInitializedWebsocket.current || isPrivate === null) return;
setIsLoading(true); setIsLoading(true);
// initWebsocketMessageGroup() // initWebsocketMessageGroup()
hasInitializedWebsocket.current = true; hasInitializedWebsocket.current = true;
}, [secretKey]); }, [secretKey, isPrivate]);
const encryptChatMessage = async (data: string, secretKeyObject: any) => { const encryptChatMessage = async (data: string, secretKeyObject: any) => {
try { try {
@ -257,12 +261,12 @@ export const GroupAnnouncements = ({
} }
}; };
const setTempData = async () => { const setTempData = async (selectedGroup) => {
try { try {
const getTempAnnouncements = await getTempPublish(); const getTempAnnouncements = await getTempPublish();
if (getTempAnnouncements?.announcement) { if (getTempAnnouncements?.announcement) {
let tempData = []; let tempData = [];
Object.keys(getTempAnnouncements?.announcement || {}).map((key) => { Object.keys(getTempAnnouncements?.announcement || {}).filter((annKey)=> annKey?.startsWith(`grp-${selectedGroup}-anc`)).map((key) => {
const value = getTempAnnouncements?.announcement[key]; const value = getTempAnnouncements?.announcement[key];
tempData.push(value.data); tempData.push(value.data);
}); });
@ -289,9 +293,9 @@ export const GroupAnnouncements = ({
extra: {}, extra: {},
message: htmlContent, message: htmlContent,
}; };
const secretKeyObject = await getSecretKey(false, true); const secretKeyObject = isPrivate === false ? null : await getSecretKey(false, true);
const message64: any = await objectToBase64(message); const message64: any = await objectToBase64(message);
const encryptSingle = await encryptChatMessage( const encryptSingle = isPrivate === false ? message64 : await encryptChatMessage(
message64, message64,
secretKeyObject secretKeyObject
); );
@ -313,7 +317,7 @@ export const GroupAnnouncements = ({
data: dataToSaveToStorage, data: dataToSaveToStorage,
key: "announcement", key: "announcement",
}); });
setTempData(); setTempData(selectedGroup);
clearEditorContent(); clearEditorContent();
} }
// send chat message // send chat message
@ -331,7 +335,7 @@ export const GroupAnnouncements = ({
}; };
const getAnnouncements = React.useCallback( const getAnnouncements = React.useCallback(
async (selectedGroup) => { async (selectedGroup, isPrivate) => {
try { try {
const offset = 0; const offset = 0;
@ -346,7 +350,7 @@ export const GroupAnnouncements = ({
}); });
const responseData = await response.json(); const responseData = await response.json();
setTempData(); setTempData(selectedGroup);
setAnnouncements(responseData); setAnnouncements(responseData);
setIsLoading(false); setIsLoading(false);
for (const data of responseData) { for (const data of responseData) {
@ -354,7 +358,7 @@ export const GroupAnnouncements = ({
name: data.name, name: data.name,
identifier: data.identifier, identifier: data.identifier,
resource: data, resource: data,
}); }, isPrivate);
} }
} catch (error) { } catch (error) {
} finally { } finally {
@ -365,11 +369,12 @@ export const GroupAnnouncements = ({
); );
React.useEffect(() => { React.useEffect(() => {
if (selectedGroup && secretKey && !hasInitialized.current && !hide) { if(!secretKey && isPrivate) return
getAnnouncements(selectedGroup); if (selectedGroup && !hasInitialized.current && !hide && isPrivate !== null) {
getAnnouncements(selectedGroup, isPrivate);
hasInitialized.current = true; hasInitialized.current = true;
} }
}, [selectedGroup, secretKey, hide]); }, [selectedGroup, secretKey, hide, isPrivate]);
const loadMore = async () => { const loadMore = async () => {
try { try {
@ -389,7 +394,7 @@ export const GroupAnnouncements = ({
setAnnouncements((prev) => [...prev, ...responseData]); setAnnouncements((prev) => [...prev, ...responseData]);
setIsLoading(false); setIsLoading(false);
for (const data of responseData) { for (const data of responseData) {
getAnnouncementData({ name: data.name, identifier: data.identifier }); getAnnouncementData({ name: data.name, identifier: data.identifier }, isPrivate);
} }
} catch (error) {} } catch (error) {}
}; };
@ -414,7 +419,7 @@ export const GroupAnnouncements = ({
getAnnouncementData({ getAnnouncementData({
name: data.name, name: data.name,
identifier: data.identifier, identifier: data.identifier,
}); }, isPrivate);
} catch (error) {} } catch (error) {}
} }
setAnnouncements(responseData); setAnnouncements(responseData);
@ -429,7 +434,7 @@ export const GroupAnnouncements = ({
for (const data of newArray) { for (const data of newArray) {
try { try {
getAnnouncementData({ name: data.name, identifier: data.identifier }); getAnnouncementData({ name: data.name, identifier: data.identifier }, isPrivate);
} catch (error) {} } catch (error) {}
} }
setAnnouncements((prev) => [...newArray, ...prev]); setAnnouncements((prev) => [...newArray, ...prev]);
@ -449,14 +454,14 @@ export const GroupAnnouncements = ({
}, [checkNewMessages]); }, [checkNewMessages]);
useEffect(() => { useEffect(() => {
if (!secretKey || hide) return; if ((!secretKey && isPrivate) || hide || isPrivate === null) return;
checkNewMessagesFunc(); checkNewMessagesFunc();
return () => { return () => {
if (interval?.current) { if (interval?.current) {
clearInterval(interval.current); clearInterval(interval.current);
} }
}; };
}, [checkNewMessagesFunc, hide]); }, [checkNewMessagesFunc, hide, isPrivate]);
const combinedListTempAndReal = useMemo(() => { const combinedListTempAndReal = useMemo(() => {
// Combine the two lists // Combine the two lists
@ -475,7 +480,6 @@ export const GroupAnnouncements = ({
return sortedList; return sortedList;
}, [tempPublishedList, announcements]); }, [tempPublishedList, announcements]);
if (selectedAnnouncement) { if (selectedAnnouncement) {
return ( return (
<div <div
@ -498,6 +502,7 @@ export const GroupAnnouncements = ({
setSelectedAnnouncement={setSelectedAnnouncement} setSelectedAnnouncement={setSelectedAnnouncement}
encryptChatMessage={encryptChatMessage} encryptChatMessage={encryptChatMessage}
getSecretKey={getSecretKey} getSecretKey={getSecretKey}
isPrivate={isPrivate}
/> />
</div> </div>
); );

View File

@ -866,6 +866,17 @@ export const Group = ({
const getAdminsForPublic = async(selectedGroup)=> {
try {
const { names, addresses, both } =
await getGroupAdmins(selectedGroup?.groupId)
setAdmins(addresses);
setAdminsWithNames(both);
} catch (error) {
//error
}
}
useEffect(() => { useEffect(() => {
if (selectedGroup && isPrivate !== null) { if (selectedGroup && isPrivate !== null) {
if(isPrivate){ if(isPrivate){
@ -877,6 +888,7 @@ export const Group = ({
} }
if(isPrivate === false){ if(isPrivate === false){
setTriedToFetchSecretKey(true); setTriedToFetchSecretKey(true);
getAdminsForPublic(selectedGroup)
} }
}, [selectedGroup, isPrivate]); }, [selectedGroup, isPrivate]);
@ -2496,6 +2508,7 @@ export const Group = ({
} }
myName={userInfo?.name} myName={userInfo?.name}
hide={groupSection !== "announcement"} hide={groupSection !== "announcement"}
isPrivate={isPrivate}
/> />
<GroupForum <GroupForum
myAddress={myAddress} myAddress={myAddress}