SyntaxGameServer/RCCService2021/ExtraContent/LuaPackages/AppTempCommon/LuaApp/Utils/ApiFetchThumbnails.lua

73 lines
2.2 KiB
Lua

local CorePackages = game:GetService("CorePackages")
local Cryo = require(CorePackages.Cryo)
local ArgCheck = require(CorePackages.ArgCheck)
local PromiseUtilities = require(CorePackages.AppTempCommon.LuaApp.PromiseUtilities)
local FetchSubdividedThumbnails = require(script.Parent.FetchSubdividedThumbnails)
local PerformFetch = require(CorePackages.AppTempCommon.LuaApp.Thunks.Networking.Util.PerformFetch)
local ICON_PAGE_COUNT = 100
local ICON_SIZE = "150x150"
local function convertToId(value)
return tostring(value)
end
local ApiFetchThumbnails = {}
local keyMapper = function (request)
local targetId = request.targetId
local size = request.iconSize and "."..request.iconSize or ""
local requestName = request.requestName and "."..request.requestName or ""
return "luaapp.thumbnails." .. convertToId(targetId)..size..requestName
end
ApiFetchThumbnails.KeyMapper = keyMapper
local function subdivideIdsArray(requests, limit)
local someTokens = {}
for i = 1, #requests, limit do
local subArray = Cryo.List.getRange(requests, i, i + limit - 1)
table.insert(someTokens, subArray)
end
return someTokens
end
function ApiFetchThumbnails.Fetch(networkImpl, targetIds, imageSize, requestName, fetchFunction, storeDispatch, store)
local size = imageSize or ICON_SIZE
ArgCheck.isType(targetIds, "table", "targetIds")
ArgCheck.isType(requestName, "string", "requestName")
ArgCheck.isNonNegativeNumber(#targetIds, "targetIds count")
local requests = {}
local promises = {}
-- Filter out the icons that are already in the store.
for _, targetId in pairs(targetIds) do
table.insert(requests, {
targetId = targetId,
iconSize = size,
})
end
local subdividedRequestsArray = subdivideIdsArray(requests, ICON_PAGE_COUNT)
for _, subdividedRequests in ipairs(subdividedRequestsArray) do
table.insert(
promises,
store:dispatch(FetchSubdividedThumbnails.Fetch(
networkImpl,
subdividedRequests,
keyMapper,
requestName,
fetchFunction,
storeDispatch
))
)
end
return PromiseUtilities.Batch(promises)
end
function ApiFetchThumbnails.GetFetchingStatus(state, targetId, iconSize, requestName)
return PerformFetch.GetStatus(state, keyMapper({targetId = targetId, requestName = requestName, iconSize = iconSize}))
end
return ApiFetchThumbnails