fix(in-316): rewrite token update listener

pull/111/head
Ruslan Khayrullin 3 years ago
parent 7d1d37c6b5
commit 2103b69fea
  1. 2
      src/features/AuthStore/config.tsx
  2. 18
      src/features/AuthStore/hooks/useAuth.tsx
  3. 2
      src/helpers/token/index.tsx
  4. 4
      src/hooks/useEventListener.tsx

@ -3,5 +3,3 @@ import { UserManager } from 'oidc-client'
import { getClientSettings } from './helpers' import { getClientSettings } from './helpers'
export const userManager = new UserManager(getClientSettings()) export const userManager = new UserManager(getClientSettings())
export const channel = new BroadcastChannel('access_token')

@ -21,6 +21,7 @@ import {
setCookie, setCookie,
removeCookie, removeCookie,
isMatchPage, isMatchPage,
TOKEN_KEY,
} from 'helpers' } from 'helpers'
import { import {
@ -40,7 +41,7 @@ import {
getTokenVirtualUser, getTokenVirtualUser,
} from 'requests' } from 'requests'
import { userManager, channel } from '../config' import { userManager } from '../config'
import { needCheckNewDeviсe } from '../helpers' import { needCheckNewDeviсe } from '../helpers'
export const useAuth = () => { export const useAuth = () => {
@ -80,8 +81,6 @@ export const useAuth = () => {
name: 'access_token', name: 'access_token',
value: loadedUser.access_token, value: loadedUser.access_token,
}) })
// обновляем токен в других окнах/вкладках
channel.postMessage({ token: loadedUser.access_token })
}, []) }, [])
const checkUser = useCallback(async () => { const checkUser = useCallback(async () => {
@ -177,23 +176,24 @@ export const useAuth = () => {
]) ])
useEventListener({ useEventListener({
callback: useCallback(async (e: MessageEvent<{ token: string }>) => { callback: useCallback(async (e: StorageEvent) => {
const loadedUser = await userManager.getUser() const loadedUser = await userManager.getUser()
if ( if (
!e.data.token e.storageArea !== localStorage
|| e.key !== TOKEN_KEY
|| !e.newValue
|| !loadedUser || !loadedUser
|| loadedUser.access_token === e.data.token || loadedUser.access_token === e.newValue
) return ) return
userManager.storeUser({ userManager.storeUser({
...loadedUser, ...loadedUser,
access_token: e.data.token, access_token: e.newValue,
toStorageString: loadedUser.toStorageString, toStorageString: loadedUser.toStorageString,
}) })
}, []), }, []),
event: 'message', event: 'storage',
target: channel,
}) })
useEffect(() => { useEffect(() => {

@ -1,4 +1,4 @@
const TOKEN_KEY = 'token' export const TOKEN_KEY = 'token'
export const readToken = () => ( export const readToken = () => (
localStorage.getItem(TOKEN_KEY) localStorage.getItem(TOKEN_KEY)

@ -4,7 +4,7 @@ import { useEffect, useRef } from 'react'
type EventMap = HTMLElementEventMap & WindowEventMap type EventMap = HTMLElementEventMap & WindowEventMap
type Target = RefObject<HTMLElement> | HTMLElement | Window | BroadcastChannel type Target = RefObject<HTMLElement> | HTMLElement | Window
type Args<E extends keyof EventMap> = { type Args<E extends keyof EventMap> = {
callback: (e: EventMap[E]) => void, callback: (e: EventMap[E]) => void,
@ -28,7 +28,7 @@ export const useEventListener = <E extends keyof EventMap>({
}, [callback]) }, [callback])
useEffect(() => { useEffect(() => {
const windowOrElement: HTMLElement | Window | BroadcastChannel | null = 'current' in target const windowOrElement: HTMLElement | Window | null = 'current' in target
? target.current ? target.current
: target : target

Loading…
Cancel
Save