From 1fc827dc22f9e8bcf6e9ceaa92915c394910e13f Mon Sep 17 00:00:00 2001 From: Ahmad Izzudin Alifyandra Date: Mon, 13 Dec 2021 00:53:10 +0700 Subject: [PATCH] fix: update details, rating, and indicator for update --- .../carousel/VerticalEcosystemCarousel.tsx | 1 + .../ecosystem/CategoryEcosystemListScreen.tsx | 2 + .../ecosystem/EcosystemDetailScreen.tsx | 42 +++++++++++- src/screens/ecosystem/EcosystemSearch.tsx | 2 + .../ecosystem/RecommendedEcosystemScreen.tsx | 2 + .../updateEcosystem/UpdateEcosystemScreen.tsx | 67 +++++++++++++------ src/types/navigation/EcosystemStack.ts | 1 + 7 files changed, 95 insertions(+), 22 deletions(-) diff --git a/src/components/carousel/VerticalEcosystemCarousel.tsx b/src/components/carousel/VerticalEcosystemCarousel.tsx index 8a844be..b5343f2 100644 --- a/src/components/carousel/VerticalEcosystemCarousel.tsx +++ b/src/components/carousel/VerticalEcosystemCarousel.tsx @@ -40,6 +40,7 @@ const VerticalEcosystemCarousel = ({ list }: props) => { rating: item.rating.toString(), creatorId: item.creatorId, categoryId: item.categoryId, + raterCount: item.raters, }, }); }} diff --git a/src/screens/ecosystem/CategoryEcosystemListScreen.tsx b/src/screens/ecosystem/CategoryEcosystemListScreen.tsx index dfbeff7..63bf4c0 100644 --- a/src/screens/ecosystem/CategoryEcosystemListScreen.tsx +++ b/src/screens/ecosystem/CategoryEcosystemListScreen.tsx @@ -111,6 +111,8 @@ const CategoryEcosystemListScreen = ({ member: item.followerCount.toString(), rating: item.rating.toString(), creatorId: item.creatorId, + raterCount: item.raters, + categoryId: item.categoryId, }, }) } diff --git a/src/screens/ecosystem/EcosystemDetailScreen.tsx b/src/screens/ecosystem/EcosystemDetailScreen.tsx index aa03c2f..862eef4 100644 --- a/src/screens/ecosystem/EcosystemDetailScreen.tsx +++ b/src/screens/ecosystem/EcosystemDetailScreen.tsx @@ -31,13 +31,24 @@ import ForumPost from "../../components/ForumPost/ForumPost"; const EcosystemDetailScreen = ({ route, }: EcosystemStackScreenProps<"EcosystemDetails">) => { - const { id, title, desc, image, member, rating, creatorId } = route.params; + const { + id, + title, + desc, + image, + member, + rating: _rating, + creatorId, + raterCount, + } = route.params; const nav = useNavigation(); const user = useUser(); const [isInEcosystem, setIsInEcosystem] = useState(false); const [isFetched, setIsFetched] = useState(false); const [isRating, setIsRating] = useState(false); + const [oldRating, setOldRating] = useState(0); const [currentRating, setCurrentRating] = useState(0); + const [rating, setRating] = useState(_rating); const [forumPosts, setForumPosts] = useState([]); useEffect(() => { @@ -47,10 +58,31 @@ const EcosystemDetailScreen = ({ setIsFetched(true); }); fetchPostsByEcosystemId(id).then((res) => setForumPosts(res)); - getEcosystemRating(id, user.id).then((res) => setCurrentRating(res)); + getEcosystemRating(id, user.id).then((res) => { + setOldRating(res); + setCurrentRating(res); + }); }); }, [id, user.id, nav]); + const updateLocalRating = ( + rating: number, + oldUserRating: number, + newUserRating: number, + raterCount: number + ) => { + if (oldUserRating != 0) { + const newRating = + (rating * raterCount + (newUserRating - oldUserRating)) / raterCount; + setRating(newRating.toString()); + setOldRating(newRating); + } else { + const newRating = (rating * raterCount + newUserRating) / raterCount + 1; + setRating(newRating.toString()); + setOldRating(newRating); + } + }; + const alertFollow = () => { Alert.alert("Joined Ecosystem", "You have joined the ecosystem"); inEcosystem(id, user.id).then((res) => setIsInEcosystem(res)); @@ -211,6 +243,12 @@ const EcosystemDetailScreen = ({ setIsRating={setIsRating} onSubmit={async () => { await rateEcosystem(id, user.id, currentRating); + updateLocalRating( + parseInt(rating), + oldRating, + currentRating, + raterCount + ); }} /> )} diff --git a/src/screens/ecosystem/EcosystemSearch.tsx b/src/screens/ecosystem/EcosystemSearch.tsx index 2235ed2..fec5788 100644 --- a/src/screens/ecosystem/EcosystemSearch.tsx +++ b/src/screens/ecosystem/EcosystemSearch.tsx @@ -105,6 +105,8 @@ const EcosystemSearch = ({ route }: EcosystemStackScreenProps<"Search">) => { member: item.followerCount.toString(), rating: item.rating.toString(), creatorId: item.creatorId, + raterCount: item.raters, + categoryId: item.categoryId, }, }); }} diff --git a/src/screens/ecosystem/RecommendedEcosystemScreen.tsx b/src/screens/ecosystem/RecommendedEcosystemScreen.tsx index 1a37263..f319a82 100644 --- a/src/screens/ecosystem/RecommendedEcosystemScreen.tsx +++ b/src/screens/ecosystem/RecommendedEcosystemScreen.tsx @@ -102,6 +102,8 @@ const RecommendedEcosystemScreen = ({ member: item.followerCount.toString(), rating: item.rating.toString(), creatorId: item.creatorId, + categoryId: item.categoryId, + raterCount: item.raters, }, }); }} diff --git a/src/screens/updateEcosystem/UpdateEcosystemScreen.tsx b/src/screens/updateEcosystem/UpdateEcosystemScreen.tsx index fef8cb8..75ad5f5 100644 --- a/src/screens/updateEcosystem/UpdateEcosystemScreen.tsx +++ b/src/screens/updateEcosystem/UpdateEcosystemScreen.tsx @@ -39,6 +39,7 @@ const UpdateEcosystemScreen = ({ const [items, setItems] = useState(getCategoriesAsDdFormat(categories)); const [pic, setPic] = useState(undefined); const [isUploadingImg, setIsUploadingImg] = useState(false); + const [isUpdating, setIsUpdating] = useState(false); useEffect(() => { getEcosystem(id).then((res) => { @@ -222,26 +223,52 @@ const UpdateEcosystemScreen = ({ /> - { - errorHandling() && - updateEcosystem({ - ecosystem: { - categoryId: ecosystemCategory, - description: ecosystemDetails, - name: ecosystemName, - pic, - id, - }, - members: ecosystem.members, - }).then(() => { - nav.goBack(); - dispatch(resetEcosystem()); - }); - }} - /> + + {!isUpdating ? ( + { + setIsUpdating(true); + errorHandling() && + updateEcosystem({ + ecosystem: { + categoryId: ecosystemCategory, + description: ecosystemDetails, + name: ecosystemName, + pic, + id, + }, + members: ecosystem.members, + }) + .then(() => { + setIsUpdating(false); + nav.navigate("Ecosystem", { + screen: "EcosystemDetails", + params: { + categoryId: ecosystemCategory, + creatorId: ecosystem.ecosystem.creatorId, + desc: ecosystemDetails, + headerTitle: ecosystemName, + id: ecosystem.ecosystem.id, + image: pic, + member: ecosystem.ecosystem.followerCount.toString(), + rating: ecosystem.ecosystem.rating.toString(), + title: ecosystemName, + raterCount: ecosystem.ecosystem.raters, + }, + }); + dispatch(resetEcosystem()); + }) + .catch((err) => { + console.log(err); + setIsUpdating(false); + }); + }} + /> + ) : ( + + )} ); }; diff --git a/src/types/navigation/EcosystemStack.ts b/src/types/navigation/EcosystemStack.ts index 9ce8ddc..502043a 100644 --- a/src/types/navigation/EcosystemStack.ts +++ b/src/types/navigation/EcosystemStack.ts @@ -25,6 +25,7 @@ export type EcosystemStackParamList = { rating: string; creatorId: string; categoryId: string; + raterCount: number; }; UserList: { headerTitle?: string; -- GitLab