Подскажите как правильно реализовать такое:
Есть ApiService, в котором я делаю запросы через axios. Там же есть interceptor, который должен проверять валидность токена, если он истёк - обновить его перед запросом, и потом продолжить.
Есть userActions, в которых я отправляю разные запросы. Сам токен лежит в userReducer.
Использую redux-thunk.
Я, конечно, могу доставать в ApiService токен из localStorage, но это же неправильно и некрасиво держать стороннюю логику в сервисе, задача которого - отправить запрос и получить ответ.
Если токен лежит в стейте, то и брать его надо из стейта.
Насчет сторонней логики... не совсем так. Задача ApiService, вами же сформулированная: отправить запрос, получить ответ и обновить токен. Вот этим он и должен заниматься.
По поводу обновления токена... тут все стандартные варианты решений применимы от самого простого - мы передаём store в ApiService, он знает где там лежит токен и знает какой акшн надо дернуть, чтоб его поменять (после обновления). До инверсии контроля, когда ApiService предоставляет наружу апи для установки токена и генерит события при его обновлении... но надо ли это всё, только от вас зависит