Skip to content

Commit feab435

Browse files
committed
Fix rendering poll
1 parent 108d933 commit feab435

File tree

2 files changed

+47
-19
lines changed

2 files changed

+47
-19
lines changed

src/ui/components/NameOptionalCard/index.tsx

Lines changed: 45 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ interface UserResolverContextType {
3333
requestUser: (email: string) => void;
3434
isResolving: (email: string) => boolean;
3535
resolutionDisabled: boolean;
36+
cacheVersion: number;
3637
}
3738

3839
// Context
@@ -57,6 +58,7 @@ export function UserResolverProvider({
5758
const [userCache, setUserCache] = useState<
5859
Record<string, string | typeof NO_NAME_FOUND>
5960
>({});
61+
const [cacheVersion, setCacheVersion] = useState(0);
6062
const pendingRequests = useRef<Set<string>>(new Set());
6163
const batchTimeout = useRef<NodeJS.Timeout | null>(null);
6264

@@ -94,21 +96,30 @@ export function UserResolverProvider({
9496

9597
try {
9698
const results = await fetchUsers(emailsToFetch);
97-
setUserCache((prev) => ({ ...prev, ...results }));
99+
setUserCache((prev) => {
100+
setCacheVersion((v) => v + 1);
101+
return { ...prev, ...results };
102+
});
98103
} catch (error) {
99104
console.error("Failed to fetch users:", error);
100105
const failedCache: Record<string, typeof NO_NAME_FOUND> = {};
101106
emailsToFetch.forEach((email) => {
102107
failedCache[email] = NO_NAME_FOUND;
103108
});
104-
setUserCache((prev) => ({ ...prev, ...failedCache }));
109+
setUserCache((prev) => {
110+
setCacheVersion((v) => v + 1);
111+
return { ...prev, ...failedCache };
112+
});
105113
}
106114
};
107115

108116
const requestUser = (email: string) => {
109117
// If resolution is disabled, mark as NO_NAME_FOUND immediately
110118
if (resolutionDisabled) {
111-
setUserCache((prev) => ({ ...prev, [email]: NO_NAME_FOUND }));
119+
setUserCache((prev) => {
120+
setCacheVersion((v) => v + 1);
121+
return { ...prev, [email]: NO_NAME_FOUND };
122+
});
112123
return;
113124
}
114125

@@ -119,7 +130,10 @@ export function UserResolverProvider({
119130

120131
// Validate email format - if invalid, mark as NO_NAME_FOUND immediately
121132
if (!EMAIL_REGEX.test(email)) {
122-
setUserCache((prev) => ({ ...prev, [email]: NO_NAME_FOUND }));
133+
setUserCache((prev) => {
134+
setCacheVersion((v) => v + 1);
135+
return { ...prev, [email]: NO_NAME_FOUND };
136+
});
123137
return;
124138
}
125139

@@ -149,12 +163,19 @@ export function UserResolverProvider({
149163

150164
return (
151165
<UserResolverContext.Provider
152-
value={{ resolveUser, requestUser, isResolving, resolutionDisabled }}
166+
value={{
167+
resolveUser,
168+
requestUser,
169+
isResolving,
170+
resolutionDisabled,
171+
cacheVersion,
172+
}}
153173
>
154174
{children}
155175
</UserResolverContext.Provider>
156176
);
157177
}
178+
158179
// Hook
159180
function useUserResolver() {
160181
const context = useContext(UserResolverContext);
@@ -179,9 +200,21 @@ export function NameOptionalUserCard({
179200
email,
180201
size = "sm",
181202
fallback,
203+
resolutionDisabled: resolutionDisabledProp,
182204
}: NameOptionalUserCardProps) {
183-
const { resolveUser, requestUser, isResolving, resolutionDisabled } =
184-
useUserResolver();
205+
const {
206+
resolveUser,
207+
requestUser,
208+
isResolving,
209+
resolutionDisabled: contextResolutionDisabled,
210+
cacheVersion,
211+
} = useUserResolver();
212+
213+
const resolutionDisabled =
214+
typeof resolutionDisabledProp === "boolean"
215+
? resolutionDisabledProp
216+
: contextResolutionDisabled;
217+
185218
const [resolvedUser, setResolvedUser] = useState<UserData | undefined>();
186219
const { userData } = useAuth();
187220

@@ -193,21 +226,16 @@ export function NameOptionalUserCard({
193226
}
194227

195228
requestUser(email);
196-
197-
const interval = setInterval(() => {
198-
const user = resolveUser(email);
199-
if (user) {
200-
setResolvedUser(user);
201-
clearInterval(interval);
202-
}
203-
}, 10);
204-
205-
return () => clearInterval(interval);
229+
const user = resolveUser(email);
230+
if (user) {
231+
setResolvedUser(user);
232+
}
206233
}, [
207234
email,
208235
providedName,
209236
isValidEmail,
210237
resolutionDisabled,
238+
cacheVersion,
211239
resolveUser,
212240
requestUser,
213241
]);

src/ui/pages/tickets/ViewTickets.page.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -298,9 +298,9 @@ const ViewTicketsPage: React.FC = () => {
298298
const startIndex = (currentPage - 1) * parseInt(pageSize, 10);
299299
const endIndex = startIndex + parseInt(pageSize, 10);
300300
const currentTickets = allTickets.slice(startIndex, endIndex);
301-
const copyTicketId = (ticketId: string) => {
301+
const copyTicketId = async (ticketId: string) => {
302302
try {
303-
navigator.clipboard.writeText(ticketId);
303+
await navigator.clipboard.writeText(ticketId);
304304
notifications.show({
305305
message: "Ticket ID copied!",
306306
});

0 commit comments

Comments
 (0)