Merge pull request #55 from atridadl/dev

3.1.4
 Optimistic vote updates
This commit is contained in:
Atridad Lahiji 2023-10-08 13:28:43 -06:00 committed by GitHub
commit d99758a21a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 32 additions and 11 deletions

View file

@ -4,6 +4,8 @@ import { EventTypes } from "@/_utils/types";
import Image from "next/image"; import Image from "next/image";
import { useEffect, useState } from "react"; import { useEffect, useState } from "react";
import { experimental_useOptimistic } from "react";
import LoadingIndicator from "@/_components/LoadingIndicator"; import LoadingIndicator from "@/_components/LoadingIndicator";
import type { PresenceItem, RoomResponse, VoteResponse } from "@/_utils/types"; import type { PresenceItem, RoomResponse, VoteResponse } from "@/_utils/types";
import { useUser } from "@clerk/nextjs"; import { useUser } from "@clerk/nextjs";
@ -36,9 +38,11 @@ const VoteUI = () => {
const [copied, setCopied] = useState<boolean>(false); const [copied, setCopied] = useState<boolean>(false);
const [roomFromDb, setRoomFromDb] = useState<RoomResponse>(); const [roomFromDb, setRoomFromDb] = useState<RoomResponse>();
const [votesFromDb, setVotesFromDb] = useState<VoteResponse>(undefined); const [votesFromDb, setVotesFromDb] = useState<VoteResponse>(undefined);
const [optimisticVotes, setOptimisticVotes] =
experimental_useOptimistic(votesFromDb);
const getRoomHandler = () => { const getRoomHandler = () => {
fetch(`/api/internal/room/${roomId}`, { fetch(`/api/internal/room/${roomId}`, {
cache: "no-cache", cache: "no-cache",
@ -102,7 +106,8 @@ const VoteUI = () => {
const getVoteForCurrentUser = () => { const getVoteForCurrentUser = () => {
if (roomFromDb) { if (roomFromDb) {
return ( return (
votesFromDb && votesFromDb.find((vote) => vote.userId === user?.id) optimisticVotes &&
optimisticVotes.find((vote) => vote.userId === user?.id)
); );
} else { } else {
return null; return null;
@ -110,6 +115,19 @@ const VoteUI = () => {
}; };
const setVoteHandler = async (value: string) => { const setVoteHandler = async (value: string) => {
const newVotes = optimisticVotes?.map((vote) => {
if (vote.userId === user?.id) {
return {
...vote,
value,
};
} else {
return vote;
}
});
setOptimisticVotes(newVotes);
if (roomFromDb) { if (roomFromDb) {
await fetch(`/api/internal/room/${roomId}/vote`, { await fetch(`/api/internal/room/${roomId}/vote`, {
cache: "no-cache", cache: "no-cache",
@ -142,7 +160,7 @@ const VoteUI = () => {
}; };
const downloadLogs = () => { const downloadLogs = () => {
if (roomFromDb && votesFromDb) { if (roomFromDb && optimisticVotes) {
const jsonObject = roomFromDb?.logs const jsonObject = roomFromDb?.logs
.map((item) => { .map((item) => {
return { return {
@ -164,7 +182,7 @@ const VoteUI = () => {
roomName: roomFromDb.roomName, roomName: roomFromDb.roomName,
storyName: storyNameText, storyName: storyNameText,
scale: roomScale, scale: roomScale,
votes: votesFromDb.map((vote) => { votes: optimisticVotes.map((vote) => {
return { return {
value: vote.value, value: vote.value,
}; };
@ -301,10 +319,10 @@ const VoteUI = () => {
</p> </p>
{roomFromDb && {roomFromDb &&
votesFromDb && optimisticVotes &&
voteString( voteString(
roomFromDb.visible, roomFromDb.visible,
votesFromDb, optimisticVotes,
presenceItem.data presenceItem.data
)} )}
</li> </li>
@ -395,7 +413,7 @@ const VoteUI = () => {
false, false,
true, true,
roomFromDb.storyName === storyNameText || roomFromDb.storyName === storyNameText ||
votesFromDb?.length === 0 optimisticVotes?.length === 0
? false ? false
: true : true
) )
@ -408,7 +426,7 @@ const VoteUI = () => {
} }
> >
{roomFromDb.storyName === storyNameText || {roomFromDb.storyName === storyNameText ||
votesFromDb?.length === 0 ? ( optimisticVotes?.length === 0 ? (
<> <>
<IoReloadOutline className="text-xl mr-1" /> Reset <IoReloadOutline className="text-xl mr-1" /> Reset
</> </>
@ -420,9 +438,9 @@ const VoteUI = () => {
</button> </button>
</div> </div>
{votesFromDb && {optimisticVotes &&
(roomFromDb.logs.length > 0 || (roomFromDb.logs.length > 0 ||
votesFromDb.length > 0) && ( optimisticVotes.length > 0) && (
<div> <div>
<button <button
onClick={() => downloadLogs()} onClick={() => downloadLogs()}

View file

@ -15,6 +15,9 @@ const config = {
"img.clerk.com", "img.clerk.com",
], ],
}, },
experimental: {
serverActions: true,
},
}; };
export default config; export default config;

View file

@ -1,6 +1,6 @@
{ {
"name": "sprintpadawan", "name": "sprintpadawan",
"version": "3.1.3", "version": "3.1.4",
"description": "Plan. Sprint. Repeat.", "description": "Plan. Sprint. Repeat.",
"private": true, "private": true,
"scripts": { "scripts": {