Proper architecture for updating a UI in a lobby system

Well, the Network Compendium doesn’t actually state the use of AGameInstance anywhere. My guess is that it has nothing to do with networking, and only exists client-side.
It would probably be something I’d use to persist data during a server travel, I guess? But not so much a place to store Player/UI data?

AGameMode only exists server-side, so clients can’t access it directly.
AGameState exists on both client and server, but I’ve had trouble accessing it from clients.
APlayerState is replicated to all clients, and each APlayerController owns one, but (AFAIK) you can’t access the UI from APlayerState

So if I made a struct like this:



USTRUCT(BlueprintType)
struct FLobbyPlayerInfo
{
	GENERATED_BODY()

public:
	UPROPERTY(BlueprintReadWrite)
	FString PlayerName;
	UPROPERTY(BlueprintReadWrite)
	FUniqueNetIdRepl PlayerId;
	UPROPERTY(BlueprintReadWrite)
	bool PlayerReady;
	UPROPERTY(BlueprintReadWrite)
	UTexture2D *PlayerAvatar;
};


Where could I store an array of these, where the server has authority over them BUT ALSO clients can request changes to them from their UIs?