Skip to content

Commit 601dd14

Browse files
bug: handle editor fetch errors, avoid refetch on user change, persist token in setUser
Co-Authored-By: patrick.bradley <patrick.bradley@cognition.ai>
1 parent 2b09032 commit 601dd14

2 files changed

Lines changed: 26 additions & 12 deletions

File tree

react/src/context/UserContext.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ export function UserProvider({ children }: { children: ReactNode }) {
7474
}, []);
7575

7676
const setUser = useCallback((user: User) => {
77+
jwt.saveToken(user.token);
7778
setUserState(user);
7879
}, []);
7980

react/src/pages/Editor.tsx

Lines changed: 25 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { useEffect, useState, type FormEvent, type KeyboardEvent } from 'react';
1+
import { useEffect, useRef, useState, type FormEvent, type KeyboardEvent } from 'react';
22
import { useNavigate, useParams } from 'react-router-dom';
33
import { ApiError } from '../api/client';
44
import { articlesApi } from '../api/services';
@@ -17,20 +17,33 @@ export function Editor() {
1717
const [tagField, setTagField] = useState('');
1818
const [errors, setErrors] = useState<Errors | null>(null);
1919
const [isSubmitting, setIsSubmitting] = useState(false);
20+
const userRef = useRef(user);
21+
userRef.current = user;
2022

2123
useEffect(() => {
2224
if (!slug) return;
23-
articlesApi.get(slug).then(({ article }) => {
24-
if (user && article.author.username !== user.username) {
25-
navigate('/');
26-
return;
27-
}
28-
setTitle(article.title);
29-
setDescription(article.description);
30-
setBody(article.body);
31-
setTagList(article.tagList);
32-
});
33-
}, [slug, user, navigate]);
25+
let cancelled = false;
26+
articlesApi
27+
.get(slug)
28+
.then(({ article }) => {
29+
if (cancelled) return;
30+
const currentUser = userRef.current;
31+
if (currentUser && article.author.username !== currentUser.username) {
32+
navigate('/');
33+
return;
34+
}
35+
setTitle(article.title);
36+
setDescription(article.description);
37+
setBody(article.body);
38+
setTagList(article.tagList);
39+
})
40+
.catch(() => {
41+
if (!cancelled) navigate('/');
42+
});
43+
return () => {
44+
cancelled = true;
45+
};
46+
}, [slug, navigate]);
3447

3548
const addTag = () => {
3649
const tag = tagField.trim();

0 commit comments

Comments
 (0)