mirror of
https://github.com/Qortal/qortal-mobile.git
synced 2025-06-15 12:31:21 +00:00
public groups announcements
This commit is contained in:
parent
f481dee813
commit
f88a44294d
@ -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={{
|
||||||
|
@ -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>
|
||||||
);
|
);
|
||||||
|
@ -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}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user