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: 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 00000000..5b1cb189 Binary files /dev/null and b/likeminds-feed-reactnative-integration/assets/images/black_background.png differ diff --git a/likeminds-feed-reactnative-integration/components/LMCommentItem/index.tsx b/likeminds-feed-reactnative-integration/components/LMCommentItem/index.tsx index 8faafd6f..dcabfecc 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, @@ -60,8 +61,11 @@ const LMCommentItem = React.memo( comment?.likesCount ); const [repliesArray, setRepliesArray] = useState([]); - const [replyPageNumber, setReplyPageNumber] = useState(2); + const [haveFirstPageReplies, setHaveFirstPageReplies] = useState(false); + const [repliesLoading, setRepliesLoading] = useState(false); + const [replyPageNumber, setReplyPageNumber] = useState(1); const customLikeIcon = likeIconButton?.icon; + const [hasRepliesPaginationEnded, setHasRepliesPaginationEnded] = useState(false); const loggedInUserMemberRights = useAppSelector( (state) => state.login.memberRights ); @@ -70,6 +74,7 @@ const LMCommentItem = React.memo( ); const memberData = useAppSelector((state) => state.login.member); const isCM = memberData?.state === STATE_ADMIN; + const dispatch = useAppDispatch(); // this handles the show more functionality const onTextLayout = (event) => { @@ -79,13 +84,11 @@ const LMCommentItem = React.memo( } }; - const {setCommentOnFocus} = usePostDetailContext() + const {setCommentOnFocus, commentOnFocus} = usePostDetailContext(); useEffect(() => { if (isRepliesVisible) { setShowReplies(true); - onTapReplies && - onTapReplies((data: Array) => setRepliesArray(data), ""); } }, [isRepliesVisible]); @@ -136,6 +139,12 @@ const LMCommentItem = React.memo( }; const handleReplies = () => { + if (showReplies) { + setHasRepliesPaginationEnded(false); + setReplyPageNumber(1); + setHaveFirstPageReplies(false); + dispatch(clearComments(comment?.id)) + } setShowReplies(!showReplies); }; @@ -353,10 +362,13 @@ const LMCommentItem = React.memo( ))} { - onTapReplies + onTapReplies && !showReplies ? (onTapReplies( - (data: Array) => - setRepliesArray(data), + (data: Array) => { + setRepliesArray(data); + setReplyPageNumber(replyPageNumber + 1) + setHaveFirstPageReplies(true); + }, "" ), handleReplies()) @@ -437,10 +449,10 @@ const LMCommentItem = React.memo( {/* replies section */} {showReplies && comment.repliesCount > 0 && ( - {repliesArray && ( + {comment?.replies && ( { return ( <> @@ -464,22 +476,29 @@ const LMCommentItem = React.memo( ); }} - // ListFooterComponentStyle={{}} ListFooterComponent={ <> - {repliesArray.length > 0 ? ( + {comment?.replies.length > 0 ? ( <> - {comment.repliesCount > repliesArray.length && ( + {comment.repliesCount > comment?.replies.length && !hasRepliesPaginationEnded && ( { - setReplyPageNumber(replyPageNumber + 1); + setRepliesLoading(true); onTapViewMore( - replyPageNumber, - (data: Array) => + haveFirstPageReplies ? replyPageNumber : 1, + (data: Array, hasPaginationEnded?: boolean) => { + setHaveFirstPageReplies(true); setRepliesArray(data) + setRepliesLoading(false); + setReplyPageNumber(replyPageNumber + 1); + if (hasPaginationEnded) { + setHasRepliesPaginationEnded(hasPaginationEnded) + } + }, + haveFirstPageReplies ); } : () => null @@ -501,7 +520,7 @@ const LMCommentItem = React.memo( buttonStyle={styles.viewMoreButton} /> - {repliesArray.length} of {comment.repliesCount} + {comment?.replies?.length} of {comment.repliesCount} )} 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/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 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 && ( { + if (!post?.attachments?.length) return 0; + + const screenWidth = Layout.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 0; + + // 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 : 500 + }; + return ( ( true}> {/* this section render image */} - {item?.attachmentType === IMAGE_ATTACHMENT_TYPE && ( + {item?.type === AttachmentType.IMAGE && ( { navigation.navigate(CAROUSEL_SCREEN, { @@ -107,9 +133,9 @@ const LMCarousel = React.memo( }} > )} {/* this section render video */} - {item?.attachmentType === VIDEO_ATTACHMENT_TYPE && ( + {item?.type === AttachmentType.VIDEO && ( { navigation.navigate(CAROUSEL_SCREEN, { @@ -151,9 +177,9 @@ const LMCarousel = React.memo( }} > true} > {/* this section render image */} - {item?.attachmentType === IMAGE_ATTACHMENT_TYPE && ( + {item?.type === AttachmentType.IMAGE && ( { navigation.navigate(CAROUSEL_SCREEN, { @@ -110,7 +111,7 @@ const LMCreatePostCarousel = React.memo( }} > )} {/* this section render video */} - {item?.attachmentType === VIDEO_ATTACHMENT_TYPE && ( + {item?.type === AttachmentType.VIDEO && ( { navigation.navigate(CAROUSEL_SCREEN, { @@ -154,7 +155,7 @@ const LMCreatePostCarousel = React.memo( }} > { - 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); }, [dimensions]); @@ -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/LMDocument/index.tsx b/likeminds-feed-reactnative-integration/components/LMMedia/LMDocument/index.tsx index a97d0bb9..ff4ac146 100644 --- a/likeminds-feed-reactnative-integration/components/LMMedia/LMDocument/index.tsx +++ b/likeminds-feed-reactnative-integration/components/LMMedia/LMDocument/index.tsx @@ -52,10 +52,10 @@ const LMDocument = 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) : ""} { const [loading, setLoading] = useState(true); const [error, setError] = useState(false); - const [heightCalculated, setHeightCalculated] = useState(0); + const [heightCalculated, setHeightCalculated] = useState(height ?? 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) { + + Image.getSize( + imageUrl, + (width, height) => { + const screenWidth = Layout.window.width; + const desiredAspectRatio = width > height ? 1.91 : 0.8; + const heightCalculated = screenWidth * (1 / desiredAspectRatio); + + setHeightCalculated(heightCalculated); + setDesiredAspectRatio(desiredAspectRatio); + }, + (error) => { + console.error('Failed to get image size:', error); + } + ); + + return; + } else { + const screenWidth = Layout.window.width + const desiredAspectRatio = width > height ? 1.91 : 0.8; + const heightCalculated = screenWidth * (1 / desiredAspectRatio); + + setHeightCalculated(heightCalculated); + setDesiredAspectRatio(desiredAspectRatio); + } + + }, [imageUrl]); return ( {/* this renders the loader until the image renders */} @@ -55,12 +71,13 @@ const LMImage = React.memo( source={{ uri: imageUrl }} onLoad={() => setLoading(false)} onError={() => setError(true)} + 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, + resizeMode: boxFit ? boxFit : "contain" } ])} /> @@ -73,9 +90,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/LMImage/types.ts b/likeminds-feed-reactnative-integration/components/LMMedia/LMImage/types.ts index 453ed460..11758b3a 100644 --- a/likeminds-feed-reactnative-integration/components/LMMedia/LMImage/types.ts +++ b/likeminds-feed-reactnative-integration/components/LMMedia/LMImage/types.ts @@ -1,13 +1,13 @@ import { ReactNode } from "react"; -import { ImageStyle, ViewStyle } from "react-native"; +import { ImageResizeMode, ImageStyle, ViewStyle } from "react-native"; import { LMButtonProps } from "../../../uiComponents"; 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?: 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/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 ( (null); const [paused, setPaused] = useState(true); const [dimensions, setDimensions] = useState({ width: 0, height: 0 }); - const [heightCalculated, setHeightCalculated] = useState(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,17 +113,41 @@ 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(() => { - 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 = 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 desiredAspectRatio = width > height ? 1.91 : 0.8; + const heightCalculated = screenWidth * (1 / desiredAspectRatio); + setHeightCalculated(heightCalculated); + setDesiredAspectRatio(desiredAspectRatio); + + } + }, [dimensions]); return ( {/* this renders the loader until the first picture of video is displayed */} {loading ? ( @@ -138,14 +166,15 @@ const LMVideo = React.memo( )} ) : null} - + {/* this renders the video */} <> {RNVideo ? ( setLoading(event?.isBuffering ?? false)} + key={`${videoUrl}-${retryKey}`} onLoad={(data) => { setError(false); onLoad(data); @@ -153,14 +182,17 @@ const LMVideo = React.memo( setLoading(false); }} onProgress={() => setError(false)} - onError={() => setError(true)} + onError={(error) => { + handleError(error) + }} repeat={ - Platform.OS === "ios" ? (looping ? looping : true) : false + looping ?? true } resizeMode={boxFit ? boxFit : defaultStyles.videoStyle.resizeMode} playWhenInactive={false} playInBackground={false} ignoreSilentSwitch="obey" + minLoadRetryCount={5} bufferConfig={{ minBufferMs: 2500, maxBufferMs: 5000, @@ -176,7 +208,7 @@ const LMVideo = React.memo( }, ])} paused={ - isFocused + (isFocused && LMFeedProvider.appState == 'active') ? flowFromCarouselScreen && currentVideoId === postId ? false : flowToCreatePostScreen diff --git a/likeminds-feed-reactnative-integration/components/LMMedia/LMVideo/types.ts b/likeminds-feed-reactnative-integration/components/LMMedia/LMVideo/types.ts index 7072bfac..fd1b40c7 100644 --- a/likeminds-feed-reactnative-integration/components/LMMedia/LMVideo/types.ts +++ b/likeminds-feed-reactnative-integration/components/LMMedia/LMVideo/types.ts @@ -4,8 +4,8 @@ import { LMButtonProps } from "../../../uiComponents"; export interface LMVideoProps { videoUrl: string; // url of the video to be displayed - height: number; // height of the video player - width: number; // width of the video player + height?: number; // height of the video player + width?: number; // width of the video player videoStyle?: ViewStyle; // this represents the style of the video player boxFit?: "stretch" | "contain" | "cover" | "none"; // this represents how the video player should be fitted in its wrapper view boxStyle?: ViewStyle; // this represents the style of the view that contains the video player diff --git a/likeminds-feed-reactnative-integration/components/LMNotificationFeedItem/index.tsx b/likeminds-feed-reactnative-integration/components/LMNotificationFeedItem/index.tsx index af8d383e..548a5c8e 100644 --- a/likeminds-feed-reactnative-integration/components/LMNotificationFeedItem/index.tsx +++ b/likeminds-feed-reactnative-integration/components/LMNotificationFeedItem/index.tsx @@ -16,6 +16,7 @@ import { } from "../../constants/Strings"; import { styles } from "./styles"; import { nameInitials, timeStamp } from "../../utils"; +import { AttachmentType } from "@likeminds.community/feed-rn"; const LMNotificationFeedItem = React.memo( ({ activity, onTap }: LMNotificationFeedItemProps) => { @@ -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 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.attachmentType.toString() === "5") { + if (attachment?.type?.toString() === AttachmentType.CUSTOM) { noOfCustomViewAttachments++; } } @@ -78,6 +79,7 @@ const LMPostComponent = React.memo(() => { return false; } }, [post]); + if (showCustomPostViewWidget) { // TODO Custom Widget // Render the complete custom Post View widget @@ -135,8 +137,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 a7d6215a..8e9055e9 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,10 +59,12 @@ const LMPostMedia = React.memo(() => { }} > { ); } - case VIDEO_ATTACHMENT_TYPE: { + case AttachmentType.VIDEO: { return ( { @@ -89,10 +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 */ @@ -151,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?.attachmentMeta.url ? url?.attachmentMeta.url : ""; + 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; }; @@ -179,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 ) && ( (); 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); @@ -98,7 +99,7 @@ function LMVideoPlayer({ url, setDisableGesture }) { {RNVideo ? ( { @@ -221,8 +222,13 @@ function LMVideoPlayer({ url, setDisableGesture }) { } step={0} value={progress?.currentTime} + onSlidingStart={() => setIsSeeking(true)} + onSlidingComplete={() => setIsSeeking(false)} onValueChange={(x) => { - ref.current.seek(x); + // logic to avoid stuttering issues + if ( x!== 0 && Math.abs(x - progress?.currentTime) >= 1) { + ref.current.seek(x); + } }} thumbTintColor={thumbTintColor ? thumbTintColor : "green"} /> diff --git a/likeminds-feed-reactnative-integration/context/createPostContext.tsx b/likeminds-feed-reactnative-integration/context/createPostContext.tsx index 79d5f814..509c330d 100644 --- a/likeminds-feed-reactnative-integration/context/createPostContext.tsx +++ b/likeminds-feed-reactnative-integration/context/createPostContext.tsx @@ -51,6 +51,7 @@ import { setUploadAttachments, } from "../store/actions/createPost"; import { + AttachmentType, DecodeURLRequest, EditPostRequest, GetPostRequest, @@ -80,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"; @@ -309,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); @@ -363,9 +374,9 @@ export const CreatePostContextProvider = ({ let imageCount = 0; let videoCount = 0; for (const media of selectedImagesVideos) { - if (media.attachmentType === IMAGE_ATTACHMENT_TYPE) { + if (media.type === AttachmentType.IMAGE) { imageCount++; - } else if (media.attachmentType === VIDEO_ATTACHMENT_TYPE) { + } else if (media.type === AttachmentType.VIDEO) { videoCount++; } } @@ -424,7 +435,7 @@ export const CreatePostContextProvider = ({ ...allMedia, ...linkData, ...pollAttachment, - ...[{ attachmentType: 5, attachmentMeta: { meta: metaData } }], + ...[{ type: AttachmentType.CUSTOM, metaData: { widgetMeta: { meta: metaData } } }], ] : [...allMedia, ...linkData, ...pollAttachment]; const post = convertToTemporaryPost( @@ -618,7 +629,7 @@ export const CreatePostContextProvider = ({ const convertedLinkData = await convertLinkMetaData( filteredResponses ); - const link = convertedLinkData[0]?.attachmentMeta?.ogTags?.url; + const link = convertedLinkData[0]?.metaData?.ogTags?.url; setFormattedLinkAttachments(convertedLinkData); if (!closedOnce) { setShowLinkPreview(true); @@ -706,13 +717,13 @@ export const CreatePostContextProvider = ({ const linkPreview: any = []; const pollPreview: any = []; for (const media of postDetail.attachments) { - if (media.attachmentType === IMAGE_ATTACHMENT_TYPE) { + if (media.type === AttachmentType.IMAGE) { imageVideoMedia.push(media); - } else if (media.attachmentType === VIDEO_ATTACHMENT_TYPE) { + } else if (media.type === AttachmentType.VIDEO) { imageVideoMedia.push(media); - } else if (media.attachmentType === DOCUMENT_ATTACHMENT_TYPE) { + } else if (media.type === AttachmentType.DOCUMENT) { documentMedia.push(media); - } else if (media.attachmentType === POLL_ATTACHMENT_TYPE) { + } else if (media.type === AttachmentType.POLL) { pollPreview.push(media); } else { linkPreview.push(media); @@ -737,11 +748,11 @@ export const CreatePostContextProvider = ({ const contentText = mentionToRouteConverter(postContentText); const linkAttachments = showLinkPreview ? formattedLinkAttachments : []; const pollAttachments = convertPollMetaData( - formattedPollAttachments[0]?.attachmentMeta + formattedPollAttachments[0]?.metaData ); // call edit post api - if (formattedPollAttachments[0]?.attachmentMeta) { + if (formattedPollAttachments[0]?.metaData) { const editPostResponse = dispatch( editPost( EditPostRequest.builder() diff --git a/likeminds-feed-reactnative-integration/context/postDetailContext.tsx b/likeminds-feed-reactnative-integration/context/postDetailContext.tsx index 8b09ce03..320b3d0f 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, @@ -92,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, @@ -220,7 +222,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; @@ -328,9 +331,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 +446,7 @@ export const PostDetailContextProvider = ({ postId: id, }; - if(postDetail?.isHidden) { + if (postDetail?.isHidden) { dispatch( showToastMessage({ isToast: true, @@ -452,7 +455,7 @@ export const PostDetailContextProvider = ({ ); return undefined } - + const pinPostResponse = await dispatch( pinPost(PinPostRequest.builder().setPostId(payload.postId).build(), false) ); @@ -489,9 +492,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 +518,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 = ( @@ -637,14 +640,16 @@ export const PostDetailContextProvider = ({ return getPostResponse; }; + // this function calls the getComments api const getCommentsReplies = async ( postId: string, commentId: string, repliesResponseCallback: any, - pageNo: number + pageNo: number, + haveFirstPageReplies?: boolean ) => { - const commentsRepliesResponse = await dispatch( + const commentsRepliesResponse: GetCommentDetails = await dispatch( getComments( GetCommentRequest.builder() .setPostId(postId) @@ -654,13 +659,24 @@ export const PostDetailContextProvider = ({ .build(), false ) - ); - // sets the api response in the callback function - repliesResponseCallback( - postDetail?.replies && - commentResponseModelConvertor(commentsRepliesResponse)?.replies - ); - setRepliesArrayUnderComments((previousResponse) => [commentsRepliesResponse,...previousResponse]) + ) as any; + + dispatch({ + type: APPEND_REPLIES_TO_COMMENT, + body: { + parentCommentId: commentId, + replies: commentResponseModelConvertor(commentsRepliesResponse)?.replies, + haveFirstPageReplies + } + }) + + let hasPaginationEnded = false; + if ((commentsRepliesResponse?.comment)?.replies?.length == 0) { + hasPaginationEnded = true; + } + + repliesResponseCallback && repliesResponseCallback([], hasPaginationEnded) + return commentsRepliesResponse; }; @@ -833,7 +849,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/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 6e68f98a..ef9414d7 100644 --- a/likeminds-feed-reactnative-integration/context/universalFeedContext.tsx +++ b/likeminds-feed-reactnative-integration/context/universalFeedContext.tsx @@ -19,6 +19,7 @@ import { GetPersonalisedFeedRequest, Post, PostSeenRequest, + AttachmentType } from "@likeminds.community/feed-rn"; import { autoPlayPostVideo, @@ -63,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, @@ -72,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; @@ -94,7 +97,7 @@ export interface UniversalFeedContextValues { showCreatePost: boolean; refreshing: boolean; localRefresh: boolean; - listRef: MutableRefObject | null>; + listRef: MutableRefObject | null>; mediaAttachmemnts: []; linkAttachments: []; postContent: string; @@ -181,13 +184,13 @@ export const UniversalFeedContextProvider = ({ const unreadNotificationCount = useAppSelector( (state) => 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); const [uploadProgress, setUploadProgress] = useState(0); - const listRef = useRef>(null); + const listRef = useRef>(null); const route = useRoute(); const params = route.params as { feedType?: FeedType; @@ -285,11 +288,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 +305,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 +328,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 +355,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 }); } @@ -395,6 +398,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, @@ -403,6 +412,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, @@ -438,20 +452,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 +475,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 +502,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 +536,7 @@ export const UniversalFeedContextProvider = ({ ...updatedAttachments, ...linkAttachments, ...pollAttachment, - ...[{ attachmentType: 5, attachmentMeta: { meta: metaData } }], + ...[{ type: AttachmentType.CUSTOM, metaData: { widgetMeta: { meta: metaData } } }], ] : [...updatedAttachments, ...linkAttachments, ...pollAttachment]; const addPostResponse: any = await dispatch( @@ -551,6 +565,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, @@ -559,6 +579,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, @@ -626,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]); @@ -667,7 +699,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 +755,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 +869,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/customModals/DeleteModal/index.tsx b/likeminds-feed-reactnative-integration/customModals/DeleteModal/index.tsx index 81d74ab3..4e7c3743 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 { @@ -61,7 +62,9 @@ interface DeleteModalProps { RootStackParamList, "PostDetail" | "UniversalFeed" | "PostsList" >; - repliesArrayUnderComments?: any + repliesArrayUnderComments?: React.Dispatch; + setRepliesArrayUnderComments?: React.Dispatch; + commentOnFocus?: LMCommentViewData; } const DeleteModal = ({ @@ -73,7 +76,8 @@ const DeleteModal = ({ commentDetail, parentCommentId, navigation, - repliesArrayUnderComments + repliesArrayUnderComments, + commentOnFocus }: DeleteModalProps) => { const dispatch = useAppDispatch(); const loggedInUser = useAppSelector((state) => state.login.member); @@ -81,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) { @@ -93,7 +98,6 @@ const DeleteModal = ({ postId: postDetail?.id, }; displayModal(false); - dispatch(deletePostStateHandler(payload.postId)); const deletePostPayload = DeletePostRequest.builder() .setDeleteReason(payload.deleteReason) .setPostId(payload.postId) @@ -103,6 +107,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([ @@ -148,16 +158,18 @@ 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 : "", - replyObject + replyObject, + commentLevel: commentOnFocus?.level }; displayModal(false); @@ -216,6 +228,7 @@ const DeleteModal = ({ setDeletionReason(val); }; + // this show the toast message over the modal const showToast = () => { Toast.show({ @@ -284,14 +297,14 @@ 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 */} {loggedInUser.userUniqueId !== postDetail?.uuid && - loggedInUser.userUniqueId !== commentDetail?.userId && ( + loggedInUser.userUniqueId !== commentDetail?.uuid && ( { 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 997b6815..f5fd35c8 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-rn" // 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 post for report tags for posts }; 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/lmFeedProvider/index.tsx b/likeminds-feed-reactnative-integration/lmFeedProvider/index.tsx index 9b041237..b155a82d 100644 --- a/likeminds-feed-reactnative-integration/lmFeedProvider/index.tsx +++ b/likeminds-feed-reactnative-integration/lmFeedProvider/index.tsx @@ -6,7 +6,7 @@ import React, { useEffect, } from "react"; import STYLES from "../constants/Styles"; -import { StyleSheet, View } from "react-native"; +import { StyleSheet, View, AppState, AppStateStatus } from "react-native"; import { Credentials } from "../credentials"; import { InitiateUserRequest, @@ -53,6 +53,7 @@ interface LMFeedContextProps { ) => 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/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/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: {} }, }; } } 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", diff --git a/likeminds-feed-reactnative-integration/package.json b/likeminds-feed-reactnative-integration/package.json index 72cef49e..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", @@ -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": { diff --git a/likeminds-feed-reactnative-integration/screens/carouselScreen/index.tsx b/likeminds-feed-reactnative-integration/screens/carouselScreen/index.tsx index df3ced57..7753dd10 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-rn"; 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} diff --git a/likeminds-feed-reactnative-integration/screens/postDetail/index.tsx b/likeminds-feed-reactnative-integration/screens/postDetail/index.tsx index 4f06e76f..6adcd48e 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; @@ -275,7 +276,8 @@ const PostDetailComponent = React.memo(() => { ); const memberData = useAppSelector((state) => state.login.member); const isCM = memberData?.state === STATE_ADMIN; - const { repliesArrayUnderComments } = usePostDetailContext(); + 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 ( @@ -551,7 +553,6 @@ const PostDetailComponent = React.memo(() => { repliesResponseCallback, commentIdOfReplies ) => { - dispatch(clearComments(item?.id)); setShowRepliesOfCommentId(commentIdOfReplies); getCommentsRepliesProp ? getCommentsRepliesProp( @@ -572,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(); @@ -1141,11 +1144,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/screens/postsList/index.tsx b/likeminds-feed-reactnative-integration/screens/postsList/index.tsx index bd084db8..d219f972 100644 --- a/likeminds-feed-reactnative-integration/screens/postsList/index.tsx +++ b/likeminds-feed-reactnative-integration/screens/postsList/index.tsx @@ -1,6 +1,5 @@ -import React, { useCallback, useEffect, useRef } from "react"; +import React, { useCallback, useEffect, useMemo, useRef } from "react"; import { - FlatList, Platform, RefreshControl, Text, @@ -56,6 +55,8 @@ 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"; +import Layout from "../../constants/Layout"; const PostsList = ({ route, @@ -170,21 +171,21 @@ const PostsListComponent = ({ if (Platform.OS == "ios") { setTimeout(() => { 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 @@ -308,7 +309,7 @@ const PostsListComponent = ({ /> {!postListStyle.shouldHideSeparator && - index != feedData.length - 1 ? ( + index != feedData.length - 1 ? ( { + if (!viewableItems) return if (feedType === FeedType.PERSONALISED_FEED) { if (!hasFetched.current) { const visiblePostIds = viewableItems.map((item) => item.item.id); @@ -374,6 +376,29 @@ const PostsListComponent = ({ debounce(onMomentumScrollEnd, 5000)({ nativeEvent }); }; + const getMaxHeightOfAttachments = (post: LMPostViewData) => { + if (!post?.attachments?.length) return 350; + + const screenWidth = Layout.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 : 450 + }; + return ( {!feedFetching ? ( feedData?.length > 0 ? ( - { + const val = getMaxHeightOfAttachments(item) + 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={ } data={feedData} + extraData={[]} renderItem={renderItem} onEndReachedThreshold={0.3} onEndReached={handleLoadMore} @@ -408,10 +457,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..b08701d7 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, 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,8 @@ 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'; +import Layout from '../../constants/Layout'; interface SearchFeedProps { children?: React.ReactNode; @@ -200,6 +202,7 @@ const LMFeedSearchScreenComponent = ({ hideTopicsView, } = useSearchFeedCustomisableMethodsContext(); + // 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 && ( - + 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/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 diff --git a/likeminds-feed-reactnative-integration/store/reducers/postDetailReducer.ts b/likeminds-feed-reactnative-integration/store/reducers/postDetailReducer.ts index d9705cc9..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"; @@ -143,38 +144,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 +313,32 @@ export const postDetailReducer = (state = initialState, action) => { }); return { ...state, postDetail: updatedPostDetail }; } + 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; + if (!haveFirstPageReplies) { + // 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]) + ).values() + ]; + } else { + 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,15 +381,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 } = 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 deletedCommentIndex = updatedPostDetail?.replies && updatedPostDetail.replies.findIndex( 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"; 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; }; diff --git a/likeminds-feed-reactnative-integration/viewDataModels/index.ts b/likeminds-feed-reactnative-integration/viewDataModels/index.ts index 2267ea40..83b1e57e 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,16 @@ 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), }; return attachmentMetaData; @@ -208,6 +210,7 @@ export function convertToLMPollViewData( multipleSelectState: item?.metadata?.multipleSelectState, isAnonymous: item?.metadata?.isAnonymous, pollType: item?.metadata?.pollType, + widgetMeta: item?.metadata }; return pollMetaData; } @@ -320,8 +323,9 @@ export function convertImageVideoMetaData( data: ImageVideoMetaData[] ): LMAttachmentViewData[] { const convertedImageVideoMetaData = data?.map((item) => { + console.log(item) return { - attachmentMeta: { + metaData: { entityId: "", format: item?.type, name: item?.fileName, @@ -335,10 +339,12 @@ 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 - : 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; @@ -353,7 +359,7 @@ export function convertDocumentMetaData( ): LMAttachmentViewData[] { const convertedDocumentMetaData = data?.map((item: any) => { return { - attachmentMeta: { + metaData: { entityId: "", format: item?.type ?? item?.mimeType, name: item?.name, @@ -368,7 +374,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; @@ -383,7 +389,7 @@ export function convertLinkMetaData( ): LMAttachmentViewData[] { const convertedLinkMetaData = data?.map((item) => { return { - attachmentMeta: { + metaData: { entityId: "", format: "", name: "", @@ -396,9 +402,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; @@ -421,7 +427,7 @@ export function convertPollOptionsMetaData( */ export function convertPollMetaData(item: any): LMAttachmentViewData { return { - attachmentMeta: { + metaData: { entityId: item?.id ? item?.id : "", format: "", name: "", @@ -446,7 +452,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. }; } @@ -572,7 +578,6 @@ export function convertToTemporaryPost( tempId: `-${Date.now()}`, attachments: attachment, commentsCount: 0, - communityId: 0, createdAt: Date.now(), heading: heading, isEdited: false, @@ -584,7 +589,6 @@ export function convertToTemporaryPost( text: text, topics: topics, updatedAt: 0, - userId: "", uuid: "", isRepost: false, repostCount: 0, 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/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 = () => {