From 12e78b61ace4eb12652c744df9760ed2e25d17d7 Mon Sep 17 00:00:00 2001 From: Usman salim Date: Sat, 3 May 2025 00:42:26 +0530 Subject: [PATCH 01/41] added height, width in attachment meta and image caching --- .../assets/images/black_background.png | Bin 0 -> 2008 bytes .../components/LMMedia/LMCarousel/index.tsx | 14 +++- .../components/LMMedia/LMImage/index.tsx | 74 ++++++++++++------ .../components/LMMedia/LMVideo/index.tsx | 4 +- .../components/LMPost/LMPostMedia/index.tsx | 10 ++- .../viewDataModels/index.ts | 5 ++ 6 files changed, 76 insertions(+), 31 deletions(-) create mode 100644 likeminds-feed-reactnative-integration/assets/images/black_background.png diff --git a/likeminds-feed-reactnative-integration/assets/images/black_background.png b/likeminds-feed-reactnative-integration/assets/images/black_background.png new file mode 100644 index 0000000000000000000000000000000000000000..5b1cb189eb46bcd5c0ff743bf1a5ec87f06b74fa GIT binary patch literal 2008 zcmeAS@N?(olHy`uVBq!ia0y~yU{VKR4i=!u%Sgj8AjOjI=`sf6E z90oy4Mx`PqmnSS8qY|S*GMX4hv%zS|Fj^*(S{tC$I6zKKDpSb{R-wx3MZG|tYKdz^ zNlIc#s#S7PDv)9@GB7gGH89gPG!8K|urjc)GPTq;05S}6`hKLMXvob^$xN%ntwHv( z!%d(DNstY}`DrEPiAAXl<>lpinR(g8$%zH2dih1^v)|cB0TnTLy85}Sb4q9e01YxL AtN;K2 literal 0 HcmV?d00001 diff --git a/likeminds-feed-reactnative-integration/components/LMMedia/LMCarousel/index.tsx b/likeminds-feed-reactnative-integration/components/LMMedia/LMCarousel/index.tsx index 6deb3f8e..653a643d 100644 --- a/likeminds-feed-reactnative-integration/components/LMMedia/LMCarousel/index.tsx +++ b/likeminds-feed-reactnative-integration/components/LMMedia/LMCarousel/index.tsx @@ -49,6 +49,14 @@ const LMCarousel = React.memo( } }; + const getMaxHeightOfAttachments = () => { + if (!post?.attachments?.length) return 400; + + return Math.max( + ...post.attachments.map(item => item?.attachmentMeta?.height || 0) + ); + } + return ( { const [loading, setLoading] = useState(true); const [error, setError] = useState(false); - const [heightCalculated, setHeightCalculated] = useState(0); + const [heightCalculated, setHeightCalculated] = useState(400); const [desiredAspectRatio, setDesiredAspectRatio] = useState(0); - useEffect(() => { - Image.getSize( - imageUrl, - (width, height) => { - const ScreenWidth = Dimensions.get("window").width; - const desiredAspectRatio = width > height ? 1.91 : 0.8; - const heightCalculated = ScreenWidth * (1 / desiredAspectRatio); - setHeightCalculated(heightCalculated); - setDesiredAspectRatio(desiredAspectRatio); - }, - (error) => { - console.error("Error getting image size:", error); - } - ); + useLayoutEffect(() => { + if (!height && !width) { + console.log("NO DIMENSIONS"); + Image.getSize( + imageUrl, + (width, height) => { + console.log(`Image dimensions: ${width}x${height}`); + const ScreenWidth = Dimensions.get("window").width; + const desiredAspectRatio = width > height ? 1.91 : 0.8; + const heightCalculated = ScreenWidth * (1 / desiredAspectRatio); + console.log({ + heightCalculated, + desiredAspectRatio + }) + setHeightCalculated(heightCalculated); + setDesiredAspectRatio(desiredAspectRatio); + }, + (error) => { + console.error('Failed to get image size:', error); + } + ); + return; + } else { + console.log({ + height, + width + }) + + const ScreenWidth = Dimensions.get("window").width; + const desiredAspectRatio = width > height ? 1.91 : 0.8; + const heightCalculated = ScreenWidth * (1 / desiredAspectRatio); + console.log({ + heightCalculated, + desiredAspectRatio + }) + setHeightCalculated(heightCalculated); + setDesiredAspectRatio(desiredAspectRatio); + } + + }, [imageUrl]); return ( {/* this renders the loader until the image renders */} {loaderWidget ? loaderWidget : loading && } {/* this renders the image */} - setLoading(false)} onError={() => setError(true)} + resizeMode={FastImage.resizeMode.contain} + defaultSource={require("../../../assets/images/black_background.png")} style={StyleSheet.flatten([ imageStyle, { height: heightCalculated, - aspectRatio: aspectRatio ? aspectRatio : desiredAspectRatio, - resizeMode: boxFit ? boxFit : defaultStyles.imageStyle.resizeMode, + aspectRatio: desiredAspectRatio, } ])} /> @@ -73,9 +101,9 @@ const LMImage = React.memo( onTap={ onCancel ? () => { - onCancel(imageUrl); - cancelButton?.onTap(); - } + onCancel(imageUrl); + cancelButton?.onTap(); + } : () => null } /> diff --git a/likeminds-feed-reactnative-integration/components/LMMedia/LMVideo/index.tsx b/likeminds-feed-reactnative-integration/components/LMMedia/LMVideo/index.tsx index 89de5366..b7a21e97 100644 --- a/likeminds-feed-reactnative-integration/components/LMMedia/LMVideo/index.tsx +++ b/likeminds-feed-reactnative-integration/components/LMMedia/LMVideo/index.tsx @@ -67,7 +67,7 @@ const LMVideo = React.memo( const player = useRef(null); const [paused, setPaused] = useState(true); const [dimensions, setDimensions] = useState({ width: 0, height: 0 }); - const [heightCalculated, setHeightCalculated] = useState(0); + const [heightCalculated, setHeightCalculated] = useState(400); const [desiredAspectRatio, setDesiredAspectRatio] = useState(0); const currentVideoId = useAppSelector( @@ -119,7 +119,7 @@ const LMVideo = React.memo( return ( {/* this renders the loader until the first picture of video is displayed */} {loading ? ( diff --git a/likeminds-feed-reactnative-integration/components/LMPost/LMPostMedia/index.tsx b/likeminds-feed-reactnative-integration/components/LMPost/LMPostMedia/index.tsx index a7d6215a..f72f1ebd 100644 --- a/likeminds-feed-reactnative-integration/components/LMPost/LMPostMedia/index.tsx +++ b/likeminds-feed-reactnative-integration/components/LMPost/LMPostMedia/index.tsx @@ -58,6 +58,8 @@ const LMPostMedia = React.memo(() => { }} > { }} > { const url = post?.attachments?.find( (item) => item?.attachmentType === type ); - return url?.attachmentMeta.url ? url?.attachmentMeta.url : ""; + return url }; // this gets the required attachment type data to render in its component @@ -205,7 +209,7 @@ const LMPostMedia = React.memo(() => { (item) => item?.attachmentType === IMAGE_ATTACHMENT_TYPE ) && ( )} @@ -213,7 +217,7 @@ const LMPostMedia = React.memo(() => { (item) => item?.attachmentType === VIDEO_ATTACHMENT_TYPE ) && ( { + console.log(item) return { attachmentMeta: { entityId: "", @@ -335,6 +338,8 @@ export function convertImageVideoMetaData( duration: Math.round(item?.duration ? item.duration : 0), pageCount: 0, url: item?.uri, + height: item?.height, + width: item?.width }, attachmentType: item?.duration ? VIDEO_ATTACHMENT_TYPE From 2aba1487ce8ac8cc8e119d0bcf713964cfbddba6 Mon Sep 17 00:00:00 2001 From: Usman salim Date: Sat, 3 May 2025 02:30:51 +0530 Subject: [PATCH 02/41] updated logic for default height and width --- .../components/LMMedia/LMCarousel/index.tsx | 27 ++++++++++++++----- .../components/LMMedia/LMImage/index.tsx | 20 +++++--------- .../components/LMMedia/LMVideo/index.tsx | 23 ++++++++++++---- 3 files changed, 46 insertions(+), 24 deletions(-) diff --git a/likeminds-feed-reactnative-integration/components/LMMedia/LMCarousel/index.tsx b/likeminds-feed-reactnative-integration/components/LMMedia/LMCarousel/index.tsx index 653a643d..b176145c 100644 --- a/likeminds-feed-reactnative-integration/components/LMMedia/LMCarousel/index.tsx +++ b/likeminds-feed-reactnative-integration/components/LMMedia/LMCarousel/index.tsx @@ -1,4 +1,4 @@ -import { StyleSheet, TouchableOpacity, View, Pressable } from "react-native"; +import { StyleSheet, TouchableOpacity, View, Pressable, Dimensions } from "react-native"; import React, { useState } from "react"; import SwiperFlatList from "react-native-swiper-flatlist"; import { LMCarouselProps } from "./types"; @@ -50,12 +50,27 @@ const LMCarousel = React.memo( }; const getMaxHeightOfAttachments = () => { - if (!post?.attachments?.length) return 400; + if (!post?.attachments?.length) return 0; + + const ScreenWidth = Dimensions.get("window").width; + + // Map over attachments and compute scaled heights + const scaledHeights = post?.attachments?.map(item => { + const meta = item?.attachmentMeta; + const width = meta?.width; + const height = meta?.height; + + if (!width || !height) return 0; + + // Determine desired aspect ratio (portrait vs landscape) + const desiredAspectRatio = width > height ? 1.91 : 0.8; + return ScreenWidth * (1 / desiredAspectRatio); + }); - return Math.max( - ...post.attachments.map(item => item?.attachmentMeta?.height || 0) - ); - } + let max = Math.max(...scaledHeights); + + return max > 0 ? max : 500 + }; return ( { - if (!height && !width) { + if (!height || !width) { + console.log("NO DIMENSIONS"); Image.getSize( imageUrl, @@ -37,10 +38,7 @@ const LMImage = React.memo( const ScreenWidth = Dimensions.get("window").width; const desiredAspectRatio = width > height ? 1.91 : 0.8; const heightCalculated = ScreenWidth * (1 / desiredAspectRatio); - console.log({ - heightCalculated, - desiredAspectRatio - }) + setHeightCalculated(heightCalculated); setDesiredAspectRatio(desiredAspectRatio); }, @@ -48,22 +46,18 @@ const LMImage = React.memo( console.error('Failed to get image size:', error); } ); + return; + } else { - console.log({ - height, - width - }) const ScreenWidth = Dimensions.get("window").width; const desiredAspectRatio = width > height ? 1.91 : 0.8; const heightCalculated = ScreenWidth * (1 / desiredAspectRatio); - console.log({ - heightCalculated, - desiredAspectRatio - }) + setHeightCalculated(heightCalculated); setDesiredAspectRatio(desiredAspectRatio); + } diff --git a/likeminds-feed-reactnative-integration/components/LMMedia/LMVideo/index.tsx b/likeminds-feed-reactnative-integration/components/LMMedia/LMVideo/index.tsx index b7a21e97..63eee4c4 100644 --- a/likeminds-feed-reactnative-integration/components/LMMedia/LMVideo/index.tsx +++ b/likeminds-feed-reactnative-integration/components/LMMedia/LMVideo/index.tsx @@ -110,11 +110,24 @@ const LMVideo = React.memo( }; useEffect(() => { - const ScreenWidth = Dimensions.get("window").width; - const desiredAspectRatio = width > height ? 1.91 : 0.8; - const heightCalculated = ScreenWidth * (1 / desiredAspectRatio); - setHeightCalculated(heightCalculated); - setDesiredAspectRatio(desiredAspectRatio); + if ( (!height || !width) && (dimensions?.height > 0 && dimensions?.width > 0)) { + + const ScreenWidth = Dimensions.get("window").width; + const desiredAspectRatio = dimensions?.width > dimensions?.height ? 1.91 : 0.8; + const heightCalculated = ScreenWidth * (1 / desiredAspectRatio); + setHeightCalculated(heightCalculated); + setDesiredAspectRatio(desiredAspectRatio); + + } else { + + const ScreenWidth = Dimensions.get("window").width; + const desiredAspectRatio = width > height ? 1.91 : 0.8; + const heightCalculated = ScreenWidth * (1 / desiredAspectRatio); + setHeightCalculated(heightCalculated); + setDesiredAspectRatio(desiredAspectRatio); + + } + }, [dimensions]); return ( From 6f0c4dec0375235037ac5414668d23cdfc3b78d6 Mon Sep 17 00:00:00 2001 From: Usman salim Date: Tue, 6 May 2025 00:01:34 +0530 Subject: [PATCH 03/41] replaced keys for attachment meta and type --- .../LMCreatePost/LMCreatePostMedia.tsx | 15 ++-- .../components/LMMedia/LMCarousel/index.tsx | 17 ++-- .../LMMedia/LMCreatePostCarousel/index.tsx | 6 +- .../components/LMMedia/LMDocument/index.tsx | 22 ++--- .../components/LMMedia/LMImage/index.tsx | 4 +- .../components/LMMedia/LMImage/types.ts | 9 +- .../LMMedia/LMLinkPreview/index.tsx | 2 +- .../components/LMMedia/LMVideo/types.ts | 4 +- .../LMNotificationFeedItem/index.tsx | 9 +- .../components/LMPost/LMPost/index.tsx | 7 +- .../components/LMPost/LMPostMedia/index.tsx | 59 ++++++------- .../context/createPostContext.tsx | 21 ++--- .../context/universalFeedContext.tsx | 87 ++++++++++--------- .../context/userOnboardingContext.tsx | 2 +- .../models/LMActivityViewData.ts | 5 +- .../models/LMAttachmentMetaViewData.ts | 2 + .../models/LMAttachmentViewData.ts | 5 +- .../models/LMPostViewData.ts | 2 +- .../viewDataModels/index.ts | 48 +++++----- 19 files changed, 170 insertions(+), 156 deletions(-) diff --git a/likeminds-feed-reactnative-integration/components/LMCreatePost/LMCreatePostMedia.tsx b/likeminds-feed-reactnative-integration/components/LMCreatePost/LMCreatePostMedia.tsx index 7dd6396d..de8a35bc 100644 --- a/likeminds-feed-reactnative-integration/components/LMCreatePost/LMCreatePostMedia.tsx +++ b/likeminds-feed-reactnative-integration/components/LMCreatePost/LMCreatePostMedia.tsx @@ -25,6 +25,7 @@ import { } from "../../constants/Strings"; import { styles } from "../../screens/createPost/styles"; import { LMButton } from "../../uiComponents"; +import { AttachmentType } from "@likeminds.community/feed-rn"; const LMCreatePostMedia = () => { const postListStyle = STYLES.$POST_LIST_STYLE; @@ -96,7 +97,7 @@ const LMCreatePostMedia = () => { > { ) : ( <> {/* single image selected section */} - {formattedMediaAttachments[0]?.attachmentType === - IMAGE_ATTACHMENT_TYPE && ( + {formattedMediaAttachments[0]?.type === + AttachmentType.IMAGE && ( { /> )} {/* single video selected section */} - {formattedMediaAttachments[0]?.attachmentType === - VIDEO_ATTACHMENT_TYPE && ( + {formattedMediaAttachments[0]?.type === + AttachmentType.VIDEO && ( { - const meta = item?.attachmentMeta; + const meta = item?.metaData; const width = meta?.width; const height = meta?.height; @@ -112,7 +113,7 @@ const LMCarousel = React.memo( renderItem={({ item, index }) => ( true}> {/* this section render image */} - {item?.attachmentType === IMAGE_ATTACHMENT_TYPE && ( + {item?.type === AttachmentType.IMAGE && ( { navigation.navigate(CAROUSEL_SCREEN, { @@ -130,9 +131,9 @@ const LMCarousel = React.memo( }} > )} {/* this section render video */} - {item?.attachmentType === VIDEO_ATTACHMENT_TYPE && ( + {item?.type === AttachmentType.VIDEO && ( { navigation.navigate(CAROUSEL_SCREEN, { @@ -174,7 +175,7 @@ const LMCarousel = React.memo( }} > { - item?.attachmentMeta?.url - ? item?.attachmentMeta?.url.includes("https://") - ? Linking.openURL(item?.attachmentMeta?.url) - : viewDocument(item?.attachmentMeta?.url) + item?.metaData?.url + ? item?.metaData?.url.includes("https://") + ? Linking.openURL(item?.metaData?.url) + : viewDocument(item?.metaData?.url) : null; onTap && onTap(); }} @@ -108,11 +108,11 @@ const LMDocument = React.memo( documentTitleStyle, ])} > - {item?.attachmentMeta?.name} + {item?.metaData?.name} {/* document page count text */} - {item?.attachmentMeta?.pageCount ? ( + {item?.metaData?.pageCount ? ( <> - {item?.attachmentMeta?.pageCount > 1 - ? `${item?.attachmentMeta?.pageCount} Pages` - : `${item?.attachmentMeta?.pageCount} Page`} + {item?.metaData?.pageCount > 1 + ? `${item?.metaData?.pageCount} Pages` + : `${item?.metaData?.pageCount} Page`} - {item.attachmentMeta.size - ? formatBytes(item.attachmentMeta.size) + {item.metaData?.size + ? formatBytes(item.metaData?.size) : ""} { if (!height || !width) { - console.log("NO DIMENSIONS"); Image.getSize( imageUrl, (width, height) => { - console.log(`Image dimensions: ${width}x${height}`); const ScreenWidth = Dimensions.get("window").width; const desiredAspectRatio = width > height ? 1.91 : 0.8; const heightCalculated = ScreenWidth * (1 / desiredAspectRatio); @@ -76,7 +74,7 @@ const LMImage = React.memo( source={{ uri: imageUrl }} onLoad={() => setLoading(false)} onError={() => setError(true)} - resizeMode={FastImage.resizeMode.contain} + resizeMode={boxFit ? boxFit : FastImage.resizeMode.contain} defaultSource={require("../../../assets/images/black_background.png")} style={StyleSheet.flatten([ imageStyle, diff --git a/likeminds-feed-reactnative-integration/components/LMMedia/LMImage/types.ts b/likeminds-feed-reactnative-integration/components/LMMedia/LMImage/types.ts index 453ed460..3d8b5a50 100644 --- a/likeminds-feed-reactnative-integration/components/LMMedia/LMImage/types.ts +++ b/likeminds-feed-reactnative-integration/components/LMMedia/LMImage/types.ts @@ -1,13 +1,14 @@ import { ReactNode } from "react"; -import { ImageStyle, ViewStyle } from "react-native"; +import { ViewStyle } from "react-native"; import { LMButtonProps } from "../../../uiComponents"; +import FastImage, {ImageStyle, ResizeMode} from "@d11/react-native-fast-image"; export interface LMImageProps { imageUrl: string; // url of the image to be displayed - height: number; // height of the image - width: number; // width of the image + height?: number; // height of the image + width?: number; // width of the image imageStyle?: ImageStyle; // this represents the style of the image - boxFit?: "center" | "contain" | "cover" | "repeat" | "stretch"; // this represents how the image should be fitted in its wrapper view + boxFit?: ResizeMode; // this represents how the image should be fitted in its wrapper view boxStyle?: ViewStyle; // this represents the style of the view that contains the image aspectRatio?: 0 | 0.1 | 0.2 | 0.3 | 0.4 | 0.5 | 0.6 | 0.7 | 0.8 | 0.9 | 1; // ratio of the image between 0 to 1 loaderWidget?: ReactNode; // this represents the loader component diff --git a/likeminds-feed-reactnative-integration/components/LMMedia/LMLinkPreview/index.tsx b/likeminds-feed-reactnative-integration/components/LMMedia/LMLinkPreview/index.tsx index 8ff8482f..5c9f1a43 100644 --- a/likeminds-feed-reactnative-integration/components/LMMedia/LMLinkPreview/index.tsx +++ b/likeminds-feed-reactnative-integration/components/LMMedia/LMLinkPreview/index.tsx @@ -29,7 +29,7 @@ const LMLinkPreview = React.memo( onCancel, cancelButton, }: LMLinkPreviewProps) => { - const previewAttachmentData = attachments[0].attachmentMeta?.ogTags; + const previewAttachmentData = attachments[0]?.metaData?.ogTags; return ( { @@ -24,7 +25,7 @@ const LMNotificationFeedItem = React.memo( const activityAttachments = activity.activityEntityData?.attachments; // storing the value of attachment type of the attachment if present const activityAttachmentType = activityAttachments - ? activityAttachments[0]?.attachmentType + ? activityAttachments[0]?.type : ""; //creating profile picture props as per customization const profilePictureStyle = notificationFeedStyle?.userImageStyles; @@ -121,8 +122,8 @@ const LMNotificationFeedItem = React.memo( {/* handles the gallery and document icon on profile picture */} {activityAttachments && // show gallery icon - (activityAttachmentType === IMAGE_ATTACHMENT_TYPE || - activityAttachmentType === VIDEO_ATTACHMENT_TYPE ? ( + (activityAttachmentType === AttachmentType.IMAGE || + activityAttachmentType === AttachmentType.VIDEO ? ( ) : // show document icon - activityAttachmentType === DOCUMENT_ATTACHMENT_TYPE ? ( + activityAttachmentType === AttachmentType.DOCUMENT ? ( { const attachmentLength = attachments.length; let noOfCustomViewAttachments = 0; for (const attachment of attachments) { - if (attachment.attachmentType.toString() === "5") { + if (attachment?.type.toString() === AttachmentType.CUSTOM) { noOfCustomViewAttachments++; } } @@ -135,8 +136,8 @@ const LMPostComponent = React.memo(() => { {/* post content */} {(post?.text || post?.attachments?.find( - (item) => item?.attachmentType === LINK_ATTACHMENT_TYPE - )?.attachmentType === LINK_ATTACHMENT_TYPE) && } + (item) => item?.type === AttachmentType.LINK + )?.type === AttachmentType.LINK) && } {/* post media */} {post?.attachments && post?.attachments.length > 0 && } diff --git a/likeminds-feed-reactnative-integration/components/LMPost/LMPostMedia/index.tsx b/likeminds-feed-reactnative-integration/components/LMPost/LMPostMedia/index.tsx index f72f1ebd..e798714a 100644 --- a/likeminds-feed-reactnative-integration/components/LMPost/LMPostMedia/index.tsx +++ b/likeminds-feed-reactnative-integration/components/LMPost/LMPostMedia/index.tsx @@ -26,6 +26,7 @@ import { } from "../../../constants/screenNames"; import STYLES from "../../../constants/Styles"; import LMPostPollView from "../../LMPoll/LMPostPollView"; +import { AttachmentType } from "@likeminds.community/feed-rn"; const LMPostMedia = React.memo(() => { const { post, mediaProps }: LMPostContextValues = useLMPostContext(); @@ -38,8 +39,8 @@ const LMPostMedia = React.memo(() => { let previousRoute = routes[routes?.length - 2]; // this handles the rendering of posts with single attachment const renderSingleAttachment = () => { - switch (post?.attachments && post?.attachments[0]?.attachmentType) { - case IMAGE_ATTACHMENT_TYPE: { + switch (post?.attachments && post?.attachments[0]?.type) { + case AttachmentType.IMAGE: { return ( { @@ -58,12 +59,12 @@ const LMPostMedia = React.memo(() => { }} > { ); } - case VIDEO_ATTACHMENT_TYPE: { + case AttachmentType.VIDEO: { return ( { @@ -91,12 +92,12 @@ const LMPostMedia = React.memo(() => { }} > { ); } - case DOCUMENT_ATTACHMENT_TYPE: { + case AttachmentType.DOCUMENT: { return ( /* @ts-ignore */ { /> ); } - case LINK_ATTACHMENT_TYPE: { + case AttachmentType.LINK: { return ( /* @ts-ignore */ { /> ); } - case POLL_ATTACHMENT_TYPE: { + case AttachmentType.POLL: { return ( /* @ts-ignore */ @@ -155,19 +156,19 @@ const LMPostMedia = React.memo(() => { }; // this functions gets the url of image and video for rendering in its components - const getUrl = (type: number) => { + const getUrl = (type: AttachmentType) => { const url = post?.attachments?.find( - (item) => item?.attachmentType === type + (item) => item?.type === type ); return url }; // this gets the required attachment type data to render in its component - const getData = (type: number, type2?: number) => { + const getData = (type: AttachmentType, type2?: AttachmentType) => { const data = post?.attachments && post?.attachments.filter( - (item) => item.attachmentType === type || item.attachmentType === type2 + (item) => item.type === type || item.type === type2 ); return data; }; @@ -183,12 +184,12 @@ const LMPostMedia = React.memo(() => { // this section renders if there are multiple attachments post?.attachments?.filter( (item) => - item?.attachmentType === IMAGE_ATTACHMENT_TYPE || - item?.attachmentType === VIDEO_ATTACHMENT_TYPE + item?.type === AttachmentType.IMAGE || + item?.type === AttachmentType.VIDEO ).length >= 2 ? ( { // this section renders if there are multiple attachments but the image or video attachments are less than 2 <> {post?.attachments?.find( - (item) => item?.attachmentType === IMAGE_ATTACHMENT_TYPE + (item) => item?.type === AttachmentType.IMAGE ) && ( )} {post?.attachments?.find( - (item) => item?.attachmentType === VIDEO_ATTACHMENT_TYPE + (item) => item?.type === AttachmentType.VIDEO ) && ( { /> )} {post?.attachments?.find( - (item) => item?.attachmentType === DOCUMENT_ATTACHMENT_TYPE + (item) => item?.type === AttachmentType.DOCUMENT ) && ( )} {post?.attachments?.every( - (item) => item?.attachmentType === LINK_ATTACHMENT_TYPE + (item) => item?.type === AttachmentType.LINK ) && ( state.notification.activitiesCount ); - const uploadingMediaAttachmentType = mediaAttachmemnts[0]?.attachmentType; - const uploadingMediaAttachment = mediaAttachmemnts[0]?.attachmentMeta.url; + const uploadingMediaAttachmentType = mediaAttachmemnts[0]?.type; + const uploadingMediaAttachment = mediaAttachmemnts[0]?.metaData.url; const [refreshing, setRefreshing] = useState(false); const [localRefresh, setLocalRefresh] = useState(false); @@ -285,11 +286,11 @@ export const UniversalFeedContextProvider = ({ const topics = temporaryPost?.topics; const mediaAttachmemnts = temporaryPost?.attachments?.filter(item => { - return item?.attachmentType == 1 || item?.attachmentType == 2 || item?.attachmentType == 3 + return item?.type == AttachmentType.IMAGE || item?.type == AttachmentType.VIDEO || item?.type == AttachmentType.DOCUMENT }) ?? [] const otherAttachments = temporaryPost?.attachments?.filter(item => { - return item?.attachmentType == 4 || item?.attachmentType == 5 || item?.attachmentType == 6 + return item?.type == AttachmentType.LINK || item?.type == AttachmentType.CUSTOM || item?.type == AttachmentType.POLL }) ?? [] let progressArray = new Array(mediaAttachmemnts?.length ?? 0).fill(0); @@ -302,20 +303,20 @@ export const UniversalFeedContextProvider = ({ // upload media to aws const uploadPromises = mediaAttachmemnts?.map( async (item: LMAttachmentViewData, index) => { - if (item?.attachmentType == 2) { + if (item?.type == AttachmentType.VIDEO) { if (RNVideoThumbnail) { await RNVideoThumbnail.createThumbnail({ - url: item?.attachmentMeta?.url, + url: item?.metaData?.url, timeStamp: 1000 }).then(async (response) => { const newName = - item.attachmentMeta.name && - item.attachmentMeta.name.substring( + item?.metaData?.name && + item?.metaData?.name.substring( 0, - item.attachmentMeta.name.lastIndexOf(".") + item.metaData?.name.lastIndexOf(".") ) + ".jpeg"; const thumbnailMeta = { - ...item.attachmentMeta, + ...item?.metaData, name: newName, format: "image/jpeg", thumbnailUrl: response?.path, @@ -325,24 +326,24 @@ export const UniversalFeedContextProvider = ({ memberData.userUniqueId, response?.path ); - item.attachmentMeta.thumbnailUrl = thumbnailRes.Location; + item.metaData.thumbnailUrl = thumbnailRes.Location; }) .catch((res) => { }); } else if (expoVideoThumbnail) { await expoVideoThumbnail.getThumbnailAsync( - item?.attachmentMeta?.url, + item?.metaData?.url, { time: 1000 } ).then(async (response) => { const newName = - item.attachmentMeta.name && - item.attachmentMeta.name.substring( + item.metaData.name && + item.metaData.name.substring( 0, - item.attachmentMeta.name.lastIndexOf(".") + item.metaData.name.lastIndexOf(".") ) + ".jpeg"; const thumbnailMeta = { - ...item.attachmentMeta, + ...item.metaData, name: newName, format: "image/jpeg", thumbnailUrl: response?.path, @@ -352,22 +353,22 @@ export const UniversalFeedContextProvider = ({ memberData.userUniqueId, response?.path ); - item.attachmentMeta.thumbnailUrl = thumbnailRes.Location; + item.metaData.thumbnailUrl = thumbnailRes.Location; }) .catch((res) => { }); } } return uploadFilesToAWS( - item.attachmentMeta, + item.metaData, memberData.userUniqueId, - item.attachmentMeta?.url, + item.metaData?.url, undefined, (progress) => { progressArray[index] = progress; // Update progress of this file updateTotalProgress(); // Recalculate total progress } ).then((res) => { - item.attachmentMeta.url = res.Location; + item.metaData.url = res.Location; return item; // Return the updated item }); } @@ -438,20 +439,20 @@ export const UniversalFeedContextProvider = ({ // upload media to aws const uploadPromises = mediaAttachmemnts?.map( async (item: LMAttachmentViewData, index) => { - if (item?.attachmentType == 2) { + if (item?.type == AttachmentType.VIDEO) { if (RNVideoThumbnail) { await RNVideoThumbnail.createThumbnail({ - url: item?.attachmentMeta?.url, + url: item?.metaData?.url, timeStamp: 1000 }).then(async (response) => { const newName = - item.attachmentMeta.name && - item.attachmentMeta.name.substring( + item.metaData.name && + item.metaData.name.substring( 0, - item.attachmentMeta.name.lastIndexOf(".") + item.metaData.name.lastIndexOf(".") ) + ".jpeg"; const thumbnailMeta = { - ...item.attachmentMeta, + ...item.metaData, name: newName, format: "image/jpeg", thumbnailUrl: response?.path, @@ -461,24 +462,24 @@ export const UniversalFeedContextProvider = ({ memberData.userUniqueId, response?.path ); - item.attachmentMeta.thumbnailUrl = thumbnailRes.Location; + item.metaData.thumbnailUrl = thumbnailRes.Location; }) .catch((res) => { }); } else if (expoVideoThumbnail) { await expoVideoThumbnail.getThumbnailAsync( - item?.attachmentMeta?.url, + item?.metaData?.url, { time: 1000 } ).then(async (response) => { const newName = - item.attachmentMeta.name && - item.attachmentMeta.name.substring( + item.metaData.name && + item.metaData.name.substring( 0, - item.attachmentMeta.name.lastIndexOf(".") + item.metaData.name.lastIndexOf(".") ) + ".jpeg"; const thumbnailMeta = { - ...item.attachmentMeta, + ...item.metaData, name: newName, format: "image/jpeg", thumbnailUrl: response?.path, @@ -488,22 +489,22 @@ export const UniversalFeedContextProvider = ({ memberData.userUniqueId, response?.path ); - item.attachmentMeta.thumbnailUrl = thumbnailRes.Location; + item.metaData.thumbnailUrl = thumbnailRes.Location; }) .catch((res) => { }); } } return uploadFilesToAWS( - item.attachmentMeta, + item.metaData, memberData.userUniqueId, - item.attachmentMeta?.url, + item.metaData?.url, undefined, (progress) => { progressArray[index] = progress; // Update progress of this file updateTotalProgress(); // Recalculate total progress } ).then((res) => { - item.attachmentMeta.url = res.Location; + item.metaData.url = res.Location; return item; // Return the updated item }); } @@ -522,7 +523,7 @@ export const UniversalFeedContextProvider = ({ ...updatedAttachments, ...linkAttachments, ...pollAttachment, - ...[{ attachmentType: 5, attachmentMeta: { meta: metaData } }], + ...[{ type: AttachmentType.CUSTOM, metaData: { meta: metaData } }], ] : [...updatedAttachments, ...linkAttachments, ...pollAttachment]; const addPostResponse: any = await dispatch( @@ -551,6 +552,12 @@ export const UniversalFeedContextProvider = ({ ); listRef.current?.scrollToIndex({ animated: true, index: 0 }); if (addPostResponse?.name == "Error") { + dispatch({ + type: SET_POST_UPLOADING_CREATE_SCREEN, + body: { + uploading: false + } + }) dispatch( showToastMessage({ isToast: true, @@ -667,7 +674,7 @@ export const UniversalFeedContextProvider = ({ setAddOptionInputField, reloadPost, }: AddPollOptionParams) { - const item = poll?.attachments[0]?.attachmentMeta; + const item = poll?.attachments[0]?.metaData; try { if (addOptionInputField.trim().length === 0) { return; @@ -723,7 +730,7 @@ export const UniversalFeedContextProvider = ({ reloadPost, setSelectedPolls, }: SetSelectedPollOptionsParams) { - const item = poll?.attachments[0]?.attachmentMeta; + const item = poll?.attachments[0]?.metaData; if (Date.now() > item?.expiryTime) { dispatch({ type: SHOW_TOAST, @@ -837,7 +844,7 @@ export const UniversalFeedContextProvider = ({ setSelectedPolls, stringManipulation, }: SubmitPollParams) { - const item = poll?.attachments[0]?.attachmentMeta; + const item = poll?.attachments[0]?.metaData; if (shouldShowSubmitPollButton) { try { const votes = selectedPolls?.map((itemIndex: any) => { diff --git a/likeminds-feed-reactnative-integration/context/userOnboardingContext.tsx b/likeminds-feed-reactnative-integration/context/userOnboardingContext.tsx index e7c2829a..8e4fa962 100644 --- a/likeminds-feed-reactnative-integration/context/userOnboardingContext.tsx +++ b/likeminds-feed-reactnative-integration/context/userOnboardingContext.tsx @@ -222,7 +222,7 @@ export default function UserOnboardingContextProvider({ const uploadProfileImage = async () => { let uuid = (memberData as any)?.userUniqueId; let formattedMedia = convertImageVideoMetaData([profileImage as any])[0] - ?.attachmentMeta; + ?.metaData; try { const url = await uploadFilesToAWS( formattedMedia, diff --git a/likeminds-feed-reactnative-integration/models/LMActivityViewData.ts b/likeminds-feed-reactnative-integration/models/LMActivityViewData.ts index 9e7621af..2b369f3b 100644 --- a/likeminds-feed-reactnative-integration/models/LMActivityViewData.ts +++ b/likeminds-feed-reactnative-integration/models/LMActivityViewData.ts @@ -1,3 +1,4 @@ +import { ActivityEntityType, ActivityActionType } from '@likeminds.community/feed-rn'; import {LMActivityEntityViewData} from './LMActivityEntityViewData'; import {LMUserViewData} from './LMUserViewData'; @@ -6,10 +7,10 @@ export interface LMActivityViewData { isRead: boolean; actionOn: string; actionBy: Array; - entityType: number; + entityType: ActivityEntityType; entityId: string; entityOwnerId: string; - action: number; + action: ActivityActionType; cta: string; activityText: string; activityEntityData?: LMActivityEntityViewData; diff --git a/likeminds-feed-reactnative-integration/models/LMAttachmentMetaViewData.ts b/likeminds-feed-reactnative-integration/models/LMAttachmentMetaViewData.ts index 4443036d..8a13673c 100644 --- a/likeminds-feed-reactnative-integration/models/LMAttachmentMetaViewData.ts +++ b/likeminds-feed-reactnative-integration/models/LMAttachmentMetaViewData.ts @@ -23,4 +23,6 @@ export interface LMAttachmentMetaViewData { multipleSelectNumber?: number; isAnonymous?: boolean; allowAddOption?: boolean; + height?: number; + width?: number; } diff --git a/likeminds-feed-reactnative-integration/models/LMAttachmentViewData.ts b/likeminds-feed-reactnative-integration/models/LMAttachmentViewData.ts index 044c90ca..1733aa17 100644 --- a/likeminds-feed-reactnative-integration/models/LMAttachmentViewData.ts +++ b/likeminds-feed-reactnative-integration/models/LMAttachmentViewData.ts @@ -1,7 +1,8 @@ +import { AttachmentType } from "@likeminds.community/feed-rn"; import { LMAttachmentMetaViewData } from "./LMAttachmentMetaViewData"; // data model for array of attachments export interface LMAttachmentViewData { - attachmentMeta: LMAttachmentMetaViewData; - attachmentType: number; + metaData: LMAttachmentMetaViewData; + type: AttachmentType; } diff --git a/likeminds-feed-reactnative-integration/models/LMPostViewData.ts b/likeminds-feed-reactnative-integration/models/LMPostViewData.ts index 07c911e8..a2798152 100644 --- a/likeminds-feed-reactnative-integration/models/LMPostViewData.ts +++ b/likeminds-feed-reactnative-integration/models/LMPostViewData.ts @@ -10,7 +10,7 @@ export interface LMPostViewData { id: string; attachments?: Array; commentsCount: number; - communityId: number; + communityId?: number; createdAt: number; isEdited: boolean; isLiked: boolean; diff --git a/likeminds-feed-reactnative-integration/viewDataModels/index.ts b/likeminds-feed-reactnative-integration/viewDataModels/index.ts index 0ba5143f..bfd96641 100644 --- a/likeminds-feed-reactnative-integration/viewDataModels/index.ts +++ b/likeminds-feed-reactnative-integration/viewDataModels/index.ts @@ -10,6 +10,7 @@ import { Reply, Like, GetPostLikes, + AttachmentType } from "@likeminds.community/feed-rn"; import { DocumentMetaData, @@ -103,7 +104,6 @@ export function convertToLMPostViewData( ? convertToLMAttachmentsViewData(post.attachments, widgets) : [], commentsCount: post.commentsCount, - communityId: post.communityId, createdAt: post.createdAt, isEdited: post.isEdited, isLiked: post.isLiked, @@ -143,11 +143,11 @@ export function convertToLMAttachmentsViewData( ): LMAttachmentViewData[] { return data?.map((item: Attachment) => { return { - attachmentMeta: convertToLMAttachmentMetaViewData( - item.attachmentMeta, + metaData: convertToLMAttachmentMetaViewData( + item?.metaData, widgets ), - attachmentType: item.attachmentType, + type: item?.type, }; }); } @@ -161,14 +161,14 @@ export function convertToLMAttachmentMetaViewData( widgets ): LMAttachmentMetaViewData { const attachmentMetaData: LMAttachmentMetaViewData = { - duration: data.duration, - format: data.format, - name: data.name, - ogTags: data.ogTags ? convertToLMOgTagsViewData(data.ogTags) : undefined, - pageCount: data.pageCount, - size: data.size, - url: data.url, - thumbnailUrl: data.thumbnailUrl, + duration: data?.duration, + format: data?.format, + name: data?.name, + ogTags: data?.ogTags ? convertToLMOgTagsViewData(data.ogTags) : undefined, + pageCount: data?.pageCount, + size: data?.size, + url: data?.url, + thumbnailUrl: data?.thumbnailUrl, height: data?.height, width: data?.width, ...convertToLMPollViewData(data?.entityId ? data?.entityId : "", widgets), @@ -324,7 +324,7 @@ export function convertImageVideoMetaData( const convertedImageVideoMetaData = data?.map((item) => { console.log(item) return { - attachmentMeta: { + metaData: { entityId: "", format: item?.type, name: item?.fileName, @@ -341,9 +341,9 @@ export function convertImageVideoMetaData( height: item?.height, width: item?.width }, - attachmentType: item?.duration - ? VIDEO_ATTACHMENT_TYPE - : IMAGE_ATTACHMENT_TYPE, // You need to specify the attachment type. + type: item?.duration + ? AttachmentType.VIDEO + : AttachmentType.IMAGE, // You need to specify the attachment type. }; }); return convertedImageVideoMetaData; @@ -358,7 +358,7 @@ export function convertDocumentMetaData( ): LMAttachmentViewData[] { const convertedDocumentMetaData = data?.map((item: any) => { return { - attachmentMeta: { + metaData: { entityId: "", format: item?.type ?? item?.mimeType, name: item?.name, @@ -373,7 +373,7 @@ export function convertDocumentMetaData( pageCount: 0, url: item?.uri, }, - attachmentType: DOCUMENT_ATTACHMENT_TYPE, // You need to specify the attachment type. + type: AttachmentType.DOCUMENT, // You need to specify the attachment type. }; }); return convertedDocumentMetaData; @@ -388,7 +388,7 @@ export function convertLinkMetaData( ): LMAttachmentViewData[] { const convertedLinkMetaData = data?.map((item) => { return { - attachmentMeta: { + metaData: { entityId: "", format: "", name: "", @@ -401,9 +401,9 @@ export function convertLinkMetaData( size: 0, duration: 0, pageCount: 0, - url: "", + url: item?.url ?? "", }, - attachmentType: LINK_ATTACHMENT_TYPE, // You need to specify the attachment type. + type: AttachmentType.LINK, // You need to specify the attachment type. }; }); return convertedLinkMetaData; @@ -426,7 +426,7 @@ export function convertPollOptionsMetaData( */ export function convertPollMetaData(item: any): LMAttachmentViewData { return { - attachmentMeta: { + metaData: { entityId: item?.id ? item?.id : "", format: "", name: "", @@ -451,7 +451,7 @@ export function convertPollMetaData(item: any): LMAttachmentViewData { isAnonymous: item?.isAnonymous, allowAddOption: item?.allowAddOption, }, - attachmentType: POLL_ATTACHMENT_TYPE, // You need to specify the attachment type. + type: AttachmentType.POLL, // You need to specify the attachment type. }; } @@ -577,7 +577,6 @@ export function convertToTemporaryPost( tempId: `-${Date.now()}`, attachments: attachment, commentsCount: 0, - communityId: 0, createdAt: Date.now(), heading: heading, isEdited: false, @@ -589,7 +588,6 @@ export function convertToTemporaryPost( text: text, topics: topics, updatedAt: 0, - userId: "", uuid: "", isRepost: false, repostCount: 0, From 6d7ab52ac44904134cc33a38c776d80d7dcd0716 Mon Sep 17 00:00:00 2001 From: Usman salim Date: Tue, 6 May 2025 00:01:50 +0530 Subject: [PATCH 04/41] updated key for attachment --- .../components/LMCreatePost/LMCreatePostHeader.tsx | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/likeminds-feed-reactnative-integration/components/LMCreatePost/LMCreatePostHeader.tsx b/likeminds-feed-reactnative-integration/components/LMCreatePost/LMCreatePostHeader.tsx index 7e335df6..e903ff4b 100644 --- a/likeminds-feed-reactnative-integration/components/LMCreatePost/LMCreatePostHeader.tsx +++ b/likeminds-feed-reactnative-integration/components/LMCreatePost/LMCreatePostHeader.tsx @@ -32,6 +32,7 @@ import pluralizeOrCapitalize from "../../utils/variables"; import { WordAction } from "../../enums/Variables"; import useDebounceCallback from "../../hooks/useDebounceCallback" import LMLoader from "../../components/LMLoader"; +import { AttachmentType } from "@likeminds.community/feed-rn"; const LMCreatePostHeader = () => { const dispatch = useAppDispatch(); @@ -84,7 +85,7 @@ const LMCreatePostHeader = () => { const map: Map = new Map(); const taggedUsers: any = userTaggingDecoder(postContentText); - const ogTags = formattedLinkAttachments[0]?.attachmentMeta?.ogTags; + const ogTags = formattedLinkAttachments[0]?.metaData?.ogTags; // To fire user tagged analytics event if (taggedUsers?.length > 0) { @@ -109,12 +110,12 @@ const LMCreatePostHeader = () => { let videoCount = 0; let documentCount = 0; for (let i = 0; i < allAttachment.length; i++) { - if (allAttachment[i].attachmentType === IMAGE_ATTACHMENT_TYPE) { + if (allAttachment[i].type === AttachmentType.IMAGE) { imageCount++; - } else if (allAttachment[i].attachmentType === VIDEO_ATTACHMENT_TYPE) { + } else if (allAttachment[i].type === AttachmentType.VIDEO) { videoCount++; } else if ( - allAttachment[i].attachmentType === DOCUMENT_ATTACHMENT_TYPE + allAttachment[i].type === AttachmentType.DOCUMENT ) { documentCount++; } @@ -255,7 +256,7 @@ const LMCreatePostHeader = () => { ? styles.enabledOpacity : styles.disabledOpacity } - onPress={debouncedHandleOnPress} + onPress={handleOnPress} > {customCreatePostScreenHeader?.rightComponent ? ( customCreatePostScreenHeader?.rightComponent From 3b048a0f0dbe94e0f8014e863bc01fd224f344f6 Mon Sep 17 00:00:00 2001 From: Usman salim Date: Sat, 10 May 2025 01:54:53 +0530 Subject: [PATCH 05/41] fixed pagination in replies and formatted code --- .../context/postDetailContext.tsx | 29 ++++++++++++------- .../customModals/ReportModal/index.tsx | 15 +++++----- .../utils/commentResponseModelConvertor.ts | 2 +- 3 files changed, 28 insertions(+), 18 deletions(-) diff --git a/likeminds-feed-reactnative-integration/context/postDetailContext.tsx b/likeminds-feed-reactnative-integration/context/postDetailContext.tsx index 8b09ce03..a998113a 100644 --- a/likeminds-feed-reactnative-integration/context/postDetailContext.tsx +++ b/likeminds-feed-reactnative-integration/context/postDetailContext.tsx @@ -328,9 +328,9 @@ export const PostDetailContextProvider = ({ const [overlayMenuType, setOverlayMenuType] = useState(""); const [isPaginationStopped, setIsPaginationStopped] = useState(false); const [showLoader, setShowLoader] = useState(true); - const [commentOnFocus,setCommentOnFocus] = useState(); + const [commentOnFocus, setCommentOnFocus] = useState(); const loaderStyle = STYLES.$LOADER_STYLE - const [repliesArrayUnderComments,setRepliesArrayUnderComments] = useState([]) + const [repliesArrayUnderComments, setRepliesArrayUnderComments] = useState([]) // this function is executed on pull to refresh const onRefresh = async () => { @@ -443,7 +443,7 @@ export const PostDetailContextProvider = ({ postId: id, }; - if(postDetail?.isHidden) { + if (postDetail?.isHidden) { dispatch( showToastMessage({ isToast: true, @@ -452,7 +452,7 @@ export const PostDetailContextProvider = ({ ); return undefined } - + const pinPostResponse = await dispatch( pinPost(PinPostRequest.builder().setPostId(payload.postId).build(), false) ); @@ -489,9 +489,9 @@ export const PostDetailContextProvider = ({ const isPostHidden = (postDetail as LMPostViewData)?.menuItems?.find((menuItem) => menuItem.id == 13); await dispatch(hidePost( HidePostRequest. - builder() - .setPostId(postId) - .build(), + builder() + .setPostId(postId) + .build(), false )) dispatch({ @@ -515,7 +515,7 @@ export const PostDetailContextProvider = ({ } } - + // this function returns the id of the item selected from menu list and handles further functionalities accordingly for post const onMenuItemSelect = ( @@ -655,12 +655,21 @@ export const PostDetailContextProvider = ({ false ) ); + let replies: any = [] + setRepliesArrayUnderComments((previousResponse) => { + replies = [ + ...commentResponseModelConvertor(commentsRepliesResponse)?.replies, ...previousResponse + ] + return replies + }) + console.log({ + replies + }) // sets the api response in the callback function repliesResponseCallback( postDetail?.replies && - commentResponseModelConvertor(commentsRepliesResponse)?.replies + replies ); - setRepliesArrayUnderComments((previousResponse) => [commentsRepliesResponse,...previousResponse]) return commentsRepliesResponse; }; diff --git a/likeminds-feed-reactnative-integration/customModals/ReportModal/index.tsx b/likeminds-feed-reactnative-integration/customModals/ReportModal/index.tsx index 997b6815..842d18b4 100644 --- a/likeminds-feed-reactnative-integration/customModals/ReportModal/index.tsx +++ b/likeminds-feed-reactnative-integration/customModals/ReportModal/index.tsx @@ -46,11 +46,12 @@ import { usePostDetailContext } from "../../context"; import pluralizeOrCapitalize from "../../utils/variables"; import { WordAction } from "../../enums/Variables"; import { CommunityConfigs } from "../../communityConfigs"; +import {ReportEntityType} from "@likeminds.community/feed-js" // interface for post report api request interface ReportRequest { entityId: string; - entityType: number; + entityType: ReportEntityType; reason: string; tagId: number; uuid: string; @@ -106,11 +107,11 @@ const ReportModal = ({ // this function calls the get report tags api for reporting a post const fetchReportTags = async () => { const payload = { - type: REPORT_TAGS_TYPE, // type 3 for report tags + type: ReportEntityType.POST, // type 3 for report tags }; const reportTagsResponse = await dispatch( getReportTags( - GetReportTagsRequest.builder().setType(payload.type).build(), + GetReportTagsRequest.builder().setEntityType(payload.type).build(), false ) ); @@ -143,7 +144,7 @@ const ReportModal = ({ .setEntityType(payload.entityType) .setReason(payload.reason) .setTagId(payload.tagId) - .setUuid(payload.uuid) + .setAccusedUUID(payload.uuid) .build(); const postReportResponse = await Client.myClient.postReport( postReportRequest @@ -343,10 +344,10 @@ const ReportModal = ({ : "", entityType: reportType === POST_TYPE - ? POST_REPORT_ENTITY_TYPE + ? ReportEntityType.POST : reportType === COMMENT_TYPE - ? COMMENT_REPORT_ENTITY_TYPE - : REPLY_REPORT_ENTITY_TYPE, // different entityType value for post/comment/reply + ? ReportEntityType.COMMENT + : ReportEntityType.REPLY, // different entityType value for post/comment/reply reason: otherReason, tagId: selectedId, uuid: diff --git a/likeminds-feed-reactnative-integration/utils/commentResponseModelConvertor.ts b/likeminds-feed-reactnative-integration/utils/commentResponseModelConvertor.ts index 8770e84e..60417682 100644 --- a/likeminds-feed-reactnative-integration/utils/commentResponseModelConvertor.ts +++ b/likeminds-feed-reactnative-integration/utils/commentResponseModelConvertor.ts @@ -17,6 +17,6 @@ export const commentResponseModelConvertor = (response) => { }); // Modify the comment object to include the replies array - comment.replies = repliesArray; + comment.replies = repliesArray?.length > 0 ? repliesArray : []; return comment; }; From 29fa1f2b016ac869f22f69cef09963a4c52b5088 Mon Sep 17 00:00:00 2001 From: Usman salim Date: Tue, 13 May 2025 14:45:16 +0530 Subject: [PATCH 06/41] updated keys --- .../components/LMMedia/LMCarousel/index.tsx | 4 ++-- .../LMMedia/LMCreatePostCarousel/index.tsx | 5 +++-- .../screens/carouselScreen/index.tsx | 17 +++++++++-------- 3 files changed, 14 insertions(+), 12 deletions(-) diff --git a/likeminds-feed-reactnative-integration/components/LMMedia/LMCarousel/index.tsx b/likeminds-feed-reactnative-integration/components/LMMedia/LMCarousel/index.tsx index bad0e710..ae2b2720 100644 --- a/likeminds-feed-reactnative-integration/components/LMMedia/LMCarousel/index.tsx +++ b/likeminds-feed-reactnative-integration/components/LMMedia/LMCarousel/index.tsx @@ -176,8 +176,8 @@ const LMCarousel = React.memo( > true} > {/* this section render image */} - {item?.attachmentType === IMAGE_ATTACHMENT_TYPE && ( + {item?.type === AttachmentType.IMAGE && ( { navigation.navigate(CAROUSEL_SCREEN, { @@ -134,7 +135,7 @@ const LMCreatePostCarousel = React.memo( )} {/* this section render video */} - {item?.attachmentType === VIDEO_ATTACHMENT_TYPE && ( + {item?.type === AttachmentType.VIDEO && ( { navigation.navigate(CAROUSEL_SCREEN, { diff --git a/likeminds-feed-reactnative-integration/screens/carouselScreen/index.tsx b/likeminds-feed-reactnative-integration/screens/carouselScreen/index.tsx index df3ced57..6bc9faa6 100644 --- a/likeminds-feed-reactnative-integration/screens/carouselScreen/index.tsx +++ b/likeminds-feed-reactnative-integration/screens/carouselScreen/index.tsx @@ -29,6 +29,7 @@ import { useAppDispatch } from "../../store/store"; import LMVideoPlayer from "../../components/LMVideoPlayer"; import ImageViewer from "react-native-image-zoom-viewer"; import { CallBack } from "../../callBacks/callBackClass"; +import { AttachmentType } from "@likeminds.community/feed-js"; const CarouselScreen = ({ navigation, route }: any) => { const dispatch = useAppDispatch(); @@ -37,7 +38,7 @@ const CarouselScreen = ({ navigation, route }: any) => { const data = dataObject?.attachments; const attachmentsUrls = data?.map((item) => ({ - ["url"]: item.attachmentMeta.url, + ["url"]: item?.metaData?.url, })); const [currentIndex, setCurrentIndex] = useState(0); @@ -54,9 +55,9 @@ const CarouselScreen = ({ navigation, route }: any) => { let imageCount = 0; let videoCount = 0; for (let i = 0; i < data.length; i++) { - if (data[i].attachmentType == VIDEO_ATTACHMENT_TYPE) { + if (data[i].type == AttachmentType.VIDEO) { videoCount++; - } else if (data[i].attachmentType === IMAGE_ATTACHMENT_TYPE) { + } else if (data[i].type === AttachmentType.IMAGE) { imageCount++; } } @@ -226,7 +227,7 @@ const CarouselScreen = ({ navigation, route }: any) => { justifyContent: "center", }} > - {item?.attachmentType === IMAGE_ATTACHMENT_TYPE ? ( + {item?.type === AttachmentType.IMAGE ? ( { ); }} /> - ) : item?.attachmentType === VIDEO_ATTACHMENT_TYPE && + ) : item?.type === AttachmentType.VIDEO && index === currentIndex ? ( - ) : item?.attachmentType === VIDEO_ATTACHMENT_TYPE && + ) : item?.type === AttachmentType.VIDEO && index !== currentIndex ? ( ) : null} From f66f56fb85349695b6e6f44d306d3255da1349d0 Mon Sep 17 00:00:00 2001 From: Usman salim Date: Wed, 14 May 2025 22:38:40 +0530 Subject: [PATCH 07/41] added flashlist and fixed video playing on scroll --- .../context/postListContext.tsx | 6 ++--- .../context/searchedPostListContext.tsx | 4 ++-- .../context/universalFeedContext.tsx | 17 ++++++++++++++ .../screens/postsList/index.tsx | 22 +++++++++++++----- .../screens/searchFeed/index.tsx | 23 +++++++++++-------- 5 files changed, 51 insertions(+), 21 deletions(-) diff --git a/likeminds-feed-reactnative-integration/context/postListContext.tsx b/likeminds-feed-reactnative-integration/context/postListContext.tsx index 0047101f..9f74a5a8 100644 --- a/likeminds-feed-reactnative-integration/context/postListContext.tsx +++ b/likeminds-feed-reactnative-integration/context/postListContext.tsx @@ -203,12 +203,12 @@ export const PostListContextProvider = ({ // handles the auto play/pause of video in viewport useEffect(() => { - if (postInViewport && isFocus) { + if (isFocus) { dispatch({ type: SET_CURRENT_ID_OF_VIDEO, - body: { currentIdOfVideo: postInViewport }, + body: { currentIdOfVideo: postInViewport ?? "" }, }); - dispatch(autoPlayPostVideo(postInViewport)); + dispatch(autoPlayPostVideo(postInViewport ?? "")); } }, [postInViewport, isFocus]); diff --git a/likeminds-feed-reactnative-integration/context/searchedPostListContext.tsx b/likeminds-feed-reactnative-integration/context/searchedPostListContext.tsx index 4212cede..64babb5c 100644 --- a/likeminds-feed-reactnative-integration/context/searchedPostListContext.tsx +++ b/likeminds-feed-reactnative-integration/context/searchedPostListContext.tsx @@ -194,9 +194,9 @@ export const SearchedPostListContextProvider = ({ if (postInViewport && isFocus) { dispatch({ type: SET_CURRENT_ID_OF_VIDEO, - body: { currentIdOfVideo: postInViewport }, + body: { currentIdOfVideo: postInViewport ?? "" }, }); - dispatch(autoPlayPostVideo(postInViewport)); + dispatch(autoPlayPostVideo(postInViewport ?? "")); } }, [postInViewport, isFocus]); diff --git a/likeminds-feed-reactnative-integration/context/universalFeedContext.tsx b/likeminds-feed-reactnative-integration/context/universalFeedContext.tsx index 82992de5..9c09481c 100644 --- a/likeminds-feed-reactnative-integration/context/universalFeedContext.tsx +++ b/likeminds-feed-reactnative-integration/context/universalFeedContext.tsx @@ -64,6 +64,7 @@ import { Client } from "../client"; import { PollMultiSelectState, PollType } from "../enums/Poll"; import { REFRESH_FROM_ONBOARDING_SCREEN, + SET_CURRENT_ID_OF_VIDEO, SET_FLOW_TO_CREATE_POST_SCREEN, SET_PAUSED_STATUS, SET_POST_UPLOADING_CREATE_SCREEN, @@ -396,6 +397,12 @@ export const UniversalFeedContextProvider = ({ setTemporaryPost(null); listRef.current?.scrollToIndex({ animated: true, index: 0 }); if (addPostResponse?.name == "Error") { + dispatch({ + type: SET_POST_UPLOADING_CREATE_SCREEN, + body: { + uploading: false + } + }) dispatch( showToastMessage({ isToast: true, @@ -404,6 +411,11 @@ export const UniversalFeedContextProvider = ({ ); return addPostResponse; } + dispatch({ + type: SET_CURRENT_ID_OF_VIDEO, + body: { currentIdOfVideo: addPostResponse?.post?.id ?? "" }, + }); + dispatch(autoPlayPostVideo(addPostResponse?.post?.id)); dispatch( showToastMessage({ isToast: true, @@ -566,6 +578,11 @@ export const UniversalFeedContextProvider = ({ ); return addPostResponse; } + dispatch({ + type: SET_CURRENT_ID_OF_VIDEO, + body: { currentIdOfVideo: addPostResponse?.post?.id ?? "" }, + }); + dispatch(autoPlayPostVideo(addPostResponse?.post?.id)); dispatch( showToastMessage({ isToast: true, diff --git a/likeminds-feed-reactnative-integration/screens/postsList/index.tsx b/likeminds-feed-reactnative-integration/screens/postsList/index.tsx index bd084db8..cc128615 100644 --- a/likeminds-feed-reactnative-integration/screens/postsList/index.tsx +++ b/likeminds-feed-reactnative-integration/screens/postsList/index.tsx @@ -1,4 +1,4 @@ -import React, { useCallback, useEffect, useRef } from "react"; +import React, { useCallback, useEffect, useMemo, useRef } from "react"; import { FlatList, Platform, @@ -6,6 +6,7 @@ import { Text, TouchableOpacity, View, + Dimensions } from "react-native"; import { styles } from "./styles"; import { @@ -56,6 +57,7 @@ import { useIsFocused } from "@react-navigation/native"; import { useLMFeed } from "../../lmFeedProvider"; import { debounce } from "../../utils/debounce"; import { FeedType } from "../../enums/FeedType"; +import FlashList from "@shopify/flash-list/src/FlashList"; const PostsList = ({ route, @@ -348,8 +350,11 @@ const PostsListComponent = ({ } }, [refreshFromOnboardingScreen]); + const screenHeight = useMemo(() => Dimensions.get("window").height, []) + // Detect viewable posts const onViewableItemsChanged = ({ viewableItems }) => { + if (!viewableItems) return if (feedType === FeedType.PERSONALISED_FEED) { if (!hasFetched.current) { const visiblePostIds = viewableItems.map((item) => item.item.id); @@ -387,10 +392,16 @@ const PostsListComponent = ({ <> {!feedFetching ? ( feedData?.length > 0 ? ( - } data={feedData} + extraData={[]} renderItem={renderItem} onEndReachedThreshold={0.3} onEndReached={handleLoadMore} @@ -408,10 +420,8 @@ const PostsListComponent = ({ ListFooterComponent={renderLoader} onViewableItemsChanged={({ changed, viewableItems }) => { if (changed) { - if (viewableItems) { - setPostInViewport(viewableItems?.[0]?.item?.id); - onViewableItemsChanged({ viewableItems }); - } + setPostInViewport(viewableItems?.[0]?.item?.id); + onViewableItemsChanged({ viewableItems }); } }} viewabilityConfig={{ viewAreaCoveragePercentThreshold: 60 }} diff --git a/likeminds-feed-reactnative-integration/screens/searchFeed/index.tsx b/likeminds-feed-reactnative-integration/screens/searchFeed/index.tsx index eb15cb7c..172dba94 100644 --- a/likeminds-feed-reactnative-integration/screens/searchFeed/index.tsx +++ b/likeminds-feed-reactnative-integration/screens/searchFeed/index.tsx @@ -1,8 +1,8 @@ -import { SafeAreaView, StyleSheet, Text, View, TouchableOpacity, RefreshControl, FlatList, ActivityIndicator, Platform } from 'react-native' +import { SafeAreaView, StyleSheet, Text, View, TouchableOpacity, RefreshControl, FlatList, ActivityIndicator, Dimensions, Platform } from 'react-native' import { NativeStackNavigationProp } from "@react-navigation/native-stack"; import { LMMenuItemsViewData, RootStackParamList } from "../../models"; import { SearchFeedCustomisableMethodsContextProvider } from '../../context/searchFeedCallbacksContext'; -import React, { useCallback, useEffect, useLayoutEffect, useState, ReactNode } from 'react' +import React, { useCallback, useEffect, useLayoutEffect, useState, ReactNode, useMemo } from 'react' import STYLES from "../../constants/Styles" import { LMHeader, LMLoader, LMPost } from '../../components' import { LMIcon, LMInputText, LMText } from '../../uiComponents' @@ -29,6 +29,7 @@ import { useSearchFeedCustomisableMethodsContext } from '../../context/searchFee import { SearchedPostListContextValues, useSearchedPostListContext } from '../../context/searchedPostListContext' import { styles } from "./styles" import { PollCustomisableMethodsContextProvider } from '../../context/pollCustomisableCallback'; +import FlashList from '@shopify/flash-list/src/FlashList'; interface SearchFeedProps { children?: React.ReactNode; @@ -200,6 +201,8 @@ const LMFeedSearchScreenComponent = ({ hideTopicsView, } = useSearchFeedCustomisableMethodsContext(); + const screenHeight = useMemo(() => Dimensions.get("window").height, []) + // this function returns the id of the item selected from menu list and handles further functionalities accordingly const onMenuItemSelect = ( postId: string, @@ -429,25 +432,25 @@ const LMFeedSearchScreenComponent = ({ - { if (feedFetching) { return ( - + ) } else if (searchPostQuery?.length > 0 && !feedFetching && searchFeedData?.length == 0) { return displayEmptyComponent && ( - + From 78b712f2d2d5fc962ae1b5939393a9d0c162618f Mon Sep 17 00:00:00 2001 From: Usman salim Date: Wed, 14 May 2025 22:39:15 +0530 Subject: [PATCH 08/41] added default height and width --- .../components/LMMedia/LMImage/index.tsx | 6 +++--- .../components/LMMedia/LMVideo/index.tsx | 3 +-- .../components/LMPost/LMPostMedia/index.tsx | 4 ++++ 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/likeminds-feed-reactnative-integration/components/LMMedia/LMImage/index.tsx b/likeminds-feed-reactnative-integration/components/LMMedia/LMImage/index.tsx index 125b9d16..414661e2 100644 --- a/likeminds-feed-reactnative-integration/components/LMMedia/LMImage/index.tsx +++ b/likeminds-feed-reactnative-integration/components/LMMedia/LMImage/index.tsx @@ -24,7 +24,7 @@ const LMImage = React.memo( }: LMImageProps) => { const [loading, setLoading] = useState(true); const [error, setError] = useState(false); - const [heightCalculated, setHeightCalculated] = useState(400); + const [heightCalculated, setHeightCalculated] = useState(height ?? 400); const [desiredAspectRatio, setDesiredAspectRatio] = useState(0); useLayoutEffect(() => { @@ -36,7 +36,7 @@ const LMImage = React.memo( const ScreenWidth = Dimensions.get("window").width; const desiredAspectRatio = width > height ? 1.91 : 0.8; const heightCalculated = ScreenWidth * (1 / desiredAspectRatio); - + setHeightCalculated(heightCalculated); setDesiredAspectRatio(desiredAspectRatio); }, @@ -48,7 +48,7 @@ const LMImage = React.memo( return; } else { - + const ScreenWidth = Dimensions.get("window").width; const desiredAspectRatio = width > height ? 1.91 : 0.8; const heightCalculated = ScreenWidth * (1 / desiredAspectRatio); diff --git a/likeminds-feed-reactnative-integration/components/LMMedia/LMVideo/index.tsx b/likeminds-feed-reactnative-integration/components/LMMedia/LMVideo/index.tsx index 63eee4c4..5966d254 100644 --- a/likeminds-feed-reactnative-integration/components/LMMedia/LMVideo/index.tsx +++ b/likeminds-feed-reactnative-integration/components/LMMedia/LMVideo/index.tsx @@ -67,7 +67,7 @@ const LMVideo = React.memo( const player = useRef(null); const [paused, setPaused] = useState(true); const [dimensions, setDimensions] = useState({ width: 0, height: 0 }); - const [heightCalculated, setHeightCalculated] = useState(400); + const [heightCalculated, setHeightCalculated] = useState(height ?? 400); const [desiredAspectRatio, setDesiredAspectRatio] = useState(0); const currentVideoId = useAppSelector( @@ -119,7 +119,6 @@ const LMVideo = React.memo( setDesiredAspectRatio(desiredAspectRatio); } else { - const ScreenWidth = Dimensions.get("window").width; const desiredAspectRatio = width > height ? 1.91 : 0.8; const heightCalculated = ScreenWidth * (1 / desiredAspectRatio); diff --git a/likeminds-feed-reactnative-integration/components/LMPost/LMPostMedia/index.tsx b/likeminds-feed-reactnative-integration/components/LMPost/LMPostMedia/index.tsx index e798714a..2764965c 100644 --- a/likeminds-feed-reactnative-integration/components/LMPost/LMPostMedia/index.tsx +++ b/likeminds-feed-reactnative-integration/components/LMPost/LMPostMedia/index.tsx @@ -211,6 +211,8 @@ const LMPostMedia = React.memo(() => { ) && ( )} @@ -219,6 +221,8 @@ const LMPostMedia = React.memo(() => { ) && ( Date: Thu, 15 May 2025 16:44:15 +0530 Subject: [PATCH 09/41] added retry for video crash --- .../components/LMMedia/LMVideo/index.tsx | 21 +++++++++++++++++-- .../screens/postsList/index.tsx | 4 ++-- .../screens/searchFeed/index.tsx | 4 ++-- social-feed/App.tsx | 2 +- 4 files changed, 24 insertions(+), 7 deletions(-) diff --git a/likeminds-feed-reactnative-integration/components/LMMedia/LMVideo/index.tsx b/likeminds-feed-reactnative-integration/components/LMMedia/LMVideo/index.tsx index 5966d254..e49f8a07 100644 --- a/likeminds-feed-reactnative-integration/components/LMMedia/LMVideo/index.tsx +++ b/likeminds-feed-reactnative-integration/components/LMMedia/LMVideo/index.tsx @@ -69,6 +69,9 @@ const LMVideo = React.memo( const [dimensions, setDimensions] = useState({ width: 0, height: 0 }); const [heightCalculated, setHeightCalculated] = useState(height ?? 400); const [desiredAspectRatio, setDesiredAspectRatio] = useState(0); + + const [retryKey, setRetryKey] = useState(0); + const [retryCount, setRetryCount] = useState(0); const currentVideoId = useAppSelector( (state) => state.feed.autoPlayVideoPostId @@ -109,6 +112,18 @@ const LMVideo = React.memo( setDimensions({ width, height }); }; + const handleError = (error) => { + console.warn('Video playback error:', error); + setError(true); + // Retry after a delay + if (retryCount < 3) { + setTimeout(() => { + setRetryKey(prev => prev + 1); + setRetryCount(prev => prev + 1); + }, 2000); + } + }; + useEffect(() => { if ( (!height || !width) && (dimensions?.height > 0 && dimensions?.width > 0)) { @@ -157,7 +172,7 @@ const LMVideo = React.memo( { setError(false); onLoad(data); @@ -165,7 +180,9 @@ const LMVideo = React.memo( setLoading(false); }} onProgress={() => setError(false)} - onError={() => setError(true)} + onError={(error) => { + handleError(error) + }} repeat={ Platform.OS === "ios" ? (looping ? looping : true) : false } diff --git a/likeminds-feed-reactnative-integration/screens/postsList/index.tsx b/likeminds-feed-reactnative-integration/screens/postsList/index.tsx index cc128615..62dcf6e0 100644 --- a/likeminds-feed-reactnative-integration/screens/postsList/index.tsx +++ b/likeminds-feed-reactnative-integration/screens/postsList/index.tsx @@ -401,7 +401,7 @@ const PostsListComponent = ({ (screenHeight)/3 } disableIntervalMomentum={true} - decelerationRate={Platform.OS == "android" ? 0.96 : 0.9956} + decelerationRate={Platform.OS == "android" ? 0.96 : 0.994} refreshControl={ } data={feedData} - extraData={[]} + extraData={[feedData]} renderItem={renderItem} onEndReachedThreshold={0.3} onEndReached={handleLoadMore} diff --git a/likeminds-feed-reactnative-integration/screens/searchFeed/index.tsx b/likeminds-feed-reactnative-integration/screens/searchFeed/index.tsx index 172dba94..bc9b54a3 100644 --- a/likeminds-feed-reactnative-integration/screens/searchFeed/index.tsx +++ b/likeminds-feed-reactnative-integration/screens/searchFeed/index.tsx @@ -434,12 +434,12 @@ const LMFeedSearchScreenComponent = ({ { if (feedFetching) { diff --git a/social-feed/App.tsx b/social-feed/App.tsx index a0e1e51d..5514965c 100644 --- a/social-feed/App.tsx +++ b/social-feed/App.tsx @@ -326,7 +326,7 @@ const App = () => { Date: Thu, 15 May 2025 16:45:51 +0530 Subject: [PATCH 10/41] added flashlist --- likeminds-feed-reactnative-integration/package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/likeminds-feed-reactnative-integration/package.json b/likeminds-feed-reactnative-integration/package.json index 72cef49e..821c0058 100644 --- a/likeminds-feed-reactnative-integration/package.json +++ b/likeminds-feed-reactnative-integration/package.json @@ -60,7 +60,8 @@ "expo-image-picker": ">=16.0.0", "expo-video-thumbnails": ">=9.0.0", "@react-native-documents/picker": ">=10.1.1", - "@react-native-documents/viewer": ">=1.0.1" + "@react-native-documents/viewer": ">=1.0.1", + "@shopify/flash-list": ">=1.8.0" }, "peerDependenciesMeta": { "react-native-document-picker": { From d45280a6fd8bb32a2f8a726fe2ce5497eccfebf5 Mon Sep 17 00:00:00 2001 From: Usman salim Date: Thu, 15 May 2025 16:58:56 +0530 Subject: [PATCH 11/41] updated imports --- .../components/LMMedia/LMCreatePostCarousel/index.tsx | 2 +- .../customModals/DeleteReasonsModal/index.tsx | 4 ++-- .../customModals/ReportModal/index.tsx | 2 +- .../screens/carouselScreen/index.tsx | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/likeminds-feed-reactnative-integration/components/LMMedia/LMCreatePostCarousel/index.tsx b/likeminds-feed-reactnative-integration/components/LMMedia/LMCreatePostCarousel/index.tsx index ea66bfc7..ec1ffb42 100644 --- a/likeminds-feed-reactnative-integration/components/LMMedia/LMCreatePostCarousel/index.tsx +++ b/likeminds-feed-reactnative-integration/components/LMMedia/LMCreatePostCarousel/index.tsx @@ -18,7 +18,7 @@ import { STATUS_BAR_STYLE, } from "../../../store/types/types"; import { CAROUSEL_SCREEN } from "../../../constants/screenNames"; -import { AttachmentType } from "@likeminds.community/feed-js"; +import { AttachmentType } from "@likeminds.community/feed-rn"; const LMCreatePostCarousel = React.memo( ({ diff --git a/likeminds-feed-reactnative-integration/customModals/DeleteReasonsModal/index.tsx b/likeminds-feed-reactnative-integration/customModals/DeleteReasonsModal/index.tsx index 727b89f7..062bd11b 100644 --- a/likeminds-feed-reactnative-integration/customModals/DeleteReasonsModal/index.tsx +++ b/likeminds-feed-reactnative-integration/customModals/DeleteReasonsModal/index.tsx @@ -1,7 +1,7 @@ import { View, Text, Modal, Pressable } from "react-native"; import React, { useEffect, useState } from "react"; import styles from "./styles"; -import { GetReportTagsRequest } from "@likeminds.community/feed-rn"; +import { GetReportTagsRequest, ReportEntityType } from "@likeminds.community/feed-rn"; import STYLES from "../../constants/Styles"; import { DELETE_TAGS_TYPE, DELETION_REASON } from "../../constants/Strings"; import { useAppDispatch, useAppSelector } from "../../store/store"; @@ -35,7 +35,7 @@ const DeleteReasonsModal = ({ }; const reportTagsResponse = await dispatch( getReportTags( - GetReportTagsRequest.builder().setType(payload.type).build(), + GetReportTagsRequest.builder().setEntityType(ReportEntityType.POST).build(), false ) ); diff --git a/likeminds-feed-reactnative-integration/customModals/ReportModal/index.tsx b/likeminds-feed-reactnative-integration/customModals/ReportModal/index.tsx index 842d18b4..0df5f43c 100644 --- a/likeminds-feed-reactnative-integration/customModals/ReportModal/index.tsx +++ b/likeminds-feed-reactnative-integration/customModals/ReportModal/index.tsx @@ -46,7 +46,7 @@ import { usePostDetailContext } from "../../context"; import pluralizeOrCapitalize from "../../utils/variables"; import { WordAction } from "../../enums/Variables"; import { CommunityConfigs } from "../../communityConfigs"; -import {ReportEntityType} from "@likeminds.community/feed-js" +import {ReportEntityType} from "@likeminds.community/feed-rn" // interface for post report api request interface ReportRequest { diff --git a/likeminds-feed-reactnative-integration/screens/carouselScreen/index.tsx b/likeminds-feed-reactnative-integration/screens/carouselScreen/index.tsx index 6bc9faa6..7753dd10 100644 --- a/likeminds-feed-reactnative-integration/screens/carouselScreen/index.tsx +++ b/likeminds-feed-reactnative-integration/screens/carouselScreen/index.tsx @@ -29,7 +29,7 @@ import { useAppDispatch } from "../../store/store"; import LMVideoPlayer from "../../components/LMVideoPlayer"; import ImageViewer from "react-native-image-zoom-viewer"; import { CallBack } from "../../callBacks/callBackClass"; -import { AttachmentType } from "@likeminds.community/feed-js"; +import { AttachmentType } from "@likeminds.community/feed-rn"; const CarouselScreen = ({ navigation, route }: any) => { const dispatch = useAppDispatch(); From c758ddafd5d692a2392d3dc89cbdc9623a5a9ee2 Mon Sep 17 00:00:00 2001 From: Usman salim Date: Fri, 16 May 2025 11:19:54 +0530 Subject: [PATCH 12/41] added changes in video component --- .../components/LMMedia/LMVideo/index.tsx | 2 +- .../components/LMVideoPlayer/index.tsx | 7 ++++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/likeminds-feed-reactnative-integration/components/LMMedia/LMVideo/index.tsx b/likeminds-feed-reactnative-integration/components/LMMedia/LMVideo/index.tsx index e49f8a07..b31c2c33 100644 --- a/likeminds-feed-reactnative-integration/components/LMMedia/LMVideo/index.tsx +++ b/likeminds-feed-reactnative-integration/components/LMMedia/LMVideo/index.tsx @@ -184,7 +184,7 @@ const LMVideo = React.memo( handleError(error) }} repeat={ - Platform.OS === "ios" ? (looping ? looping : true) : false + (looping ? looping : true) } resizeMode={boxFit ? boxFit : defaultStyles.videoStyle.resizeMode} playWhenInactive={false} diff --git a/likeminds-feed-reactnative-integration/components/LMVideoPlayer/index.tsx b/likeminds-feed-reactnative-integration/components/LMVideoPlayer/index.tsx index 7db0ce2c..c6ac7546 100644 --- a/likeminds-feed-reactnative-integration/components/LMVideoPlayer/index.tsx +++ b/likeminds-feed-reactnative-integration/components/LMVideoPlayer/index.tsx @@ -20,6 +20,7 @@ function LMVideoPlayer({ url, setDisableGesture }) { const ref = useRef(); const [clicked, setClicked] = useState(false); + const [isSeeking, setIsSeeking] = useState(false); const [paused, setPaused] = useState(false); const [progress, setProgress] = useState(null); const [mute, setMute] = useState(false); @@ -221,8 +222,12 @@ function LMVideoPlayer({ url, setDisableGesture }) { } step={0} value={progress?.currentTime} + onSlidingStart={() => setIsSeeking(true)} + onSlidingComplete={() => setIsSeeking(false)} onValueChange={(x) => { - ref.current.seek(x); + if (isSeeking) { + ref.current.seek(x); + } }} thumbTintColor={thumbTintColor ? thumbTintColor : "green"} /> From c0196bd5f28770b25096023ab9af1380951e6e99 Mon Sep 17 00:00:00 2001 From: Usman salim Date: Fri, 16 May 2025 14:11:03 +0530 Subject: [PATCH 13/41] updated custom widget key --- .../components/LMPost/LMPost/index.tsx | 3 ++- .../context/createPostContext.tsx | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/likeminds-feed-reactnative-integration/components/LMPost/LMPost/index.tsx b/likeminds-feed-reactnative-integration/components/LMPost/LMPost/index.tsx index 6396cf05..a6b97484 100644 --- a/likeminds-feed-reactnative-integration/components/LMPost/LMPost/index.tsx +++ b/likeminds-feed-reactnative-integration/components/LMPost/LMPost/index.tsx @@ -66,7 +66,7 @@ const LMPostComponent = React.memo(() => { const attachmentLength = attachments.length; let noOfCustomViewAttachments = 0; for (const attachment of attachments) { - if (attachment?.type.toString() === AttachmentType.CUSTOM) { + if (attachment?.type?.toString() === AttachmentType.CUSTOM) { noOfCustomViewAttachments++; } } @@ -79,6 +79,7 @@ const LMPostComponent = React.memo(() => { return false; } }, [post]); + if (showCustomPostViewWidget) { // TODO Custom Widget // Render the complete custom Post View widget diff --git a/likeminds-feed-reactnative-integration/context/createPostContext.tsx b/likeminds-feed-reactnative-integration/context/createPostContext.tsx index 82d822ea..e42b62db 100644 --- a/likeminds-feed-reactnative-integration/context/createPostContext.tsx +++ b/likeminds-feed-reactnative-integration/context/createPostContext.tsx @@ -425,7 +425,7 @@ export const CreatePostContextProvider = ({ ...allMedia, ...linkData, ...pollAttachment, - ...[{ type: 5, attachmentMeta: { meta: metaData } }], + ...[{ type: AttachmentType.CUSTOM, metaData: { meta: metaData } }], ] : [...allMedia, ...linkData, ...pollAttachment]; const post = convertToTemporaryPost( From 25c738da2588806163e612c8227d36f0cac08e2c Mon Sep 17 00:00:00 2001 From: Usman salim Date: Fri, 16 May 2025 14:36:50 +0530 Subject: [PATCH 14/41] removed fast image --- .../components/LMMedia/LMImage/index.tsx | 5 ++--- .../components/LMMedia/LMImage/types.ts | 5 ++--- .../components/LMPost/LMPost/index.tsx | 4 ++-- .../customModals/DeleteModal/index.tsx | 14 ++++++++++---- 4 files changed, 16 insertions(+), 12 deletions(-) diff --git a/likeminds-feed-reactnative-integration/components/LMMedia/LMImage/index.tsx b/likeminds-feed-reactnative-integration/components/LMMedia/LMImage/index.tsx index 414661e2..2ffb77f5 100644 --- a/likeminds-feed-reactnative-integration/components/LMMedia/LMImage/index.tsx +++ b/likeminds-feed-reactnative-integration/components/LMMedia/LMImage/index.tsx @@ -5,7 +5,6 @@ import { MEDIA_FETCH_ERROR } from "../../../constants/Strings"; import LMLoader from "../../LMLoader"; import { LMButton } from "../../../uiComponents"; import { defaultStyles } from "./styles"; -import FastImage from "@d11/react-native-fast-image"; const LMImage = React.memo( ({ @@ -70,17 +69,17 @@ const LMImage = React.memo( {loaderWidget ? loaderWidget : loading && } {/* this renders the image */} - setLoading(false)} onError={() => setError(true)} - resizeMode={boxFit ? boxFit : FastImage.resizeMode.contain} defaultSource={require("../../../assets/images/black_background.png")} style={StyleSheet.flatten([ imageStyle, { height: heightCalculated, aspectRatio: desiredAspectRatio, + resizeMode: boxFit ? boxFit : "contain" } ])} /> diff --git a/likeminds-feed-reactnative-integration/components/LMMedia/LMImage/types.ts b/likeminds-feed-reactnative-integration/components/LMMedia/LMImage/types.ts index 3d8b5a50..11758b3a 100644 --- a/likeminds-feed-reactnative-integration/components/LMMedia/LMImage/types.ts +++ b/likeminds-feed-reactnative-integration/components/LMMedia/LMImage/types.ts @@ -1,14 +1,13 @@ import { ReactNode } from "react"; -import { ViewStyle } from "react-native"; +import { ImageResizeMode, ImageStyle, ViewStyle } from "react-native"; import { LMButtonProps } from "../../../uiComponents"; -import FastImage, {ImageStyle, ResizeMode} from "@d11/react-native-fast-image"; export interface LMImageProps { imageUrl: string; // url of the image to be displayed height?: number; // height of the image width?: number; // width of the image imageStyle?: ImageStyle; // this represents the style of the image - boxFit?: ResizeMode; // this represents how the image should be fitted in its wrapper view + boxFit?: ImageResizeMode; // this represents how the image should be fitted in its wrapper view boxStyle?: ViewStyle; // this represents the style of the view that contains the image aspectRatio?: 0 | 0.1 | 0.2 | 0.3 | 0.4 | 0.5 | 0.6 | 0.7 | 0.8 | 0.9 | 1; // ratio of the image between 0 to 1 loaderWidget?: ReactNode; // this represents the loader component diff --git a/likeminds-feed-reactnative-integration/components/LMPost/LMPost/index.tsx b/likeminds-feed-reactnative-integration/components/LMPost/LMPost/index.tsx index a6b97484..367fd5f9 100644 --- a/likeminds-feed-reactnative-integration/components/LMPost/LMPost/index.tsx +++ b/likeminds-feed-reactnative-integration/components/LMPost/LMPost/index.tsx @@ -62,8 +62,8 @@ const LMPostComponent = React.memo(() => { const showCustomPostViewWidget = useMemo(() => { if (post?.attachments && post?.attachments.length > 0) { - const attachments = post.attachments; - const attachmentLength = attachments.length; + const attachments = post?.attachments; + const attachmentLength = attachments?.length; let noOfCustomViewAttachments = 0; for (const attachment of attachments) { if (attachment?.type?.toString() === AttachmentType.CUSTOM) { diff --git a/likeminds-feed-reactnative-integration/customModals/DeleteModal/index.tsx b/likeminds-feed-reactnative-integration/customModals/DeleteModal/index.tsx index 81d74ab3..ab4852b9 100644 --- a/likeminds-feed-reactnative-integration/customModals/DeleteModal/index.tsx +++ b/likeminds-feed-reactnative-integration/customModals/DeleteModal/index.tsx @@ -27,7 +27,7 @@ import { } from "../../constants/Strings"; import STYLES from "../../constants/Styles"; import { useAppDispatch, useAppSelector } from "../../store/store"; -import { deletePost, deletePostStateHandler } from "../../store/actions/feed"; +import { autoPlayPostVideo, deletePost, deletePostStateHandler } from "../../store/actions/feed"; import { deleteComment, deleteCommentStateHandler, @@ -47,6 +47,7 @@ import { usePostDetailContext } from "../../context"; import { CommunityConfigs } from "../../communityConfigs"; import { WordAction } from "../../enums/Variables"; import pluralizeOrCapitalize from "../../utils/variables"; +import { SET_CURRENT_ID_OF_VIDEO } from "../../store/types/types"; // delete modal's props interface DeleteModalProps { @@ -93,7 +94,6 @@ const DeleteModal = ({ postId: postDetail?.id, }; displayModal(false); - dispatch(deletePostStateHandler(payload.postId)); const deletePostPayload = DeletePostRequest.builder() .setDeleteReason(payload.deleteReason) .setPostId(payload.postId) @@ -103,6 +103,12 @@ const DeleteModal = ({ ); // toast message action if (deletePostResponse?.success == true) { + dispatch(deletePostStateHandler(payload.postId)); + dispatch({ + type: SET_CURRENT_ID_OF_VIDEO, + body: { currentIdOfVideo: "" }, + }); + dispatch(autoPlayPostVideo("")); LMFeedAnalytics.track( Events.POST_DELETED, new Map([ @@ -284,9 +290,9 @@ const DeleteModal = ({ {/* main modal section */} - Delete {(pluralizeOrCapitalize((CommunityConfigs?.getCommunityConfigs("feed_metadata"))?.value?.post ?? "post",WordAction.allSmallSingular))}? + Delete {(pluralizeOrCapitalize((CommunityConfigs?.getCommunityConfigs("feed_metadata"))?.value?.post ?? "post", WordAction.allSmallSingular))}? - {CONFIRM_DELETE(pluralizeOrCapitalize((CommunityConfigs?.getCommunityConfigs("feed_metadata"))?.value?.post ?? "post",WordAction.allSmallSingular))} + {CONFIRM_DELETE(pluralizeOrCapitalize((CommunityConfigs?.getCommunityConfigs("feed_metadata"))?.value?.post ?? "post", WordAction.allSmallSingular))} {/* delete reason selection section */} From dacec0e64fa5ecb427568e96aad542766139d988 Mon Sep 17 00:00:00 2001 From: Usman salim Date: Fri, 16 May 2025 16:05:30 +0530 Subject: [PATCH 15/41] resolved comments --- .../components/LMMedia/LMCarousel/index.tsx | 5 +++-- .../components/LMMedia/LMCreatePostVideo/index.tsx | 4 ++-- .../components/LMMedia/LMImage/index.tsx | 8 ++++---- .../components/LMMedia/LMVideo/index.tsx | 8 ++++---- .../context/postDetailContext.tsx | 5 +---- .../context/universalFeedContext.tsx | 5 +++-- .../customModals/ReportModal/index.tsx | 2 +- .../screens/postsList/index.tsx | 1 - 8 files changed, 18 insertions(+), 20 deletions(-) diff --git a/likeminds-feed-reactnative-integration/components/LMMedia/LMCarousel/index.tsx b/likeminds-feed-reactnative-integration/components/LMMedia/LMCarousel/index.tsx index ae2b2720..7bafde52 100644 --- a/likeminds-feed-reactnative-integration/components/LMMedia/LMCarousel/index.tsx +++ b/likeminds-feed-reactnative-integration/components/LMMedia/LMCarousel/index.tsx @@ -50,10 +50,11 @@ const LMCarousel = React.memo( } }; + // this functions calculates the max height among all the attachments in the carousel const getMaxHeightOfAttachments = () => { if (!post?.attachments?.length) return 0; - const ScreenWidth = Dimensions.get("window").width; + const screenWidth = Dimensions.get("window").width; // Map over attachments and compute scaled heights const scaledHeights = post?.attachments?.map(item => { @@ -65,7 +66,7 @@ const LMCarousel = React.memo( // Determine desired aspect ratio (portrait vs landscape) const desiredAspectRatio = width > height ? 1.91 : 0.8; - return ScreenWidth * (1 / desiredAspectRatio); + return screenWidth * (1 / desiredAspectRatio); }); let max = Math.max(...scaledHeights); diff --git a/likeminds-feed-reactnative-integration/components/LMMedia/LMCreatePostVideo/index.tsx b/likeminds-feed-reactnative-integration/components/LMMedia/LMCreatePostVideo/index.tsx index 225280ee..25b3236c 100644 --- a/likeminds-feed-reactnative-integration/components/LMMedia/LMCreatePostVideo/index.tsx +++ b/likeminds-feed-reactnative-integration/components/LMMedia/LMCreatePostVideo/index.tsx @@ -108,9 +108,9 @@ import { }; useEffect(() => { - const ScreenWidth = Dimensions.get("window").width; + const screenWidth = Dimensions.get("window").width; const desiredAspectRatio = width > height ? 1.91 : 0.8; - const heightCalculated = ScreenWidth * (1 / desiredAspectRatio); + const heightCalculated = screenWidth * (1 / desiredAspectRatio); setHeightCalculated(heightCalculated); setDesiredAspectRatio(desiredAspectRatio); }, [dimensions]); diff --git a/likeminds-feed-reactnative-integration/components/LMMedia/LMImage/index.tsx b/likeminds-feed-reactnative-integration/components/LMMedia/LMImage/index.tsx index 2ffb77f5..0932841e 100644 --- a/likeminds-feed-reactnative-integration/components/LMMedia/LMImage/index.tsx +++ b/likeminds-feed-reactnative-integration/components/LMMedia/LMImage/index.tsx @@ -32,9 +32,9 @@ const LMImage = React.memo( Image.getSize( imageUrl, (width, height) => { - const ScreenWidth = Dimensions.get("window").width; + const screenWidth = Dimensions.get("window").width; const desiredAspectRatio = width > height ? 1.91 : 0.8; - const heightCalculated = ScreenWidth * (1 / desiredAspectRatio); + const heightCalculated = screenWidth * (1 / desiredAspectRatio); setHeightCalculated(heightCalculated); setDesiredAspectRatio(desiredAspectRatio); @@ -48,9 +48,9 @@ const LMImage = React.memo( } else { - const ScreenWidth = Dimensions.get("window").width; + const screenWidth = Dimensions.get("window").width; const desiredAspectRatio = width > height ? 1.91 : 0.8; - const heightCalculated = ScreenWidth * (1 / desiredAspectRatio); + const heightCalculated = screenWidth * (1 / desiredAspectRatio); setHeightCalculated(heightCalculated); setDesiredAspectRatio(desiredAspectRatio); diff --git a/likeminds-feed-reactnative-integration/components/LMMedia/LMVideo/index.tsx b/likeminds-feed-reactnative-integration/components/LMMedia/LMVideo/index.tsx index b31c2c33..c0062dc2 100644 --- a/likeminds-feed-reactnative-integration/components/LMMedia/LMVideo/index.tsx +++ b/likeminds-feed-reactnative-integration/components/LMMedia/LMVideo/index.tsx @@ -127,16 +127,16 @@ const LMVideo = React.memo( useEffect(() => { if ( (!height || !width) && (dimensions?.height > 0 && dimensions?.width > 0)) { - const ScreenWidth = Dimensions.get("window").width; + const screenWidth = Dimensions.get("window").width; const desiredAspectRatio = dimensions?.width > dimensions?.height ? 1.91 : 0.8; - const heightCalculated = ScreenWidth * (1 / desiredAspectRatio); + const heightCalculated = screenWidth * (1 / desiredAspectRatio); setHeightCalculated(heightCalculated); setDesiredAspectRatio(desiredAspectRatio); } else { - const ScreenWidth = Dimensions.get("window").width; + const screenWidth = Dimensions.get("window").width; const desiredAspectRatio = width > height ? 1.91 : 0.8; - const heightCalculated = ScreenWidth * (1 / desiredAspectRatio); + const heightCalculated = screenWidth * (1 / desiredAspectRatio); setHeightCalculated(heightCalculated); setDesiredAspectRatio(desiredAspectRatio); diff --git a/likeminds-feed-reactnative-integration/context/postDetailContext.tsx b/likeminds-feed-reactnative-integration/context/postDetailContext.tsx index a998113a..16d74e31 100644 --- a/likeminds-feed-reactnative-integration/context/postDetailContext.tsx +++ b/likeminds-feed-reactnative-integration/context/postDetailContext.tsx @@ -655,16 +655,13 @@ export const PostDetailContextProvider = ({ false ) ); - let replies: any = [] + let replies = new Array() setRepliesArrayUnderComments((previousResponse) => { replies = [ ...commentResponseModelConvertor(commentsRepliesResponse)?.replies, ...previousResponse ] return replies }) - console.log({ - replies - }) // sets the api response in the callback function repliesResponseCallback( postDetail?.replies && diff --git a/likeminds-feed-reactnative-integration/context/universalFeedContext.tsx b/likeminds-feed-reactnative-integration/context/universalFeedContext.tsx index 9c09481c..a4f749b1 100644 --- a/likeminds-feed-reactnative-integration/context/universalFeedContext.tsx +++ b/likeminds-feed-reactnative-integration/context/universalFeedContext.tsx @@ -74,6 +74,7 @@ import { FeedType } from "../enums/FeedType"; import { AddPollOptionParams, SetSelectedPollOptionsParams, SubmitPollParams } from "../constants/types"; import RNVideoThumbnail from "../optionalDependencies/RNVideoThumbnail"; import expoVideoThumbnail from "../optionalDependencies/ExpoVideoThumbnail"; +import FlashList from "@shopify/flash-list/src/FlashList"; interface UniversalFeedContextProps { children?: ReactNode; navigation: NativeStackNavigationProp; @@ -96,7 +97,7 @@ export interface UniversalFeedContextValues { showCreatePost: boolean; refreshing: boolean; localRefresh: boolean; - listRef: MutableRefObject | null>; + listRef: MutableRefObject | null>; mediaAttachmemnts: []; linkAttachments: []; postContent: string; @@ -189,7 +190,7 @@ export const UniversalFeedContextProvider = ({ const [refreshing, setRefreshing] = useState(false); const [localRefresh, setLocalRefresh] = useState(false); const [uploadProgress, setUploadProgress] = useState(0); - const listRef = useRef>(null); + const listRef = useRef>(null); const route = useRoute(); const params = route.params as { feedType?: FeedType; diff --git a/likeminds-feed-reactnative-integration/customModals/ReportModal/index.tsx b/likeminds-feed-reactnative-integration/customModals/ReportModal/index.tsx index 0df5f43c..f5fd35c8 100644 --- a/likeminds-feed-reactnative-integration/customModals/ReportModal/index.tsx +++ b/likeminds-feed-reactnative-integration/customModals/ReportModal/index.tsx @@ -107,7 +107,7 @@ const ReportModal = ({ // this function calls the get report tags api for reporting a post const fetchReportTags = async () => { const payload = { - type: ReportEntityType.POST, // type 3 for report tags + type: ReportEntityType.POST, // type post for report tags for posts }; const reportTagsResponse = await dispatch( getReportTags( diff --git a/likeminds-feed-reactnative-integration/screens/postsList/index.tsx b/likeminds-feed-reactnative-integration/screens/postsList/index.tsx index 62dcf6e0..2e345ab8 100644 --- a/likeminds-feed-reactnative-integration/screens/postsList/index.tsx +++ b/likeminds-feed-reactnative-integration/screens/postsList/index.tsx @@ -393,7 +393,6 @@ const PostsListComponent = ({ {!feedFetching ? ( feedData?.length > 0 ? ( Date: Fri, 16 May 2025 17:43:43 +0530 Subject: [PATCH 16/41] updated custom widget key --- .../context/createPostContext.tsx | 2 +- .../context/universalFeedContext.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/likeminds-feed-reactnative-integration/context/createPostContext.tsx b/likeminds-feed-reactnative-integration/context/createPostContext.tsx index e42b62db..1d95556a 100644 --- a/likeminds-feed-reactnative-integration/context/createPostContext.tsx +++ b/likeminds-feed-reactnative-integration/context/createPostContext.tsx @@ -425,7 +425,7 @@ export const CreatePostContextProvider = ({ ...allMedia, ...linkData, ...pollAttachment, - ...[{ type: AttachmentType.CUSTOM, metaData: { meta: metaData } }], + ...[{ type: AttachmentType.CUSTOM, metaData: { widget_meta: metaData } }], ] : [...allMedia, ...linkData, ...pollAttachment]; const post = convertToTemporaryPost( diff --git a/likeminds-feed-reactnative-integration/context/universalFeedContext.tsx b/likeminds-feed-reactnative-integration/context/universalFeedContext.tsx index a4f749b1..865a6bdd 100644 --- a/likeminds-feed-reactnative-integration/context/universalFeedContext.tsx +++ b/likeminds-feed-reactnative-integration/context/universalFeedContext.tsx @@ -536,7 +536,7 @@ export const UniversalFeedContextProvider = ({ ...updatedAttachments, ...linkAttachments, ...pollAttachment, - ...[{ type: AttachmentType.CUSTOM, metaData: { meta: metaData } }], + ...[{ type: AttachmentType.CUSTOM, metaData: { widget_meta: metaData } }], ] : [...updatedAttachments, ...linkAttachments, ...pollAttachment]; const addPostResponse: any = await dispatch( From 8af75d47e261469af6e9c7d78c03f7ee8672bda8 Mon Sep 17 00:00:00 2001 From: Usman salim Date: Sat, 17 May 2025 19:26:44 +0530 Subject: [PATCH 17/41] formatted code and added logic to calculate layout --- .../components/LMPost/LMPostMedia/index.tsx | 4 +- .../screens/postsList/index.tsx | 49 +++++++++++++++---- 2 files changed, 41 insertions(+), 12 deletions(-) diff --git a/likeminds-feed-reactnative-integration/components/LMPost/LMPostMedia/index.tsx b/likeminds-feed-reactnative-integration/components/LMPost/LMPostMedia/index.tsx index 2764965c..8e9055e9 100644 --- a/likeminds-feed-reactnative-integration/components/LMPost/LMPostMedia/index.tsx +++ b/likeminds-feed-reactnative-integration/components/LMPost/LMPostMedia/index.tsx @@ -212,7 +212,7 @@ const LMPostMedia = React.memo(() => { )} @@ -222,7 +222,7 @@ const LMPostMedia = React.memo(() => { { handleReportPostProps - ? handleReportPostProps(postId) - : handleReportPost(); + ? handleReportPostProps(postId) + : handleReportPost(); }, 500) } else { handleReportPostProps - ? handleReportPostProps(postId) - : handleReportPost(); + ? handleReportPostProps(postId) + : handleReportPost(); } } if (itemId === DELETE_POST_MENU_ITEM) { if (Platform.OS == "ios") { setTimeout(() => { handleDeletePostProps - ? handleDeletePostProps(true, postId) - : handleDeletePost(true); + ? handleDeletePostProps(true, postId) + : handleDeletePost(true); }, 500) } else { handleDeletePostProps @@ -310,7 +310,7 @@ const PostsListComponent = ({ /> {!postListStyle.shouldHideSeparator && - index != feedData.length - 1 ? ( + index != feedData.length - 1 ? ( { + if (!post?.attachments?.length) return 350; + + const ScreenWidth = Dimensions.get("window").width; + + // Map over attachments and compute scaled heights + const scaledHeights = post?.attachments?.map(item => { + const meta = item?.metaData; + const width = meta?.width; + const height = meta?.height; + + if (!width || !height) return 500; + + // Determine desired aspect ratio (portrait vs landscape) + const desiredAspectRatio = width > height ? 1.91 : 0.8; + return ScreenWidth * (1 / desiredAspectRatio); + }); + + let max = Math.max(...scaledHeights); + + return max > 0 ? max : 350 + }; + return ( 0 ? ( { + const val = getMaxHeightOfAttachments(item) + console.log({val}) + return val; + }} refreshControl={ } data={feedData} - extraData={[feedData]} + extraData={[]} renderItem={renderItem} onEndReachedThreshold={0.3} onEndReached={handleLoadMore} From f04c43b9a57d5afec3f5a07b40e025d6e0f3235c Mon Sep 17 00:00:00 2001 From: Usman salim Date: Sun, 18 May 2025 21:23:13 +0530 Subject: [PATCH 18/41] fixed seeking issues --- .../components/LMMedia/LMVideo/index.tsx | 13 +++++++------ .../components/LMVideoPlayer/index.tsx | 7 ++++--- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/likeminds-feed-reactnative-integration/components/LMMedia/LMVideo/index.tsx b/likeminds-feed-reactnative-integration/components/LMMedia/LMVideo/index.tsx index c0062dc2..ab367fb7 100644 --- a/likeminds-feed-reactnative-integration/components/LMMedia/LMVideo/index.tsx +++ b/likeminds-feed-reactnative-integration/components/LMMedia/LMVideo/index.tsx @@ -127,16 +127,16 @@ const LMVideo = React.memo( useEffect(() => { if ( (!height || !width) && (dimensions?.height > 0 && dimensions?.width > 0)) { - const screenWidth = Dimensions.get("window").width; + const ScreenWidth = Dimensions.get("window").width; const desiredAspectRatio = dimensions?.width > dimensions?.height ? 1.91 : 0.8; - const heightCalculated = screenWidth * (1 / desiredAspectRatio); + const heightCalculated = ScreenWidth * (1 / desiredAspectRatio); setHeightCalculated(heightCalculated); setDesiredAspectRatio(desiredAspectRatio); } else { - const screenWidth = Dimensions.get("window").width; + const ScreenWidth = Dimensions.get("window").width; const desiredAspectRatio = width > height ? 1.91 : 0.8; - const heightCalculated = screenWidth * (1 / desiredAspectRatio); + const heightCalculated = ScreenWidth * (1 / desiredAspectRatio); setHeightCalculated(heightCalculated); setDesiredAspectRatio(desiredAspectRatio); @@ -172,7 +172,7 @@ const LMVideo = React.memo( { setError(false); onLoad(data); @@ -184,12 +184,13 @@ const LMVideo = React.memo( handleError(error) }} repeat={ - (looping ? looping : true) + looping ?? true } resizeMode={boxFit ? boxFit : defaultStyles.videoStyle.resizeMode} playWhenInactive={false} playInBackground={false} ignoreSilentSwitch="obey" + minLoadRetryCount={5} bufferConfig={{ minBufferMs: 2500, maxBufferMs: 5000, diff --git a/likeminds-feed-reactnative-integration/components/LMVideoPlayer/index.tsx b/likeminds-feed-reactnative-integration/components/LMVideoPlayer/index.tsx index c6ac7546..9d719939 100644 --- a/likeminds-feed-reactnative-integration/components/LMVideoPlayer/index.tsx +++ b/likeminds-feed-reactnative-integration/components/LMVideoPlayer/index.tsx @@ -110,10 +110,10 @@ function LMVideoPlayer({ url, setDisableGesture }) { style={styles.videoPlayer} resizeMode="contain" bufferConfig={{ - minBufferMs: 2500, + minBufferMs: 1000, maxBufferMs: 5000, bufferForPlaybackMs: 2500, - bufferForPlaybackAfterRebufferMs: 2500, + bufferForPlaybackAfterRebufferMs: 1000, }} muted={mute} onEnd={() => { @@ -225,7 +225,8 @@ function LMVideoPlayer({ url, setDisableGesture }) { onSlidingStart={() => setIsSeeking(true)} onSlidingComplete={() => setIsSeeking(false)} onValueChange={(x) => { - if (isSeeking) { + // logic to avoid stuttering issues + if ( x!== 0 && Math.abs(x - progress?.currentTime) >= 1) { ref.current.seek(x); } }} From b524f675a72f0573aa2d13d86e1e2cd552dcc73d Mon Sep 17 00:00:00 2001 From: Usman salim Date: Sun, 18 May 2025 22:05:28 +0530 Subject: [PATCH 19/41] resolved comments --- .../components/LMMedia/LMCarousel/index.tsx | 3 ++- .../components/LMMedia/LMCreatePostVideo/index.tsx | 3 ++- .../components/LMMedia/LMImage/index.tsx | 5 +++-- .../components/LMMedia/LMVideo/index.tsx | 9 +++++---- .../screens/postsList/index.tsx | 5 +++-- .../screens/searchFeed/index.tsx | 8 ++++---- 6 files changed, 19 insertions(+), 14 deletions(-) diff --git a/likeminds-feed-reactnative-integration/components/LMMedia/LMCarousel/index.tsx b/likeminds-feed-reactnative-integration/components/LMMedia/LMCarousel/index.tsx index 7bafde52..3558ba66 100644 --- a/likeminds-feed-reactnative-integration/components/LMMedia/LMCarousel/index.tsx +++ b/likeminds-feed-reactnative-integration/components/LMMedia/LMCarousel/index.tsx @@ -19,6 +19,7 @@ import { } from "../../../store/types/types"; import {AttachmentType} from "@likeminds.community/feed-rn" import { CAROUSEL_SCREEN } from "../../../constants/screenNames"; +import Layout from "../../../constants/Layout"; const LMCarousel = React.memo( ({ @@ -54,7 +55,7 @@ const LMCarousel = React.memo( const getMaxHeightOfAttachments = () => { if (!post?.attachments?.length) return 0; - const screenWidth = Dimensions.get("window").width; + const screenWidth = Layout.window.width // Map over attachments and compute scaled heights const scaledHeights = post?.attachments?.map(item => { diff --git a/likeminds-feed-reactnative-integration/components/LMMedia/LMCreatePostVideo/index.tsx b/likeminds-feed-reactnative-integration/components/LMMedia/LMCreatePostVideo/index.tsx index 25b3236c..3a639f51 100644 --- a/likeminds-feed-reactnative-integration/components/LMMedia/LMCreatePostVideo/index.tsx +++ b/likeminds-feed-reactnative-integration/components/LMMedia/LMCreatePostVideo/index.tsx @@ -26,6 +26,7 @@ import { } from "../../../constants/screenNames"; import RNVideo from "../../../optionalDependencies/Video"; import { useLMFeed } from "../../../lmFeedProvider"; + import Layout from "../../../constants/Layout" const LMCreatePostVideo = React.memo( ({ @@ -108,7 +109,7 @@ import { }; useEffect(() => { - const screenWidth = Dimensions.get("window").width; + const screenWidth = Layout.window.width const desiredAspectRatio = width > height ? 1.91 : 0.8; const heightCalculated = screenWidth * (1 / desiredAspectRatio); setHeightCalculated(heightCalculated); diff --git a/likeminds-feed-reactnative-integration/components/LMMedia/LMImage/index.tsx b/likeminds-feed-reactnative-integration/components/LMMedia/LMImage/index.tsx index 0932841e..addad889 100644 --- a/likeminds-feed-reactnative-integration/components/LMMedia/LMImage/index.tsx +++ b/likeminds-feed-reactnative-integration/components/LMMedia/LMImage/index.tsx @@ -5,6 +5,7 @@ import { MEDIA_FETCH_ERROR } from "../../../constants/Strings"; import LMLoader from "../../LMLoader"; import { LMButton } from "../../../uiComponents"; import { defaultStyles } from "./styles"; +import Layout from "../../../constants/Layout"; const LMImage = React.memo( ({ @@ -32,7 +33,7 @@ const LMImage = React.memo( Image.getSize( imageUrl, (width, height) => { - const screenWidth = Dimensions.get("window").width; + const screenWidth = Layout.window.width const desiredAspectRatio = width > height ? 1.91 : 0.8; const heightCalculated = screenWidth * (1 / desiredAspectRatio); @@ -48,7 +49,7 @@ const LMImage = React.memo( } else { - const screenWidth = Dimensions.get("window").width; + const screenWidth = Layout.window.width; const desiredAspectRatio = width > height ? 1.91 : 0.8; const heightCalculated = screenWidth * (1 / desiredAspectRatio); diff --git a/likeminds-feed-reactnative-integration/components/LMMedia/LMVideo/index.tsx b/likeminds-feed-reactnative-integration/components/LMMedia/LMVideo/index.tsx index ab367fb7..696e243c 100644 --- a/likeminds-feed-reactnative-integration/components/LMMedia/LMVideo/index.tsx +++ b/likeminds-feed-reactnative-integration/components/LMMedia/LMVideo/index.tsx @@ -27,6 +27,7 @@ import { import RNVideo from "../../../optionalDependencies/Video"; import { useLMFeed } from "../../../lmFeedProvider"; import { useIsFocused } from "@react-navigation/native"; +import Layout from "../../../constants/Layout"; const LMVideo = React.memo( ({ @@ -127,16 +128,16 @@ const LMVideo = React.memo( useEffect(() => { if ( (!height || !width) && (dimensions?.height > 0 && dimensions?.width > 0)) { - const ScreenWidth = Dimensions.get("window").width; + const screenWidth = Layout.window.width; const desiredAspectRatio = dimensions?.width > dimensions?.height ? 1.91 : 0.8; - const heightCalculated = ScreenWidth * (1 / desiredAspectRatio); + const heightCalculated = screenWidth * (1 / desiredAspectRatio); setHeightCalculated(heightCalculated); setDesiredAspectRatio(desiredAspectRatio); } else { - const ScreenWidth = Dimensions.get("window").width; + const screenWidth = Layout.window.width; const desiredAspectRatio = width > height ? 1.91 : 0.8; - const heightCalculated = ScreenWidth * (1 / desiredAspectRatio); + const heightCalculated = screenWidth * (1 / desiredAspectRatio); setHeightCalculated(heightCalculated); setDesiredAspectRatio(desiredAspectRatio); diff --git a/likeminds-feed-reactnative-integration/screens/postsList/index.tsx b/likeminds-feed-reactnative-integration/screens/postsList/index.tsx index 60435867..d9cba7c7 100644 --- a/likeminds-feed-reactnative-integration/screens/postsList/index.tsx +++ b/likeminds-feed-reactnative-integration/screens/postsList/index.tsx @@ -58,6 +58,7 @@ import { useLMFeed } from "../../lmFeedProvider"; import { debounce } from "../../utils/debounce"; import { FeedType } from "../../enums/FeedType"; import FlashList from "@shopify/flash-list/src/FlashList"; +import Layout from "../../constants/Layout"; const PostsList = ({ route, @@ -382,7 +383,7 @@ const PostsListComponent = ({ const getMaxHeightOfAttachments = (post) => { if (!post?.attachments?.length) return 350; - const ScreenWidth = Dimensions.get("window").width; + const screenWidth = Layout.window.width // Map over attachments and compute scaled heights const scaledHeights = post?.attachments?.map(item => { @@ -394,7 +395,7 @@ const PostsListComponent = ({ // Determine desired aspect ratio (portrait vs landscape) const desiredAspectRatio = width > height ? 1.91 : 0.8; - return ScreenWidth * (1 / desiredAspectRatio); + return screenWidth * (1 / desiredAspectRatio); }); let max = Math.max(...scaledHeights); diff --git a/likeminds-feed-reactnative-integration/screens/searchFeed/index.tsx b/likeminds-feed-reactnative-integration/screens/searchFeed/index.tsx index bc9b54a3..572d35bd 100644 --- a/likeminds-feed-reactnative-integration/screens/searchFeed/index.tsx +++ b/likeminds-feed-reactnative-integration/screens/searchFeed/index.tsx @@ -30,6 +30,7 @@ import { SearchedPostListContextValues, useSearchedPostListContext } from '../.. import { styles } from "./styles" import { PollCustomisableMethodsContextProvider } from '../../context/pollCustomisableCallback'; import FlashList from '@shopify/flash-list/src/FlashList'; +import Layout from '../../constants/Layout'; interface SearchFeedProps { children?: React.ReactNode; @@ -201,7 +202,6 @@ const LMFeedSearchScreenComponent = ({ hideTopicsView, } = useSearchFeedCustomisableMethodsContext(); - const screenHeight = useMemo(() => Dimensions.get("window").height, []) // this function returns the id of the item selected from menu list and handles further functionalities accordingly const onMenuItemSelect = ( @@ -436,7 +436,7 @@ const LMFeedSearchScreenComponent = ({ data={searchFeedData} extraData={[searchFeedData]} estimatedItemSize={ - (screenHeight) / 3 + (Layout.window.height) / 3 } disableIntervalMomentum={true} decelerationRate={Platform.OS == "android" ? 0.96 : 0.994} @@ -444,13 +444,13 @@ const LMFeedSearchScreenComponent = ({ ListEmptyComponent={() => { if (feedFetching) { return ( - + ) } else if (searchPostQuery?.length > 0 && !feedFetching && searchFeedData?.length == 0) { return displayEmptyComponent && ( - + From 01f4025eaeb402e7c238874465653ce717897b88 Mon Sep 17 00:00:00 2001 From: Usman salim Date: Mon, 19 May 2025 02:22:40 +0530 Subject: [PATCH 20/41] resolved comments --- .../components/LMMedia/LMImage/index.tsx | 9 +++------ .../components/LMMedia/LMVideo/index.tsx | 7 ++++--- .../context/createPostContext.tsx | 16 +++++++++++++--- .../context/universalFeedContext.tsx | 2 +- .../screens/postsList/index.tsx | 8 +++----- 5 files changed, 24 insertions(+), 18 deletions(-) diff --git a/likeminds-feed-reactnative-integration/components/LMMedia/LMImage/index.tsx b/likeminds-feed-reactnative-integration/components/LMMedia/LMImage/index.tsx index addad889..127aa6f5 100644 --- a/likeminds-feed-reactnative-integration/components/LMMedia/LMImage/index.tsx +++ b/likeminds-feed-reactnative-integration/components/LMMedia/LMImage/index.tsx @@ -5,7 +5,7 @@ import { MEDIA_FETCH_ERROR } from "../../../constants/Strings"; import LMLoader from "../../LMLoader"; import { LMButton } from "../../../uiComponents"; import { defaultStyles } from "./styles"; -import Layout from "../../../constants/Layout"; +import Layout from "../../../constants/Layout" const LMImage = React.memo( ({ @@ -33,7 +33,7 @@ const LMImage = React.memo( Image.getSize( imageUrl, (width, height) => { - const screenWidth = Layout.window.width + const screenWidth = Layout.window.width; const desiredAspectRatio = width > height ? 1.91 : 0.8; const heightCalculated = screenWidth * (1 / desiredAspectRatio); @@ -46,16 +46,13 @@ const LMImage = React.memo( ); return; - } else { - - const screenWidth = Layout.window.width; + const screenWidth = Layout.window.width const desiredAspectRatio = width > height ? 1.91 : 0.8; const heightCalculated = screenWidth * (1 / desiredAspectRatio); setHeightCalculated(heightCalculated); setDesiredAspectRatio(desiredAspectRatio); - } diff --git a/likeminds-feed-reactnative-integration/components/LMMedia/LMVideo/index.tsx b/likeminds-feed-reactnative-integration/components/LMMedia/LMVideo/index.tsx index 696e243c..dac40770 100644 --- a/likeminds-feed-reactnative-integration/components/LMMedia/LMVideo/index.tsx +++ b/likeminds-feed-reactnative-integration/components/LMMedia/LMVideo/index.tsx @@ -128,14 +128,14 @@ const LMVideo = React.memo( useEffect(() => { if ( (!height || !width) && (dimensions?.height > 0 && dimensions?.width > 0)) { - const screenWidth = Layout.window.width; + const screenWidth = Layout.window.width const desiredAspectRatio = dimensions?.width > dimensions?.height ? 1.91 : 0.8; const heightCalculated = screenWidth * (1 / desiredAspectRatio); setHeightCalculated(heightCalculated); setDesiredAspectRatio(desiredAspectRatio); } else { - const screenWidth = Layout.window.width; + const screenWidth = Layout.window.width const desiredAspectRatio = width > height ? 1.91 : 0.8; const heightCalculated = screenWidth * (1 / desiredAspectRatio); setHeightCalculated(heightCalculated); @@ -173,7 +173,8 @@ const LMVideo = React.memo( setLoading(event?.isBuffering ?? false)} + key={`${videoUrl}-${retryKey}`} onLoad={(data) => { setError(false); onLoad(data); diff --git a/likeminds-feed-reactnative-integration/context/createPostContext.tsx b/likeminds-feed-reactnative-integration/context/createPostContext.tsx index 1d95556a..f572a354 100644 --- a/likeminds-feed-reactnative-integration/context/createPostContext.tsx +++ b/likeminds-feed-reactnative-integration/context/createPostContext.tsx @@ -81,7 +81,7 @@ import { Keys } from "../enums/Keys"; import { CommunityConfigs } from "../communityConfigs"; import { CREATE_POLL_SCREEN } from "../constants/screenNames"; import STYLES from "../constants/Styles"; -import { Video, getVideoMetaData } from "react-native-compressor"; +import { Video, getVideoMetaData, Image, getImageMetaData } from "react-native-compressor"; import { Client } from "../client"; import _ from "lodash"; @@ -310,7 +310,17 @@ export const CreatePostContextProvider = ({ ); } else { if (media?.type?.includes("image")) { - mediaWithSizeCheck.push(media); + const uri = await Image.compress(media?.uri); + const response = await getImageMetaData(uri); + const convertedMedia = { + fileName: media?.fileName, + fileSize: response?.size, + type: media?.type, + height: response?.ImageHeight, + width: response?.ImageWidth, + uri + } + mediaWithSizeCheck.push(convertedMedia); } else { const uri = await Video.compress(media?.uri); const response = await getVideoMetaData(uri); @@ -425,7 +435,7 @@ export const CreatePostContextProvider = ({ ...allMedia, ...linkData, ...pollAttachment, - ...[{ type: AttachmentType.CUSTOM, metaData: { widget_meta: metaData } }], + ...[{ type: AttachmentType.CUSTOM, metaData: { widgetMeta: metaData } }], ] : [...allMedia, ...linkData, ...pollAttachment]; const post = convertToTemporaryPost( diff --git a/likeminds-feed-reactnative-integration/context/universalFeedContext.tsx b/likeminds-feed-reactnative-integration/context/universalFeedContext.tsx index 865a6bdd..4d3f8fd0 100644 --- a/likeminds-feed-reactnative-integration/context/universalFeedContext.tsx +++ b/likeminds-feed-reactnative-integration/context/universalFeedContext.tsx @@ -536,7 +536,7 @@ export const UniversalFeedContextProvider = ({ ...updatedAttachments, ...linkAttachments, ...pollAttachment, - ...[{ type: AttachmentType.CUSTOM, metaData: { widget_meta: metaData } }], + ...[{ type: AttachmentType.CUSTOM, metaData: { widgetMeta: metaData } }], ] : [...updatedAttachments, ...linkAttachments, ...pollAttachment]; const addPostResponse: any = await dispatch( diff --git a/likeminds-feed-reactnative-integration/screens/postsList/index.tsx b/likeminds-feed-reactnative-integration/screens/postsList/index.tsx index d9cba7c7..04ea204b 100644 --- a/likeminds-feed-reactnative-integration/screens/postsList/index.tsx +++ b/likeminds-feed-reactnative-integration/screens/postsList/index.tsx @@ -351,8 +351,6 @@ const PostsListComponent = ({ } }, [refreshFromOnboardingScreen]); - const screenHeight = useMemo(() => Dimensions.get("window").height, []) - // Detect viewable posts const onViewableItemsChanged = ({ viewableItems }) => { if (!viewableItems) return @@ -383,7 +381,7 @@ const PostsListComponent = ({ const getMaxHeightOfAttachments = (post) => { if (!post?.attachments?.length) return 350; - const screenWidth = Layout.window.width + const screenWidth = Layout.window.width; // Map over attachments and compute scaled heights const scaledHeights = post?.attachments?.map(item => { @@ -400,7 +398,7 @@ const PostsListComponent = ({ let max = Math.max(...scaledHeights); - return max > 0 ? max : 350 + return max > 0 ? max : 450 }; return ( @@ -422,7 +420,7 @@ const PostsListComponent = ({ refreshing={refreshing} style={postListStyle?.listStyle} estimatedItemSize={ - (screenHeight) / 4 + (Layout.window.height) / 4 } disableIntervalMomentum={true} decelerationRate={Platform.OS == "android" ? 0.97 : 0.994} From 9b2e435d0b24ca4749afccb1f41378f2e8250e1b Mon Sep 17 00:00:00 2001 From: Usman salim Date: Mon, 19 May 2025 11:59:19 +0530 Subject: [PATCH 21/41] updated custom widget key --- .../context/createPostContext.tsx | 2 +- .../context/universalFeedContext.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/likeminds-feed-reactnative-integration/context/createPostContext.tsx b/likeminds-feed-reactnative-integration/context/createPostContext.tsx index f572a354..509c330d 100644 --- a/likeminds-feed-reactnative-integration/context/createPostContext.tsx +++ b/likeminds-feed-reactnative-integration/context/createPostContext.tsx @@ -435,7 +435,7 @@ export const CreatePostContextProvider = ({ ...allMedia, ...linkData, ...pollAttachment, - ...[{ type: AttachmentType.CUSTOM, metaData: { widgetMeta: metaData } }], + ...[{ type: AttachmentType.CUSTOM, metaData: { widgetMeta: { meta: metaData } } }], ] : [...allMedia, ...linkData, ...pollAttachment]; const post = convertToTemporaryPost( diff --git a/likeminds-feed-reactnative-integration/context/universalFeedContext.tsx b/likeminds-feed-reactnative-integration/context/universalFeedContext.tsx index 4d3f8fd0..4c8a631c 100644 --- a/likeminds-feed-reactnative-integration/context/universalFeedContext.tsx +++ b/likeminds-feed-reactnative-integration/context/universalFeedContext.tsx @@ -536,7 +536,7 @@ export const UniversalFeedContextProvider = ({ ...updatedAttachments, ...linkAttachments, ...pollAttachment, - ...[{ type: AttachmentType.CUSTOM, metaData: { widgetMeta: metaData } }], + ...[{ type: AttachmentType.CUSTOM, metaData: { widgetMeta: { meta: metaData } } }], ] : [...updatedAttachments, ...linkAttachments, ...pollAttachment]; const addPostResponse: any = await dispatch( From 458659de0c14106a943d5bdd8b02ec90892021e3 Mon Sep 17 00:00:00 2001 From: Usman salim Date: Mon, 19 May 2025 12:10:36 +0530 Subject: [PATCH 22/41] resolved comments --- .../components/LMMedia/LMCarousel/index.tsx | 2 +- .../components/LMMedia/LMImage/index.tsx | 2 +- .../components/LMMedia/LMVideo/index.tsx | 1 - .../screens/postDetail/index.tsx | 1 - 4 files changed, 2 insertions(+), 4 deletions(-) diff --git a/likeminds-feed-reactnative-integration/components/LMMedia/LMCarousel/index.tsx b/likeminds-feed-reactnative-integration/components/LMMedia/LMCarousel/index.tsx index 3558ba66..53919ffc 100644 --- a/likeminds-feed-reactnative-integration/components/LMMedia/LMCarousel/index.tsx +++ b/likeminds-feed-reactnative-integration/components/LMMedia/LMCarousel/index.tsx @@ -1,4 +1,4 @@ -import { StyleSheet, TouchableOpacity, View, Pressable, Dimensions } from "react-native"; +import { StyleSheet, TouchableOpacity, View, Pressable } from "react-native"; import React, { useState } from "react"; import SwiperFlatList from "react-native-swiper-flatlist"; import { LMCarouselProps } from "./types"; diff --git a/likeminds-feed-reactnative-integration/components/LMMedia/LMImage/index.tsx b/likeminds-feed-reactnative-integration/components/LMMedia/LMImage/index.tsx index 127aa6f5..bc6f68e8 100644 --- a/likeminds-feed-reactnative-integration/components/LMMedia/LMImage/index.tsx +++ b/likeminds-feed-reactnative-integration/components/LMMedia/LMImage/index.tsx @@ -1,4 +1,4 @@ -import { View, Text, Image, StyleSheet, Dimensions } from "react-native"; +import { View, Text, Image, StyleSheet } from "react-native"; import React, { useEffect, useLayoutEffect, useState } from "react"; import { LMImageProps } from "./types"; import { MEDIA_FETCH_ERROR } from "../../../constants/Strings"; diff --git a/likeminds-feed-reactnative-integration/components/LMMedia/LMVideo/index.tsx b/likeminds-feed-reactnative-integration/components/LMMedia/LMVideo/index.tsx index dac40770..1e0454b3 100644 --- a/likeminds-feed-reactnative-integration/components/LMMedia/LMVideo/index.tsx +++ b/likeminds-feed-reactnative-integration/components/LMMedia/LMVideo/index.tsx @@ -5,7 +5,6 @@ import { TouchableOpacity, TouchableWithoutFeedback, Image, - Dimensions, Platform, } from "react-native"; import React, { useEffect, useRef, useState } from "react"; diff --git a/likeminds-feed-reactnative-integration/screens/postDetail/index.tsx b/likeminds-feed-reactnative-integration/screens/postDetail/index.tsx index 4f06e76f..1202be5d 100644 --- a/likeminds-feed-reactnative-integration/screens/postDetail/index.tsx +++ b/likeminds-feed-reactnative-integration/screens/postDetail/index.tsx @@ -11,7 +11,6 @@ import { Text, View, SafeAreaView, - Dimensions, StatusBar, } from "react-native"; import React, { useState, useEffect, ReactNode } from "react"; From 002150b97cbd896cc4edf2da95e1abe2205dd944 Mon Sep 17 00:00:00 2001 From: Usman salim Date: Mon, 19 May 2025 12:11:34 +0530 Subject: [PATCH 23/41] removed unused imports --- .../screens/postsList/index.tsx | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/likeminds-feed-reactnative-integration/screens/postsList/index.tsx b/likeminds-feed-reactnative-integration/screens/postsList/index.tsx index 04ea204b..b4d5f87d 100644 --- a/likeminds-feed-reactnative-integration/screens/postsList/index.tsx +++ b/likeminds-feed-reactnative-integration/screens/postsList/index.tsx @@ -1,12 +1,10 @@ import React, { useCallback, useEffect, useMemo, useRef } from "react"; import { - FlatList, Platform, RefreshControl, Text, TouchableOpacity, View, - Dimensions } from "react-native"; import { styles } from "./styles"; import { @@ -378,7 +376,7 @@ const PostsListComponent = ({ debounce(onMomentumScrollEnd, 5000)({ nativeEvent }); }; - const getMaxHeightOfAttachments = (post) => { + const getMaxHeightOfAttachments = (post: LMPostViewData) => { if (!post?.attachments?.length) return 350; const screenWidth = Layout.window.width; @@ -415,7 +413,6 @@ const PostsListComponent = ({ {!feedFetching ? ( feedData?.length > 0 ? ( Date: Mon, 19 May 2025 12:48:42 +0530 Subject: [PATCH 24/41] resolved comments --- .../components/LMMedia/LMCreatePostVideo/index.tsx | 1 - .../screens/searchFeed/index.tsx | 4 ++-- .../viewDataModels/index.ts | 1 + 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/likeminds-feed-reactnative-integration/components/LMMedia/LMCreatePostVideo/index.tsx b/likeminds-feed-reactnative-integration/components/LMMedia/LMCreatePostVideo/index.tsx index 3a639f51..2b7e891c 100644 --- a/likeminds-feed-reactnative-integration/components/LMMedia/LMCreatePostVideo/index.tsx +++ b/likeminds-feed-reactnative-integration/components/LMMedia/LMCreatePostVideo/index.tsx @@ -5,7 +5,6 @@ import { TouchableOpacity, TouchableWithoutFeedback, Image, - Dimensions, Platform, } from "react-native"; import React, { useEffect, useRef, useState } from "react"; diff --git a/likeminds-feed-reactnative-integration/screens/searchFeed/index.tsx b/likeminds-feed-reactnative-integration/screens/searchFeed/index.tsx index 572d35bd..b08701d7 100644 --- a/likeminds-feed-reactnative-integration/screens/searchFeed/index.tsx +++ b/likeminds-feed-reactnative-integration/screens/searchFeed/index.tsx @@ -1,4 +1,4 @@ -import { SafeAreaView, StyleSheet, Text, View, TouchableOpacity, RefreshControl, FlatList, ActivityIndicator, Dimensions, Platform } from 'react-native' +import { SafeAreaView, StyleSheet, Text, View, TouchableOpacity, Platform } from 'react-native' import { NativeStackNavigationProp } from "@react-navigation/native-stack"; import { LMMenuItemsViewData, RootStackParamList } from "../../models"; import { SearchFeedCustomisableMethodsContextProvider } from '../../context/searchFeedCallbacksContext'; @@ -434,7 +434,7 @@ const LMFeedSearchScreenComponent = ({ Date: Mon, 19 May 2025 13:21:29 +0530 Subject: [PATCH 25/41] added optimization --- .../screens/postsList/index.tsx | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/likeminds-feed-reactnative-integration/screens/postsList/index.tsx b/likeminds-feed-reactnative-integration/screens/postsList/index.tsx index b4d5f87d..d219f972 100644 --- a/likeminds-feed-reactnative-integration/screens/postsList/index.tsx +++ b/likeminds-feed-reactnative-integration/screens/postsList/index.tsx @@ -423,9 +423,22 @@ const PostsListComponent = ({ decelerationRate={Platform.OS == "android" ? 0.97 : 0.994} overrideItemLayout={(_, item) => { const val = getMaxHeightOfAttachments(item) - console.log({val}) return val; }} + getItemType={(item) => { + const attachments = item?.attachments ?? []; + + switch (attachments.length) { + case 0: + return "post"; + + case 1: + return attachments[0]?.type || ""; + + default: + return "carousel"; + } + }} refreshControl={ Date: Tue, 20 May 2025 20:26:47 +0530 Subject: [PATCH 26/41] resolved comment and replies issues --- .../components/LMCommentItem/index.tsx | 27 +++- .../components/LMMedia/LMImage/index.tsx | 2 +- .../components/LMMedia/LMVideo/index.tsx | 132 +----------------- .../context/postDetailContext.tsx | 63 +++++++-- .../customModals/DeleteModal/index.tsx | 16 ++- .../screens/postDetail/index.tsx | 5 +- .../store/reducers/postDetailReducer.ts | 7 +- .../utils/commentResponseModelConvertor.ts | 38 +++++ 8 files changed, 135 insertions(+), 155 deletions(-) diff --git a/likeminds-feed-reactnative-integration/components/LMCommentItem/index.tsx b/likeminds-feed-reactnative-integration/components/LMCommentItem/index.tsx index 8faafd6f..cb5dc419 100644 --- a/likeminds-feed-reactnative-integration/components/LMCommentItem/index.tsx +++ b/likeminds-feed-reactnative-integration/components/LMCommentItem/index.tsx @@ -62,6 +62,7 @@ const LMCommentItem = React.memo( const [repliesArray, setRepliesArray] = useState([]); const [replyPageNumber, setReplyPageNumber] = useState(2); const customLikeIcon = likeIconButton?.icon; + const [hasRepliesPaginationEnded, setHasRepliesPaginationEnded] = useState(false); const loggedInUserMemberRights = useAppSelector( (state) => state.login.memberRights ); @@ -71,6 +72,8 @@ const LMCommentItem = React.memo( const memberData = useAppSelector((state) => state.login.member); const isCM = memberData?.state === STATE_ADMIN; + const { repliesArrayUnderComments } = usePostDetailContext(); + // this handles the show more functionality const onTextLayout = (event) => { if (event.nativeEvent.lines.length > MAX_LINES && !showText) { @@ -79,7 +82,16 @@ const LMCommentItem = React.memo( } }; - const {setCommentOnFocus} = usePostDetailContext() + const {setCommentOnFocus, commentOnFocus} = usePostDetailContext(); + + useEffect(() => { + if (repliesArray?.length) { + if (comment?.id !== (repliesArrayUnderComments[0])?.comment?.id) { + setRepliesArray([]); + setShowReplies(false); + } + } + }, [commentOnFocus, repliesArrayUnderComments]) useEffect(() => { if (isRepliesVisible) { @@ -441,6 +453,7 @@ const LMCommentItem = React.memo( { return ( <> @@ -469,17 +482,21 @@ const LMCommentItem = React.memo( <> {repliesArray.length > 0 ? ( <> - {comment.repliesCount > repliesArray.length && ( + {comment.repliesCount > repliesArray.length && !hasRepliesPaginationEnded && ( { - setReplyPageNumber(replyPageNumber + 1); onTapViewMore( replyPageNumber, - (data: Array) => + (data: Array, hasPaginationEnded?: boolean) => { setRepliesArray(data) + setReplyPageNumber(replyPageNumber + 1); + if (hasPaginationEnded) { + setHasRepliesPaginationEnded(hasPaginationEnded) + } + } ); } : () => null @@ -513,7 +530,7 @@ const LMCommentItem = React.memo( )} } - keyExtractor={(item, index) => index?.toString()} + keyExtractor={(item, index) => item?.id?.toString()} /> )} diff --git a/likeminds-feed-reactnative-integration/components/LMMedia/LMImage/index.tsx b/likeminds-feed-reactnative-integration/components/LMMedia/LMImage/index.tsx index bc6f68e8..127aa6f5 100644 --- a/likeminds-feed-reactnative-integration/components/LMMedia/LMImage/index.tsx +++ b/likeminds-feed-reactnative-integration/components/LMMedia/LMImage/index.tsx @@ -1,4 +1,4 @@ -import { View, Text, Image, StyleSheet } from "react-native"; +import { View, Text, Image, StyleSheet, Dimensions } from "react-native"; import React, { useEffect, useLayoutEffect, useState } from "react"; import { LMImageProps } from "./types"; import { MEDIA_FETCH_ERROR } from "../../../constants/Strings"; diff --git a/likeminds-feed-reactnative-integration/components/LMMedia/LMVideo/index.tsx b/likeminds-feed-reactnative-integration/components/LMMedia/LMVideo/index.tsx index 1e0454b3..d229cc9a 100644 --- a/likeminds-feed-reactnative-integration/components/LMMedia/LMVideo/index.tsx +++ b/likeminds-feed-reactnative-integration/components/LMMedia/LMVideo/index.tsx @@ -5,6 +5,7 @@ import { TouchableOpacity, TouchableWithoutFeedback, Image, + Dimensions, Platform, } from "react-native"; import React, { useEffect, useRef, useState } from "react"; @@ -167,136 +168,7 @@ const LMVideo = React.memo( ) : null} {/* this renders the video */} - <> - {RNVideo ? ( - setLoading(event?.isBuffering ?? false)} - key={`${videoUrl}-${retryKey}`} - onLoad={(data) => { - setError(false); - onLoad(data); - player.current.seek(0); // this will set first frame of video as thumbnail - setLoading(false); - }} - onProgress={() => setError(false)} - onError={(error) => { - handleError(error) - }} - repeat={ - looping ?? true - } - resizeMode={boxFit ? boxFit : defaultStyles.videoStyle.resizeMode} - playWhenInactive={false} - playInBackground={false} - ignoreSilentSwitch="obey" - minLoadRetryCount={5} - bufferConfig={{ - minBufferMs: 2500, - maxBufferMs: 5000, - bufferForPlaybackMs: 2500, - bufferForPlaybackAfterRebufferMs: 2500, - }} - /* @ts-ignore */ - style={StyleSheet.flatten([ - videoStyle, - { - height: heightCalculated, - aspectRatio: aspectRatio ? aspectRatio : desiredAspectRatio, - }, - ])} - paused={ - isFocused - ? flowFromCarouselScreen && currentVideoId === postId - ? false - : flowToCreatePostScreen - ? true - : pauseStatus === true && - previousRoute?.name === UNIVERSAL_FEED && - currentRoute?.name !== CREATE_POST - ? pauseStatus - : videoInFeed - ? autoPlay - ? currentVideoId === postId - ? videoInCarousel - ? currentVideoInCarousel === videoUrl - ? false - : true - : false - : true - : playingStatus - : autoPlay - ? videoInCarousel - ? currentVideoInCarousel === videoUrl - ? false - : true - : false - : playingStatus - : true - } // handles the auto play/pause functionality - muted={ - isReportModalOpened || - flowToCarouselScreen || - flowToPostDetailScreen - ? true - : mute - } - /> - ) : videoCallback ? ( - videoCallback({ - paused: isFocused - ? flowFromCarouselScreen && currentVideoId === postId - ? false - : flowToCreatePostScreen - ? true - : pauseStatus === true && - previousRoute?.name === UNIVERSAL_FEED && - currentRoute?.name !== CREATE_POST - ? pauseStatus - : videoInFeed - ? autoPlay - ? currentVideoId === postId - ? videoInCarousel - ? currentVideoInCarousel === videoUrl - ? false - : true - : false - : true - : playingStatus - : autoPlay - ? videoInCarousel - ? currentVideoInCarousel === videoUrl - ? false - : true - : false - : playingStatus - : true, - source: videoUrl, - ref: player, - muted: - isReportModalOpened || - flowToCarouselScreen || - flowToPostDetailScreen - ? true - : mute, - repeat: looping ? looping : true, - resizeMode: boxFit ? boxFit : defaultStyles.videoStyle.resizeMode, - playWhenInactive: false, - playInBackground: false, - ignoreSilentSwitch: "obey", - onLoad: onLoad, - setLoading: setLoading, - style: StyleSheet.flatten([ - videoStyle, - { - height: heightCalculated, - aspectRatio: aspectRatio ? aspectRatio : desiredAspectRatio, - }, - ]), - }) - ) : null} - + {/* this renders the cancel button */} {showCancel && ( diff --git a/likeminds-feed-reactnative-integration/context/postDetailContext.tsx b/likeminds-feed-reactnative-integration/context/postDetailContext.tsx index 16d74e31..fd4c9aa2 100644 --- a/likeminds-feed-reactnative-integration/context/postDetailContext.tsx +++ b/likeminds-feed-reactnative-integration/context/postDetailContext.tsx @@ -96,7 +96,7 @@ import { SET_FLOW_TO_POST_DETAIL_SCREEN, SET_REPORT_MODEL_STATUS_IN_POST_DETAIL, } from "../store/types/types"; -import { commentResponseModelConvertor } from "../utils/commentResponseModelConvertor"; +import { commentResponseModelConvertor, mergeReplies } from "../utils/commentResponseModelConvertor"; import STYLES from "../constants/Styles"; import { Client } from "../client"; import { SHOW_TOAST } from "../store/types/loader"; @@ -638,13 +638,46 @@ export const PostDetailContextProvider = ({ }; // this function calls the getComments api + // const getCommentsReplies = async ( + // postId: string, + // commentId: string, + // repliesResponseCallback: any, + // pageNo: number + // ) => { + // const commentsRepliesResponse = await dispatch( + // getComments( + // GetCommentRequest.builder() + // .setPostId(postId) + // .setCommentId(commentId) + // .setPage(pageNo) + // .setPageSize(10) + // .build(), + // false + // ) + // ); + // let replies = new Array() + // setRepliesArrayUnderComments((previousResponse) => { + // replies = [ + // ...commentResponseModelConvertor(commentsRepliesResponse)?.replies, ...previousResponse + // ] + // return replies + // }) + // // sets the api response in the callback function + // repliesResponseCallback( + // postDetail?.replies && + // replies + // ); + // return commentsRepliesResponse; + // }; + + // this function calls the getComments api const getCommentsReplies = async ( postId: string, commentId: string, repliesResponseCallback: any, pageNo: number ) => { - const commentsRepliesResponse = await dispatch( + const commentsRepliesResponse: any = await dispatch( getComments( GetCommentRequest.builder() .setPostId(postId) @@ -655,17 +688,29 @@ export const PostDetailContextProvider = ({ false ) ); - let replies = new Array() + + let val: any = [] + let hasPaginationEnded = false; + if (commentsRepliesResponse?.comment?.replies?.length == 0) { + hasPaginationEnded = true; + } + setRepliesArrayUnderComments((previousResponse) => { - replies = [ - ...commentResponseModelConvertor(commentsRepliesResponse)?.replies, ...previousResponse - ] - return replies + if (previousResponse?.length) { + val = [ + mergeReplies(previousResponse[0], commentsRepliesResponse) + ] + return val; + } else { + val = [commentsRepliesResponse] + return val; + } }) // sets the api response in the callback function repliesResponseCallback( postDetail?.replies && - replies + commentResponseModelConvertor(val[0])?.replies, + hasPaginationEnded ); return commentsRepliesResponse; }; @@ -839,7 +884,7 @@ export const PostDetailContextProvider = ({ const commentEdit = async () => { // convert the mentions to route const convertedEditedComment = mentionToRouteConverter(commentToAdd); - let replyObject = repliesArrayUnderComments?.find(item => item?.comment?.id == commentOnFocus?.parentId) + let replyObject = repliesArrayUnderComments?.find(item => item?.comment?.id == commentOnFocus?.parentId || item?.comment?.id == commentOnFocus?.id) const payload = { commentId: commentOnFocus?.id ?? "", commentText: convertedEditedComment.trim(), diff --git a/likeminds-feed-reactnative-integration/customModals/DeleteModal/index.tsx b/likeminds-feed-reactnative-integration/customModals/DeleteModal/index.tsx index ab4852b9..5c4535c0 100644 --- a/likeminds-feed-reactnative-integration/customModals/DeleteModal/index.tsx +++ b/likeminds-feed-reactnative-integration/customModals/DeleteModal/index.tsx @@ -62,7 +62,9 @@ interface DeleteModalProps { RootStackParamList, "PostDetail" | "UniversalFeed" | "PostsList" >; - repliesArrayUnderComments?: any + repliesArrayUnderComments?: any; + setRepliesArrayUnderComments?: any; + commentOnFocus?: LMCommentViewData; } const DeleteModal = ({ @@ -74,7 +76,8 @@ const DeleteModal = ({ commentDetail, parentCommentId, navigation, - repliesArrayUnderComments + repliesArrayUnderComments, + commentOnFocus }: DeleteModalProps) => { const dispatch = useAppDispatch(); const loggedInUser = useAppSelector((state) => state.login.member); @@ -82,6 +85,7 @@ const DeleteModal = ({ const [otherReason, setOtherReason] = useState(""); const [showReasons, setShowReasons] = useState(false); + // this function calls the delete post api const postDelete = async () => { if (!deletionReason && loggedInUser.userUniqueId !== postDetail?.uuid) { @@ -154,12 +158,13 @@ const DeleteModal = ({ const commentDelete = async () => { if ( !deletionReason && - loggedInUser.userUniqueId !== commentDetail?.userId + loggedInUser.userUniqueId !== commentDetail?.uuid ) { showToast(); } else { - let replyObject = repliesArrayUnderComments?.find(item => item?.comment?.id == commentDetail?.parentId) + let replyObject = (repliesArrayUnderComments[0])?.comment?.replies const payload = { + parentCommentId: (repliesArrayUnderComments[0])?.comment?.id, deleteReason: otherReason ? otherReason : deletionReason, commentId: commentDetail?.id ? commentDetail.id : "", postId: commentDetail?.postId ? commentDetail.postId : "", @@ -222,6 +227,7 @@ const DeleteModal = ({ setDeletionReason(val); }; + // this show the toast message over the modal const showToast = () => { Toast.show({ @@ -297,7 +303,7 @@ const DeleteModal = ({ {/* delete reason selection section */} {loggedInUser.userUniqueId !== postDetail?.uuid && - loggedInUser.userUniqueId !== commentDetail?.userId && ( + loggedInUser.userUniqueId !== commentDetail?.uuid && ( { diff --git a/likeminds-feed-reactnative-integration/screens/postDetail/index.tsx b/likeminds-feed-reactnative-integration/screens/postDetail/index.tsx index 1202be5d..e9b0d409 100644 --- a/likeminds-feed-reactnative-integration/screens/postDetail/index.tsx +++ b/likeminds-feed-reactnative-integration/screens/postDetail/index.tsx @@ -11,6 +11,7 @@ import { Text, View, SafeAreaView, + Dimensions, StatusBar, } from "react-native"; import React, { useState, useEffect, ReactNode } from "react"; @@ -274,7 +275,7 @@ const PostDetailComponent = React.memo(() => { ); const memberData = useAppSelector((state) => state.login.member); const isCM = memberData?.state === STATE_ADMIN; - const { repliesArrayUnderComments } = usePostDetailContext(); + const { repliesArrayUnderComments, setRepliesArrayUnderComments } = usePostDetailContext(); // this function returns the id of the item selected from menu list and handles further functionalities accordingly for comment const onCommentMenuItemSelect = async ( @@ -1140,11 +1141,13 @@ const PostDetailComponent = React.memo(() => { deleteType={selectedMenuItemPostId ? POST_TYPE : COMMENT_TYPE} postDetail={postDetail} commentDetail={getCommentDetail(postDetail?.replies)?.commentDetail} + commentOnFocus={commentOnFocus} parentCommentId={ getCommentDetail(postDetail?.replies)?.parentCommentId } navigation={navigation} repliesArrayUnderComments={repliesArrayUnderComments} + setRepliesArrayUnderComments={setRepliesArrayUnderComments} /> )} {/* report post modal */} diff --git a/likeminds-feed-reactnative-integration/store/reducers/postDetailReducer.ts b/likeminds-feed-reactnative-integration/store/reducers/postDetailReducer.ts index d9705cc9..4ff97833 100644 --- a/likeminds-feed-reactnative-integration/store/reducers/postDetailReducer.ts +++ b/likeminds-feed-reactnative-integration/store/reducers/postDetailReducer.ts @@ -390,12 +390,11 @@ export const postDetailReducer = (state = initialState, action) => { case DELETE_COMMENT_STATE: { const updatedPostDetail: any = state.postDetail; // this gets the index of the comment that is deleted - const { replyObject } = action.body; - let parentCommentId = replyObject?.comment?.id; + const { replyObject, parentCommentId } = action.body; if (updatedPostDetail?.replies?.length > 0) { updatedPostDetail?.replies?.forEach((item) => { if (item?.id == parentCommentId) { - item.replies = replyObject?.comment?.replies; + item.replies = replyObject } }); } @@ -427,7 +426,7 @@ export const postDetailReducer = (state = initialState, action) => { deletedCommentIndexChild !== undefined && deletedCommentIndexChild !== -1 ) { - updatedPostDetail.replies[i].replies.splice( + const del = updatedPostDetail.replies[i].replies.splice( deletedCommentIndexChild, 1 ); diff --git a/likeminds-feed-reactnative-integration/utils/commentResponseModelConvertor.ts b/likeminds-feed-reactnative-integration/utils/commentResponseModelConvertor.ts index 60417682..6b3f4332 100644 --- a/likeminds-feed-reactnative-integration/utils/commentResponseModelConvertor.ts +++ b/likeminds-feed-reactnative-integration/utils/commentResponseModelConvertor.ts @@ -20,3 +20,41 @@ export const commentResponseModelConvertor = (response) => { comment.replies = repliesArray?.length > 0 ? repliesArray : []; return comment; }; + +export function mergeReplies(obj1, obj2) { + // Ensure both objects and their comments exist + const comment1 = obj1?.comment; + const comment2 = obj2?.comment; + + // If comment IDs don't match, return obj1 unchanged (or handle as needed) + if (!comment1 || !comment2 || comment1.id !== comment2.id) { + return obj2; + } + + // Clone obj1 to avoid mutating it + const merged = JSON.parse(JSON.stringify(obj1)); + + const replies1 = comment1.replies ?? []; + const replies2 = comment2.replies ?? []; + + // Deduplicate replies by reply.id + const deduplicatedReplies = [ + ...new Map( + [...replies1, ...replies2].map(reply => [reply.id, reply]) + ).values() + ]; + + // Sort by abs(Number(tempId)) in ascending order + deduplicatedReplies.sort((a, b) => { + const aTime = Math.abs(Number(a.tempId)); + const bTime = Math.abs(Number(b.tempId)); + return bTime - aTime; + }); + + merged.comment.replies = deduplicatedReplies; + + return merged; +} + + + From 549d9b215e046dac5b6dcf21a3394056880671b2 Mon Sep 17 00:00:00 2001 From: Usman salim Date: Wed, 21 May 2025 02:43:44 +0530 Subject: [PATCH 27/41] fixed comment count issue --- .../customModals/DeleteModal/index.tsx | 3 ++- .../store/reducers/feedReducer.ts | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/likeminds-feed-reactnative-integration/customModals/DeleteModal/index.tsx b/likeminds-feed-reactnative-integration/customModals/DeleteModal/index.tsx index 5c4535c0..92ad8028 100644 --- a/likeminds-feed-reactnative-integration/customModals/DeleteModal/index.tsx +++ b/likeminds-feed-reactnative-integration/customModals/DeleteModal/index.tsx @@ -168,7 +168,8 @@ const DeleteModal = ({ deleteReason: otherReason ? otherReason : deletionReason, commentId: commentDetail?.id ? commentDetail.id : "", postId: commentDetail?.postId ? commentDetail.postId : "", - replyObject + replyObject, + commentLevel: commentOnFocus?.level }; displayModal(false); diff --git a/likeminds-feed-reactnative-integration/store/reducers/feedReducer.ts b/likeminds-feed-reactnative-integration/store/reducers/feedReducer.ts index b7e8efe4..8c9c4d4e 100644 --- a/likeminds-feed-reactnative-integration/store/reducers/feedReducer.ts +++ b/likeminds-feed-reactnative-integration/store/reducers/feedReducer.ts @@ -513,6 +513,8 @@ export const feedReducer = (state = initialState, action) => { } case DELETE_COMMENT_STATE: { + const { commentLevel } = action.body + if (commentLevel !== 0) return { ...state }; const updatedFeed = state.feed; const updatedSearchFeed = state.searchedPosts; // finds the post whose comment is deleted in post detail and manage its comment count From 1467ce622167a73532e07fac8f82bd9d705c8dcf Mon Sep 17 00:00:00 2001 From: Usman salim Date: Wed, 21 May 2025 14:02:16 +0530 Subject: [PATCH 28/41] fixed video player pause issue --- .../LMMedia/LMCreatePostVideo/index.tsx | 5 +- .../components/LMMedia/LMVideo/index.tsx | 133 +++++++++++++++++- .../components/LMVideoPlayer/index.tsx | 2 +- .../lmFeedProvider/index.tsx | 19 ++- .../screens/postDetail/index.tsx | 2 + 5 files changed, 154 insertions(+), 7 deletions(-) diff --git a/likeminds-feed-reactnative-integration/components/LMMedia/LMCreatePostVideo/index.tsx b/likeminds-feed-reactnative-integration/components/LMMedia/LMCreatePostVideo/index.tsx index 2b7e891c..20fd207b 100644 --- a/likeminds-feed-reactnative-integration/components/LMMedia/LMCreatePostVideo/index.tsx +++ b/likeminds-feed-reactnative-integration/components/LMMedia/LMCreatePostVideo/index.tsx @@ -3,7 +3,6 @@ import { Text, StyleSheet, TouchableOpacity, - TouchableWithoutFeedback, Image, Platform, } from "react-native"; @@ -172,7 +171,7 @@ import { }, ])} paused={ - flowFromCarouselScreen && currentVideoId === postId + ( LMFeedProvider.appState !== "active" || (flowFromCarouselScreen && currentVideoId === postId ? false : flowToCreatePostScreen ? true @@ -196,7 +195,7 @@ import { ? false : true : false - : playingStatus + : playingStatus)) } // handles the auto play/pause functionality muted={ isReportModalOpened || diff --git a/likeminds-feed-reactnative-integration/components/LMMedia/LMVideo/index.tsx b/likeminds-feed-reactnative-integration/components/LMMedia/LMVideo/index.tsx index d229cc9a..2bb87cf1 100644 --- a/likeminds-feed-reactnative-integration/components/LMMedia/LMVideo/index.tsx +++ b/likeminds-feed-reactnative-integration/components/LMMedia/LMVideo/index.tsx @@ -166,9 +166,138 @@ const LMVideo = React.memo( )} ) : null} - + {/* this renders the video */} - + <> + {RNVideo ? ( + setLoading(event?.isBuffering ?? false)} + key={`${videoUrl}-${retryKey}`} + onLoad={(data) => { + setError(false); + onLoad(data); + player.current.seek(0); // this will set first frame of video as thumbnail + setLoading(false); + }} + onProgress={() => setError(false)} + onError={(error) => { + handleError(error) + }} + repeat={ + looping ?? true + } + resizeMode={boxFit ? boxFit : defaultStyles.videoStyle.resizeMode} + playWhenInactive={false} + playInBackground={false} + ignoreSilentSwitch="obey" + minLoadRetryCount={5} + bufferConfig={{ + minBufferMs: 2500, + maxBufferMs: 5000, + bufferForPlaybackMs: 2500, + bufferForPlaybackAfterRebufferMs: 2500, + }} + /* @ts-ignore */ + style={StyleSheet.flatten([ + videoStyle, + { + height: heightCalculated, + aspectRatio: aspectRatio ? aspectRatio : desiredAspectRatio, + }, + ])} + paused={ + (isFocused && LMFeedProvider.appState == 'active') + ? flowFromCarouselScreen && currentVideoId === postId + ? false + : flowToCreatePostScreen + ? true + : pauseStatus === true && + previousRoute?.name === UNIVERSAL_FEED && + currentRoute?.name !== CREATE_POST + ? pauseStatus + : videoInFeed + ? autoPlay + ? currentVideoId === postId + ? videoInCarousel + ? currentVideoInCarousel === videoUrl + ? false + : true + : false + : true + : playingStatus + : autoPlay + ? videoInCarousel + ? currentVideoInCarousel === videoUrl + ? false + : true + : false + : playingStatus + : true + } // handles the auto play/pause functionality + muted={ + isReportModalOpened || + flowToCarouselScreen || + flowToPostDetailScreen + ? true + : mute + } + /> + ) : videoCallback ? ( + videoCallback({ + paused: isFocused + ? flowFromCarouselScreen && currentVideoId === postId + ? false + : flowToCreatePostScreen + ? true + : pauseStatus === true && + previousRoute?.name === UNIVERSAL_FEED && + currentRoute?.name !== CREATE_POST + ? pauseStatus + : videoInFeed + ? autoPlay + ? currentVideoId === postId + ? videoInCarousel + ? currentVideoInCarousel === videoUrl + ? false + : true + : false + : true + : playingStatus + : autoPlay + ? videoInCarousel + ? currentVideoInCarousel === videoUrl + ? false + : true + : false + : playingStatus + : true, + source: videoUrl, + ref: player, + muted: + isReportModalOpened || + flowToCarouselScreen || + flowToPostDetailScreen + ? true + : mute, + repeat: looping ? looping : true, + resizeMode: boxFit ? boxFit : defaultStyles.videoStyle.resizeMode, + playWhenInactive: false, + playInBackground: false, + ignoreSilentSwitch: "obey", + onLoad: onLoad, + setLoading: setLoading, + style: StyleSheet.flatten([ + videoStyle, + { + height: heightCalculated, + aspectRatio: aspectRatio ? aspectRatio : desiredAspectRatio, + }, + ]), + }) + ) : null} + {/* this renders the cancel button */} {showCancel && ( diff --git a/likeminds-feed-reactnative-integration/components/LMVideoPlayer/index.tsx b/likeminds-feed-reactnative-integration/components/LMVideoPlayer/index.tsx index 9d719939..9ded02b3 100644 --- a/likeminds-feed-reactnative-integration/components/LMVideoPlayer/index.tsx +++ b/likeminds-feed-reactnative-integration/components/LMVideoPlayer/index.tsx @@ -99,7 +99,7 @@ function LMVideoPlayer({ url, setDisableGesture }) { {RNVideo ? ( void; callGetCommunityConfigurations: () => void; callIsUserOnboardingDone: () => Promise; + appState: AppStateStatus } // Create a context for LMFeedProvider @@ -84,6 +85,8 @@ export const LMFeedProvider = ({ const [isInitiated, setIsInitiated] = useState(false); const [onBoardUser, setOnboardUser] = useState(false); const [withAPIKeySecurity, setWithAPIKeySecurity] = useState(false); + const [appState, setAppState] = useState(AppState.currentState); + const dispatch = useAppDispatch(); const showToast = useAppSelector((state) => state.loader.isToast); @@ -213,6 +216,19 @@ export const LMFeedProvider = ({ })(); }, [accessToken, refreshToken]); + + useEffect(() => { + const handleAppStateChange = (nextAppState) => { + setAppState(nextAppState); + }; + + const subscription = AppState.addEventListener('change', handleAppStateChange); + + return () => { + subscription.remove(); // Clean up listener on unmount + }; + }, []); + const contextValues: LMFeedContextProps = { myClient: myClient, videoCallback: videoCallback, @@ -223,6 +239,7 @@ export const LMFeedProvider = ({ withAPIKeySecurity, apiKey, userUniqueId, + appState, setOnboardUser, setIsInitiated, diff --git a/likeminds-feed-reactnative-integration/screens/postDetail/index.tsx b/likeminds-feed-reactnative-integration/screens/postDetail/index.tsx index e9b0d409..c1a85aa9 100644 --- a/likeminds-feed-reactnative-integration/screens/postDetail/index.tsx +++ b/likeminds-feed-reactnative-integration/screens/postDetail/index.tsx @@ -78,6 +78,7 @@ import pluralizeOrCapitalize from "../../utils/variables"; import { CommunityConfigs } from "../../communityConfigs"; import { WordAction } from "../..//enums/Variables"; import { useSafeAreaFrame, useSafeAreaInsets } from "react-native-safe-area-context"; +import { useIsFocused } from '@react-navigation/native'; interface PostDetailProps { children?: React.ReactNode; @@ -276,6 +277,7 @@ const PostDetailComponent = React.memo(() => { const memberData = useAppSelector((state) => state.login.member); const isCM = memberData?.state === STATE_ADMIN; const { repliesArrayUnderComments, setRepliesArrayUnderComments } = usePostDetailContext(); + const focused = useIsFocused(); // this function returns the id of the item selected from menu list and handles further functionalities accordingly for comment const onCommentMenuItemSelect = async ( From d9cd0cd863db4343eede08e937060a593254f97b Mon Sep 17 00:00:00 2001 From: Usman salim Date: Wed, 21 May 2025 16:13:57 +0530 Subject: [PATCH 29/41] fixed peer testing issues --- .../context/universalFeedContext.tsx | 7 +++++++ .../notification/index.ts | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/likeminds-feed-reactnative-integration/context/universalFeedContext.tsx b/likeminds-feed-reactnative-integration/context/universalFeedContext.tsx index 4c8a631c..ef9414d7 100644 --- a/likeminds-feed-reactnative-integration/context/universalFeedContext.tsx +++ b/likeminds-feed-reactnative-integration/context/universalFeedContext.tsx @@ -651,6 +651,13 @@ export const UniversalFeedContextProvider = ({ ) { setPostUploading(true); postAdd(); + } else { + dispatch({ + type: SET_POST_UPLOADING_CREATE_SCREEN, + body: { + uploading: false + } + }) } }, [mediaAttachmemnts, linkAttachments, postContent, heading, topics, poll]); diff --git a/likeminds-feed-reactnative-integration/notification/index.ts b/likeminds-feed-reactnative-integration/notification/index.ts index 18a83447..db63d02c 100644 --- a/likeminds-feed-reactnative-integration/notification/index.ts +++ b/likeminds-feed-reactnative-integration/notification/index.ts @@ -43,7 +43,7 @@ export function getRoute(route: any) { } else { return { route: UNIVERSAL_FEED, - params: { navigationRoute: navigationRoute[1] }, + params: { navigationRoute: {} }, }; } } From 67d39699a1920261afbcf83d9f0234a2270f969f Mon Sep 17 00:00:00 2001 From: Usman salim Date: Wed, 21 May 2025 16:25:34 +0530 Subject: [PATCH 30/41] removed comments --- .../context/postDetailContext.tsx | 34 +------------------ 1 file changed, 1 insertion(+), 33 deletions(-) diff --git a/likeminds-feed-reactnative-integration/context/postDetailContext.tsx b/likeminds-feed-reactnative-integration/context/postDetailContext.tsx index fd4c9aa2..1348386b 100644 --- a/likeminds-feed-reactnative-integration/context/postDetailContext.tsx +++ b/likeminds-feed-reactnative-integration/context/postDetailContext.tsx @@ -637,40 +637,8 @@ export const PostDetailContextProvider = ({ return getPostResponse; }; - // this function calls the getComments api - // const getCommentsReplies = async ( - // postId: string, - // commentId: string, - // repliesResponseCallback: any, - // pageNo: number - // ) => { - // const commentsRepliesResponse = await dispatch( - // getComments( - // GetCommentRequest.builder() - // .setPostId(postId) - // .setCommentId(commentId) - // .setPage(pageNo) - // .setPageSize(10) - // .build(), - // false - // ) - // ); - // let replies = new Array() - // setRepliesArrayUnderComments((previousResponse) => { - // replies = [ - // ...commentResponseModelConvertor(commentsRepliesResponse)?.replies, ...previousResponse - // ] - // return replies - // }) - // // sets the api response in the callback function - // repliesResponseCallback( - // postDetail?.replies && - // replies - // ); - // return commentsRepliesResponse; - // }; - // this function calls the getComments api + // this function calls the getComments api const getCommentsReplies = async ( postId: string, commentId: string, From 13663cbd26d39b86cc895a13733d9734525a19ae Mon Sep 17 00:00:00 2001 From: Usman salim Date: Wed, 21 May 2025 17:00:48 +0530 Subject: [PATCH 31/41] resolved comments --- .../context/postDetailContext.tsx | 19 ++++++++++--------- .../customModals/DeleteModal/index.tsx | 4 ++-- .../store/reducers/postDetailReducer.ts | 2 +- .../utils/commentResponseModelConvertor.ts | 6 ++---- 4 files changed, 15 insertions(+), 16 deletions(-) diff --git a/likeminds-feed-reactnative-integration/context/postDetailContext.tsx b/likeminds-feed-reactnative-integration/context/postDetailContext.tsx index 1348386b..be73fcec 100644 --- a/likeminds-feed-reactnative-integration/context/postDetailContext.tsx +++ b/likeminds-feed-reactnative-integration/context/postDetailContext.tsx @@ -54,6 +54,7 @@ import { import { AddCommentRequest, EditCommentRequest, + GetCommentDetails, GetCommentRequest, GetPostRequest, GetTaggingListRequest, @@ -645,7 +646,7 @@ export const PostDetailContextProvider = ({ repliesResponseCallback: any, pageNo: number ) => { - const commentsRepliesResponse: any = await dispatch( + const commentsRepliesResponse: GetCommentDetails = await dispatch( getComments( GetCommentRequest.builder() .setPostId(postId) @@ -655,29 +656,29 @@ export const PostDetailContextProvider = ({ .build(), false ) - ); + ) as any; - let val: any = [] + let replies = new Array(); let hasPaginationEnded = false; - if (commentsRepliesResponse?.comment?.replies?.length == 0) { + if ((commentsRepliesResponse?.comment)?.replies?.length == 0) { hasPaginationEnded = true; } setRepliesArrayUnderComments((previousResponse) => { if (previousResponse?.length) { - val = [ + replies = [ mergeReplies(previousResponse[0], commentsRepliesResponse) ] - return val; + return replies; } else { - val = [commentsRepliesResponse] - return val; + replies = [commentsRepliesResponse] + return replies; } }) // sets the api response in the callback function repliesResponseCallback( postDetail?.replies && - commentResponseModelConvertor(val[0])?.replies, + commentResponseModelConvertor(replies[0])?.replies, hasPaginationEnded ); return commentsRepliesResponse; diff --git a/likeminds-feed-reactnative-integration/customModals/DeleteModal/index.tsx b/likeminds-feed-reactnative-integration/customModals/DeleteModal/index.tsx index 92ad8028..4e7c3743 100644 --- a/likeminds-feed-reactnative-integration/customModals/DeleteModal/index.tsx +++ b/likeminds-feed-reactnative-integration/customModals/DeleteModal/index.tsx @@ -62,8 +62,8 @@ interface DeleteModalProps { RootStackParamList, "PostDetail" | "UniversalFeed" | "PostsList" >; - repliesArrayUnderComments?: any; - setRepliesArrayUnderComments?: any; + repliesArrayUnderComments?: React.Dispatch; + setRepliesArrayUnderComments?: React.Dispatch; commentOnFocus?: LMCommentViewData; } diff --git a/likeminds-feed-reactnative-integration/store/reducers/postDetailReducer.ts b/likeminds-feed-reactnative-integration/store/reducers/postDetailReducer.ts index 4ff97833..fd39fab0 100644 --- a/likeminds-feed-reactnative-integration/store/reducers/postDetailReducer.ts +++ b/likeminds-feed-reactnative-integration/store/reducers/postDetailReducer.ts @@ -426,7 +426,7 @@ export const postDetailReducer = (state = initialState, action) => { deletedCommentIndexChild !== undefined && deletedCommentIndexChild !== -1 ) { - const del = updatedPostDetail.replies[i].replies.splice( + updatedPostDetail.replies[i].replies.splice( deletedCommentIndexChild, 1 ); diff --git a/likeminds-feed-reactnative-integration/utils/commentResponseModelConvertor.ts b/likeminds-feed-reactnative-integration/utils/commentResponseModelConvertor.ts index 6b3f4332..38c0c640 100644 --- a/likeminds-feed-reactnative-integration/utils/commentResponseModelConvertor.ts +++ b/likeminds-feed-reactnative-integration/utils/commentResponseModelConvertor.ts @@ -21,6 +21,7 @@ export const commentResponseModelConvertor = (response) => { return comment; }; +// this function merges the level 1 replies during pagination of replies under a single comment export function mergeReplies(obj1, obj2) { // Ensure both objects and their comments exist const comment1 = obj1?.comment; @@ -54,7 +55,4 @@ export function mergeReplies(obj1, obj2) { merged.comment.replies = deduplicatedReplies; return merged; -} - - - +} \ No newline at end of file From 29f2ff9b3bd995d961ce2e15b4feb3fc5d8d5728 Mon Sep 17 00:00:00 2001 From: Usman salim Date: Thu, 22 May 2025 00:37:18 +0530 Subject: [PATCH 32/41] refactored replies logic --- .../components/LMCommentItem/index.tsx | 37 +++++------ .../context/postDetailContext.tsx | 26 +++----- .../screens/postDetail/index.tsx | 1 - .../store/reducers/postDetailReducer.ts | 61 ++++++------------- 4 files changed, 39 insertions(+), 86 deletions(-) diff --git a/likeminds-feed-reactnative-integration/components/LMCommentItem/index.tsx b/likeminds-feed-reactnative-integration/components/LMCommentItem/index.tsx index cb5dc419..a86204fe 100644 --- a/likeminds-feed-reactnative-integration/components/LMCommentItem/index.tsx +++ b/likeminds-feed-reactnative-integration/components/LMCommentItem/index.tsx @@ -21,13 +21,14 @@ import { LMCommentViewData } from "../../models"; import { styles } from "./styles"; import decode from "../../utils/decodeMentions"; import { timeStamp } from "../../utils"; -import { useAppSelector } from "../../store/store"; +import { useAppDispatch, useAppSelector } from "../../store/store"; import { MemberRightsEnum } from "../../enums/MemberRightsEnum"; import STYLES from "../../constants/Styles"; import { usePostDetailContext } from "../../context"; import { CommunityConfigs } from "../../communityConfigs"; import pluralizeOrCapitalize from "../../utils/variables"; import { WordAction } from "../../enums/Variables"; +import { clearComments } from "../../store/actions/postDetail"; const LMCommentItem = React.memo( ({ likeIconButton, @@ -71,8 +72,7 @@ const LMCommentItem = React.memo( ); const memberData = useAppSelector((state) => state.login.member); const isCM = memberData?.state === STATE_ADMIN; - - const { repliesArrayUnderComments } = usePostDetailContext(); + const dispatch = useAppDispatch(); // this handles the show more functionality const onTextLayout = (event) => { @@ -84,20 +84,9 @@ const LMCommentItem = React.memo( const {setCommentOnFocus, commentOnFocus} = usePostDetailContext(); - useEffect(() => { - if (repliesArray?.length) { - if (comment?.id !== (repliesArrayUnderComments[0])?.comment?.id) { - setRepliesArray([]); - setShowReplies(false); - } - } - }, [commentOnFocus, repliesArrayUnderComments]) - useEffect(() => { if (isRepliesVisible) { setShowReplies(true); - onTapReplies && - onTapReplies((data: Array) => setRepliesArray(data), ""); } }, [isRepliesVisible]); @@ -148,6 +137,10 @@ const LMCommentItem = React.memo( }; const handleReplies = () => { + if (showReplies) { + setHasRepliesPaginationEnded(false); + dispatch(clearComments(comment?.id)) + } setShowReplies(!showReplies); }; @@ -365,7 +358,7 @@ const LMCommentItem = React.memo( ))} { - onTapReplies + onTapReplies && !showReplies ? (onTapReplies( (data: Array) => setRepliesArray(data), @@ -449,11 +442,10 @@ const LMCommentItem = React.memo( {/* replies section */} {showReplies && comment.repliesCount > 0 && ( - {repliesArray && ( + {comment?.replies && ( { return ( <> @@ -477,12 +469,11 @@ const LMCommentItem = React.memo( ); }} - // ListFooterComponentStyle={{}} ListFooterComponent={ <> - {repliesArray.length > 0 ? ( + {comment?.replies.length > 0 ? ( <> - {comment.repliesCount > repliesArray.length && !hasRepliesPaginationEnded && ( + {comment.repliesCount > comment?.replies.length && !hasRepliesPaginationEnded && ( - {repliesArray.length} of {comment.repliesCount} + {comment?.replies?.length} of {comment.repliesCount} )} @@ -530,7 +521,7 @@ const LMCommentItem = React.memo( )} } - keyExtractor={(item, index) => item?.id?.toString()} + keyExtractor={(item, index) => index?.toString()} /> )} diff --git a/likeminds-feed-reactnative-integration/context/postDetailContext.tsx b/likeminds-feed-reactnative-integration/context/postDetailContext.tsx index be73fcec..0de0fdbf 100644 --- a/likeminds-feed-reactnative-integration/context/postDetailContext.tsx +++ b/likeminds-feed-reactnative-integration/context/postDetailContext.tsx @@ -658,29 +658,19 @@ export const PostDetailContextProvider = ({ ) ) as any; - let replies = new Array(); + dispatch({ + type: "ADD_REPLIES_TO_COMMENT", + body: { + parentCommentId: commentId, + replies: commentResponseModelConvertor(commentsRepliesResponse)?.replies, + } + }) + let hasPaginationEnded = false; if ((commentsRepliesResponse?.comment)?.replies?.length == 0) { hasPaginationEnded = true; } - setRepliesArrayUnderComments((previousResponse) => { - if (previousResponse?.length) { - replies = [ - mergeReplies(previousResponse[0], commentsRepliesResponse) - ] - return replies; - } else { - replies = [commentsRepliesResponse] - return replies; - } - }) - // sets the api response in the callback function - repliesResponseCallback( - postDetail?.replies && - commentResponseModelConvertor(replies[0])?.replies, - hasPaginationEnded - ); return commentsRepliesResponse; }; diff --git a/likeminds-feed-reactnative-integration/screens/postDetail/index.tsx b/likeminds-feed-reactnative-integration/screens/postDetail/index.tsx index c1a85aa9..be6414fe 100644 --- a/likeminds-feed-reactnative-integration/screens/postDetail/index.tsx +++ b/likeminds-feed-reactnative-integration/screens/postDetail/index.tsx @@ -553,7 +553,6 @@ const PostDetailComponent = React.memo(() => { repliesResponseCallback, commentIdOfReplies ) => { - dispatch(clearComments(item?.id)); setShowRepliesOfCommentId(commentIdOfReplies); getCommentsRepliesProp ? getCommentsRepliesProp( diff --git a/likeminds-feed-reactnative-integration/store/reducers/postDetailReducer.ts b/likeminds-feed-reactnative-integration/store/reducers/postDetailReducer.ts index fd39fab0..891ecc04 100644 --- a/likeminds-feed-reactnative-integration/store/reducers/postDetailReducer.ts +++ b/likeminds-feed-reactnative-integration/store/reducers/postDetailReducer.ts @@ -143,38 +143,13 @@ export const postDetailReducer = (state = initialState, action) => { return { ...state, postDetail: converterPostData }; } case POST_COMMENTS_SUCCESS: { - const { comment, users } = action.body; - const updatedDetail = state.postDetail; - updatedDetail?.replies && - updatedDetail.replies.find((item) => { - if (item.id === comment?.id) { - const commentData = convertToLMCommentViewData( - comment?.postId, - comment.replies, - users - ); - let newReplies = commentData || []; - // Filter out replies that are already present in item.replies - newReplies = newReplies.filter( - (newReply) => - !item.replies || // Check if item.replies exist - !item.replies.some( - (existingReply) => existingReply.id === newReply.id - ) - ); - - // Merge the unique newReplies with existing replies in item.replies - const mergedReplies = [...(item.replies || []), ...newReplies]; - item.replies = mergedReplies; - } - }); - return { ...state, postDetail: updatedDetail }; + return {...state} } case CLEAR_COMMENT: { const updatedDetail = state.postDetail; updatedDetail?.replies && updatedDetail.replies.find((item) => { - if (item.id === action.body) { + if (item.id == action.body) { item.replies = []; } }); @@ -337,17 +312,23 @@ export const postDetailReducer = (state = initialState, action) => { }); return { ...state, postDetail: updatedPostDetail }; } + case "ADD_REPLIES_TO_COMMENT": { + const { parentCommentId, replies } = action.body; + if (!parentCommentId || !replies?.length) return {...state} + const postDetail = state.postDetail; + const parentComment = postDetail.replies?.find(reply => reply.id == parentCommentId) + if (parentComment) { + let previousReplies = parentComment.replies; + parentComment.replies = [ + ...previousReplies as [], + ...replies, + ] + } + return { ...state } + } case EDIT_COMMENT_STATE: { const updatedPostDetail: any = state.postDetail; const { commentId, commentText, replyObject } = action.body; - let parentCommentId = replyObject?.comment?.id; - if (updatedPostDetail?.replies?.length > 0) { - updatedPostDetail?.replies?.forEach((item) => { - if (item?.id == parentCommentId) { - item.replies = replyObject?.comment?.replies; - } - }); - } const editCommentIndex = updatedPostDetail?.replies && updatedPostDetail.replies.findIndex( @@ -390,14 +371,6 @@ export const postDetailReducer = (state = initialState, action) => { case DELETE_COMMENT_STATE: { const updatedPostDetail: any = state.postDetail; // this gets the index of the comment that is deleted - const { replyObject, parentCommentId } = action.body; - if (updatedPostDetail?.replies?.length > 0) { - updatedPostDetail?.replies?.forEach((item) => { - if (item?.id == parentCommentId) { - item.replies = replyObject - } - }); - } const deletedCommentIndex = updatedPostDetail?.replies && updatedPostDetail.replies.findIndex( @@ -426,7 +399,7 @@ export const postDetailReducer = (state = initialState, action) => { deletedCommentIndexChild !== undefined && deletedCommentIndexChild !== -1 ) { - updatedPostDetail.replies[i].replies.splice( + updatedPostDetail.replies[i].replies.splice( deletedCommentIndexChild, 1 ); From 8ac115e6d512cfd8af612bf1fd0ba316ff9fcd8a Mon Sep 17 00:00:00 2001 From: Usman salim Date: Thu, 22 May 2025 15:03:55 +0530 Subject: [PATCH 33/41] removed unused code --- .../context/postDetailContext.tsx | 2 +- .../utils/commentResponseModelConvertor.ts | 36 ------------------- 2 files changed, 1 insertion(+), 37 deletions(-) diff --git a/likeminds-feed-reactnative-integration/context/postDetailContext.tsx b/likeminds-feed-reactnative-integration/context/postDetailContext.tsx index 0de0fdbf..3241be54 100644 --- a/likeminds-feed-reactnative-integration/context/postDetailContext.tsx +++ b/likeminds-feed-reactnative-integration/context/postDetailContext.tsx @@ -97,7 +97,7 @@ import { SET_FLOW_TO_POST_DETAIL_SCREEN, SET_REPORT_MODEL_STATUS_IN_POST_DETAIL, } from "../store/types/types"; -import { commentResponseModelConvertor, mergeReplies } from "../utils/commentResponseModelConvertor"; +import { commentResponseModelConvertor } from "../utils/commentResponseModelConvertor"; import STYLES from "../constants/Styles"; import { Client } from "../client"; import { SHOW_TOAST } from "../store/types/loader"; diff --git a/likeminds-feed-reactnative-integration/utils/commentResponseModelConvertor.ts b/likeminds-feed-reactnative-integration/utils/commentResponseModelConvertor.ts index 38c0c640..60417682 100644 --- a/likeminds-feed-reactnative-integration/utils/commentResponseModelConvertor.ts +++ b/likeminds-feed-reactnative-integration/utils/commentResponseModelConvertor.ts @@ -20,39 +20,3 @@ export const commentResponseModelConvertor = (response) => { comment.replies = repliesArray?.length > 0 ? repliesArray : []; return comment; }; - -// this function merges the level 1 replies during pagination of replies under a single comment -export function mergeReplies(obj1, obj2) { - // Ensure both objects and their comments exist - const comment1 = obj1?.comment; - const comment2 = obj2?.comment; - - // If comment IDs don't match, return obj1 unchanged (or handle as needed) - if (!comment1 || !comment2 || comment1.id !== comment2.id) { - return obj2; - } - - // Clone obj1 to avoid mutating it - const merged = JSON.parse(JSON.stringify(obj1)); - - const replies1 = comment1.replies ?? []; - const replies2 = comment2.replies ?? []; - - // Deduplicate replies by reply.id - const deduplicatedReplies = [ - ...new Map( - [...replies1, ...replies2].map(reply => [reply.id, reply]) - ).values() - ]; - - // Sort by abs(Number(tempId)) in ascending order - deduplicatedReplies.sort((a, b) => { - const aTime = Math.abs(Number(a.tempId)); - const bTime = Math.abs(Number(b.tempId)); - return bTime - aTime; - }); - - merged.comment.replies = deduplicatedReplies; - - return merged; -} \ No newline at end of file From d61280c5d99dcca8e76609f7c57cd63da99dad06 Mon Sep 17 00:00:00 2001 From: Usman salim Date: Thu, 22 May 2025 16:56:19 +0530 Subject: [PATCH 34/41] fixed pagination --- .../components/LMCommentItem/index.tsx | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/likeminds-feed-reactnative-integration/components/LMCommentItem/index.tsx b/likeminds-feed-reactnative-integration/components/LMCommentItem/index.tsx index a86204fe..4178cf81 100644 --- a/likeminds-feed-reactnative-integration/components/LMCommentItem/index.tsx +++ b/likeminds-feed-reactnative-integration/components/LMCommentItem/index.tsx @@ -61,7 +61,8 @@ const LMCommentItem = React.memo( comment?.likesCount ); const [repliesArray, setRepliesArray] = useState([]); - const [replyPageNumber, setReplyPageNumber] = useState(2); + const [repliesLoading, setRepliesLoading] = useState(false); + const [replyPageNumber, setReplyPageNumber] = useState(1); const customLikeIcon = likeIconButton?.icon; const [hasRepliesPaginationEnded, setHasRepliesPaginationEnded] = useState(false); const loggedInUserMemberRights = useAppSelector( @@ -329,6 +330,14 @@ const LMCommentItem = React.memo( ]), }} onTap={() => { + if (!showReplies) { + (onTapReplies && onTapReplies( + (data: Array) => + setRepliesArray(data), + "" + ), + handleReplies()) + } replyTextProps?.onTap(); }} buttonStyle={StyleSheet.flatten([ @@ -477,12 +486,14 @@ const LMCommentItem = React.memo( { + setRepliesLoading(true); onTapViewMore( - replyPageNumber, + replyPageNumber + 1, (data: Array, hasPaginationEnded?: boolean) => { setRepliesArray(data) + setRepliesLoading(false); setReplyPageNumber(replyPageNumber + 1); if (hasPaginationEnded) { setHasRepliesPaginationEnded(hasPaginationEnded) From eb2f4e9c4ea5946e0308273bc4534abc57cf7ee4 Mon Sep 17 00:00:00 2001 From: Usman salim Date: Fri, 23 May 2025 13:27:13 +0530 Subject: [PATCH 35/41] added missing logic --- .../context/postDetailContext.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/likeminds-feed-reactnative-integration/context/postDetailContext.tsx b/likeminds-feed-reactnative-integration/context/postDetailContext.tsx index 3241be54..26616738 100644 --- a/likeminds-feed-reactnative-integration/context/postDetailContext.tsx +++ b/likeminds-feed-reactnative-integration/context/postDetailContext.tsx @@ -671,6 +671,8 @@ export const PostDetailContextProvider = ({ hasPaginationEnded = true; } + repliesResponseCallback && repliesResponseCallback([], hasPaginationEnded) + return commentsRepliesResponse; }; From e0ed67dacf2798e8ec62ed09bec26162c30293e8 Mon Sep 17 00:00:00 2001 From: Usman salim Date: Fri, 23 May 2025 14:35:18 +0530 Subject: [PATCH 36/41] fixed duplication in replies --- .../components/LMCommentItem/index.tsx | 15 +++++-------- .../components/LMCommentItem/types.ts | 3 ++- .../context/postDetailContext.tsx | 9 +++++--- .../screens/postDetail/index.tsx | 6 ++++-- .../store/reducers/postDetailReducer.ts | 21 +++++++++++++------ 5 files changed, 32 insertions(+), 22 deletions(-) diff --git a/likeminds-feed-reactnative-integration/components/LMCommentItem/index.tsx b/likeminds-feed-reactnative-integration/components/LMCommentItem/index.tsx index 4178cf81..bc733366 100644 --- a/likeminds-feed-reactnative-integration/components/LMCommentItem/index.tsx +++ b/likeminds-feed-reactnative-integration/components/LMCommentItem/index.tsx @@ -61,6 +61,7 @@ const LMCommentItem = React.memo( comment?.likesCount ); const [repliesArray, setRepliesArray] = useState([]); + const [haveFirstPageReplies, setHaveFirstPageReplies] = useState(false); const [repliesLoading, setRepliesLoading] = useState(false); const [replyPageNumber, setReplyPageNumber] = useState(1); const customLikeIcon = likeIconButton?.icon; @@ -330,14 +331,6 @@ const LMCommentItem = React.memo( ]), }} onTap={() => { - if (!showReplies) { - (onTapReplies && onTapReplies( - (data: Array) => - setRepliesArray(data), - "" - ), - handleReplies()) - } replyTextProps?.onTap(); }} buttonStyle={StyleSheet.flatten([ @@ -490,15 +483,17 @@ const LMCommentItem = React.memo( ? () => { setRepliesLoading(true); onTapViewMore( - replyPageNumber + 1, + haveFirstPageReplies ? replyPageNumber + 1 : 1, (data: Array, hasPaginationEnded?: boolean) => { + setHaveFirstPageReplies(true); setRepliesArray(data) setRepliesLoading(false); setReplyPageNumber(replyPageNumber + 1); if (hasPaginationEnded) { setHasRepliesPaginationEnded(hasPaginationEnded) } - } + }, + haveFirstPageReplies ); } : () => null diff --git a/likeminds-feed-reactnative-integration/components/LMCommentItem/types.ts b/likeminds-feed-reactnative-integration/components/LMCommentItem/types.ts index e66b7042..d5180ba8 100644 --- a/likeminds-feed-reactnative-integration/components/LMCommentItem/types.ts +++ b/likeminds-feed-reactnative-integration/components/LMCommentItem/types.ts @@ -8,7 +8,8 @@ export interface LMCommentProps { likeTextButton?: LMButtonProps; // custom like text button onTapViewMore?: ( page: number, - data: (repliesArray: Array) => void + data: (repliesArray: Array) => void, + haveFirstPageReplies?: boolean ) => void; // callback function to be executed on click of view more replies commentMaxLines?: number; // maximun lines of comment to be shown menuIcon?: LMButtonProps; // custom menu icon button diff --git a/likeminds-feed-reactnative-integration/context/postDetailContext.tsx b/likeminds-feed-reactnative-integration/context/postDetailContext.tsx index 26616738..82705a2c 100644 --- a/likeminds-feed-reactnative-integration/context/postDetailContext.tsx +++ b/likeminds-feed-reactnative-integration/context/postDetailContext.tsx @@ -221,7 +221,8 @@ export interface PostDetailContextValues { postId: string, commentId: string, repliesResponseCallback: any, - pageNo: number + pageNo: number, + haveFirstPageReplies?: boolean ) => void; commentLikeHandler: (postId: string, commentId: string) => void; addNewComment: (postId: string) => void; @@ -644,7 +645,8 @@ export const PostDetailContextProvider = ({ postId: string, commentId: string, repliesResponseCallback: any, - pageNo: number + pageNo: number, + haveFirstPageReplies?: boolean ) => { const commentsRepliesResponse: GetCommentDetails = await dispatch( getComments( @@ -659,10 +661,11 @@ export const PostDetailContextProvider = ({ ) as any; dispatch({ - type: "ADD_REPLIES_TO_COMMENT", + type: "APPEND_REPLIES_TO_COMMENT", body: { parentCommentId: commentId, replies: commentResponseModelConvertor(commentsRepliesResponse)?.replies, + haveFirstPageReplies } }) diff --git a/likeminds-feed-reactnative-integration/screens/postDetail/index.tsx b/likeminds-feed-reactnative-integration/screens/postDetail/index.tsx index be6414fe..6adcd48e 100644 --- a/likeminds-feed-reactnative-integration/screens/postDetail/index.tsx +++ b/likeminds-feed-reactnative-integration/screens/postDetail/index.tsx @@ -573,13 +573,15 @@ const PostDetailComponent = React.memo(() => { // this handles the pagination of child replies on click of view more onTapViewMore={( pageValue, - repliesResponseCallback + repliesResponseCallback, + haveFirstPageReplies ) => { getCommentsReplies( item?.postId, item?.id, repliesResponseCallback, - pageValue + pageValue, + haveFirstPageReplies ); customCommentItemStyle?.onTapViewMore && customCommentItemStyle?.onTapViewMore(); diff --git a/likeminds-feed-reactnative-integration/store/reducers/postDetailReducer.ts b/likeminds-feed-reactnative-integration/store/reducers/postDetailReducer.ts index 891ecc04..ed60890e 100644 --- a/likeminds-feed-reactnative-integration/store/reducers/postDetailReducer.ts +++ b/likeminds-feed-reactnative-integration/store/reducers/postDetailReducer.ts @@ -312,17 +312,26 @@ export const postDetailReducer = (state = initialState, action) => { }); return { ...state, postDetail: updatedPostDetail }; } - case "ADD_REPLIES_TO_COMMENT": { - const { parentCommentId, replies } = action.body; + case "APPEND_REPLIES_TO_COMMENT": { + const { parentCommentId, replies, haveFirstPageReplies } = action.body; if (!parentCommentId || !replies?.length) return {...state} const postDetail = state.postDetail; const parentComment = postDetail.replies?.find(reply => reply.id == parentCommentId) if (parentComment) { let previousReplies = parentComment.replies; - parentComment.replies = [ - ...previousReplies as [], - ...replies, - ] + if (!haveFirstPageReplies) { + // incase of replying to a comment when replies have not been fetched + parentComment.replies = [ + ...new Map( + [...(previousReplies as []), ...replies].map((reply: any) => [reply.id, reply]) + ).values() + ]; + } else { + parentComment.replies = [ + ...previousReplies as [], + ...replies, + ] + } } return { ...state } } From 78c4886236b5754363ada514be60168dd79c5971 Mon Sep 17 00:00:00 2001 From: Usman salim Date: Fri, 23 May 2025 15:43:11 +0530 Subject: [PATCH 37/41] fixed pagination issue --- .../components/LMCommentItem/index.tsx | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/likeminds-feed-reactnative-integration/components/LMCommentItem/index.tsx b/likeminds-feed-reactnative-integration/components/LMCommentItem/index.tsx index bc733366..dcabfecc 100644 --- a/likeminds-feed-reactnative-integration/components/LMCommentItem/index.tsx +++ b/likeminds-feed-reactnative-integration/components/LMCommentItem/index.tsx @@ -141,6 +141,8 @@ const LMCommentItem = React.memo( const handleReplies = () => { if (showReplies) { setHasRepliesPaginationEnded(false); + setReplyPageNumber(1); + setHaveFirstPageReplies(false); dispatch(clearComments(comment?.id)) } setShowReplies(!showReplies); @@ -362,8 +364,11 @@ const LMCommentItem = React.memo( onTap={() => { onTapReplies && !showReplies ? (onTapReplies( - (data: Array) => - setRepliesArray(data), + (data: Array) => { + setRepliesArray(data); + setReplyPageNumber(replyPageNumber + 1) + setHaveFirstPageReplies(true); + }, "" ), handleReplies()) @@ -483,7 +488,7 @@ const LMCommentItem = React.memo( ? () => { setRepliesLoading(true); onTapViewMore( - haveFirstPageReplies ? replyPageNumber + 1 : 1, + haveFirstPageReplies ? replyPageNumber : 1, (data: Array, hasPaginationEnded?: boolean) => { setHaveFirstPageReplies(true); setRepliesArray(data) From c846c74c2d4f7849e60208000443202c681e5d99 Mon Sep 17 00:00:00 2001 From: Usman salim Date: Fri, 23 May 2025 15:49:40 +0530 Subject: [PATCH 38/41] added constant --- .../context/postDetailContext.tsx | 3 ++- .../store/reducers/postDetailReducer.ts | 5 +++-- likeminds-feed-reactnative-integration/store/types/types.ts | 1 + 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/likeminds-feed-reactnative-integration/context/postDetailContext.tsx b/likeminds-feed-reactnative-integration/context/postDetailContext.tsx index 82705a2c..320b3d0f 100644 --- a/likeminds-feed-reactnative-integration/context/postDetailContext.tsx +++ b/likeminds-feed-reactnative-integration/context/postDetailContext.tsx @@ -93,6 +93,7 @@ import { getPostType } from "../utils/analytics"; import LMLoader from "../components/LMLoader"; import Layout from "../constants/Layout"; import { + APPEND_REPLIES_TO_COMMENT, HIDE_POST_STATE, SET_FLOW_TO_POST_DETAIL_SCREEN, SET_REPORT_MODEL_STATUS_IN_POST_DETAIL, @@ -661,7 +662,7 @@ export const PostDetailContextProvider = ({ ) as any; dispatch({ - type: "APPEND_REPLIES_TO_COMMENT", + type: APPEND_REPLIES_TO_COMMENT, body: { parentCommentId: commentId, replies: commentResponseModelConvertor(commentsRepliesResponse)?.replies, diff --git a/likeminds-feed-reactnative-integration/store/reducers/postDetailReducer.ts b/likeminds-feed-reactnative-integration/store/reducers/postDetailReducer.ts index ed60890e..07c96dea 100644 --- a/likeminds-feed-reactnative-integration/store/reducers/postDetailReducer.ts +++ b/likeminds-feed-reactnative-integration/store/reducers/postDetailReducer.ts @@ -25,6 +25,7 @@ import { POST_DATA_REFRESH_SUCCESS, POST_DATA_SUCCESS, SAVE_POST_STATE, + APPEND_REPLIES_TO_COMMENT } from "../types/types"; import { LMCommentViewData, LMPostViewData } from "../../models"; @@ -312,7 +313,7 @@ export const postDetailReducer = (state = initialState, action) => { }); return { ...state, postDetail: updatedPostDetail }; } - case "APPEND_REPLIES_TO_COMMENT": { + case APPEND_REPLIES_TO_COMMENT: { const { parentCommentId, replies, haveFirstPageReplies } = action.body; if (!parentCommentId || !replies?.length) return {...state} const postDetail = state.postDetail; @@ -320,7 +321,7 @@ export const postDetailReducer = (state = initialState, action) => { if (parentComment) { let previousReplies = parentComment.replies; if (!haveFirstPageReplies) { - // incase of replying to a comment when replies have not been fetched + // incase of replying to a comment when replies have not been fetched so to avoid the already locally appended reply to be fetched again from backend parentComment.replies = [ ...new Map( [...(previousReplies as []), ...replies].map((reply: any) => [reply.id, reply]) diff --git a/likeminds-feed-reactnative-integration/store/types/types.ts b/likeminds-feed-reactnative-integration/store/types/types.ts index 0563e4cc..fd12c862 100644 --- a/likeminds-feed-reactnative-integration/store/types/types.ts +++ b/likeminds-feed-reactnative-integration/store/types/types.ts @@ -185,4 +185,5 @@ export const PERSONALISED_FEED_REFRESH_SUCCESS = "PERSONALISED_FEED_REFRESH_SUCCESS"; export const CLEAR_FLOWS_AND_ID = "CLEAR_FLOWS_AND_ID"; export const SET_POST_UPLOADING_CREATE_SCREEN = "SET_POST_UPLOADING_CREATE_SCREEN"; +export const APPEND_REPLIES_TO_COMMENT = "APPEND_REPLIES_TO_COMMENT"; From 5e08017472b91d3857a66d9d916c2856a08ed062 Mon Sep 17 00:00:00 2001 From: Usman salim Date: Mon, 26 May 2025 19:26:32 +0530 Subject: [PATCH 39/41] upgraded version --- likeminds-feed-reactnative-integration/package.json | 4 ++-- likeminds-feed-reactnative-integration/setup.ts | 2 +- qna-feed/package.json | 6 +++--- social-feed/package.json | 6 +++--- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/likeminds-feed-reactnative-integration/package.json b/likeminds-feed-reactnative-integration/package.json index 821c0058..e260d8d4 100644 --- a/likeminds-feed-reactnative-integration/package.json +++ b/likeminds-feed-reactnative-integration/package.json @@ -1,6 +1,6 @@ { "name": "@likeminds.community/feed-rn-core", - "version": "1.16.0", + "version": "1.17.0", "description": "LikeMinds ReactNative Core SDK for feed", "scripts": { "android": "react-native run-android", @@ -18,7 +18,7 @@ "homepage": "https://likeminds.community/", "license": "ISC", "dependencies": { - "@likeminds.community/feed-rn": "1.6.0", + "@likeminds.community/feed-rn": "1.7.0", "aws-sdk": "2.1548.0", "diff": "5.1.0", "lodash": "4.17.21", diff --git a/likeminds-feed-reactnative-integration/setup.ts b/likeminds-feed-reactnative-integration/setup.ts index 5fa44bff..04d745f8 100644 --- a/likeminds-feed-reactnative-integration/setup.ts +++ b/likeminds-feed-reactnative-integration/setup.ts @@ -3,7 +3,7 @@ import { LMFeedClient } from "@likeminds.community/feed-rn"; export const initMyClient = () => { const lmFeedClient = LMFeedClient.Builder() .setPlatformCode("rn") - .setVersionCode(31) + .setVersionCode(32) .build(); return lmFeedClient; diff --git a/qna-feed/package.json b/qna-feed/package.json index 8b10b91e..975e6044 100644 --- a/qna-feed/package.json +++ b/qna-feed/package.json @@ -1,6 +1,6 @@ { "name": "QnA", - "version": "1.15.0", + "version": "1.16.0", "private": true, "scripts": { "android": "react-native run-android", @@ -10,8 +10,8 @@ "test": "jest" }, "dependencies": { - "@likeminds.community/feed-rn": "1.6.0", - "@likeminds.community/feed-rn-core": "1.16.0", + "@likeminds.community/feed-rn": "1.7.0", + "@likeminds.community/feed-rn-core": "1.17.0", "@notifee/react-native": "7.8.2", "@react-native-async-storage/async-storage": "1.24.0", "@react-native-community/datetimepicker": "8.0.1", diff --git a/social-feed/package.json b/social-feed/package.json index c2ff3e28..1e5b8347 100644 --- a/social-feed/package.json +++ b/social-feed/package.json @@ -1,6 +1,6 @@ { "name": "sampleApp", - "version": "1.15.0", + "version": "1.16.0", "private": true, "scripts": { "android": "react-native run-android", @@ -10,8 +10,8 @@ "test": "jest" }, "dependencies": { - "@likeminds.community/feed-rn": "1.6.0", - "@likeminds.community/feed-rn-core": "1.16.0", + "@likeminds.community/feed-rn": "1.7.0", + "@likeminds.community/feed-rn-core": "1.17.0", "@notifee/react-native": "7.8.2", "@react-native-async-storage/async-storage": "1.24.0", "@react-native-community/datetimepicker": "8.0.1", From b864670e9dbac3ae3c97087f257d53a1ef326420 Mon Sep 17 00:00:00 2001 From: Usman salim Date: Mon, 26 May 2025 22:35:10 +0530 Subject: [PATCH 40/41] updated package lock --- .../package-lock.json | 964 +++++++++--------- 1 file changed, 503 insertions(+), 461 deletions(-) diff --git a/likeminds-feed-reactnative-integration/package-lock.json b/likeminds-feed-reactnative-integration/package-lock.json index d3505703..5ca7c22d 100644 --- a/likeminds-feed-reactnative-integration/package-lock.json +++ b/likeminds-feed-reactnative-integration/package-lock.json @@ -1,15 +1,15 @@ { "name": "@likeminds.community/feed-rn-core", - "version": "1.16.0", + "version": "1.17.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@likeminds.community/feed-rn-core", - "version": "1.16.0", + "version": "1.17.0", "license": "ISC", "dependencies": { - "@likeminds.community/feed-rn": "1.6.0", + "@likeminds.community/feed-rn": "1.7.0", "aws-sdk": "2.1548.0", "diff": "5.1.0", "lodash": "4.17.21", @@ -35,6 +35,7 @@ "@react-navigation/native": ">=6.1.7", "@react-navigation/native-stack": ">=6.9.18", "@react-navigation/stack": ">=6.3.20", + "@shopify/flash-list": ">=1.8.0", "@types/react-native-video": ">=5.0.14", "expo-document-picker": ">=13.0.0", "expo-image-picker": ">=16.0.0", @@ -314,35 +315,35 @@ } }, "node_modules/@aws-sdk/client-s3": { - "version": "3.787.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.787.0.tgz", - "integrity": "sha512-eGLCWkN0NlntJ9yPU6OKUggVS4cFvuZJog+cFg1KD5hniLqz7Y0YRtB4uBxW212fK3XCfddgyscEOEeHaTQQTw==", + "version": "3.817.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.817.0.tgz", + "integrity": "sha512-nZyjhlLMEXDs0ofWbpikI8tKoeKuuSgYcIb6eEZJk90Nt5HkkXn6nkWOs/kp2FdhpoGJyTILOVsDgdm7eutnLA==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha1-browser": "5.2.0", "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.775.0", - "@aws-sdk/credential-provider-node": "3.787.0", - "@aws-sdk/middleware-bucket-endpoint": "3.775.0", - "@aws-sdk/middleware-expect-continue": "3.775.0", - "@aws-sdk/middleware-flexible-checksums": "3.787.0", - "@aws-sdk/middleware-host-header": "3.775.0", - "@aws-sdk/middleware-location-constraint": "3.775.0", - "@aws-sdk/middleware-logger": "3.775.0", - "@aws-sdk/middleware-recursion-detection": "3.775.0", - "@aws-sdk/middleware-sdk-s3": "3.775.0", - "@aws-sdk/middleware-ssec": "3.775.0", - "@aws-sdk/middleware-user-agent": "3.787.0", - "@aws-sdk/region-config-resolver": "3.775.0", - "@aws-sdk/signature-v4-multi-region": "3.775.0", - "@aws-sdk/types": "3.775.0", - "@aws-sdk/util-endpoints": "3.787.0", - "@aws-sdk/util-user-agent-browser": "3.775.0", - "@aws-sdk/util-user-agent-node": "3.787.0", - "@aws-sdk/xml-builder": "3.775.0", - "@smithy/config-resolver": "^4.1.0", - "@smithy/core": "^3.2.0", + "@aws-sdk/core": "3.816.0", + "@aws-sdk/credential-provider-node": "3.817.0", + "@aws-sdk/middleware-bucket-endpoint": "3.808.0", + "@aws-sdk/middleware-expect-continue": "3.804.0", + "@aws-sdk/middleware-flexible-checksums": "3.816.0", + "@aws-sdk/middleware-host-header": "3.804.0", + "@aws-sdk/middleware-location-constraint": "3.804.0", + "@aws-sdk/middleware-logger": "3.804.0", + "@aws-sdk/middleware-recursion-detection": "3.804.0", + "@aws-sdk/middleware-sdk-s3": "3.816.0", + "@aws-sdk/middleware-ssec": "3.804.0", + "@aws-sdk/middleware-user-agent": "3.816.0", + "@aws-sdk/region-config-resolver": "3.808.0", + "@aws-sdk/signature-v4-multi-region": "3.816.0", + "@aws-sdk/types": "3.804.0", + "@aws-sdk/util-endpoints": "3.808.0", + "@aws-sdk/util-user-agent-browser": "3.804.0", + "@aws-sdk/util-user-agent-node": "3.816.0", + "@aws-sdk/xml-builder": "3.804.0", + "@smithy/config-resolver": "^4.1.2", + "@smithy/core": "^3.3.3", "@smithy/eventstream-serde-browser": "^4.0.2", "@smithy/eventstream-serde-config-resolver": "^4.1.0", "@smithy/eventstream-serde-node": "^4.0.2", @@ -353,24 +354,24 @@ "@smithy/invalid-dependency": "^4.0.2", "@smithy/md5-js": "^4.0.2", "@smithy/middleware-content-length": "^4.0.2", - "@smithy/middleware-endpoint": "^4.1.0", - "@smithy/middleware-retry": "^4.1.0", - "@smithy/middleware-serde": "^4.0.3", + "@smithy/middleware-endpoint": "^4.1.6", + "@smithy/middleware-retry": "^4.1.7", + "@smithy/middleware-serde": "^4.0.5", "@smithy/middleware-stack": "^4.0.2", - "@smithy/node-config-provider": "^4.0.2", + "@smithy/node-config-provider": "^4.1.1", "@smithy/node-http-handler": "^4.0.4", "@smithy/protocol-http": "^5.1.0", - "@smithy/smithy-client": "^4.2.0", + "@smithy/smithy-client": "^4.2.6", "@smithy/types": "^4.2.0", "@smithy/url-parser": "^4.0.2", "@smithy/util-base64": "^4.0.0", "@smithy/util-body-length-browser": "^4.0.0", "@smithy/util-body-length-node": "^4.0.0", - "@smithy/util-defaults-mode-browser": "^4.0.8", - "@smithy/util-defaults-mode-node": "^4.0.8", - "@smithy/util-endpoints": "^3.0.2", + "@smithy/util-defaults-mode-browser": "^4.0.14", + "@smithy/util-defaults-mode-node": "^4.0.14", + "@smithy/util-endpoints": "^3.0.4", "@smithy/util-middleware": "^4.0.2", - "@smithy/util-retry": "^4.0.2", + "@smithy/util-retry": "^4.0.3", "@smithy/util-stream": "^4.2.0", "@smithy/util-utf8": "^4.0.0", "@smithy/util-waiter": "^4.0.3", @@ -381,47 +382,47 @@ } }, "node_modules/@aws-sdk/client-sso": { - "version": "3.787.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.787.0.tgz", - "integrity": "sha512-L8R+Mh258G0DC73ktpSVrG4TT9i2vmDLecARTDR/4q5sRivdDQSL5bUp3LKcK80Bx+FRw3UETIlX6mYMLL9PJQ==", + "version": "3.817.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.817.0.tgz", + "integrity": "sha512-fCh5rUHmWmWDvw70NNoWpE5+BRdtNi45kDnIoeoszqVg7UKF79SlG+qYooUT52HKCgDNHqgbWaXxMOSqd2I/OQ==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.775.0", - "@aws-sdk/middleware-host-header": "3.775.0", - "@aws-sdk/middleware-logger": "3.775.0", - "@aws-sdk/middleware-recursion-detection": "3.775.0", - "@aws-sdk/middleware-user-agent": "3.787.0", - "@aws-sdk/region-config-resolver": "3.775.0", - "@aws-sdk/types": "3.775.0", - "@aws-sdk/util-endpoints": "3.787.0", - "@aws-sdk/util-user-agent-browser": "3.775.0", - "@aws-sdk/util-user-agent-node": "3.787.0", - "@smithy/config-resolver": "^4.1.0", - "@smithy/core": "^3.2.0", + "@aws-sdk/core": "3.816.0", + "@aws-sdk/middleware-host-header": "3.804.0", + "@aws-sdk/middleware-logger": "3.804.0", + "@aws-sdk/middleware-recursion-detection": "3.804.0", + "@aws-sdk/middleware-user-agent": "3.816.0", + "@aws-sdk/region-config-resolver": "3.808.0", + "@aws-sdk/types": "3.804.0", + "@aws-sdk/util-endpoints": "3.808.0", + "@aws-sdk/util-user-agent-browser": "3.804.0", + "@aws-sdk/util-user-agent-node": "3.816.0", + "@smithy/config-resolver": "^4.1.2", + "@smithy/core": "^3.3.3", "@smithy/fetch-http-handler": "^5.0.2", "@smithy/hash-node": "^4.0.2", "@smithy/invalid-dependency": "^4.0.2", "@smithy/middleware-content-length": "^4.0.2", - "@smithy/middleware-endpoint": "^4.1.0", - "@smithy/middleware-retry": "^4.1.0", - "@smithy/middleware-serde": "^4.0.3", + "@smithy/middleware-endpoint": "^4.1.6", + "@smithy/middleware-retry": "^4.1.7", + "@smithy/middleware-serde": "^4.0.5", "@smithy/middleware-stack": "^4.0.2", - "@smithy/node-config-provider": "^4.0.2", + "@smithy/node-config-provider": "^4.1.1", "@smithy/node-http-handler": "^4.0.4", "@smithy/protocol-http": "^5.1.0", - "@smithy/smithy-client": "^4.2.0", + "@smithy/smithy-client": "^4.2.6", "@smithy/types": "^4.2.0", "@smithy/url-parser": "^4.0.2", "@smithy/util-base64": "^4.0.0", "@smithy/util-body-length-browser": "^4.0.0", "@smithy/util-body-length-node": "^4.0.0", - "@smithy/util-defaults-mode-browser": "^4.0.8", - "@smithy/util-defaults-mode-node": "^4.0.8", - "@smithy/util-endpoints": "^3.0.2", + "@smithy/util-defaults-mode-browser": "^4.0.14", + "@smithy/util-defaults-mode-node": "^4.0.14", + "@smithy/util-endpoints": "^3.0.4", "@smithy/util-middleware": "^4.0.2", - "@smithy/util-retry": "^4.0.2", + "@smithy/util-retry": "^4.0.3", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, @@ -430,18 +431,18 @@ } }, "node_modules/@aws-sdk/core": { - "version": "3.775.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.775.0.tgz", - "integrity": "sha512-8vpW4WihVfz0DX+7WnnLGm3GuQER++b0IwQG35JlQMlgqnc44M//KbJPsIHA0aJUJVwJAEShgfr5dUbY8WUzaA==", + "version": "3.816.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.816.0.tgz", + "integrity": "sha512-Lx50wjtyarzKpMFV6V+gjbSZDgsA/71iyifbClGUSiNPoIQ4OCV0KVOmAAj7mQRVvGJqUMWKVM+WzK79CjbjWA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.775.0", - "@smithy/core": "^3.2.0", - "@smithy/node-config-provider": "^4.0.2", + "@aws-sdk/types": "3.804.0", + "@smithy/core": "^3.3.3", + "@smithy/node-config-provider": "^4.1.1", "@smithy/property-provider": "^4.0.2", "@smithy/protocol-http": "^5.1.0", - "@smithy/signature-v4": "^5.0.2", - "@smithy/smithy-client": "^4.2.0", + "@smithy/signature-v4": "^5.1.0", + "@smithy/smithy-client": "^4.2.6", "@smithy/types": "^4.2.0", "@smithy/util-middleware": "^4.0.2", "fast-xml-parser": "4.4.1", @@ -452,13 +453,13 @@ } }, "node_modules/@aws-sdk/credential-provider-env": { - "version": "3.775.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.775.0.tgz", - "integrity": "sha512-6ESVxwCbGm7WZ17kY1fjmxQud43vzJFoLd4bmlR+idQSWdqlzGDYdcfzpjDKTcivdtNrVYmFvcH1JBUwCRAZhw==", + "version": "3.816.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.816.0.tgz", + "integrity": "sha512-wUJZwRLe+SxPxRV9AENYBLrJZRrNIo+fva7ZzejsC83iz7hdfq6Rv6B/aHEdPwG/nQC4+q7UUvcRPlomyrpsBA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.775.0", - "@aws-sdk/types": "3.775.0", + "@aws-sdk/core": "3.816.0", + "@aws-sdk/types": "3.804.0", "@smithy/property-provider": "^4.0.2", "@smithy/types": "^4.2.0", "tslib": "^2.6.2" @@ -468,18 +469,18 @@ } }, "node_modules/@aws-sdk/credential-provider-http": { - "version": "3.775.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.775.0.tgz", - "integrity": "sha512-PjDQeDH/J1S0yWV32wCj2k5liRo0ssXMseCBEkCsD3SqsU8o5cU82b0hMX4sAib/RkglCSZqGO0xMiN0/7ndww==", + "version": "3.816.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.816.0.tgz", + "integrity": "sha512-gcWGzMQ7yRIF+ljTkR8Vzp7727UY6cmeaPrFQrvcFB8PhOqWpf7g0JsgOf5BSaP8CkkSQcTQHc0C5ZYAzUFwPg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.775.0", - "@aws-sdk/types": "3.775.0", + "@aws-sdk/core": "3.816.0", + "@aws-sdk/types": "3.804.0", "@smithy/fetch-http-handler": "^5.0.2", "@smithy/node-http-handler": "^4.0.4", "@smithy/property-provider": "^4.0.2", "@smithy/protocol-http": "^5.1.0", - "@smithy/smithy-client": "^4.2.0", + "@smithy/smithy-client": "^4.2.6", "@smithy/types": "^4.2.0", "@smithy/util-stream": "^4.2.0", "tslib": "^2.6.2" @@ -489,20 +490,20 @@ } }, "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.787.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.787.0.tgz", - "integrity": "sha512-hc2taRoDlXn2uuNuHWDJljVWYrp3r9JF1a/8XmOAZhVUNY+ImeeStylHXhXXKEA4JOjW+5PdJj0f1UDkVCHJiQ==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "3.775.0", - "@aws-sdk/credential-provider-env": "3.775.0", - "@aws-sdk/credential-provider-http": "3.775.0", - "@aws-sdk/credential-provider-process": "3.775.0", - "@aws-sdk/credential-provider-sso": "3.787.0", - "@aws-sdk/credential-provider-web-identity": "3.787.0", - "@aws-sdk/nested-clients": "3.787.0", - "@aws-sdk/types": "3.775.0", - "@smithy/credential-provider-imds": "^4.0.2", + "version": "3.817.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.817.0.tgz", + "integrity": "sha512-kyEwbQyuXE+phWVzloMdkFv6qM6NOon+asMXY5W0fhDKwBz9zQLObDRWBrvQX9lmqq8BbDL1sCfZjOh82Y+RFw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.816.0", + "@aws-sdk/credential-provider-env": "3.816.0", + "@aws-sdk/credential-provider-http": "3.816.0", + "@aws-sdk/credential-provider-process": "3.816.0", + "@aws-sdk/credential-provider-sso": "3.817.0", + "@aws-sdk/credential-provider-web-identity": "3.817.0", + "@aws-sdk/nested-clients": "3.817.0", + "@aws-sdk/types": "3.804.0", + "@smithy/credential-provider-imds": "^4.0.4", "@smithy/property-provider": "^4.0.2", "@smithy/shared-ini-file-loader": "^4.0.2", "@smithy/types": "^4.2.0", @@ -513,19 +514,19 @@ } }, "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.787.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.787.0.tgz", - "integrity": "sha512-JioVi44B1vDMaK2CdzqimwvJD3uzvzbQhaEWXsGMBcMcNHajXAXf08EF50JG3ZhLrhhUsT1ObXpbTaPINOhh+g==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/credential-provider-env": "3.775.0", - "@aws-sdk/credential-provider-http": "3.775.0", - "@aws-sdk/credential-provider-ini": "3.787.0", - "@aws-sdk/credential-provider-process": "3.775.0", - "@aws-sdk/credential-provider-sso": "3.787.0", - "@aws-sdk/credential-provider-web-identity": "3.787.0", - "@aws-sdk/types": "3.775.0", - "@smithy/credential-provider-imds": "^4.0.2", + "version": "3.817.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.817.0.tgz", + "integrity": "sha512-b5mz7av0Lhavs1Bz3Zb+jrs0Pki93+8XNctnVO0drBW98x1fM4AR38cWvGbM/w9F9Q0/WEH3TinkmrMPrP4T/w==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.816.0", + "@aws-sdk/credential-provider-http": "3.816.0", + "@aws-sdk/credential-provider-ini": "3.817.0", + "@aws-sdk/credential-provider-process": "3.816.0", + "@aws-sdk/credential-provider-sso": "3.817.0", + "@aws-sdk/credential-provider-web-identity": "3.817.0", + "@aws-sdk/types": "3.804.0", + "@smithy/credential-provider-imds": "^4.0.4", "@smithy/property-provider": "^4.0.2", "@smithy/shared-ini-file-loader": "^4.0.2", "@smithy/types": "^4.2.0", @@ -536,13 +537,13 @@ } }, "node_modules/@aws-sdk/credential-provider-process": { - "version": "3.775.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.775.0.tgz", - "integrity": "sha512-A6k68H9rQp+2+7P7SGO90Csw6nrUEm0Qfjpn9Etc4EboZhhCLs9b66umUsTsSBHus4FDIe5JQxfCUyt1wgNogg==", + "version": "3.816.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.816.0.tgz", + "integrity": "sha512-9Tm+AxMoV2Izvl5b9tyMQRbBwaex8JP06HN7ZeCXgC5sAsSN+o8dsThnEhf8jKN+uBpT6CLWKN1TXuUMrAmW1A==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.775.0", - "@aws-sdk/types": "3.775.0", + "@aws-sdk/core": "3.816.0", + "@aws-sdk/types": "3.804.0", "@smithy/property-provider": "^4.0.2", "@smithy/shared-ini-file-loader": "^4.0.2", "@smithy/types": "^4.2.0", @@ -553,15 +554,15 @@ } }, "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.787.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.787.0.tgz", - "integrity": "sha512-fHc08bsvwm4+dEMEQKnQ7c1irEQmmxbgS+Fq41y09pPvPh31nAhoMcjBSTWAaPHvvsRbTYvmP4Mf12ZGr8/nfg==", + "version": "3.817.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.817.0.tgz", + "integrity": "sha512-gFUAW3VmGvdnueK1bh6TOcRX+j99Xm0men1+gz3cA4RE+rZGNy1Qjj8YHlv0hPwI9OnTPZquvPzA5fkviGREWg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/client-sso": "3.787.0", - "@aws-sdk/core": "3.775.0", - "@aws-sdk/token-providers": "3.787.0", - "@aws-sdk/types": "3.775.0", + "@aws-sdk/client-sso": "3.817.0", + "@aws-sdk/core": "3.816.0", + "@aws-sdk/token-providers": "3.817.0", + "@aws-sdk/types": "3.804.0", "@smithy/property-provider": "^4.0.2", "@smithy/shared-ini-file-loader": "^4.0.2", "@smithy/types": "^4.2.0", @@ -572,14 +573,14 @@ } }, "node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.787.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.787.0.tgz", - "integrity": "sha512-SobmCwNbk6TfEsF283mZPQEI5vV2j6eY5tOCj8Er4Lzraxu9fBPADV+Bib2A8F6jlB1lMPJzOuDCbEasSt/RIw==", + "version": "3.817.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.817.0.tgz", + "integrity": "sha512-A2kgkS9g6NY0OMT2f2EdXHpL17Ym81NhbGnQ8bRXPqESIi7TFypFD2U6osB2VnsFv+MhwM+Ke4PKXSmLun22/A==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.775.0", - "@aws-sdk/nested-clients": "3.787.0", - "@aws-sdk/types": "3.775.0", + "@aws-sdk/core": "3.816.0", + "@aws-sdk/nested-clients": "3.817.0", + "@aws-sdk/types": "3.804.0", "@smithy/property-provider": "^4.0.2", "@smithy/types": "^4.2.0", "tslib": "^2.6.2" @@ -589,14 +590,14 @@ } }, "node_modules/@aws-sdk/middleware-bucket-endpoint": { - "version": "3.775.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.775.0.tgz", - "integrity": "sha512-qogMIpVChDYr4xiUNC19/RDSw/sKoHkAhouS6Skxiy6s27HBhow1L3Z1qVYXuBmOZGSWPU0xiyZCvOyWrv9s+Q==", + "version": "3.808.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.808.0.tgz", + "integrity": "sha512-wEPlNcs8dir9lXbuviEGtSzYSxG/NRKQrJk5ybOc7OpPGHovsN+QhDOdY3lcjOFdwMTiMIG9foUkPz3zBpLB1A==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.775.0", - "@aws-sdk/util-arn-parser": "3.723.0", - "@smithy/node-config-provider": "^4.0.2", + "@aws-sdk/types": "3.804.0", + "@aws-sdk/util-arn-parser": "3.804.0", + "@smithy/node-config-provider": "^4.1.1", "@smithy/protocol-http": "^5.1.0", "@smithy/types": "^4.2.0", "@smithy/util-config-provider": "^4.0.0", @@ -607,12 +608,12 @@ } }, "node_modules/@aws-sdk/middleware-expect-continue": { - "version": "3.775.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.775.0.tgz", - "integrity": "sha512-Apd3owkIeUW5dnk3au9np2IdW2N0zc9NjTjHiH+Mx3zqwSrc+m+ANgJVgk9mnQjMzU/vb7VuxJ0eqdEbp5gYsg==", + "version": "3.804.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.804.0.tgz", + "integrity": "sha512-YW1hySBolALMII6C8y7Z0CRG2UX1dGJjLEBNFeefhO/xP7ZuE1dvnmfJGaEuBMnvc3wkRS63VZ3aqX6sevM1CA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.775.0", + "@aws-sdk/types": "3.804.0", "@smithy/protocol-http": "^5.1.0", "@smithy/types": "^4.2.0", "tslib": "^2.6.2" @@ -622,18 +623,18 @@ } }, "node_modules/@aws-sdk/middleware-flexible-checksums": { - "version": "3.787.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.787.0.tgz", - "integrity": "sha512-X71qEwWoixFmwowWzlPoZUR3u1CWJ7iAzU0EzIxqmPhQpQJLFmdL1+SRjqATynDPZQzLs1a5HBtPT++EnZ+Quw==", + "version": "3.816.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.816.0.tgz", + "integrity": "sha512-kftcwDxB/VoCBsUiRgkm5CIuKbTfCN1WLPbis9LRwX3kQhKgGVxG2gG78SHk4TBB0qviWVAd/t+i/KaUgwiAcA==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/crc32": "5.2.0", "@aws-crypto/crc32c": "5.2.0", "@aws-crypto/util": "5.2.0", - "@aws-sdk/core": "3.775.0", - "@aws-sdk/types": "3.775.0", + "@aws-sdk/core": "3.816.0", + "@aws-sdk/types": "3.804.0", "@smithy/is-array-buffer": "^4.0.0", - "@smithy/node-config-provider": "^4.0.2", + "@smithy/node-config-provider": "^4.1.1", "@smithy/protocol-http": "^5.1.0", "@smithy/types": "^4.2.0", "@smithy/util-middleware": "^4.0.2", @@ -646,12 +647,12 @@ } }, "node_modules/@aws-sdk/middleware-host-header": { - "version": "3.775.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.775.0.tgz", - "integrity": "sha512-tkSegM0Z6WMXpLB8oPys/d+umYIocvO298mGvcMCncpRl77L9XkvSLJIFzaHes+o7djAgIduYw8wKIMStFss2w==", + "version": "3.804.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.804.0.tgz", + "integrity": "sha512-bum1hLVBrn2lJCi423Z2fMUYtsbkGI2s4N+2RI2WSjvbaVyMSv/WcejIrjkqiiMR+2Y7m5exgoKeg4/TODLDPQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.775.0", + "@aws-sdk/types": "3.804.0", "@smithy/protocol-http": "^5.1.0", "@smithy/types": "^4.2.0", "tslib": "^2.6.2" @@ -661,12 +662,12 @@ } }, "node_modules/@aws-sdk/middleware-location-constraint": { - "version": "3.775.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.775.0.tgz", - "integrity": "sha512-8TMXEHZXZTFTckQLyBT5aEI8fX11HZcwZseRifvBKKpj0RZDk4F0EEYGxeNSPpUQ7n+PRWyfAEnnZNRdAj/1NQ==", + "version": "3.804.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.804.0.tgz", + "integrity": "sha512-AMtKnllIWKgoo7hiJfphLYotEwTERfjVMO2+cKAncz9w1g+bnYhHxiVhJJoR94y047c06X4PU5MsTxvdQ73Znw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.775.0", + "@aws-sdk/types": "3.804.0", "@smithy/types": "^4.2.0", "tslib": "^2.6.2" }, @@ -675,12 +676,12 @@ } }, "node_modules/@aws-sdk/middleware-logger": { - "version": "3.775.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.775.0.tgz", - "integrity": "sha512-FaxO1xom4MAoUJsldmR92nT1G6uZxTdNYOFYtdHfd6N2wcNaTuxgjIvqzg5y7QIH9kn58XX/dzf1iTjgqUStZw==", + "version": "3.804.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.804.0.tgz", + "integrity": "sha512-w/qLwL3iq0KOPQNat0Kb7sKndl9BtceigINwBU7SpkYWX9L/Lem6f8NPEKrC9Tl4wDBht3Yztub4oRTy/horJA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.775.0", + "@aws-sdk/types": "3.804.0", "@smithy/types": "^4.2.0", "tslib": "^2.6.2" }, @@ -689,12 +690,12 @@ } }, "node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.775.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.775.0.tgz", - "integrity": "sha512-GLCzC8D0A0YDG5u3F5U03Vb9j5tcOEFhr8oc6PDk0k0vm5VwtZOE6LvK7hcCSoAB4HXyOUM0sQuXrbaAh9OwXA==", + "version": "3.804.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.804.0.tgz", + "integrity": "sha512-zqHOrvLRdsUdN/ehYfZ9Tf8svhbiLLz5VaWUz22YndFv6m9qaAcijkpAOlKexsv3nLBMJdSdJ6GUTAeIy3BZzw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.775.0", + "@aws-sdk/types": "3.804.0", "@smithy/protocol-http": "^5.1.0", "@smithy/types": "^4.2.0", "tslib": "^2.6.2" @@ -704,19 +705,19 @@ } }, "node_modules/@aws-sdk/middleware-sdk-s3": { - "version": "3.775.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.775.0.tgz", - "integrity": "sha512-zsvcu7cWB28JJ60gVvjxPCI7ZU7jWGcpNACPiZGyVtjYXwcxyhXbYEVDSWKsSA6ERpz9XrpLYod8INQWfW3ECg==", + "version": "3.816.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.816.0.tgz", + "integrity": "sha512-jJ+EAXM7gnOwiCM6rrl4AUNY5urmtIsX7roTkxtb4DevJxcS+wFYRRg3/j33fQbuxQZrvk21HqxyZYx5UH70PA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.775.0", - "@aws-sdk/types": "3.775.0", - "@aws-sdk/util-arn-parser": "3.723.0", - "@smithy/core": "^3.2.0", - "@smithy/node-config-provider": "^4.0.2", + "@aws-sdk/core": "3.816.0", + "@aws-sdk/types": "3.804.0", + "@aws-sdk/util-arn-parser": "3.804.0", + "@smithy/core": "^3.3.3", + "@smithy/node-config-provider": "^4.1.1", "@smithy/protocol-http": "^5.1.0", - "@smithy/signature-v4": "^5.0.2", - "@smithy/smithy-client": "^4.2.0", + "@smithy/signature-v4": "^5.1.0", + "@smithy/smithy-client": "^4.2.6", "@smithy/types": "^4.2.0", "@smithy/util-config-provider": "^4.0.0", "@smithy/util-middleware": "^4.0.2", @@ -729,12 +730,12 @@ } }, "node_modules/@aws-sdk/middleware-ssec": { - "version": "3.775.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.775.0.tgz", - "integrity": "sha512-Iw1RHD8vfAWWPzBBIKaojO4GAvQkHOYIpKdAfis/EUSUmSa79QsnXnRqsdcE0mCB0Ylj23yi+ah4/0wh9FsekA==", + "version": "3.804.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.804.0.tgz", + "integrity": "sha512-Tk8jK0gOIUBvEPTz/wwSlP1V70zVQ3QYqsLPAjQRMO6zfOK9ax31dln3MgKvFDJxBydS2tS3wsn53v+brxDxTA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.775.0", + "@aws-sdk/types": "3.804.0", "@smithy/types": "^4.2.0", "tslib": "^2.6.2" }, @@ -743,15 +744,15 @@ } }, "node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.787.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.787.0.tgz", - "integrity": "sha512-Lnfj8SmPLYtrDFthNIaNj66zZsBCam+E4XiUDr55DIHTGstH6qZ/q6vg0GfbukxwSmUcGMwSR4Qbn8rb8yd77g==", + "version": "3.816.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.816.0.tgz", + "integrity": "sha512-bHRSlWZ0xDsFR8E2FwDb//0Ff6wMkVx4O+UKsfyNlAbtqCiiHRt5ANNfKPafr95cN2CCxLxiPvFTFVblQM5TsQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.775.0", - "@aws-sdk/types": "3.775.0", - "@aws-sdk/util-endpoints": "3.787.0", - "@smithy/core": "^3.2.0", + "@aws-sdk/core": "3.816.0", + "@aws-sdk/types": "3.804.0", + "@aws-sdk/util-endpoints": "3.808.0", + "@smithy/core": "^3.3.3", "@smithy/protocol-http": "^5.1.0", "@smithy/types": "^4.2.0", "tslib": "^2.6.2" @@ -761,47 +762,47 @@ } }, "node_modules/@aws-sdk/nested-clients": { - "version": "3.787.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.787.0.tgz", - "integrity": "sha512-xk03q1xpKNHgbuo+trEf1dFrI239kuMmjKKsqLEsHlAZbuFq4yRGMlHBrVMnKYOPBhVFDS/VineM991XI52fKg==", + "version": "3.817.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.817.0.tgz", + "integrity": "sha512-vQ2E06A48STJFssueJQgxYD8lh1iGJoLJnHdshRDWOQb8gy1wVQR+a7MkPGhGR6lGoS0SCnF/Qp6CZhnwLsqsQ==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.775.0", - "@aws-sdk/middleware-host-header": "3.775.0", - "@aws-sdk/middleware-logger": "3.775.0", - "@aws-sdk/middleware-recursion-detection": "3.775.0", - "@aws-sdk/middleware-user-agent": "3.787.0", - "@aws-sdk/region-config-resolver": "3.775.0", - "@aws-sdk/types": "3.775.0", - "@aws-sdk/util-endpoints": "3.787.0", - "@aws-sdk/util-user-agent-browser": "3.775.0", - "@aws-sdk/util-user-agent-node": "3.787.0", - "@smithy/config-resolver": "^4.1.0", - "@smithy/core": "^3.2.0", + "@aws-sdk/core": "3.816.0", + "@aws-sdk/middleware-host-header": "3.804.0", + "@aws-sdk/middleware-logger": "3.804.0", + "@aws-sdk/middleware-recursion-detection": "3.804.0", + "@aws-sdk/middleware-user-agent": "3.816.0", + "@aws-sdk/region-config-resolver": "3.808.0", + "@aws-sdk/types": "3.804.0", + "@aws-sdk/util-endpoints": "3.808.0", + "@aws-sdk/util-user-agent-browser": "3.804.0", + "@aws-sdk/util-user-agent-node": "3.816.0", + "@smithy/config-resolver": "^4.1.2", + "@smithy/core": "^3.3.3", "@smithy/fetch-http-handler": "^5.0.2", "@smithy/hash-node": "^4.0.2", "@smithy/invalid-dependency": "^4.0.2", "@smithy/middleware-content-length": "^4.0.2", - "@smithy/middleware-endpoint": "^4.1.0", - "@smithy/middleware-retry": "^4.1.0", - "@smithy/middleware-serde": "^4.0.3", + "@smithy/middleware-endpoint": "^4.1.6", + "@smithy/middleware-retry": "^4.1.7", + "@smithy/middleware-serde": "^4.0.5", "@smithy/middleware-stack": "^4.0.2", - "@smithy/node-config-provider": "^4.0.2", + "@smithy/node-config-provider": "^4.1.1", "@smithy/node-http-handler": "^4.0.4", "@smithy/protocol-http": "^5.1.0", - "@smithy/smithy-client": "^4.2.0", + "@smithy/smithy-client": "^4.2.6", "@smithy/types": "^4.2.0", "@smithy/url-parser": "^4.0.2", "@smithy/util-base64": "^4.0.0", "@smithy/util-body-length-browser": "^4.0.0", "@smithy/util-body-length-node": "^4.0.0", - "@smithy/util-defaults-mode-browser": "^4.0.8", - "@smithy/util-defaults-mode-node": "^4.0.8", - "@smithy/util-endpoints": "^3.0.2", + "@smithy/util-defaults-mode-browser": "^4.0.14", + "@smithy/util-defaults-mode-node": "^4.0.14", + "@smithy/util-endpoints": "^3.0.4", "@smithy/util-middleware": "^4.0.2", - "@smithy/util-retry": "^4.0.2", + "@smithy/util-retry": "^4.0.3", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, @@ -810,13 +811,13 @@ } }, "node_modules/@aws-sdk/region-config-resolver": { - "version": "3.775.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.775.0.tgz", - "integrity": "sha512-40iH3LJjrQS3LKUJAl7Wj0bln7RFPEvUYKFxtP8a+oKFDO0F65F52xZxIJbPn6sHkxWDAnZlGgdjZXM3p2g5wQ==", + "version": "3.808.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.808.0.tgz", + "integrity": "sha512-9x2QWfphkARZY5OGkl9dJxZlSlYM2l5inFeo2bKntGuwg4A4YUe5h7d5yJ6sZbam9h43eBrkOdumx03DAkQF9A==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.775.0", - "@smithy/node-config-provider": "^4.0.2", + "@aws-sdk/types": "3.804.0", + "@smithy/node-config-provider": "^4.1.1", "@smithy/types": "^4.2.0", "@smithy/util-config-provider": "^4.0.0", "@smithy/util-middleware": "^4.0.2", @@ -827,15 +828,15 @@ } }, "node_modules/@aws-sdk/signature-v4-multi-region": { - "version": "3.775.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.775.0.tgz", - "integrity": "sha512-cnGk8GDfTMJ8p7+qSk92QlIk2bmTmFJqhYxcXZ9PysjZtx0xmfCMxnG3Hjy1oU2mt5boPCVSOptqtWixayM17g==", + "version": "3.816.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.816.0.tgz", + "integrity": "sha512-idcr9NW86sSIXASSej3423Selu6fxlhhJJtMgpAqoCH/HJh1eQrONJwNKuI9huiruPE8+02pwxuePvLW46X2mw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/middleware-sdk-s3": "3.775.0", - "@aws-sdk/types": "3.775.0", + "@aws-sdk/middleware-sdk-s3": "3.816.0", + "@aws-sdk/types": "3.804.0", "@smithy/protocol-http": "^5.1.0", - "@smithy/signature-v4": "^5.0.2", + "@smithy/signature-v4": "^5.1.0", "@smithy/types": "^4.2.0", "tslib": "^2.6.2" }, @@ -844,13 +845,14 @@ } }, "node_modules/@aws-sdk/token-providers": { - "version": "3.787.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.787.0.tgz", - "integrity": "sha512-d7/NIqxq308Zg0RPMNrmn0QvzniL4Hx8Qdwzr6YZWLYAbUSvZYS2ppLR3BFWSkV6SsTJUx8BuDaj3P8vttkrog==", + "version": "3.817.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.817.0.tgz", + "integrity": "sha512-CYN4/UO0VaqyHf46ogZzNrVX7jI3/CfiuktwKlwtpKA6hjf2+ivfgHSKzPpgPBcSEfiibA/26EeLuMnB6cpSrQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/nested-clients": "3.787.0", - "@aws-sdk/types": "3.775.0", + "@aws-sdk/core": "3.816.0", + "@aws-sdk/nested-clients": "3.817.0", + "@aws-sdk/types": "3.804.0", "@smithy/property-provider": "^4.0.2", "@smithy/shared-ini-file-loader": "^4.0.2", "@smithy/types": "^4.2.0", @@ -861,9 +863,9 @@ } }, "node_modules/@aws-sdk/types": { - "version": "3.775.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.775.0.tgz", - "integrity": "sha512-ZoGKwa4C9fC9Av6bdfqcW6Ix5ot05F/S4VxWR2nHuMv7hzfmAjTOcUiWT7UR4hM/U0whf84VhDtXN/DWAk52KA==", + "version": "3.804.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.804.0.tgz", + "integrity": "sha512-A9qnsy9zQ8G89vrPPlNG9d1d8QcKRGqJKqwyGgS0dclJpwy6d1EWgQLIolKPl6vcFpLoe6avLOLxr+h8ur5wpg==", "license": "Apache-2.0", "dependencies": { "@smithy/types": "^4.2.0", @@ -874,9 +876,9 @@ } }, "node_modules/@aws-sdk/util-arn-parser": { - "version": "3.723.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.723.0.tgz", - "integrity": "sha512-ZhEfvUwNliOQROcAk34WJWVYTlTa4694kSVhDSjW6lE1bMataPnIN8A0ycukEzBXmd8ZSoBcQLn6lKGl7XIJ5w==", + "version": "3.804.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.804.0.tgz", + "integrity": "sha512-wmBJqn1DRXnZu3b4EkE6CWnoWMo1ZMvlfkqU5zPz67xx1GMaXlDCchFvKAXMjk4jn/L1O3tKnoFDNsoLV1kgNQ==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -886,14 +888,14 @@ } }, "node_modules/@aws-sdk/util-endpoints": { - "version": "3.787.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.787.0.tgz", - "integrity": "sha512-fd3zkiOkwnbdbN0Xp9TsP5SWrmv0SpT70YEdbb8wAj2DWQwiCmFszaSs+YCvhoCdmlR3Wl9Spu0pGpSAGKeYvQ==", + "version": "3.808.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.808.0.tgz", + "integrity": "sha512-N6Lic98uc4ADB7fLWlzx+1uVnq04VgVjngZvwHoujcRg9YDhIg9dUDiTzD5VZv13g1BrPYmvYP1HhsildpGV6w==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.775.0", + "@aws-sdk/types": "3.804.0", "@smithy/types": "^4.2.0", - "@smithy/util-endpoints": "^3.0.2", + "@smithy/util-endpoints": "^3.0.4", "tslib": "^2.6.2" }, "engines": { @@ -901,9 +903,9 @@ } }, "node_modules/@aws-sdk/util-locate-window": { - "version": "3.723.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.723.0.tgz", - "integrity": "sha512-Yf2CS10BqK688DRsrKI/EO6B8ff5J86NXe4C+VCysK7UOgN0l1zOTeTukZ3H8Q9tYYX3oaF1961o8vRkFm7Nmw==", + "version": "3.804.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.804.0.tgz", + "integrity": "sha512-zVoRfpmBVPodYlnMjgVjfGoEZagyRF5IPn3Uo6ZvOZp24chnW/FRstH7ESDHDDRga4z3V+ElUQHKpFDXWyBW5A==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -913,26 +915,26 @@ } }, "node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.775.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.775.0.tgz", - "integrity": "sha512-txw2wkiJmZKVdDbscK7VBK+u+TJnRtlUjRTLei+elZg2ADhpQxfVAQl436FUeIv6AhB/oRHW6/K/EAGXUSWi0A==", + "version": "3.804.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.804.0.tgz", + "integrity": "sha512-KfW6T6nQHHM/vZBBdGn6fMyG/MgX5lq82TDdX4HRQRRuHKLgBWGpKXqqvBwqIaCdXwWHgDrg2VQups6GqOWW2A==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.775.0", + "@aws-sdk/types": "3.804.0", "@smithy/types": "^4.2.0", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, "node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.787.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.787.0.tgz", - "integrity": "sha512-mG7Lz8ydfG4SF9e8WSXiPQ/Lsn3n8A5B5jtPROidafi06I3ckV2WxyMLdwG14m919NoS6IOfWHyRGSqWIwbVKA==", + "version": "3.816.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.816.0.tgz", + "integrity": "sha512-Q6dxmuj4hL7pudhrneWEQ7yVHIQRBFr0wqKLF1opwOi1cIePuoEbPyJ2jkel6PDEv1YMfvsAKaRshp6eNA8VHg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/middleware-user-agent": "3.787.0", - "@aws-sdk/types": "3.775.0", - "@smithy/node-config-provider": "^4.0.2", + "@aws-sdk/middleware-user-agent": "3.816.0", + "@aws-sdk/types": "3.804.0", + "@smithy/node-config-provider": "^4.1.1", "@smithy/types": "^4.2.0", "tslib": "^2.6.2" }, @@ -949,9 +951,9 @@ } }, "node_modules/@aws-sdk/xml-builder": { - "version": "3.775.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.775.0.tgz", - "integrity": "sha512-b9NGO6FKJeLGYnV7Z1yvcP1TNU4dkD5jNsLWOF1/sygZoASaQhNOlaiJ/1OH331YQ1R1oWk38nBb0frsYkDsOQ==", + "version": "3.804.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.804.0.tgz", + "integrity": "sha512-JbGWp36IG9dgxtvC6+YXwt5WDZYfuamWFtVfK6fQpnmL96dx+GUPOXPKRWdw67WLKf2comHY28iX2d3z35I53Q==", "license": "Apache-2.0", "dependencies": { "@smithy/types": "^4.2.0", @@ -3861,9 +3863,9 @@ } }, "node_modules/@likeminds.community/feed-js": { - "version": "1.16.1", - "resolved": "file:../../../untitled/dummyApp/likeminds-feed-js-data/likeminds.community-feed-js-1.16.1.tgz", - "integrity": "sha512-wbvu0TUg1+ZpQxkxL+Ccp7q6Fkd9HdL0kJNs17PB43eewRfoOgd2d5+sEX/xMeuZOXQtLSKrqISLtMqz96RBsw==", + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/@likeminds.community/feed-js/-/feed-js-1.19.1.tgz", + "integrity": "sha512-zLYyJNYThIdV3G+nNvHgOnqjbASpHLGIG0zchO2aaTdD0DrlgcSpSFydBdpZAvYn6M9Y6vVOsrBJa9E6yIEYAQ==", "license": "ISC", "dependencies": { "@aws-sdk/client-s3": "^3.226.0", @@ -4567,13 +4569,13 @@ } }, "node_modules/@likeminds.community/feed-rn": { - "version": "1.6.0", - "resolved": "file:../../../untitled/dummyApp/likeminds-feed-reactnative-data/likeminds.community-feed-rn-1.6.0.tgz", - "integrity": "sha512-PI5/bk+Yj+9V501DNfdkDsaOZ0l7UBvbvfVd4wGpB0obkmHCjx71kyPPkWx5fxzQXs5myML5EroEjHGAyef6NA==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@likeminds.community/feed-rn/-/feed-rn-1.7.0.tgz", + "integrity": "sha512-iJTeKVKE1KQ+K7BZpoRMdgyVuwulRRGIfcXHXJC3eq/1Ua3CKl0o/Pqlgp066cQwt62gMN7EYRaMG1lQ/s39nA==", "license": "ISC", "dependencies": { - "@likeminds.community/feed-js": "file:../likeminds-feed-js-data/likeminds.community-feed-js-1.16.1.tgz", - "@react-native-async-storage/async-storage": "^2.1.2", + "@likeminds.community/feed-js": "1.19.1", + "@react-native-async-storage/async-storage": ">=1.23.1", "axios": "0.22.0" }, "peerDependencies": { @@ -5286,6 +5288,22 @@ "dev": true, "license": "MIT" }, + "node_modules/@shopify/flash-list": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@shopify/flash-list/-/flash-list-1.8.0.tgz", + "integrity": "sha512-APZ48kceCCJobUimmI2594io+HujELK60HFKgzIyIdHGX5ySR5YfvsPy3PKtPwHHDtIMFNaq3U/BY3qZocOhCA==", + "license": "MIT", + "peer": true, + "dependencies": { + "recyclerlistview": "4.2.3", + "tslib": "2.8.1" + }, + "peerDependencies": { + "@babel/runtime": "*", + "react": "*", + "react-native": "*" + } + }, "node_modules/@sinclair/typebox": { "version": "0.27.8", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", @@ -5311,12 +5329,12 @@ } }, "node_modules/@smithy/abort-controller": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.0.2.tgz", - "integrity": "sha512-Sl/78VDtgqKxN2+1qduaVE140XF+Xg+TafkncspwM4jFP/LHr76ZHmIY/y3V1M0mMLNk+Je6IGbzxy23RSToMw==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.0.3.tgz", + "integrity": "sha512-AqXFf6DXnuRBXy4SoK/n1mfgHaKaq36bmkphmD1KO0nHq6xK/g9KHSW4HEsPQUBCGdIEfuJifGHwxFXPIFay9Q==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.2.0", + "@smithy/types": "^4.3.0", "tslib": "^2.6.2" }, "engines": { @@ -5349,15 +5367,15 @@ } }, "node_modules/@smithy/config-resolver": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.1.0.tgz", - "integrity": "sha512-8smPlwhga22pwl23fM5ew4T9vfLUCeFXlcqNOCD5M5h8VmNPNUE9j6bQSuRXpDSV11L/E/SwEBQuW8hr6+nS1A==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.1.3.tgz", + "integrity": "sha512-N5e7ofiyYDmHxnPnqF8L4KtsbSDwyxFRfDK9bp1d9OyPO4ytRLd0/XxCqi5xVaaqB65v4woW8uey6jND6zxzxQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/node-config-provider": "^4.0.2", - "@smithy/types": "^4.2.0", + "@smithy/node-config-provider": "^4.1.2", + "@smithy/types": "^4.3.0", "@smithy/util-config-provider": "^4.0.0", - "@smithy/util-middleware": "^4.0.2", + "@smithy/util-middleware": "^4.0.3", "tslib": "^2.6.2" }, "engines": { @@ -5365,17 +5383,17 @@ } }, "node_modules/@smithy/core": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.2.0.tgz", - "integrity": "sha512-k17bgQhVZ7YmUvA8at4af1TDpl0NDMBuBKJl8Yg0nrefwmValU+CnA5l/AriVdQNthU/33H3nK71HrLgqOPr1Q==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.4.0.tgz", + "integrity": "sha512-dDYISQo7k0Ml/rXlFIjkTmTcQze/LxhtIRAEmZ6HJ/EI0inVxVEVnrUXJ7jPx6ZP0GHUhFm40iQcCgS5apXIXA==", "license": "Apache-2.0", "dependencies": { - "@smithy/middleware-serde": "^4.0.3", - "@smithy/protocol-http": "^5.1.0", - "@smithy/types": "^4.2.0", + "@smithy/middleware-serde": "^4.0.6", + "@smithy/protocol-http": "^5.1.1", + "@smithy/types": "^4.3.0", "@smithy/util-body-length-browser": "^4.0.0", - "@smithy/util-middleware": "^4.0.2", - "@smithy/util-stream": "^4.2.0", + "@smithy/util-middleware": "^4.0.3", + "@smithy/util-stream": "^4.2.1", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, @@ -5384,15 +5402,15 @@ } }, "node_modules/@smithy/credential-provider-imds": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.0.2.tgz", - "integrity": "sha512-32lVig6jCaWBHnY+OEQ6e6Vnt5vDHaLiydGrwYMW9tPqO688hPGTYRamYJ1EptxEC2rAwJrHWmPoKRBl4iTa8w==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.0.5.tgz", + "integrity": "sha512-saEAGwrIlkb9XxX/m5S5hOtzjoJPEK6Qw2f9pYTbIsMPOFyGSXBBTw95WbOyru8A1vIS2jVCCU1Qhz50QWG3IA==", "license": "Apache-2.0", "dependencies": { - "@smithy/node-config-provider": "^4.0.2", - "@smithy/property-provider": "^4.0.2", - "@smithy/types": "^4.2.0", - "@smithy/url-parser": "^4.0.2", + "@smithy/node-config-provider": "^4.1.2", + "@smithy/property-provider": "^4.0.3", + "@smithy/types": "^4.3.0", + "@smithy/url-parser": "^4.0.3", "tslib": "^2.6.2" }, "engines": { @@ -5400,13 +5418,13 @@ } }, "node_modules/@smithy/eventstream-codec": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-4.0.2.tgz", - "integrity": "sha512-p+f2kLSK7ZrXVfskU/f5dzksKTewZk8pJLPvER3aFHPt76C2MxD9vNatSfLzzQSQB4FNO96RK4PSXfhD1TTeMQ==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-4.0.3.tgz", + "integrity": "sha512-V22KIPXZsE2mc4zEgYGANM/7UbL9jWlOACEolyGyMuTY+jjHJ2PQ0FdopOTS1CS7u6PlAkALmypkv2oQ4aftcg==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/crc32": "5.2.0", - "@smithy/types": "^4.2.0", + "@smithy/types": "^4.3.0", "@smithy/util-hex-encoding": "^4.0.0", "tslib": "^2.6.2" }, @@ -5415,13 +5433,13 @@ } }, "node_modules/@smithy/eventstream-serde-browser": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-4.0.2.tgz", - "integrity": "sha512-CepZCDs2xgVUtH7ZZ7oDdZFH8e6Y2zOv8iiX6RhndH69nlojCALSKK+OXwZUgOtUZEUaZ5e1hULVCHYbCn7pug==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-4.0.3.tgz", + "integrity": "sha512-oe1d/tfCGVZBMX8O6HApaM4G+fF9JNdyLP7tWXt00epuL/kLOdp/4o9VqheLFeJaXgao+9IaBgs/q/oM48hxzg==", "license": "Apache-2.0", "dependencies": { - "@smithy/eventstream-serde-universal": "^4.0.2", - "@smithy/types": "^4.2.0", + "@smithy/eventstream-serde-universal": "^4.0.3", + "@smithy/types": "^4.3.0", "tslib": "^2.6.2" }, "engines": { @@ -5429,12 +5447,12 @@ } }, "node_modules/@smithy/eventstream-serde-config-resolver": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-4.1.0.tgz", - "integrity": "sha512-1PI+WPZ5TWXrfj3CIoKyUycYynYJgZjuQo8U+sphneOtjsgrttYybdqESFReQrdWJ+LKt6NEdbYzmmfDBmjX2A==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-4.1.1.tgz", + "integrity": "sha512-XXCPGjRNwpFWHKQJMKIjGLfFKYULYckFnxGcWmBC2mBf3NsrvUKgqHax4NCqc0TfbDAimPDHOc6HOKtzsXK9Gw==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.2.0", + "@smithy/types": "^4.3.0", "tslib": "^2.6.2" }, "engines": { @@ -5442,13 +5460,13 @@ } }, "node_modules/@smithy/eventstream-serde-node": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-4.0.2.tgz", - "integrity": "sha512-C5bJ/C6x9ENPMx2cFOirspnF9ZsBVnBMtP6BdPl/qYSuUawdGQ34Lq0dMcf42QTjUZgWGbUIZnz6+zLxJlb9aw==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-4.0.3.tgz", + "integrity": "sha512-HOEbRmm9TrikCoFrypYu0J/gC4Lsk8gl5LtOz1G3laD2Jy44+ht2Pd2E9qjNQfhMJIzKDZ/gbuUH0s0v4kWQ0A==", "license": "Apache-2.0", "dependencies": { - "@smithy/eventstream-serde-universal": "^4.0.2", - "@smithy/types": "^4.2.0", + "@smithy/eventstream-serde-universal": "^4.0.3", + "@smithy/types": "^4.3.0", "tslib": "^2.6.2" }, "engines": { @@ -5456,13 +5474,13 @@ } }, "node_modules/@smithy/eventstream-serde-universal": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-4.0.2.tgz", - "integrity": "sha512-St8h9JqzvnbB52FtckiHPN4U/cnXcarMniXRXTKn0r4b4XesZOGiAyUdj1aXbqqn1icSqBlzzUsCl6nPB018ng==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-4.0.3.tgz", + "integrity": "sha512-ShOP512CZrYI9n+h64PJ84udzoNHUQtPddyh1j175KNTKsSnMEDNscOWJWyEoLQiuhWWw51lSa+k6ea9ZGXcRg==", "license": "Apache-2.0", "dependencies": { - "@smithy/eventstream-codec": "^4.0.2", - "@smithy/types": "^4.2.0", + "@smithy/eventstream-codec": "^4.0.3", + "@smithy/types": "^4.3.0", "tslib": "^2.6.2" }, "engines": { @@ -5470,14 +5488,14 @@ } }, "node_modules/@smithy/fetch-http-handler": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.0.2.tgz", - "integrity": "sha512-+9Dz8sakS9pe7f2cBocpJXdeVjMopUDLgZs1yWeu7h++WqSbjUYv/JAJwKwXw1HV6gq1jyWjxuyn24E2GhoEcQ==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.0.3.tgz", + "integrity": "sha512-yBZwavI31roqTndNI7ONHqesfH01JmjJK6L3uUpZAhyAmr86LN5QiPzfyZGIxQmed8VEK2NRSQT3/JX5V1njfQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^5.1.0", - "@smithy/querystring-builder": "^4.0.2", - "@smithy/types": "^4.2.0", + "@smithy/protocol-http": "^5.1.1", + "@smithy/querystring-builder": "^4.0.3", + "@smithy/types": "^4.3.0", "@smithy/util-base64": "^4.0.0", "tslib": "^2.6.2" }, @@ -5486,14 +5504,14 @@ } }, "node_modules/@smithy/hash-blob-browser": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@smithy/hash-blob-browser/-/hash-blob-browser-4.0.2.tgz", - "integrity": "sha512-3g188Z3DyhtzfBRxpZjU8R9PpOQuYsbNnyStc/ZVS+9nVX1f6XeNOa9IrAh35HwwIZg+XWk8bFVtNINVscBP+g==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@smithy/hash-blob-browser/-/hash-blob-browser-4.0.3.tgz", + "integrity": "sha512-37wZYU/XI2cOF4hgNDNMzZNAuNtJTkZFWxcpagQrnf6PYU/6sJ6y5Ey9Bp4vzi9nteex/ImxAugfsF3XGLrqWA==", "license": "Apache-2.0", "dependencies": { "@smithy/chunked-blob-reader": "^5.0.0", "@smithy/chunked-blob-reader-native": "^4.0.0", - "@smithy/types": "^4.2.0", + "@smithy/types": "^4.3.0", "tslib": "^2.6.2" }, "engines": { @@ -5501,12 +5519,12 @@ } }, "node_modules/@smithy/hash-node": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.0.2.tgz", - "integrity": "sha512-VnTpYPnRUE7yVhWozFdlxcYknv9UN7CeOqSrMH+V877v4oqtVYuoqhIhtSjmGPvYrYnAkaM61sLMKHvxL138yg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.0.3.tgz", + "integrity": "sha512-W5Uhy6v/aYrgtjh9y0YP332gIQcwccQ+EcfWhllL0B9rPae42JngTTUpb8W6wuxaNFzqps4xq5klHckSSOy5fw==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.2.0", + "@smithy/types": "^4.3.0", "@smithy/util-buffer-from": "^4.0.0", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" @@ -5516,12 +5534,12 @@ } }, "node_modules/@smithy/hash-stream-node": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@smithy/hash-stream-node/-/hash-stream-node-4.0.2.tgz", - "integrity": "sha512-POWDuTznzbIwlEXEvvXoPMS10y0WKXK790soe57tFRfvf4zBHyzE529HpZMqmDdwG9MfFflnyzndUQ8j78ZdSg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@smithy/hash-stream-node/-/hash-stream-node-4.0.3.tgz", + "integrity": "sha512-CAwAvztwGYHHZGGcXtbinNxytaj5FNZChz8V+o7eNUAi5BgVqnF91Z3cJSmaE9O7FYUQVrIzGAB25Aok9T5KHQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.2.0", + "@smithy/types": "^4.3.0", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, @@ -5530,12 +5548,12 @@ } }, "node_modules/@smithy/invalid-dependency": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.0.2.tgz", - "integrity": "sha512-GatB4+2DTpgWPday+mnUkoumP54u/MDM/5u44KF9hIu8jF0uafZtQLcdfIKkIcUNuF/fBojpLEHZS/56JqPeXQ==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.0.3.tgz", + "integrity": "sha512-1Bo8Ur1ZGqxvwTqBmv6DZEn0rXtwJGeqiiO2/JFcCtz3nBakOqeXbJBElXJMMzd0ghe8+eB6Dkw98nMYctgizg==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.2.0", + "@smithy/types": "^4.3.0", "tslib": "^2.6.2" }, "engines": { @@ -5555,12 +5573,12 @@ } }, "node_modules/@smithy/md5-js": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@smithy/md5-js/-/md5-js-4.0.2.tgz", - "integrity": "sha512-Hc0R8EiuVunUewCse2syVgA2AfSRco3LyAv07B/zCOMa+jpXI9ll+Q21Nc6FAlYPcpNcAXqBzMhNs1CD/pP2bA==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@smithy/md5-js/-/md5-js-4.0.3.tgz", + "integrity": "sha512-m95Z+1UJFPq4cv/R6TPMLYkoau7cNJYA5GLuuUJjfmF+Zrad4yaupIWeGGzIinf8pD1L+CIAxjh8eowPvyL7Dw==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.2.0", + "@smithy/types": "^4.3.0", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, @@ -5569,13 +5587,13 @@ } }, "node_modules/@smithy/middleware-content-length": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.0.2.tgz", - "integrity": "sha512-hAfEXm1zU+ELvucxqQ7I8SszwQ4znWMbNv6PLMndN83JJN41EPuS93AIyh2N+gJ6x8QFhzSO6b7q2e6oClDI8A==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.0.3.tgz", + "integrity": "sha512-NE/Zph4BP5u16bzYq2csq9qD0T6UBLeg4AuNrwNJ7Gv9uLYaGEgelZUOdRndGdMGcUfSGvNlXGb2aA2hPCwJ6g==", "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^5.1.0", - "@smithy/types": "^4.2.0", + "@smithy/protocol-http": "^5.1.1", + "@smithy/types": "^4.3.0", "tslib": "^2.6.2" }, "engines": { @@ -5583,18 +5601,18 @@ } }, "node_modules/@smithy/middleware-endpoint": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.1.0.tgz", - "integrity": "sha512-xhLimgNCbCzsUppRTGXWkZywksuTThxaIB0HwbpsVLY5sceac4e1TZ/WKYqufQLaUy+gUSJGNdwD2jo3cXL0iA==", + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.1.7.tgz", + "integrity": "sha512-KDzM7Iajo6K7eIWNNtukykRT4eWwlHjCEsULZUaSfi/SRSBK8BPRqG5FsVfp58lUxcvre8GT8AIPIqndA0ERKw==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.2.0", - "@smithy/middleware-serde": "^4.0.3", - "@smithy/node-config-provider": "^4.0.2", - "@smithy/shared-ini-file-loader": "^4.0.2", - "@smithy/types": "^4.2.0", - "@smithy/url-parser": "^4.0.2", - "@smithy/util-middleware": "^4.0.2", + "@smithy/core": "^3.4.0", + "@smithy/middleware-serde": "^4.0.6", + "@smithy/node-config-provider": "^4.1.2", + "@smithy/shared-ini-file-loader": "^4.0.3", + "@smithy/types": "^4.3.0", + "@smithy/url-parser": "^4.0.3", + "@smithy/util-middleware": "^4.0.3", "tslib": "^2.6.2" }, "engines": { @@ -5602,18 +5620,18 @@ } }, "node_modules/@smithy/middleware-retry": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.1.0.tgz", - "integrity": "sha512-2zAagd1s6hAaI/ap6SXi5T3dDwBOczOMCSkkYzktqN1+tzbk1GAsHNAdo/1uzxz3Ky02jvZQwbi/vmDA6z4Oyg==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/node-config-provider": "^4.0.2", - "@smithy/protocol-http": "^5.1.0", - "@smithy/service-error-classification": "^4.0.2", - "@smithy/smithy-client": "^4.2.0", - "@smithy/types": "^4.2.0", - "@smithy/util-middleware": "^4.0.2", - "@smithy/util-retry": "^4.0.2", + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.1.8.tgz", + "integrity": "sha512-e2OtQgFzzlSG0uCjcJmi02QuFSRTrpT11Eh2EcqqDFy7DYriteHZJkkf+4AsxsrGDugAtPFcWBz1aq06sSX5fQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^4.1.2", + "@smithy/protocol-http": "^5.1.1", + "@smithy/service-error-classification": "^4.0.4", + "@smithy/smithy-client": "^4.3.0", + "@smithy/types": "^4.3.0", + "@smithy/util-middleware": "^4.0.3", + "@smithy/util-retry": "^4.0.4", "tslib": "^2.6.2", "uuid": "^9.0.1" }, @@ -5635,12 +5653,13 @@ } }, "node_modules/@smithy/middleware-serde": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.0.3.tgz", - "integrity": "sha512-rfgDVrgLEVMmMn0BI8O+8OVr6vXzjV7HZj57l0QxslhzbvVfikZbVfBVthjLHqib4BW44QhcIgJpvebHlRaC9A==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.0.6.tgz", + "integrity": "sha512-YECyl7uNII+jCr/9qEmCu8xYL79cU0fqjo0qxpcVIU18dAPHam/iYwcknAu4Jiyw1uN+sAx7/SMf/Kmef/Jjsg==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.2.0", + "@smithy/protocol-http": "^5.1.1", + "@smithy/types": "^4.3.0", "tslib": "^2.6.2" }, "engines": { @@ -5648,12 +5667,12 @@ } }, "node_modules/@smithy/middleware-stack": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.0.2.tgz", - "integrity": "sha512-eSPVcuJJGVYrFYu2hEq8g8WWdJav3sdrI4o2c6z/rjnYDd3xH9j9E7deZQCzFn4QvGPouLngH3dQ+QVTxv5bOQ==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.0.3.tgz", + "integrity": "sha512-baeV7t4jQfQtFxBADFmnhmqBmqR38dNU5cvEgHcMK/Kp3D3bEI0CouoX2Sr/rGuntR+Eg0IjXdxnGGTc6SbIkw==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.2.0", + "@smithy/types": "^4.3.0", "tslib": "^2.6.2" }, "engines": { @@ -5661,14 +5680,14 @@ } }, "node_modules/@smithy/node-config-provider": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.0.2.tgz", - "integrity": "sha512-WgCkILRZfJwJ4Da92a6t3ozN/zcvYyJGUTmfGbgS/FkCcoCjl7G4FJaCDN1ySdvLvemnQeo25FdkyMSTSwulsw==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.1.2.tgz", + "integrity": "sha512-SUvNup8iU1v7fmM8XPk+27m36udmGCfSz+VZP5Gb0aJ3Ne0X28K/25gnsrg3X1rWlhcnhzNUUysKW/Ied46ivQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/property-provider": "^4.0.2", - "@smithy/shared-ini-file-loader": "^4.0.2", - "@smithy/types": "^4.2.0", + "@smithy/property-provider": "^4.0.3", + "@smithy/shared-ini-file-loader": "^4.0.3", + "@smithy/types": "^4.3.0", "tslib": "^2.6.2" }, "engines": { @@ -5676,15 +5695,15 @@ } }, "node_modules/@smithy/node-http-handler": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.0.4.tgz", - "integrity": "sha512-/mdqabuAT3o/ihBGjL94PUbTSPSRJ0eeVTdgADzow0wRJ0rN4A27EOrtlK56MYiO1fDvlO3jVTCxQtQmK9dZ1g==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.0.5.tgz", + "integrity": "sha512-T7QglZC1vS7SPT44/1qSIAQEx5bFKb3LfO6zw/o4Xzt1eC5HNoH1TkS4lMYA9cWFbacUhx4hRl/blLun4EOCkg==", "license": "Apache-2.0", "dependencies": { - "@smithy/abort-controller": "^4.0.2", - "@smithy/protocol-http": "^5.1.0", - "@smithy/querystring-builder": "^4.0.2", - "@smithy/types": "^4.2.0", + "@smithy/abort-controller": "^4.0.3", + "@smithy/protocol-http": "^5.1.1", + "@smithy/querystring-builder": "^4.0.3", + "@smithy/types": "^4.3.0", "tslib": "^2.6.2" }, "engines": { @@ -5692,12 +5711,12 @@ } }, "node_modules/@smithy/property-provider": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.2.tgz", - "integrity": "sha512-wNRoQC1uISOuNc2s4hkOYwYllmiyrvVXWMtq+TysNRVQaHm4yoafYQyjN/goYZS+QbYlPIbb/QRjaUZMuzwQ7A==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.3.tgz", + "integrity": "sha512-Wcn17QNdawJZcZZPBuMuzyBENVi1AXl4TdE0jvzo4vWX2x5df/oMlmr/9M5XAAC6+yae4kWZlOYIsNsgDrMU9A==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.2.0", + "@smithy/types": "^4.3.0", "tslib": "^2.6.2" }, "engines": { @@ -5705,12 +5724,12 @@ } }, "node_modules/@smithy/protocol-http": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.1.0.tgz", - "integrity": "sha512-KxAOL1nUNw2JTYrtviRRjEnykIDhxc84qMBzxvu1MUfQfHTuBlCG7PA6EdVwqpJjH7glw7FqQoFxUJSyBQgu7g==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.1.1.tgz", + "integrity": "sha512-Vsay2mzq05DwNi9jK01yCFtfvu9HimmgC7a4HTs7lhX12Sx8aWsH0mfz6q/02yspSp+lOB+Q2HJwi4IV2GKz7A==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.2.0", + "@smithy/types": "^4.3.0", "tslib": "^2.6.2" }, "engines": { @@ -5718,12 +5737,12 @@ } }, "node_modules/@smithy/querystring-builder": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.0.2.tgz", - "integrity": "sha512-NTOs0FwHw1vimmQM4ebh+wFQvOwkEf/kQL6bSM1Lock+Bv4I89B3hGYoUEPkmvYPkDKyp5UdXJYu+PoTQ3T31Q==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.0.3.tgz", + "integrity": "sha512-UUzIWMVfPmDZcOutk2/r1vURZqavvQW0OHvgsyNV0cKupChvqg+/NKPRMaMEe+i8tP96IthMFeZOZWpV+E4RAw==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.2.0", + "@smithy/types": "^4.3.0", "@smithy/util-uri-escape": "^4.0.0", "tslib": "^2.6.2" }, @@ -5732,12 +5751,12 @@ } }, "node_modules/@smithy/querystring-parser": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.0.2.tgz", - "integrity": "sha512-v6w8wnmZcVXjfVLjxw8qF7OwESD9wnpjp0Dqry/Pod0/5vcEA3qxCr+BhbOHlxS8O+29eLpT3aagxXGwIoEk7Q==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.0.3.tgz", + "integrity": "sha512-K5M4ZJQpFCblOJ5Oyw7diICpFg1qhhR47m2/5Ef1PhGE19RaIZf50tjYFrxa6usqcuXyTiFPGo4d1geZdH4YcQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.2.0", + "@smithy/types": "^4.3.0", "tslib": "^2.6.2" }, "engines": { @@ -5745,24 +5764,24 @@ } }, "node_modules/@smithy/service-error-classification": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.0.2.tgz", - "integrity": "sha512-LA86xeFpTKn270Hbkixqs5n73S+LVM0/VZco8dqd+JT75Dyx3Lcw/MraL7ybjmz786+160K8rPOmhsq0SocoJQ==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.0.4.tgz", + "integrity": "sha512-W5ScbQ1bTzgH91kNEE2CvOzM4gXlDOqdow4m8vMFSIXCel2scbHwjflpVNnC60Y3F1m5i7w2gQg9lSnR+JsJAA==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.2.0" + "@smithy/types": "^4.3.0" }, "engines": { "node": ">=18.0.0" } }, "node_modules/@smithy/shared-ini-file-loader": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.2.tgz", - "integrity": "sha512-J9/gTWBGVuFZ01oVA6vdb4DAjf1XbDhK6sLsu3OS9qmLrS6KB5ygpeHiM3miIbj1qgSJ96GYszXFWv6ErJ8QEw==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.3.tgz", + "integrity": "sha512-vHwlrqhZGIoLwaH8vvIjpHnloShqdJ7SUPNM2EQtEox+yEDFTVQ7E+DLZ+6OhnYEgFUwPByJyz6UZaOu2tny6A==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.2.0", + "@smithy/types": "^4.3.0", "tslib": "^2.6.2" }, "engines": { @@ -5770,16 +5789,16 @@ } }, "node_modules/@smithy/signature-v4": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.0.2.tgz", - "integrity": "sha512-Mz+mc7okA73Lyz8zQKJNyr7lIcHLiPYp0+oiqiMNc/t7/Kf2BENs5d63pEj7oPqdjaum6g0Fc8wC78dY1TgtXw==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.1.1.tgz", + "integrity": "sha512-zy8Repr5zvT0ja+Tf5wjV/Ba6vRrhdiDcp/ww6cvqYbSEudIkziDe3uppNRlFoCViyJXdPnLcwyZdDLA4CHzSg==", "license": "Apache-2.0", "dependencies": { "@smithy/is-array-buffer": "^4.0.0", - "@smithy/protocol-http": "^5.1.0", - "@smithy/types": "^4.2.0", + "@smithy/protocol-http": "^5.1.1", + "@smithy/types": "^4.3.0", "@smithy/util-hex-encoding": "^4.0.0", - "@smithy/util-middleware": "^4.0.2", + "@smithy/util-middleware": "^4.0.3", "@smithy/util-uri-escape": "^4.0.0", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" @@ -5789,17 +5808,17 @@ } }, "node_modules/@smithy/smithy-client": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.2.0.tgz", - "integrity": "sha512-Qs65/w30pWV7LSFAez9DKy0Koaoh3iHhpcpCCJ4waj/iqwsuSzJna2+vYwq46yBaqO5ZbP9TjUsATUNxrKeBdw==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.3.0.tgz", + "integrity": "sha512-DNsRA38pN6tYHUjebmwD9e4KcgqTLldYQb2gC6K+oxXYdCTxPn6wV9+FvOa6wrU2FQEnGJoi+3GULzOTKck/tg==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.2.0", - "@smithy/middleware-endpoint": "^4.1.0", - "@smithy/middleware-stack": "^4.0.2", - "@smithy/protocol-http": "^5.1.0", - "@smithy/types": "^4.2.0", - "@smithy/util-stream": "^4.2.0", + "@smithy/core": "^3.4.0", + "@smithy/middleware-endpoint": "^4.1.7", + "@smithy/middleware-stack": "^4.0.3", + "@smithy/protocol-http": "^5.1.1", + "@smithy/types": "^4.3.0", + "@smithy/util-stream": "^4.2.1", "tslib": "^2.6.2" }, "engines": { @@ -5807,9 +5826,9 @@ } }, "node_modules/@smithy/types": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.2.0.tgz", - "integrity": "sha512-7eMk09zQKCO+E/ivsjQv+fDlOupcFUCSC/L2YUPgwhvowVGWbPQHjEFcmjt7QQ4ra5lyowS92SV53Zc6XD4+fg==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.0.tgz", + "integrity": "sha512-+1iaIQHthDh9yaLhRzaoQxRk+l9xlk+JjMFxGRhNLz+m9vKOkjNeU8QuB4w3xvzHyVR/BVlp/4AXDHjoRIkfgQ==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -5819,13 +5838,13 @@ } }, "node_modules/@smithy/url-parser": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.0.2.tgz", - "integrity": "sha512-Bm8n3j2ScqnT+kJaClSVCMeiSenK6jVAzZCNewsYWuZtnBehEz4r2qP0riZySZVfzB+03XZHJeqfmJDkeeSLiQ==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.0.3.tgz", + "integrity": "sha512-n5/DnosDu/tweOqUUNtUbu7eRIR4J/Wz9nL7V5kFYQQVb8VYdj7a4G5NJHCw6o21ul7CvZoJkOpdTnsQDLT0tQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/querystring-parser": "^4.0.2", - "@smithy/types": "^4.2.0", + "@smithy/querystring-parser": "^4.0.3", + "@smithy/types": "^4.3.0", "tslib": "^2.6.2" }, "engines": { @@ -5896,14 +5915,14 @@ } }, "node_modules/@smithy/util-defaults-mode-browser": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.0.8.tgz", - "integrity": "sha512-ZTypzBra+lI/LfTYZeop9UjoJhhGRTg3pxrNpfSTQLd3AJ37r2z4AXTKpq1rFXiiUIJsYyFgNJdjWRGP/cbBaQ==", + "version": "4.0.15", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.0.15.tgz", + "integrity": "sha512-bJJ/B8owQbHAflatSq92f9OcV8858DJBQF1Y3GRjB8psLyUjbISywszYPFw16beREHO/C3I3taW4VGH+tOuwrQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/property-provider": "^4.0.2", - "@smithy/smithy-client": "^4.2.0", - "@smithy/types": "^4.2.0", + "@smithy/property-provider": "^4.0.3", + "@smithy/smithy-client": "^4.3.0", + "@smithy/types": "^4.3.0", "bowser": "^2.11.0", "tslib": "^2.6.2" }, @@ -5912,17 +5931,17 @@ } }, "node_modules/@smithy/util-defaults-mode-node": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.0.8.tgz", - "integrity": "sha512-Rgk0Jc/UDfRTzVthye/k2dDsz5Xxs9LZaKCNPgJTRyoyBoeiNCnHsYGOyu1PKN+sDyPnJzMOz22JbwxzBp9NNA==", + "version": "4.0.15", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.0.15.tgz", + "integrity": "sha512-8CUrEW2Ni5q+NmYkj8wsgkfqoP7l4ZquptFbq92yQE66xevc4SxqP2zH6tMtN158kgBqBDsZ+qlrRwXWOjCR8A==", "license": "Apache-2.0", "dependencies": { - "@smithy/config-resolver": "^4.1.0", - "@smithy/credential-provider-imds": "^4.0.2", - "@smithy/node-config-provider": "^4.0.2", - "@smithy/property-provider": "^4.0.2", - "@smithy/smithy-client": "^4.2.0", - "@smithy/types": "^4.2.0", + "@smithy/config-resolver": "^4.1.3", + "@smithy/credential-provider-imds": "^4.0.5", + "@smithy/node-config-provider": "^4.1.2", + "@smithy/property-provider": "^4.0.3", + "@smithy/smithy-client": "^4.3.0", + "@smithy/types": "^4.3.0", "tslib": "^2.6.2" }, "engines": { @@ -5930,13 +5949,13 @@ } }, "node_modules/@smithy/util-endpoints": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.0.2.tgz", - "integrity": "sha512-6QSutU5ZyrpNbnd51zRTL7goojlcnuOB55+F9VBD+j8JpRY50IGamsjlycrmpn8PQkmJucFW8A0LSfXj7jjtLQ==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.0.5.tgz", + "integrity": "sha512-PjDpqLk24/vAl340tmtCA++Q01GRRNH9cwL9qh46NspAX9S+IQVcK+GOzPt0GLJ6KYGyn8uOgo2kvJhiThclJw==", "license": "Apache-2.0", "dependencies": { - "@smithy/node-config-provider": "^4.0.2", - "@smithy/types": "^4.2.0", + "@smithy/node-config-provider": "^4.1.2", + "@smithy/types": "^4.3.0", "tslib": "^2.6.2" }, "engines": { @@ -5956,12 +5975,12 @@ } }, "node_modules/@smithy/util-middleware": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.0.2.tgz", - "integrity": "sha512-6GDamTGLuBQVAEuQ4yDQ+ti/YINf/MEmIegrEeg7DdB/sld8BX1lqt9RRuIcABOhAGTA50bRbPzErez7SlDtDQ==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.0.3.tgz", + "integrity": "sha512-iIsC6qZXxkD7V3BzTw3b1uK8RVC1M8WvwNxK1PKrH9FnxntCd30CSunXjL/8iJBE8Z0J14r2P69njwIpRG4FBQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.2.0", + "@smithy/types": "^4.3.0", "tslib": "^2.6.2" }, "engines": { @@ -5969,13 +5988,13 @@ } }, "node_modules/@smithy/util-retry": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.0.2.tgz", - "integrity": "sha512-Qryc+QG+7BCpvjloFLQrmlSd0RsVRHejRXd78jNO3+oREueCjwG1CCEH1vduw/ZkM1U9TztwIKVIi3+8MJScGg==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.0.4.tgz", + "integrity": "sha512-Aoqr9W2jDYGrI6OxljN8VmLDQIGO4VdMAUKMf9RGqLG8hn6or+K41NEy1Y5dtum9q8F7e0obYAuKl2mt/GnpZg==", "license": "Apache-2.0", "dependencies": { - "@smithy/service-error-classification": "^4.0.2", - "@smithy/types": "^4.2.0", + "@smithy/service-error-classification": "^4.0.4", + "@smithy/types": "^4.3.0", "tslib": "^2.6.2" }, "engines": { @@ -5983,14 +6002,14 @@ } }, "node_modules/@smithy/util-stream": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.2.0.tgz", - "integrity": "sha512-Vj1TtwWnuWqdgQI6YTUF5hQ/0jmFiOYsc51CSMgj7QfyO+RF4EnT2HNjoviNlOOmgzgvf3f5yno+EiC4vrnaWQ==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.2.1.tgz", + "integrity": "sha512-W3IR0x5DY6iVtjj5p902oNhD+Bz7vs5S+p6tppbPa509rV9BdeXZjGuRSCtVEad9FA0Mba+tNUtUmtnSI1nwUw==", "license": "Apache-2.0", "dependencies": { - "@smithy/fetch-http-handler": "^5.0.2", - "@smithy/node-http-handler": "^4.0.4", - "@smithy/types": "^4.2.0", + "@smithy/fetch-http-handler": "^5.0.3", + "@smithy/node-http-handler": "^4.0.5", + "@smithy/types": "^4.3.0", "@smithy/util-base64": "^4.0.0", "@smithy/util-buffer-from": "^4.0.0", "@smithy/util-hex-encoding": "^4.0.0", @@ -6027,13 +6046,13 @@ } }, "node_modules/@smithy/util-waiter": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-4.0.3.tgz", - "integrity": "sha512-JtaY3FxmD+te+KSI2FJuEcfNC9T/DGGVf551babM7fAaXhjJUt7oSYurH1Devxd2+BOSUACCgt3buinx4UnmEA==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-4.0.4.tgz", + "integrity": "sha512-73aeIvHjtSB6fd9I08iFaQIGTICKpLrI3EtlWAkStVENGo1ARMq9qdoD4QwkY0RUp6A409xlgbD9NCCfCF5ieg==", "license": "Apache-2.0", "dependencies": { - "@smithy/abort-controller": "^4.0.2", - "@smithy/types": "^4.2.0", + "@smithy/abort-controller": "^4.0.3", + "@smithy/types": "^4.3.0", "tslib": "^2.6.2" }, "engines": { @@ -12368,6 +12387,22 @@ "node": ">=0.10.0" } }, + "node_modules/recyclerlistview": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/recyclerlistview/-/recyclerlistview-4.2.3.tgz", + "integrity": "sha512-STR/wj/FyT8EMsBzzhZ1l2goYirMkIgfV3gYEPxI3Kf3lOnu6f7Dryhyw7/IkQrgX5xtTcDrZMqytvteH9rL3g==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "lodash.debounce": "4.0.8", + "prop-types": "15.8.1", + "ts-object-utils": "0.0.5" + }, + "peerDependencies": { + "react": ">= 15.2.1", + "react-native": ">= 0.30.0" + } + }, "node_modules/reflect.getprototypeof": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", @@ -13835,6 +13870,13 @@ "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", "license": "MIT" }, + "node_modules/ts-object-utils": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/ts-object-utils/-/ts-object-utils-0.0.5.tgz", + "integrity": "sha512-iV0GvHqOmilbIKJsfyfJY9/dNHCs969z3so90dQWsO1eMMozvTpnB1MEaUbb3FYtZTGjv5sIy/xmslEz0Rg2TA==", + "license": "ISC", + "peer": true + }, "node_modules/tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", From be51751dbfd77d16dc727859c2ed00f8dfb9fdc4 Mon Sep 17 00:00:00 2001 From: Usman salim Date: Mon, 26 May 2025 22:59:44 +0530 Subject: [PATCH 41/41] adde main branch in workflow --- .github/workflows/branch-check.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/branch-check.yml b/.github/workflows/branch-check.yml index ad9f6218..cc05d680 100644 --- a/.github/workflows/branch-check.yml +++ b/.github/workflows/branch-check.yml @@ -4,6 +4,7 @@ on: pull_request: branches: - master + - main jobs: validate-source-branch: