Repository: gitify-app/gitify
Pull request #691 (2023-12-06 18:07:25)

deps: switch and upgrade @electron/notarize


Patch:
diff --git a/package.json b/package.json
index 66147467..54b02f6f 100644
--- a/package.json
+++ b/package.json
@@ -112,19 +112,18 @@
     "typescript": "5.2.2"
   },
   "devDependencies": {
+    "@electron/notarize": "1.2.4",
     "@testing-library/react": "14.0.0",
-    "@testing-library/react-hooks": "8.0.1",
     "@types/jest": "29.5.10",
     "@types/node": "18.18.0",
     "@types/react": "18.2.42",
     "@types/react-router-dom": "5.3.3",
     "@types/react-transition-group": "4.4.7",
     "autoprefixer": "10.4.16",
-    "coveralls": "3.1.1",
     "css-loader": "6.8.1",
     "electron": "^13.1.7",
     "electron-builder": "24.6.4",
-    "electron-notarize": "1.2.2",
+    "husky": "8.0.3",
     "jest": "29.7.0",
     "jest-environment-jsdom": "29.7.0",
     "nock": "13.3.4",
@@ -137,8 +136,7 @@
     "ts-jest": "29.1.1",
     "webpack": "5.88.2",
     "webpack-cli": "5.1.4",
-    "webpack-merge": "5.9.0",
-    "husky": "8.0.3"
+    "webpack-merge": "5.9.0"
   },
   "packageManager": "pnpm@8.9.0",
   "lint-staged": {
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index d7b283ce..5324435f 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -55,12 +55,12 @@ dependencies:
     version: 5.2.2
 
 devDependencies:
+  '@electron/notarize':
+    specifier: 1.2.4
+    version: 1.2.4
   '@testing-library/react':
     specifier: 14.0.0
     version: 14.0.0(react-dom@18.2.0)(react@18.2.0)
-  '@testing-library/react-hooks':
-    specifier: 8.0.1
-    version: 8.0.1(@types/react@18.2.42)(react-dom@18.2.0)(react-test-renderer@18.2.0)(react@18.2.0)
   '@types/jest':
     specifier: 29.5.10
     version: 29.5.10
@@ -79,9 +79,6 @@ devDependencies:
   autoprefixer:
     specifier: 10.4.16
     version: 10.4.16(postcss@8.4.31)
-  coveralls:
-    specifier: 3.1.1
-    version: 3.1.1
   css-loader:
     specifier: 6.8.1
     version: 6.8.1(webpack@5.88.2)
@@ -91,9 +88,6 @@ devDependencies:
   electron-builder:
     specifier: 24.6.4
     version: 24.6.4
-  electron-notarize:
-    specifier: 1.2.2
-    version: 1.2.2
   husky:
     specifier: 8.0.3
     version: 8.0.3
@@ -534,6 +528,16 @@ packages:
     transitivePeerDependencies:
       - supports-color
 
+  /@electron/notarize@1.2.4:
+    resolution: {integrity: sha512-W5GQhJEosFNafewnS28d3bpQ37/s91CDWqxVchHfmv2dQSTWpOzNlUVQwYzC1ay5bChRV/A9BTL68yj0Pa+TSg==}
+    engines: {node: '>= 10.0.0'}
+    dependencies:
+      debug: 4.3.4
+      fs-extra: 9.1.0
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
   /@electron/notarize@2.1.0:
     resolution: {integrity: sha512-Q02xem1D0sg4v437xHgmBLxI2iz/fc0D4K7fiVWHa/AnW8o7D751xyKNXgziA6HrTOme9ul1JfWN5ark8WH1xA==}
     engines: {node: '>= 10.0.0'}
@@ -941,30 +945,6 @@ packages:
       pretty-format: 27.5.1
     dev: true
 
-  /@testing-library/react-hooks@8.0.1(@types/react@18.2.42)(react-dom@18.2.0)(react-test-renderer@18.2.0)(react@18.2.0):
-    resolution: {integrity: sha512-Aqhl2IVmLt8IovEVarNDFuJDVWVvhnr9/GCU6UUnrYXwgDFF9h2L2o2P9KBni1AST5sT6riAyoukFLyjQUgD/g==}
-    engines: {node: '>=12'}
-    peerDependencies:
-      '@types/react': ^16.9.0 || ^17.0.0
-      react: ^16.9.0 || ^17.0.0
-      react-dom: ^16.9.0 || ^17.0.0
-      react-test-renderer: ^16.9.0 || ^17.0.0
-    peerDependenciesMeta:
-      '@types/react':
-        optional: true
-      react-dom:
-        optional: true
-      react-test-renderer:
-        optional: true
-    dependencies:
-      '@babel/runtime': 7.21.5
-      '@types/react': 18.2.42
-      react: 18.2.0
-      react-dom: 18.2.0(react@18.2.0)
-      react-error-boundary: 3.1.4(react@18.2.0)
-      react-test-renderer: 18.2.0(react@18.2.0)
-    dev: true
-
   /@testing-library/react@14.0.0(react-dom@18.2.0)(react@18.2.0):
     resolution: {integrity: sha512-S04gSNJbYE30TlIMLTzv6QCTzt9AqIF5y6s6SzVFILNcNvbV/jU96GeiTPillGQo+Ny64M/5PV7klNYYgv5Dfg==}
     engines: {node: '>=14'}
@@ -1475,16 +1455,12 @@ packages:
       is-array-buffer: 3.0.2
     dev: true
 
-  /asn1@0.2.6:
-    resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==}
-    dependencies:
-      safer-buffer: 2.1.2
-    dev: true
-
   /assert-plus@1.0.0:
     resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==}
     engines: {node: '>=0.8'}
+    requiresBuild: true
     dev: true
+    optional: true
 
   /astral-regex@2.0.0:
     resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==}
@@ -1531,14 +1507,6 @@ packages:
     engines: {node: '>= 0.4'}
     dev: true
 
-  /aws-sign2@0.7.0:
-    resolution: {integrity: sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==}
-    dev: true
-
-  /aws4@1.12.0:
-    resolution: {integrity: sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==}
-    dev: true
-
   /axios@1.6.0:
     resolution: {integrity: sha512-EZ1DYihju9pwVB+jg67ogm+Tmqc6JmhamRN6I4Zt8DfZu5lbcQGw3ozH9lFejSJgs/ibaef3A9PMXPLeefFGJg==}
     dependencies:
@@ -1630,12 +1598,6 @@ packages:
     requiresBuild: true
     dev: true
 
-  /bcrypt-pbkdf@1.0.2:
-    resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==}
-    dependencies:
-      tweetnacl: 0.14.5
-    dev: true
-
   /binary-extensions@2.2.0:
     resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==}
     engines: {node: '>=8'}
@@ -1792,10 +1754,6 @@ packages:
   /caniuse-lite@1.0.30001538:
     resolution: {integrity: sha512-HWJnhnID+0YMtGlzcp3T9drmBJUVDchPJ08tpUGFLs9CYlwWPH2uLgpHn8fND5pCgXVtnGS3H4QR9XLMHVNkHw==}
 
-  /caseless@0.12.0:
-    resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==}
-    dev: true
-
   /chalk@2.4.2:
     resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==}
     engines: {node: '>=4'}
@@ -1983,7 +1941,9 @@ packages:
 
   /core-util-is@1.0.2:
     resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==}
+    requiresBuild: true
     dev: true
+    optional: true
 
   /core-util-is@1.0.3:
     resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==}
@@ -2004,18 +1964,6 @@ packages:
       typescript: 5.2.2
     dev: true
 
-  /coveralls@3.1.1:
-    resolution: {integrity: sha512-+dxnG2NHncSD1NrqbSM3dn/lE57O6Qf/koe9+I7c+wzkqRmEvcp0kgJdxKInzYzkICKkFMZsX3Vct3++tsF9ww==}
-    engines: {node: '>=6'}
-    hasBin: true
-    dependencies:
-      js-yaml: 3.14.1
-      lcov-parse: 1.0.0
-      log-driver: 1.2.7
-      minimist: 1.2.8
-      request: 2.88.2
-    dev: true
-
   /crc@3.8.0:
     resolution: {integrity: sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==}
     requiresBuild: true
@@ -2092,13 +2040,6 @@ packages:
   /csstype@3.1.2:
     resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==}
 
-  /dashdash@1.14.1:
-    resolution: {integrity: sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==}
-    engines: {node: '>=0.10'}
-    dependencies:
-      assert-plus: 1.0.0
-    dev: true
-
   /data-urls@3.0.2:
     resolution: {integrity: sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==}
     engines: {node: '>=12'}
@@ -2304,13 +2245,6 @@ packages:
   /duplexer3@0.1.5:
     resolution: {integrity: sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==}
 
-  /ecc-jsbn@0.1.2:
-    resolution: {integrity: sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==}
-    dependencies:
-      jsbn: 0.1.1
-      safer-buffer: 2.1.2
-    dev: true
-
   /ejs@3.1.9:
     resolution: {integrity: sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==}
     engines: {node: '>=0.10.0'}
@@ -2339,17 +2273,6 @@ packages:
       - supports-color
     dev: true
 
-  /electron-notarize@1.2.2:
-    resolution: {integrity: sha512-ZStVWYcWI7g87/PgjPJSIIhwQXOaw4/XeXU+pWqMMktSLHaGMLHdyPPN7Cmao7+Cr7fYufA16npdtMndYciHNw==}
-    engines: {node: '>= 10.0.0'}
-    deprecated: Please use @electron/notarize moving forward.  There is no API change, just a package name change
-    dependencies:
-      debug: 4.3.4
-      fs-extra: 9.1.0
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
-
   /electron-positioner@4.1.0:
     resolution: {integrity: sha512-726DfbI9ZNoCg+Fcu6XLuTKTnzf+6nFqv7h+K/V6Ug7IbaPMI7s9S8URnGtWFCy5N5PL4HSzRFF2mXuinftDdg==}
     dev: false
@@ -2572,10 +2495,6 @@ packages:
       jest-util: 29.7.0
     dev: true
 
-  /extend@3.0.2:
-    resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==}
-    dev: true
-
   /extract-zip@1.7.0:
     resolution: {integrity: sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==}
     hasBin: true
@@ -2587,15 +2506,12 @@ packages:
     transitivePeerDependencies:
       - supports-color
 
-  /extsprintf@1.3.0:
-    resolution: {integrity: sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==}
-    engines: {'0': node >=0.6.0}
-    dev: true
-
   /extsprintf@1.4.1:
     resolution: {integrity: sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA==}
     engines: {'0': node >=0.6.0}
+    requiresBuild: true
     dev: true
+    optional: true
 
   /fast-deep-equal@3.1.3:
     resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
@@ -2682,19 +2598,6 @@ packages:
       is-callable: 1.2.7
     dev: true
 
-  /forever-agent@0.6.1:
-    resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==}
-    dev: true
-
-  /form-data@2.3.3:
-    resolution: {integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==}
-    engines: {node: '>= 0.12'}
-    dependencies:
-      asynckit: 0.4.0
-      combined-stream: 1.0.8
-      mime-types: 2.1.35
-    dev: true
-
   /form-data@4.0.0:
     resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==}
     engines: {node: '>= 6'}
@@ -2800,12 +2703,6 @@ packages:
     engines: {node: '>=10'}
     dev: true
 
-  /getpass@0.1.7:
-    resolution: {integrity: sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==}
-    dependencies:
-      assert-plus: 1.0.0
-    dev: true
-
   /glob-parent@5.1.2:
     resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
     engines: {node: '>= 6'}
@@ -2909,20 +2806,6 @@ packages:
   /graceful-fs@4.2.11:
     resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
 
-  /har-schema@2.0.0:
-    resolution: {integrity: sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==}
-    engines: {node: '>=4'}
-    dev: true
-
-  /har-validator@5.1.5:
-    resolution: {integrity: sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==}
-    engines: {node: '>=6'}
-    deprecated: this library is no longer supported
-    dependencies:
-      ajv: 6.12.6
-      har-schema: 2.0.0
-    dev: true
-
   /has-bigints@1.0.2:
     resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==}
     dev: true
@@ -2997,15 +2880,6 @@ packages:
       - supports-color
     dev: true
 
-  /http-signature@1.2.0:
-    resolution: {integrity: sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==}
-    engines: {node: '>=0.8', npm: '>=1.3.7'}
-    dependencies:
-      assert-plus: 1.0.0
-      jsprim: 1.4.2
-      sshpk: 1.17.0
-    dev: true
-
   /https-proxy-agent@5.0.1:
     resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==}
     engines: {node: '>= 6'}
@@ -3266,10 +3140,6 @@ packages:
       which-typed-array: 1.1.11
     dev: true
 
-  /is-typedarray@1.0.0:
-    resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==}
-    dev: true
-
   /is-weakmap@2.0.1:
     resolution: {integrity: sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==}
     dev: true
@@ -3305,10 +3175,6 @@ packages:
     resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==}
     engines: {node: '>=0.10.0'}
 
-  /isstream@0.1.2:
-    resolution: {integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==}
-    dev: true
-
   /istanbul-lib-coverage@3.2.0:
     resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==}
     engines: {node: '>=8'}
@@ -3842,10 +3708,6 @@ packages:
     dependencies:
       argparse: 2.0.1
 
-  /jsbn@0.1.1:
-    resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==}
-    dev: true
-
   /jsdom@20.0.3:
     resolution: {integrity: sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==}
     engines: {node: '>=14'}
@@ -3903,10 +3765,6 @@ packages:
     resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==}
     requiresBuild: true
 
-  /json-schema@0.4.0:
-    resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==}
-    dev: true
-
   /json-stringify-safe@5.0.1:
     resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==}
 
@@ -3928,16 +3786,6 @@ packages:
     optionalDependencies:
       graceful-fs: 4.2.11
 
-  /jsprim@1.4.2:
-    resolution: {integrity: sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==}
-    engines: {node: '>=0.6.0'}
-    dependencies:
-      assert-plus: 1.0.0
-      extsprintf: 1.3.0
-      json-schema: 0.4.0
-      verror: 1.10.0
-    dev: true
-
   /keyv@3.1.0:
     resolution: {integrity: sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==}
     dependencies:
@@ -3955,11 +3803,6 @@ packages:
   /lazy-val@1.0.5:
     resolution: {integrity: sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q==}
 
-  /lcov-parse@1.0.0:
-    resolution: {integrity: sha512-aprLII/vPzuQvYZnDRU78Fns9I2Ag3gi4Ipga/hxnVMCZC8DnR2nI7XBqrPoywGfxqIx/DgarGvDJZAD3YBTgQ==}
-    hasBin: true
-    dev: true
-
   /leven@3.1.0:
     resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==}
     engines: {node: '>=6'}
@@ -4007,11 +3850,6 @@ packages:
   /lodash@4.17.21:
     resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==}
 
-  /log-driver@1.2.7:
-    resolution: {integrity: sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg==}
-    engines: {node: '>=0.8.6'}
-    dev: true
-
   /loose-envify@1.4.0:
     resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==}
     hasBin: true
@@ -4255,10 +4093,6 @@ packages:
     resolution: {integrity: sha512-NHj4rzRo0tQdijE9ZqAx6kYDcoRwYwSYzCA8MY3JzfxlrvEU0jhnhJT9BhqhJs7I/dKcrDm6TyulaRqZPIhN5g==}
     dev: true
 
-  /oauth-sign@0.9.0:
-    resolution: {integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==}
-    dev: true
-
   /object-assign@4.1.1:
     resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
     engines: {node: '>=0.10.0'}
@@ -4393,10 +4227,6 @@ packages:
   /pend@1.2.0:
     resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==}
 
-  /performance-now@2.1.0:
-    resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==}
-    dev: true
-
   /picocolors@1.0.0:
     resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==}
 
@@ -4657,11 +4487,6 @@ packages:
     resolution: {integrity: sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA==}
     dev: true
 
-  /qs@6.5.3:
-    resolution: {integrity: sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==}
-    engines: {node: '>=0.6'}
-    dev: true
-
   /querystringify@2.2.0:
     resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==}
     dev: true
@@ -4684,16 +4509,6 @@ packages:
       react: 18.2.0
       scheduler: 0.23.0
 
-  /react-error-boundary@3.1.4(react@18.2.0):
-    resolution: {integrity: sha512-uM9uPzZJTF6wRQORmSrvOIgt4lJ9MC1sNgEOj2XGsDTRE4kmpWxg7ENK9EWNKJRMAOY9z0MuF4yIfl6gp4sotA==}
-    engines: {node: '>=10', npm: '>=6'}
-    peerDependencies:
-      react: '>=16.13.1'
-    dependencies:
-      '@babel/runtime': 7.21.5
-      react: 18.2.0
-    dev: true
-
   /react-final-form@6.5.9(final-form@4.20.10)(react@18.2.0):
     resolution: {integrity: sha512-x3XYvozolECp3nIjly+4QqxdjSSWfcnpGEL5K8OBT6xmGrq5kBqbA6+/tOqoom9NwqIPPbxPNsOViFlbKgowbA==}
     peerDependencies:
@@ -4835,33 +4650,6 @@ packages:
       set-function-name: 2.0.1
     dev: true
 
-  /request@2.88.2:
-    resolution: {integrity: sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==}
-    engines: {node: '>= 6'}
-    deprecated: request has been deprecated, see https://github.com/request/request/issues/3142
-    dependencies:
-      aws-sign2: 0.7.0
-      aws4: 1.12.0
-      caseless: 0.12.0
-      combined-stream: 1.0.8
-      extend: 3.0.2
-      forever-agent: 0.6.1
-      form-data: 2.3.3
-      har-validator: 5.1.5
-      http-signature: 1.2.0
-      is-typedarray: 1.0.0
-      isstream: 0.1.2
-      json-stringify-safe: 5.0.1
-      mime-types: 2.1.35
-      oauth-sign: 0.9.0
-      performance-now: 2.1.0
-      qs: 6.5.3
-      safe-buffer: 5.2.1
-      tough-cookie: 2.5.0
-      tunnel-agent: 0.6.0
-      uuid: 3.4.0
-    dev: true
-
   /require-directory@2.1.1:
     resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==}
     engines: {node: '>=0.10.0'}
@@ -5115,22 +4903,6 @@ packages:
     requiresBuild: true
     optional: true
 
-  /sshpk@1.17.0:
-    resolution: {integrity: sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==}
-    engines: {node: '>=0.10.0'}
-    hasBin: true
-    dependencies:
-      asn1: 0.2.6
-      assert-plus: 1.0.0
-      bcrypt-pbkdf: 1.0.2
-      dashdash: 1.14.1
-      ecc-jsbn: 0.1.2
-      getpass: 0.1.7
-      jsbn: 0.1.1
-      safer-buffer: 2.1.2
-      tweetnacl: 0.14.5
-    dev: true
-
   /stack-utils@2.0.6:
     resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==}
     engines: {node: '>=10'}
@@ -5397,14 +5169,6 @@ packages:
     dependencies:
       is-number: 7.0.0
 
-  /tough-cookie@2.5.0:
-    resolution: {integrity: sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==}
-    engines: {node: '>=0.8'}
-    dependencies:
-      psl: 1.9.0
-      punycode: 2.3.0
-    dev: true
-
   /tough-cookie@4.1.2:
     resolution: {integrity: sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ==}
     engines: {node: '>=6'}
@@ -5482,22 +5246,12 @@ packages:
       webpack: 5.88.2(webpack-cli@5.1.4)
     dev: false
 
-  /tunnel-agent@0.6.0:
-    resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==}
-    dependencies:
-      safe-buffer: 5.2.1
-    dev: true
-
   /tunnel@0.0.6:
     resolution: {integrity: sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==}
     engines: {node: '>=0.6.11 <=0.7.0 || >=0.7.3'}
     requiresBuild: true
     optional: true
 
-  /tweetnacl@0.14.5:
-    resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==}
-    dev: true
-
   /type-check@0.3.2:
     resolution: {integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==}
     engines: {node: '>= 0.8.0'}
