сфейленных запросов отвечает человекочитаемыми ошибками на клиент, а на клиенте хочется выводить сфейленные ответы в нотификации.
Начал решать задачу “в лоб” - на клиенте, там, где дергаю запрос, разбирать ответ, проверять пустой ли error, и, если не пустой, вызывать с error хук, который показывает нотифайку.
Что-то вроде
const { data, error } = useSomeExampleQuery({ variables: ... })
useServerErrorToToast(error)
То есть бойлерплейт вокруг каждого запроса. Но этот бойлерплейт можно по идее спрятать в какую-нибудь обертку.
Потом начал копать в сторону более изящных решений и нашел подход через линки
https://www.apollographql.com/docs/react/data/error-handling/#advanced-error-handling-with-apollo-link -
можно выводить нотификацию на каждую пришедшую ошибку прямо из линка, не разбирая каждый результат запроса вручную.
Но в этом подходе есть нюанс - часть запросов работает в режиме поллинга, и, если одна и та же ошибка приходит 5 перезапросов подряд, юзер увидит 5 отдельных нотификаций об ошибке. В целом то логика правильная, но с точки зрения UX не очень, хотелось бы этого избежать.
В этом плане подход “в лоб” для поллинговых запросов лучше, так как хук для нотификации выкупит, что пришла та же ошибка и показывать нотифайку лишний раз не будет.
Подумал про гибридный подход - научить линк понимать, что ошибка пришла на единичный запрос (выкидывать нотификацию), или поллинговый (не выкидывать нотификацию, обработать отдельно, как в варианте в “лоб”). Но, как я понял, это можно сделать только костылями.
Другой вариант - городить какой-то специальный стор для линка с последними сфейленными попытками, кажется совсем плохой идеей.
Есть какие-то мысли? Может кто-то сталкивался?
У меня подход с обертками. В линке только обработка ошибок аутентификации. Я использую codegen, который оборачивает хуки useQuery, useMutation с дефолтной обработкой ошибок + возможностью кастомизировать ошибки при вызове хука. Квери выводят нотификации ошибок с мемоизацией. Мутации выводят нотификации ошибки и об успешном выполнении мутации. При этом разработчик может переопределить это поведение в своих компонентах, когда вызывает хуки. конфиг кодгена https://github.com/nodkz/example-apollo3/blob/master/codegen.yml#L38 пример оберток аполовских хуков https://github.com/nodkz/example-apollo3/blob/master/src/utils/extendApolloHooks.ts
Обсуждают сегодня