local CorePackages = game:GetService("CorePackages") local Requests = CorePackages.AppTempCommon.LuaApp.Http.Requests local Promise = require(CorePackages.AppTempCommon.LuaApp.Promise) local ApiFetchUsersPresences = require(CorePackages.AppTempCommon.LuaApp.Thunks.ApiFetchUsersPresences) local ApiFetchUsersThumbnail = require(CorePackages.AppTempCommon.LuaApp.Thunks.ApiFetchUsersThumbnail) local UsersGetFriends = require(Requests.UsersGetFriends) local FetchUserFriendsStarted = require(CorePackages.AppTempCommon.LuaApp.Actions.FetchUserFriendsStarted) local FetchUserFriendsFailed = require(CorePackages.AppTempCommon.LuaApp.Actions.FetchUserFriendsFailed) local FetchUserFriendsCompleted = require(CorePackages.AppTempCommon.LuaApp.Actions.FetchUserFriendsCompleted) local UserModel = require(CorePackages.AppTempCommon.LuaApp.Models.User) local UpdateUsers = require(CorePackages.AppTempCommon.LuaApp.Thunks.UpdateUsers) return function(requestImpl, userId, thumbnailRequest, checkPoints) return function(store) store:dispatch(FetchUserFriendsStarted(userId)) if checkPoints ~= nil and checkPoints.startFetchUserFriends ~= nil then checkPoints:startFetchUserFriends() end local fetchedUserIds = {} return UsersGetFriends(requestImpl, userId):andThen(function(response) local responseBody = response.responseBody local newUsers = {} for _, userData in pairs(responseBody.data) do local id = tostring(userData.id) userData.isFriend = true local newUser = UserModel.fromDataTable(userData) table.insert(fetchedUserIds, id) newUsers[newUser.id] = newUser end store:dispatch(UpdateUsers(newUsers)) if checkPoints ~= nil and checkPoints.finishFetchUserFriends ~= nil then checkPoints:finishFetchUserFriends() end return fetchedUserIds end):andThen(function(userIds) if checkPoints ~= nil and checkPoints.startFetchUsersPresences ~= nil then checkPoints:startFetchUsersPresences() end -- Asynchronously fetch friend thumbnails so we don't block display of UI store:dispatch(ApiFetchUsersThumbnail.Fetch(requestImpl, userIds, thumbnailRequest)) return store:dispatch(ApiFetchUsersPresences(requestImpl, userIds)) end):andThen( function(result) store:dispatch(FetchUserFriendsCompleted(userId)) if checkPoints ~= nil and checkPoints.finishFetchUsersPresences ~= nil then checkPoints:finishFetchUsersPresences() end return Promise.resolve(fetchedUserIds) end, function(response) store:dispatch(FetchUserFriendsFailed(userId, response)) return Promise.reject(response) end ) end end