@@ -5584,12 +5338,6 @@ packages:
   /util-deprecate@1.0.2:
     resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
 
-  /uuid@3.4.0:
-    resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==}
-    deprecated: Please upgrade  to version 7 or higher.  Older versions may use Math.random() in certain circumstances, which is known to be problematic.  See https://v8.dev/blog/math-random for details.
-    hasBin: true
-    dev: true
-
   /v8-to-istanbul@9.1.0:
     resolution: {integrity: sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==}
     engines: {node: '>=10.12.0'}
@@ -5599,15 +5347,6 @@ packages:
       convert-source-map: 1.9.0
     dev: true
 
-  /verror@1.10.0:
-    resolution: {integrity: sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==}
-    engines: {'0': node >=0.6.0}
-    dependencies:
-      assert-plus: 1.0.0
-      core-util-is: 1.0.2
-      extsprintf: 1.4.1
-    dev: true
-
   /verror@1.10.1:
     resolution: {integrity: sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg==}
     engines: {node: '>=0.6.0'}
diff --git a/scripts/notarize.js b/scripts/notarize.js
index 8532363e..f30f84ee 100644
--- a/scripts/notarize.js
+++ b/scripts/notarize.js
@@ -1,4 +1,4 @@
-const { notarize } = require('electron-notarize');
+const { notarize } = require('@electron/notarize');
 
 const packageJson = require('../package.json');
 const appBundleId = packageJson.build.appId;
