diff --git a/src/components/carousel/VerticalEcosystemCarousel.tsx b/src/components/carousel/VerticalEcosystemCarousel.tsx index 8a844be35e1e0a4ad0e5c5ddda5ef741288609fa..b5343f2f72bf857162a74db59742635a38816cc0 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 dfbeff7d067fdfb62204048e53bdb98fbd9c4838..63bf4c0ebc6798dca777f18d9b57e92c9054306d 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 aa03c2f003fbaac4c9fe070713b846d3641ba187..862eef41b1ba4a3bc6bb65172a7846981878ebca 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 2235ed2acefbd6e73da4d7d642914b43454d0099..fec57882ec3290dd908b90b6b12f629a5d0095f5 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 1a372635f4ddb57abcfd833e925d8a587b8eba5a..f319a82032ef130c211cfc4bbdd2354e1c64860e 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 fef8cb8fb3ee55019a9f369c1fda48f1e849369a..75ad5f578f7be753348c3722d3e2937859ee79ca 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 9ce8ddcc6b5b51a8a81e6ff826591f59a5558424..502043ac6a7bf727afd375cf712ad0841948fadb 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;