From 71d1d5b34e2866729ae0c96c59ea51e8d1a3dcca Mon Sep 17 00:00:00 2001 From: zyachel Date: Sun, 22 Jan 2023 21:13:09 +0530 Subject: [PATCH] fix: fix app crash this commit fixes a crash due to unavailability of localStorage https://github.com/zyachel/libremdb/issues/31 --- src/context/theme-context.tsx | 7 +++++-- src/pages/_document.tsx | 10 +++++++++- src/utils/helpers.ts | 10 ++++++++++ 3 files changed, 24 insertions(+), 3 deletions(-) diff --git a/src/context/theme-context.tsx b/src/context/theme-context.tsx index 69b9d96..85bb421 100644 --- a/src/context/theme-context.tsx +++ b/src/context/theme-context.tsx @@ -1,10 +1,13 @@ import React, { useState, createContext, ReactNode } from 'react'; +import { isLocalStorageAvailable } from '../utils/helpers'; const getInitialTheme = () => { // for server-side rendering, as window isn't availabe there if (typeof window === 'undefined') return 'light'; - const userPrefersTheme = window.localStorage.getItem('theme') || null; + const userPrefersTheme = isLocalStorageAvailable() + ? window.localStorage.getItem('theme') + : null; const browserPrefersDarkTheme = window.matchMedia( '(prefers-color-scheme: dark)' ).matches; @@ -35,7 +38,7 @@ const ThemeProvider = ({ children }: { children: ReactNode }) => { const setTheme = (theme: string) => { setCurTheme(theme); - window.localStorage.setItem('theme', theme); + if (isLocalStorageAvailable()) window.localStorage.setItem('theme', theme); document.documentElement.dataset.theme = theme; updateMetaTheme(); }; diff --git a/src/pages/_document.tsx b/src/pages/_document.tsx index 5464287..b350aa4 100644 --- a/src/pages/_document.tsx +++ b/src/pages/_document.tsx @@ -5,9 +5,17 @@ import Document, { Html, Head, Main, NextScript } from 'next/document'; const setInitialTheme = ` (() => { document.documentElement.dataset.js = true; + const isLocalStorageAvailable = () => { + try { + window.localStorage.getItem('test'); + return true; + } catch (e) { + return false; + } + } let theme = 'light'; let themeColor = '#ffe5ef'; - const userPrefersTheme = window.localStorage.getItem('theme') || null; + const userPrefersTheme = isLocalStorageAvailable() ? window.localStorage.getItem('theme') : null; const browserPrefersDarkTheme = window.matchMedia('(prefers-color-scheme: dark)').matches; if (userPrefersTheme) theme = userPrefersTheme; else if (browserPrefersDarkTheme) theme = 'dark'; diff --git a/src/utils/helpers.ts b/src/utils/helpers.ts index be8ee04..b218d88 100644 --- a/src/utils/helpers.ts +++ b/src/utils/helpers.ts @@ -103,3 +103,13 @@ export const getResTitleTypeHeading = ( if (el.id === titleType) return el.name; } }; + + +export const isLocalStorageAvailable = () => { + try { + localStorage.getItem('test'); + return true; + } catch (e) { + return false; + } +}; \ No newline at end of file