'Scoping in React for users with disabled cookies
I am looking for the best approach for dealing with users who have their cookies disabled. In my root index.tsx
file I placed a condition to render the application only if the user has their cookies enabled, otherwise an error page should be rendered. Here is the code for that:
ReactDOM.render(
<React.StrictMode>
{navigator.cookieEnabled ? (
<Provider store={store}>
<Router history={browserHistory}>
<App />
</Router>
</Provider>
) : (
<Error />
)}
</React.StrictMode>,
document.getElementById('root')
)
In several files within our application we are using localStorage.getItem
and localStorage.setItem
. However, even with this condition(code above) our React application is throwing an error. The errors we are receiving are only from files with localStorage
is being used outside a function.
This is because React is scanning our main.chunk.js
and the localStorage
items are causing the error. There are 3 specific files that have localStorage
out of scope and if I wrap the items with a condition that to check navigator.cookieEnabled
, there is no error. I was wondering, however if there was a way to scope or namespace these items, instead of having a condition. Or what the thoughts on best practices.
Here are the files:
A redux reducer:
// This line is causing the issue
export const initialState: string = sessionStorage.getItem('example')
// Error fixed if updated to
export const initialState: string =
navigator.cookieEnabled && sessionStorage.getItem('example')
export default (
state: string = initialState,
action: ExampleAction
): string => {
if (action.type === 'UPDATE_EXAMPLE') {
return action.payload
}
return state
}
Analytics:
import triggerAnalyticsEvent, {
analyticsConfig
} from 'some-library/helpers/triggerAnalyticsEvent'
analyticsConfig.defaults.Country = 'us'
// This line is causing the issue
analyticsConfig.defaults.ExampleItem = sessionStorage.getItem('exampleItem')
// Error fixed if updated to
if (navigator.cookieEnabled) {
analyticsConfig.defaults.ExampleItem = sessionStorage.getItem('exampleItem')
}
...
export default triggerAnalyticsEvent
Axios API
// This line is causing the issue
const apiHost = sessionStorage.getItem('mockData') ? 'https://getsandbox.com' : API_HOST
// Error fixed if updated to
const apiHost =
navigator.cookieEnabled && sessionStorage.getItem('mockData')
? 'https://getsandbox.com'
: API_HOST
const api = axios.create({
baseURL: apiHost,
headers: {
'Content-Type': 'application/json'
}
})
...
export default api
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|