Rozwiązań może być kilka, zależy od aplikacji. Jeśli dysponujesz back-endem i bazą danych z użytkownikami to możesz po prostu zapisywać takie informacje w bazie i przy "lajkowaniu" sprawdzać, czy user już tego nie zlajkował, albo z drugiej strony, najpierw ukryć ikonę "lajkowania" i aktywować dopiero gdy asynchronicznie sprawdzisz możliwość dla tego usera.
Ewentualnie, jeśli nie dysponujesz bazą i back-endem to możesz to zrobić w oparciu o cache lokalne np. localStorage, IndexedDB, ewentualnie cookies, ale to zwodnicze, ponieważ user może te dane sam wyczyścić.
W pierwszym wypadku musisz sobie odpowiedzieć na pytanie jakie podejście wybierasz:
- na starcie wyłączasz głosowanie -> leci request do bazy -> gdy przyjdzie odpowiedź pozytywna to włączasz możliwosć głosowania
- na starcie włączasz głosowanie -> leci request do bazy -> gdy przyjdzie odp. negatywna to wyłączasz, tylko w tej sytuacji musimy rozważyć sytuację gdy user zagłosuje zanim nadejdzie odp. z API. Można tu zastosować optimistic pattern i np. po prostu anulować w razie czego ten głos + ewentualnie jakieś powiadomienie dla usera jeśli jest to coś istotnego.
Wszystko zależy co to za dane, jak ważne, jak chcesz podejść do UX itp. itd. Daj więcej informacji to dobierzemy jakiś optymalny wzorzec do konkretnego przypadku.