@@ -11,7 +11,7 @@ const notarizeApp = async (context) => {
 
   if (!shouldNotarize || !isMacOS) {
     console.log(
-      '  • notarizing      either should not notarize or not building for macOS'
+      '  • notarizing      either should not notarize or not building for macOS',
     );
     return;
   }
diff --git a/src/components/fields/Checkbox.tsx b/src/components/fields/Checkbox.tsx
index d167e5ee..4f4bc658 100644
--- a/src/components/fields/Checkbox.tsx
+++ b/src/components/fields/Checkbox.tsx
@@ -6,6 +6,7 @@ interface IFieldCheckbox {
   checked: boolean;
   onChange: any;
   placeholder?: string;
+  disabled?: boolean;
 }
 
 export const FieldCheckbox = (props: IFieldCheckbox) => {
@@ -18,6 +19,7 @@ export const FieldCheckbox = (props: IFieldCheckbox) => {
           className="focus:ring-indigo-500 h-4 w-4 text-indigo-600 border-gray-300 rounded"
           checked={props.checked}
           onChange={props.onChange}
+          disabled={props.disabled}
         />
       </div>
 
@@ -25,6 +27,9 @@ export const FieldCheckbox = (props: IFieldCheckbox) => {
         <label
           htmlFor={props.name}
           className="font-medium text-gray-700 dark:text-gray-200"
+          style={
+            props.disabled ? { textDecoration: 'line-through' } : undefined
+          }
         >
           {props.label}
         </label>
diff --git a/src/context/App.tsx b/src/context/App.tsx
index fb94f545..34543cf3 100644
--- a/src/context/App.tsx
+++ b/src/context/App.tsx
@@ -1,11 +1,13 @@
 import React, {
-  useState,
   createContext,
   useCallback,
   useEffect,
   useMemo,
+  useState,
 } from 'react';
 
+import { useInterval } from '../hooks/useInterval';
+import { useNotifications } from '../hooks/useNotifications';
 import {
   AccountNotifications,
   Appearance,
@@ -15,14 +17,12 @@ import {
   SettingsState,
 } from '../types';
 import { apiRequestAuth } from '../utils/api-requests';
-import { addAccount, authGitHub, getToken, getUserData } from '../utils/auth';
-import { clearState, loadState, saveState } from '../utils/storage';
 import { setAppearance } from '../utils/appearance';
+import { addAccount, authGitHub, getToken, getUserData } from '../utils/auth';
 import { setAutoLaunch } from '../utils/comms';
-import { useInterval } from '../hooks/useInterval';
-import { useNotifications } from '../hooks/useNotifications';
 import Constants from '../utils/constants';
 import { generateGitHubAPIUrl } from '../utils/helpers';
+import { clearState, loadState, saveState } from '../utils/storage';
 
 const defaultAccounts: AuthState = {
   token: null,
@@ -37,7 +37,7 @@ export const defaultSettings: SettingsState = {
   markOnClick: false,
   openAtStartup: false,
   appearance: Appearance.SYSTEM,
-  colors: true,
+  colors: false,
 };
 
 interface AppContextState {
diff --git a/src/routes/Settings.tsx b/src/routes/Settings.tsx
index f04da658..b4355169 100644
--- a/src/routes/Settings.tsx
+++ b/src/routes/Settings.tsx
@@ -1,24 +1,34 @@
-import React, { useCallback, useContext, useState, useEffect } from 'react';
+import { ArrowLeftIcon } from '@primer/octicons-react';
 import { ipcRenderer } from 'electron';
+import React, {
+  useCallback,
+  useContext,
+  useEffect,
+  useMemo,
+  useState,
+} from 'react';
 import { useNavigate } from 'react-router-dom';
-import { ArrowLeftIcon } from '@primer/octicons-react';
 
-import { AppContext } from '../context/App';
-import { Appearance } from '../types';
 import { FieldCheckbox } from '../components/fields/Checkbox';
 import { FieldRadioGroup } from '../components/fields/RadioGroup';
+import { AppContext } from '../context/App';
 import { IconAddAccount } from '../icons/AddAccount';
 import { IconLogOut } from '../icons/Logout';
 import { IconQuit } from '../icons/Quit';
-import { updateTrayIcon } from '../utils/comms';
+import { Appearance } from '../types';
+import { apiRequestAuth } from '../utils/api-requests';
 import { setAppearance } from '../utils/appearance';
+import { updateTrayIcon } from '../utils/comms';
+import Constants from '../utils/constants';
+import { generateGitHubAPIUrl } from '../utils/helpers';
 
 export const SettingsRoute: React.FC = () => {
-  const { settings, updateSetting, logout } = useContext(AppContext);
+  const { accounts, settings, updateSetting, logout } = useContext(AppContext);
   const navigate = useNavigate();
 
   const [isLinux, setIsLinux] = useState<boolean>(false);
   const [appVersion, setAppVersion] = useState<string | null>(null);
+  const [colorScope, setColorScope] = useState<boolean>(false);
 
   useEffect(() => {
     ipcRenderer.invoke('get-platform').then((result: string) => {
@@ -30,6 +40,19 @@ export const SettingsRoute: React.FC = () => {
     });
   }, []);
 
+  useMemo(() => {
+    (async () => {
+      const response = await apiRequestAuth(
+        `${generateGitHubAPIUrl(Constants.DEFAULT_AUTH_OPTIONS.hostname)}`,
+        'GET',
+        accounts.token,
+      );
+
+      if (response.headers['x-oauth-scopes'].includes('repo'))
+        setColorScope(true);
+    })();
+  }, [accounts.token]);
+
   ipcRenderer.on('update-native-theme', (_, updatedAppearance: Appearance) => {
     if (settings.appearance === Appearance.SYSTEM) {
       setAppearance(updatedAppearance);
@@ -84,9 +107,14 @@ export const SettingsRoute: React.FC = () => {
 
         <FieldCheckbox
           name="colors"
-          label="Use colors to indicate state"
-          checked={settings.colors}
-          onChange={(evt) => updateSetting('colors', evt.target.checked)}
+          label={`Use GitHub-like state colors${
+            !colorScope ? ' (requires repo scope)' : ''
+          }`}
+          checked={colorScope && settings.colors}
+          onChange={(evt) =>
+            colorScope && updateSetting('colors', evt.target.checked)
+          }
+          disabled={!colorScope}
         />
         <FieldCheckbox
           name="showOnlyParticipating"


Test patch:
diff --git a/src/context/App.test.tsx b/src/context/App.test.tsx
index 390fefc9..05e00520 100644
--- a/src/context/App.test.tsx
+++ b/src/context/App.test.tsx
@@ -264,7 +264,7 @@ describe('context/App.tsx', () => {
         participating: true,
         playSound: true,
         showNotifications: true,
-        colors: true,
+        colors: false,
       },
     );
   });
@@ -302,7 +302,7 @@ describe('context/App.tsx', () => {
         participating: false,
         playSound: true,
         showNotifications: true,
-        colors: true,
+        colors: false,
       },
     );
   });
diff --git a/src/hooks/useNotifications.test.ts b/src/hooks/useNotifications.test.ts
index dce5e9e1..66e40f26 100644
--- a/src/hooks/useNotifications.test.ts
+++ b/src/hooks/useNotifications.test.ts
@@ -1,11 +1,11 @@
+import { act, renderHook, waitFor } from '@testing-library/react';
 import axios from 'axios';
 import nock from 'nock';
-import { act, renderHook } from '@testing-library/react-hooks';
 
 import { mockAccounts, mockSettings } from '../__mocks__/mock-state';
-import { useNotifications } from './useNotifications';
-import { AuthState } from '../types';
 import { mockedUser } from '../__mocks__/mockedData';
+import { AuthState } from '../types';
+import { useNotifications } from './useNotifications';
 
 describe('hooks/useNotifications.ts', () => {
   beforeEach(() => {
@@ -30,9 +30,7 @@ describe('hooks/useNotifications.ts', () => {
           .get('/notifications?participating=false')
           .reply(200, notifications);
 
-        const { result, waitForNextUpdate } = renderHook(() =>
-          useNotifications(false),
-        );
+        const { result } = renderHook(() => useNotifications(false));
 
         act(() => {
           result.current.fetchNotifications(mockAccounts, mockSettings);
@@ -40,9 +38,10 @@ describe('hooks/useNotifications.ts', () => {
 
         expect(result.current.isFetching).toBe(true);
 
-        await waitForNextUpdate();
+        await waitFor(() => {
+          expect(result.current.isFetching).toBe(false);
+        });
 
-        expect(result.current.isFetching).toBe(false);
         expect(result.current.notifications[0].hostname).toBe(
           'github.gitify.io',
         );
@@ -60,9 +59,7 @@ describe('hooks/useNotifications.ts', () => {
           .get('/notifications?participating=false')
           .reply(400, { message });
 
-        const { result, waitForNextUpdate } = renderHook(() =>
-          useNotifications(false),
-        );
+        const { result } = renderHook(() => useNotifications(false));
 
         act(() => {
           result.current.fetchNotifications(mockAccounts, mockSettings);
@@ -70,9 +67,10 @@ describe('hooks/useNotifications.ts', () => {
 
         expect(result.current.isFetching).toBe(true);
 
-        await waitForNextUpdate();
+        await waitFor(() => {
+          expect(result.current.isFetching).toBe(false);
+        });
 
-        expect(result.current.isFetching).toBe(false);
         expect(result.current.requestFailed).toBe(true);
       });
     });
@@ -93,19 +91,18 @@ describe('hooks/useNotifications.ts', () => {
           .get('/notifications?participating=false')
           .reply(200, notifications);
 
-        const { result, waitForNextUpdate } = renderHook(() =>
-          useNotifications(false),
-        );
+        const { result } = renderHook(() => useNotifications(false));
 
         act(() => {
           result.current.fetchNotifications(accounts, mockSettings);
         });
 
-        await waitForNextUpdate();
+        await waitFor(() => {
+          expect(result.current.notifications[0].hostname).toBe(
+            'github.gitify.io',
+          );
+        });
 
-        expect(result.current.notifications[0].hostname).toBe(
-          'github.gitify.io',
-        );
         expect(result.current.notifications[0].notifications.length).toBe(2);
       });
 
@@ -119,17 +116,15 @@ describe('hooks/useNotifications.ts', () => {
           .get('/notifications?participating=false')
           .reply(400, { message: 'Oops! Something went wrong.' });
 
-        const { result, waitForNextUpdate } = renderHook(() =>
-          useNotifications(false),
-        );
+        const { result } = renderHook(() => useNotifications(false));
 
         act(() => {
           result.current.fetchNotifications(accounts, mockSettings);
         });
 
-        await waitForNextUpdate();
-
-        expect(result.current.requestFailed).toBe(true);
+        await waitFor(() => {
+          expect(result.current.requestFailed).toBe(true);
+        });
       });
     });
 
@@ -150,17 +145,16 @@ describe('hooks/useNotifications.ts', () => {
           .get('/notifications?participating=false')
           .reply(200, notifications);
 
-        const { result, waitForNextUpdate } = renderHook(() =>
-          useNotifications(false),
-        );
+        const { result } = renderHook(() => useNotifications(false));
 
         act(() => {
           result.current.fetchNotifications(accounts, mockSettings);
         });
 
-        await waitForNextUpdate();
+        await waitFor(() => {
+          expect(result.current.notifications[0].hostname).toBe('github.com');
+        });
 
-        expect(result.current.notifications[0].hostname).toBe('github.com');
         expect(result.current.notifications[0].notifications.length).toBe(2);
       });
 
@@ -174,17 +168,15 @@ describe('hooks/useNotifications.ts', () => {
           .get('/notifications?participating=false')
           .reply(400, { message: 'Oops! Something went wrong.' });
 
-        const { result, waitForNextUpdate } = renderHook(() =>
-          useNotifications(false),
-        );
+        const { result } = renderHook(() => useNotifications(false));
 
         act(() => {
           result.current.fetchNotifications(accounts, mockSettings);
         });
 
-        await waitForNextUpdate();
-
-        expect(result.current.requestFailed).toBe(true);
+        await waitFor(() => {
+          expect(result.current.requestFailed).toBe(true);
+        });
       });
     });
 
@@ -242,9 +234,7 @@ describe('hooks/useNotifications.ts', () => {
           .get('/5')
           .reply(200, { state: 'open', draft: true });
 
-        const { result, waitForNextUpdate } = renderHook(() =>
-          useNotifications(true),
-        );
+        const { result } = renderHook(() => useNotifications(true));
 
         act(() => {
           result.current.fetchNotifications(accounts, {
@@ -255,9 +245,10 @@ describe('hooks/useNotifications.ts', () => {
 
         expect(result.current.isFetching).toBe(true);
 
-        await waitForNextUpdate();
+        await waitFor(() => {
+          expect(result.current.notifications[0].hostname).toBe('github.com');
+        });
 
-        expect(result.current.notifications[0].hostname).toBe('github.com');
         expect(result.current.notifications[0].notifications.length).toBe(5);
         expect(
           result.current.notifications[0].notifications[0].subject.state,
@@ -290,15 +281,15 @@ describe('hooks/useNotifications.ts', () => {
           .patch(`/notifications/threads/${id}`)
           .reply(200);
 
-        const { result, waitForNextUpdate } = renderHook(() =>
-          useNotifications(false),
-        );
+        const { result } = renderHook(() => useNotifications(false));
 
         act(() => {
           result.current.markNotification(accounts, id, hostname);
         });
 
-        await waitForNextUpdate();
+        await waitFor(() => {
+          expect(result.current.isFetching).toBe(false);
+        });
 
         expect(result.current.notifications.length).toBe(0);
       });
@@ -308,15 +299,15 @@ describe('hooks/useNotifications.ts', () => {
           .patch(`/notifications/threads/${id}`)
           .reply(400);
 
-        const { result, waitForNextUpdate } = renderHook(() =>
-          useNotifications(false),
-        );
+        const { result } = renderHook(() => useNotifications(false));
 
         act(() => {
           result.current.markNotification(accounts, id, hostname);
         });
 
-        await waitForNextUpdate();
+        await waitFor(() => {
+          expect(result.current.isFetching).toBe(false);
+        });
 
         expect(result.current.notifications.length).toBe(0);
       });
@@ -331,15 +322,15 @@ describe('hooks/useNotifications.ts', () => {
           .patch(`/notifications/threads/${id}`)
           .reply(200);
 
-        const { result, waitForNextUpdate } = renderHook(() =>
-          useNotifications(false),
-        );
+        const { result } = renderHook(() => useNotifications(false));
 
         act(() => {
           result.current.markNotification(accounts, id, hostname);
         });
 
-        await waitForNextUpdate();
+        await waitFor(() => {
+          expect(result.current.isFetching).toBe(false);
+        });
 
         expect(result.current.notifications.length).toBe(0);
       });
@@ -349,15 +340,15 @@ describe('hooks/useNotifications.ts', () => {
           .patch(`/notifications/threads/${id}`)
           .reply(400);
 
-        const { result, waitForNextUpdate } = renderHook(() =>
-          useNotifications(false),
-        );
+        const { result } = renderHook(() => useNotifications(false));
 
         act(() => {
           result.current.markNotification(accounts, id, hostname);
         });
 
-        await waitForNextUpdate();
+        await waitFor(() => {
+          expect(result.current.isFetching).toBe(false);
+        });
 
         expect(result.current.notifications.length).toBe(0);
       });
@@ -382,16 +373,14 @@ describe('hooks/useNotifications.ts', () => {
           .patch(`/notifications/threads/${id}`)
           .reply(200);
 
-        const { result, waitForValueToChange } = renderHook(() =>
-          useNotifications(false),
-        );
+        const { result } = renderHook(() => useNotifications(false));
 
         act(() => {
           result.current.unsubscribeNotification(accounts, id, hostname);
         });
 
-        await waitForValueToChange(() => {
-          return result.current.isFetching;
+        await waitFor(() => {
+          expect(result.current.isFetching).toBe(false);
         });
 
         expect(result.current.notifications.length).toBe(0);
@@ -408,16 +397,14 @@ describe('hooks/useNotifications.ts', () => {
           .patch(`/notifications/threads/${id}`)
           .reply(400);
 
-        const { result, waitForValueToChange } = renderHook(() =>
-          useNotifications(false),
-        );
+        const { result } = renderHook(() => useNotifications(false));
 
         act(() => {
           result.current.unsubscribeNotification(accounts, id, hostname);
         });
 
-        await waitForValueToChange(() => {
-          return result.current.isFetching;
+        await waitFor(() => {
+          expect(result.current.isFetching).toBe(false);
         });
 
         expect(result.current.notifications.length).toBe(0);
@@ -439,16 +426,14 @@ describe('hooks/useNotifications.ts', () => {
           .patch(`/notifications/threads/${id}`)
           .reply(200);
 
-        const { result, waitForValueToChange } = renderHook(() =>
-          useNotifications(false),
-        );
+        const { result } = renderHook(() => useNotifications(false));
 
         act(() => {
           result.current.unsubscribeNotification(accounts, id, hostname);
         });
 
-        await waitForValueToChange(() => {
-          return result.current.isFetching;
+        await waitFor(() => {
+          expect(result.current.isFetching).toBe(false);
         });
 
         expect(result.current.notifications.length).toBe(0);
@@ -465,16 +450,14 @@ describe('hooks/useNotifications.ts', () => {
           .patch(`/notifications/threads/${id}`)
           .reply(400);
 
-        const { result, waitForValueToChange } = renderHook(() =>
-          useNotifications(false),
-        );
+        const { result } = renderHook(() => useNotifications(false));
 
         act(() => {
           result.current.unsubscribeNotification(accounts, id, hostname);
         });
 
-        await waitForValueToChange(() => {
-          return result.current.isFetching;
+        await waitFor(() => {
+          expect(result.current.isFetching).toBe(false);
         });
 
         expect(result.current.notifications.length).toBe(0);
@@ -494,15 +477,15 @@ describe('hooks/useNotifications.ts', () => {
           .put(`/repos/${repoSlug}/notifications`)
           .reply(200);
 
-        const { result, waitForNextUpdate } = renderHook(() =>
-          useNotifications(false),
-        );
+        const { result } = renderHook(() => useNotifications(false));
 
         act(() => {
           result.current.markRepoNotifications(accounts, repoSlug, hostname);
         });
 
-        await waitForNextUpdate();
+        await waitFor(() => {
+          expect(result.current.isFetching).toBe(false);
+        });
 
         expect(result.current.notifications.length).toBe(0);
       });
@@ -512,15 +495,15 @@ describe('hooks/useNotifications.ts', () => {
           .put(`/repos/${repoSlug}/notifications`)
           .reply(400);
 
-        const { result, waitForNextUpdate } = renderHook(() =>
-          useNotifications(false),
-        );
+        const { result } = renderHook(() => useNotifications(false));
 
         act(() => {
           result.current.markRepoNotifications(accounts, repoSlug, hostname);
         });
 
-        await waitForNextUpdate();
+        await waitFor(() => {
+          expect(result.current.isFetching).toBe(false);
+        });
 
         expect(result.current.notifications.length).toBe(0);
       });
@@ -535,15 +518,15 @@ describe('hooks/useNotifications.ts', () => {
           .put(`/repos/${repoSlug}/notifications`)
           .reply(200);
 
-        const { result, waitForNextUpdate } = renderHook(() =>
-          useNotifications(false),
-        );
+        const { result } = renderHook(() => useNotifications(false));
 
         act(() => {
           result.current.markRepoNotifications(accounts, repoSlug, hostname);
         });
 
-        await waitForNextUpdate();
+        await waitFor(() => {
+          expect(result.current.isFetching).toBe(false);
+        });
 
         expect(result.current.notifications.length).toBe(0);
       });
@@ -553,15 +536,15 @@ describe('hooks/useNotifications.ts', () => {
           .put(`/repos/${repoSlug}/notifications`)
           .reply(400);
 
-        const { result, waitForNextUpdate } = renderHook(() =>
-          useNotifications(false),
-        );
+        const { result } = renderHook(() => useNotifications(false));
 
         act(() => {
           result.current.markRepoNotifications(accounts, repoSlug, hostname);
         });
 
-        await waitForNextUpdate();
+        await waitFor(() => {
+          expect(result.current.isFetching).toBe(false);
+        });
 
         expect(result.current.notifications.length).toBe(0);
       });
diff --git a/src/routes/Settings.test.tsx b/src/routes/Settings.test.tsx
index d8565a1f..daa7d38e 100644
--- a/src/routes/Settings.test.tsx
+++ b/src/routes/Settings.test.tsx
@@ -1,26 +1,33 @@
+import { fireEvent, render, screen } from '@testing-library/react';
 import React from 'react';
-import TestRenderer, { act } from 'react-test-renderer';
-import { render, fireEvent } from '@testing-library/react';
 import { MemoryRouter } from 'react-router-dom';
+import TestRenderer, { act } from 'react-test-renderer';
 
 const { ipcRenderer } = require('electron');
 
-import { SettingsRoute } from './Settings';
+import { AxiosResponse } from 'axios';
+import { mockAccounts, mockSettings } from '../__mocks__/mock-state';
 import { AppContext } from '../context/App';
-import { mockSettings } from '../__mocks__/mock-state';
+import * as apiRequests from '../utils/api-requests';
+import Constants from '../utils/constants';
+import { SettingsRoute } from './Settings';
 
 const mockNavigate = jest.fn();
 jest.mock('react-router-dom', () => ({
   ...jest.requireActual('react-router-dom'),
   useNavigate: () => mockNavigate,
 }));
+jest.spyOn(apiRequests, 'apiRequestAuth').mockResolvedValue({
+  headers: {
+    'x-oauth-scopes': Constants.AUTH_SCOPE.join(', '),
+  },
+} as unknown as AxiosResponse);
 
 describe('routes/Settings.tsx', () => {
   const updateSetting = jest.fn();
 
   beforeEach(() => {
-    mockNavigate.mockReset();
-    updateSetting.mockReset();
+    jest.clearAllMocks();
   });
 
   it('should render itself & its children', async () => {
@@ -28,7 +35,9 @@ describe('routes/Settings.tsx', () => {
 
     await act(async () => {
       tree = TestRenderer.create(
-        <AppContext.Provider value={{ settings: mockSettings }}>
+        <AppContext.Provider
+          value={{ settings: mockSettings, accounts: mockAccounts }}
+        >
           <MemoryRouter>
             <SettingsRoute />
           </MemoryRouter>
@@ -45,7 +54,11 @@ describe('routes/Settings.tsx', () => {
     await act(async () => {
       const { getByLabelText: getByLabelTextLocal } = render(
         <AppContext.Provider
-          value={{ settings: mockSettings, logout: logoutMock }}
+          value={{
+            settings: mockSettings,
+            accounts: mockAccounts,
+            logout: logoutMock,
+          }}
         >
           <MemoryRouter>
             <SettingsRoute />
@@ -70,7 +83,12 @@ describe('routes/Settings.tsx', () => {
 
     await act(async () => {
       const { getByLabelText: getByLabelTextLocal } = render(
-        <AppContext.Provider value={{ settings: mockSettings }}>
+        <AppContext.Provider
+          value={{
+            settings: mockSettings,
+            accounts: mockAccounts,
+          }}
+        >
           <MemoryRouter>
             <SettingsRoute />
           </MemoryRouter>
@@ -88,7 +106,13 @@ describe('routes/Settings.tsx', () => {
 
     await act(async () => {
       const { getByLabelText: getByLabelTextLocal } = render(
-        <AppContext.Provider value={{ settings: mockSettings, updateSetting }}>
+        <AppContext.Provider
+          value={{
+            settings: mockSettings,
+            accounts: mockAccounts,
+            updateSetting,
+          }}
+        >
           <MemoryRouter>
             <SettingsRoute />
           </MemoryRouter>
@@ -110,7 +134,13 @@ describe('routes/Settings.tsx', () => {
 
     await act(async () => {
       const { getByLabelText: getByLabelTextLocal } = render(
-        <AppContext.Provider value={{ settings: mockSettings, updateSetting }}>
+        <AppContext.Provider
+          value={{
+            settings: mockSettings,
+            accounts: mockAccounts,
+            updateSetting,
+          }}
+        >
           <MemoryRouter>
             <SettingsRoute />
           </MemoryRouter>
@@ -132,7 +162,13 @@ describe('routes/Settings.tsx', () => {
 
     await act(async () => {
       const { getByLabelText: getByLabelTextLocal } = render(
-        <AppContext.Provider value={{ settings: mockSettings, updateSetting }}>
+        <AppContext.Provider
+          value={{
+            settings: mockSettings,
+            accounts: mockAccounts,
+            updateSetting,
+          }}
+        >
           <MemoryRouter>
             <SettingsRoute />
           </MemoryRouter>
@@ -154,7 +190,13 @@ describe('routes/Settings.tsx', () => {
 
     await act(async () => {
       const { getByLabelText: getByLabelTextLocal } = render(
-        <AppContext.Provider value={{ settings: mockSettings, updateSetting }}>
+        <AppContext.Provider
+          value={{
+            settings: mockSettings,
+            accounts: mockAccounts,
+            updateSetting,
+          }}
+        >
           <MemoryRouter>
             <SettingsRoute />
           </MemoryRouter>
@@ -176,7 +218,13 @@ describe('routes/Settings.tsx', () => {
 
     await act(async () => {
       const { getByLabelText: getByLabelTextLocal } = render(
-        <AppContext.Provider value={{ settings: mockSettings, updateSetting }}>
+        <AppContext.Provider
+          value={{
+            settings: mockSettings,
+            accounts: mockAccounts,
+            updateSetting,
+          }}
+        >
           <MemoryRouter>
             <SettingsRoute />
           </MemoryRouter>
@@ -198,7 +246,13 @@ describe('routes/Settings.tsx', () => {
 
     await act(async () => {
       const { getByLabelText: getByLabelTextLocal } = render(
-        <AppContext.Provider value={{ settings: mockSettings, updateSetting }}>
+        <AppContext.Provider
+          value={{
+            settings: mockSettings,
+            accounts: mockAccounts,
+            updateSetting,
+          }}
+        >
           <MemoryRouter>
             <SettingsRoute />
           </MemoryRouter>
@@ -218,7 +272,12 @@ describe('routes/Settings.tsx', () => {
 
     await act(async () => {
       const { getByLabelText: getByLabelTextLocal } = render(
-        <AppContext.Provider value={{ settings: mockSettings }}>
+        <AppContext.Provider
+          value={{
+            settings: mockSettings,
+            accounts: mockAccounts,
+          }}
+        >
           <MemoryRouter>
             <SettingsRoute />
           </MemoryRouter>
@@ -238,7 +297,9 @@ describe('routes/Settings.tsx', () => {
 
     await act(async () => {
       const { getByLabelText: getByLabelTextLocal } = render(
-        <AppContext.Provider value={{ settings: mockSettings }}>
+        <AppContext.Provider
+          value={{ settings: mockSettings, accounts: mockAccounts }}
+        >
           <MemoryRouter>
             <SettingsRoute />
           </MemoryRouter>
@@ -250,4 +311,86 @@ describe('routes/Settings.tsx', () => {
     fireEvent.click(getByLabelText('Quit Gitify'));
     expect(ipcRenderer.send).toHaveBeenCalledWith('app-quit');
   });
+
+  it('should be able to enable colors', async () => {
+    jest.spyOn(apiRequests, 'apiRequestAuth').mockResolvedValue({
+      headers: {
+        'x-oauth-scopes': Constants.AUTH_SCOPE.join(', '),
+      },
+    } as unknown as AxiosResponse);
+
+    await act(async () => {
+      render(
+        <AppContext.Provider
+          value={{
+            settings: mockSettings,
+            accounts: mockAccounts,
+            updateSetting,
+          }}
+        >
+          <MemoryRouter>
+            <SettingsRoute />
+          </MemoryRouter>
+        </AppContext.Provider>,
+      );
+    });
+
+    await screen.findByLabelText('Use GitHub-like state colors');
+
+    fireEvent.click(screen.getByLabelText('Use GitHub-like state colors'));
+
+    expect(updateSetting).toHaveBeenCalledTimes(1);
+    expect(updateSetting).toHaveBeenCalledWith('colors', true);
+  });
+
+  it('should not be able to enable colors due to missing scope', async () => {
+    jest.spyOn(apiRequests, 'apiRequestAuth').mockResolvedValue({
+      headers: {
+        'x-oauth-scopes': 'read:user, notifications',
+      },
+    } as unknown as AxiosResponse);
+
+    await act(async () => {
+      render(
+        <AppContext.Provider
+          value={{
+            settings: mockSettings,
+            accounts: mockAccounts,
+            updateSetting,
+          }}
+        >
+          <MemoryRouter>
+            <SettingsRoute />
+          </MemoryRouter>
+        </AppContext.Provider>,
+      );
+    });
+
+    expect(
+      screen
+        .getByLabelText('Use GitHub-like state colors (requires repo scope)')
+        .closest('input'),
+    ).toHaveProperty('disabled', true);
+
+    // click the checkbox
+    fireEvent.click(
+      screen.getByLabelText(
+        'Use GitHub-like state colors (requires repo scope)',
+      ),
+    );
+
+    // check if the checkbox is still unchecked
+    expect(updateSetting).not.toHaveBeenCalled();
+    expect(
+      screen.getByLabelText(
+        'Use GitHub-like state colors (requires repo scope)',
+      ),
+    ).not.toBe('checked');
+
+    expect(
+      screen.getByLabelText(
+        'Use GitHub-like state colors (requires repo scope)',
+      ).parentNode.parentNode,
+    ).toMatchSnapshot();
+  });
 });
diff --git a/src/routes/__snapshots__/Settings.test.tsx.snap b/src/routes/__snapshots__/Settings.test.tsx.snap
index 3aa7b4c7..c01feb0d 100644
--- a/src/routes/__snapshots__/Settings.test.tsx.snap
+++ b/src/routes/__snapshots__/Settings.test.tsx.snap
@@ -1,5 +1,33 @@
 // Jest Snapshot v1, https://goo.gl/fbAQLP
 
+exports[`routes/Settings.tsx should not be able to enable colors due to missing scope 1`] = `
+<div
+  class="flex items-start mt-1 mb-3"
+>
+  <div
+    class="flex items-center h-5"
+  >
+    <input
+      class="focus:ring-indigo-500 h-4 w-4 text-indigo-600 border-gray-300 rounded"
+      disabled=""
+      id="colors"
+      type="checkbox"
+    />
+  </div>
+  <div
+    class="ml-3 text-sm"
+  >
+    <label
+      class="font-medium text-gray-700 dark:text-gray-200"
+      for="colors"
+      style="text-decoration: line-through;"
+    >
+      Use GitHub-like state colors (requires repo scope)
+    </label>
+  </div>
+</div>
+`;
+
 exports[`routes/Settings.tsx should render itself & its children 1`] = `
 <div
   className="flex flex-1 flex-col dark:bg-gray-dark dark:text-white"
@@ -128,6 +156,7 @@ exports[`routes/Settings.tsx should render itself & its children 1`] = `
         <input
           checked={false}
           className="focus:ring-indigo-500 h-4 w-4 text-indigo-600 border-gray-300 rounded"
+          disabled={false}
           id="colors"
           onChange={[Function]}
           type="checkbox"
@@ -140,7 +169,7 @@ exports[`routes/Settings.tsx should render itself & its children 1`] = `
           className="font-medium text-gray-700 dark:text-gray-200"
           htmlFor="colors"
         >
-          Use colors to indicate state
+          Use GitHub-like state colors
         </label>
       </div>
     </div>