Repository: gitify-app/gitify
Pull request #1356 (2024-07-10 13:09:25)

feat: add support for RepositoryDependabotAlertsThread


Patch:
diff --git a/.husky/pre-commit b/.husky/pre-commit
index 09dd6bf4..cb2c84d5 100644
--- a/.husky/pre-commit
+++ b/.husky/pre-commit
@@ -1,1 +1,1 @@
-pnpx lint-staged
+pnpm lint-staged
diff --git a/package.json b/package.json
index f1927596..5e8680b7 100644
--- a/package.json
+++ b/package.json
@@ -150,7 +150,7 @@
   },
   "packageManager": "pnpm@9.5.0",
   "lint-staged": {
-    "*.{js,json,ts,tsx}": "biome format --fix",
+    "*": "biome check --fix --no-errors-on-unmatched",
     "*.{js,ts,tsx}": "pnpm test -- --findRelatedTests -u --passWithNoTests"
   }
 }
diff --git a/src/components/notification/NotificationFooter.tsx b/src/components/notification/NotificationFooter.tsx
index fa883512..ae075d47 100644
--- a/src/components/notification/NotificationFooter.tsx
+++ b/src/components/notification/NotificationFooter.tsx
@@ -1,4 +1,4 @@
-import { FeedPersonIcon } from '@primer/octicons-react';
+import { FeedPersonIcon, MarkGithubIcon } from '@primer/octicons-react';
 import type { FC, MouseEvent } from 'react';
 import { IconColor, Opacity, Size } from '../../types';
 import type { Notification } from '../../typesGitHub';
@@ -50,7 +50,12 @@ export const NotificationFooter: FC<INotificationFooter> = ({
         </button>
       ) : (
         <div>
-          <FeedPersonIcon size={Size.MEDIUM} className={IconColor.GRAY} />
+          {notification.subject.type === 'RepositoryDependabotAlertsThread' ||
+          notification.subject.type === 'RepositoryVulnerabilityAlert' ? (
+            <MarkGithubIcon size={Size.MEDIUM} />
+          ) : (
+            <FeedPersonIcon size={Size.MEDIUM} className={IconColor.GRAY} />
+          )}
         </div>
       )}
       <div title={reason.description}>{reason.title}</div>
diff --git a/src/typesGitHub.ts b/src/typesGitHub.ts
index 39e56723..a9ebf20f 100644
--- a/src/typesGitHub.ts
+++ b/src/typesGitHub.ts
@@ -33,6 +33,7 @@ export type SubjectType =
   | 'Issue'
   | 'PullRequest'
   | 'Release'
+  | 'RepositoryDependabotAlertsThread'
   | 'RepositoryInvitation'
   | 'RepositoryVulnerabilityAlert'
   | 'WorkflowRun';
diff --git a/src/utils/helpers.ts b/src/utils/helpers.ts
index cab914a5..31f047f0 100644
--- a/src/utils/helpers.ts
+++ b/src/utils/helpers.ts
@@ -125,6 +125,9 @@ export async function generateGitHubWebUrl(
       case 'RepositoryInvitation':
         url.pathname += '/invitations';
         break;
+      case 'RepositoryDependabotAlertsThread':
+        url.pathname += '/security/dependabot';
+        break;
       case 'WorkflowRun':
         url.href = getWorkflowRunUrl(notification);
         break;
diff --git a/src/utils/icons.ts b/src/utils/icons.ts
index b85864e2..f6ae990b 100644
--- a/src/utils/icons.ts
+++ b/src/utils/icons.ts
@@ -84,6 +84,8 @@ export function getNotificationTypeIcon(subject: Subject): FC<OcticonProps> {
       }
     case 'Release':
       return TagIcon;
+    case 'RepositoryDependabotAlertsThread':
+      return AlertIcon;
     case 'RepositoryInvitation':
       return MailIcon;
     case 'RepositoryVulnerabilityAlert':


Test patch:
diff --git a/src/components/notification/NotificationFooter.test.tsx b/src/components/notification/NotificationFooter.test.tsx
index 200b919b..fd01cc04 100644
--- a/src/components/notification/NotificationFooter.test.tsx
+++ b/src/components/notification/NotificationFooter.test.tsx
@@ -59,7 +59,49 @@ describe('components/notification/NotificationFooter.tsx', () => {
     expect(tree).toMatchSnapshot();
   });
 
-  it('should render itself & its children without avatar', async () => {
+  describe('security alerts should use github icon for avatar', () => {
+    it('Repository Dependabot Alerts Thread', async () => {
+      jest
+        .spyOn(global.Date, 'now')
+        .mockImplementation(() => new Date('2024').valueOf());
+
+      const mockNotification = mockSingleNotification;
+      mockNotification.subject.type = 'RepositoryDependabotAlertsThread';
+
+      const props = {
+        notification: mockNotification,
+      };
+
+      const tree = render(
+        <AppContext.Provider value={{ settings: mockSettings }}>
+          <NotificationFooter {...props} />
+        </AppContext.Provider>,
+      );
+      expect(tree).toMatchSnapshot();
+    });
+
+    it('Repository Vulnerability Alert', async () => {
+      jest
+        .spyOn(global.Date, 'now')
+        .mockImplementation(() => new Date('2024').valueOf());
+
+      const mockNotification = mockSingleNotification;
+      mockNotification.subject.type = 'RepositoryVulnerabilityAlert';
+
+      const props = {
+        notification: mockNotification,
+      };
+
+      const tree = render(
+        <AppContext.Provider value={{ settings: mockSettings }}>
+          <NotificationFooter {...props} />
+        </AppContext.Provider>,
+      );
+      expect(tree).toMatchSnapshot();
+    });
+  });
+
+  it('should default to known avatar if no user found', async () => {
     jest
       .spyOn(global.Date, 'now')
       .mockImplementation(() => new Date('2024').valueOf());
diff --git a/src/components/notification/__snapshots__/NotificationFooter.test.tsx.snap b/src/components/notification/__snapshots__/NotificationFooter.test.tsx.snap
index 5d59c1f5..7d462c36 100644
--- a/src/components/notification/__snapshots__/NotificationFooter.test.tsx.snap
+++ b/src/components/notification/__snapshots__/NotificationFooter.test.tsx.snap
@@ -1,6 +1,6 @@
 // Jest Snapshot v1, https://goo.gl/fbAQLP
 
-exports[`components/notification/NotificationFooter.tsx should render itself & its children 1`] = `
+exports[`components/notification/NotificationFooter.tsx security alerts should use github icon for avatar Repository Dependabot Alerts Thread 1`] = `
 {
   "asFragment": [Function],
   "baseElement": <body>
@@ -209,7 +209,7 @@ exports[`components/notification/NotificationFooter.tsx should render itself & i
 }
 `;
 
-exports[`components/notification/NotificationFooter.tsx should render itself & its children when last_read_at is null 1`] = `
+exports[`components/notification/NotificationFooter.tsx security alerts should use github icon for avatar Repository Vulnerability Alert 1`] = `
 {
   "asFragment": [Function],
   "baseElement": <body>
@@ -418,7 +418,7 @@ exports[`components/notification/NotificationFooter.tsx should render itself & i
 }
 `;
 
-exports[`components/notification/NotificationFooter.tsx should render itself & its children without avatar 1`] = `
+exports[`components/notification/NotificationFooter.tsx should default to known avatar if no user found 1`] = `
 {
   "asFragment": [Function],
   "baseElement": <body>
@@ -429,7 +429,7 @@ exports[`components/notification/NotificationFooter.tsx should render itself & i
         <div>
           <svg
             aria-hidden="true"
-            class="text-gray-500 dark:text-gray-300"
+            class="octicon octicon-mark-github"
             fill="currentColor"
             focusable="false"
             height="16"
@@ -438,7 +438,7 @@ exports[`components/notification/NotificationFooter.tsx should render itself & i
             width="16"
           >
             <path
-              d="M8 16A8 8 0 1 1 8 0a8 8 0 0 1 0 16Zm.847-8.145a2.502 2.502 0 1 0-1.694 0C5.471 8.261 4 9.775 4 11c0 .395.145.995 1 .995h6c.855 0 1-.6 1-.995 0-1.224-1.47-2.74-3.153-3.145Z"
+              d="M8 0c4.42 0 8 3.58 8 8a8.013 8.013 0 0 1-5.45 7.59c-.4.08-.55-.17-.55-.38 0-.27.01-1.13.01-2.2 0-.75-.25-1.23-.54-1.48 1.78-.2 3.65-.88 3.65-3.95 0-.88-.31-1.59-.82-2.15.08-.2.36-1.02-.08-2.12 0 0-.67-.22-2.2.82-.64-.18-1.32-.27-2-.27-.68 0-1.36.09-2 .27-1.53-1.03-2.2-.82-2.2-.82-.44 1.1-.16 1.92-.08 2.12-.51.56-.82 1.28-.82 2.15 0 3.06 1.86 3.75 3.64 3.95-.23.2-.44.55-.51 1.07-.46.21-1.61.55-2.33-.66-.15-.24-.6-.83-1.23-.82-.67.01-.27.38.01.53.34.19.73.9.82 1.13.16.45.68 1.31 2.69.94 0 .67.01 1.3.01 1.49 0 .21-.15.45-.55.38A7.995 7.995 0 0 1 0 8c0-4.42 3.58-8 8-8Z"
             />
           </svg>
         </div>
@@ -510,7 +510,7 @@ exports[`components/notification/NotificationFooter.tsx should render itself & i
       <div>
         <svg
           aria-hidden="true"
-          class="text-gray-500 dark:text-gray-300"
+          class="octicon octicon-mark-github"
           fill="currentColor"
           focusable="false"
           height="16"
@@ -519,7 +519,7 @@ exports[`components/notification/NotificationFooter.tsx should render itself & i
           width="16"
         >
           <path
-            d="M8 16A8 8 0 1 1 8 0a8 8 0 0 1 0 16Zm.847-8.145a2.502 2.502 0 1 0-1.694 0C5.471 8.261 4 9.775 4 11c0 .395.145.995 1 .995h6c.855 0 1-.6 1-.995 0-1.224-1.47-2.74-3.153-3.145Z"
+            d="M8 0c4.42 0 8 3.58 8 8a8.013 8.013 0 0 1-5.45 7.59c-.4.08-.55-.17-.55-.38 0-.27.01-1.13.01-2.2 0-.75-.25-1.23-.54-1.48 1.78-.2 3.65-.88 3.65-3.95 0-.88-.31-1.59-.82-2.15.08-.2.36-1.02-.08-2.12 0 0-.67-.22-2.2.82-.64-.18-1.32-.27-2-.27-.68 0-1.36.09-2 .27-1.53-1.03-2.2-.82-2.2-.82-.44 1.1-.16 1.92-.08 2.12-.51.56-.82 1.28-.82 2.15 0 3.06 1.86 3.75 3.64 3.95-.23.2-.44.55-.51 1.07-.46.21-1.61.55-2.33-.66-.15-.24-.6-.83-1.23-.82-.67.01-.27.38.01.53.34.19.73.9.82 1.13.16.45.68 1.31 2.69.94 0 .67.01 1.3.01 1.49 0 .21-.15.45-.55.38A7.995 7.995 0 0 1 0 8c0-4.42 3.58-8 8-8Z"
           />
         </svg>
       </div>
@@ -636,3 +636,421 @@ exports[`components/notification/NotificationFooter.tsx should render itself & i
   "unmount": [Function],
 }
 `;
+
+exports[`components/notification/NotificationFooter.tsx should render itself & its children 1`] = `
+{
+  "asFragment": [Function],
+  "baseElement": <body>
+    <div>
+      <div
+        class="flex flex-wrap items-center gap-1 text-xs capitalize opacity-80"
+      >
+        <button
+          class="flex-shrink-0"
+          title="View User Profile"
+          type="button"
+        >
+          <img
+            alt="gitify-app's avatar"
+            class="rounded-full object-cover size-4"
+            src="https://avatars.githubusercontent.com/u/133795385?s=200&v=4"
+          />
+        </button>
+        <div
+          title="You're watching the repository."
+        >
+          Updated
+        </div>
+        <div
+          title="gitify-app updated 7 years ago"
+        >
+          7 years ago
+        </div>
+        <div
+          class="flex"
+        >
+          <button
+            class="flex gap-1 items-center m-0.5 rounded-full bg-gray-100 px-1 text-xxs hover:bg-gray-200 dark:bg-gray-800 dark:hover:bg-gray-700"
+            title="octocat approved these changes"
+            type="button"
+          >
+            <svg
+              aria-label="octocat approved these changes"
+              class="text-green-500"
+              fill="currentColor"
+              focusable="false"
+              height="12"
+              role="img"
+              style="display: inline-block; user-select: none; vertical-align: text-bottom; overflow: visible;"
+              viewBox="0 0 16 16"
+              width="12"
+            >
+              <path
+                d="M13.78 4.22a.75.75 0 0 1 0 1.06l-7.25 7.25a.75.75 0 0 1-1.06 0L2.22 9.28a.751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018L6 10.94l6.72-6.72a.75.75 0 0 1 1.06 0Z"
+              />
+            </svg>
+            1
+          </button>
+          <button
+            class="flex gap-1 items-center m-0.5 rounded-full bg-gray-100 px-1 text-xxs hover:bg-gray-200 dark:bg-gray-800 dark:hover:bg-gray-700"
+            title="gitify-app requested changes"
+            type="button"
+          >
+            <svg
+              aria-label="gitify-app requested changes"
+              class="text-red-500"
+              fill="currentColor"
+              focusable="false"
+              height="12"
+              role="img"
+              style="display: inline-block; user-select: none; vertical-align: text-bottom; overflow: visible;"
+              viewBox="0 0 16 16"
+              width="12"
+            >
+              <path
+                d="M1 1.75C1 .784 1.784 0 2.75 0h7.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16H2.75A1.75 1.75 0 0 1 1 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h10.5a.25.25 0 0 0 .25-.25V4.664a.25.25 0 0 0-.073-.177l-2.914-2.914a.25.25 0 0 0-.177-.073ZM8 3.25a.75.75 0 0 1 .75.75v1.5h1.5a.75.75 0 0 1 0 1.5h-1.5v1.5a.75.75 0 0 1-1.5 0V7h-1.5a.75.75 0 0 1 0-1.5h1.5V4A.75.75 0 0 1 8 3.25Zm-3 8a.75.75 0 0 1 .75-.75h4.5a.75.75 0 0 1 0 1.5h-4.5a.75.75 0 0 1-.75-.75Z"
+              />
+            </svg>
+            1
+          </button>
+        </div>
+      </div>
+    </div>
+  </body>,
+  "container": <div>
+    <div
+      class="flex flex-wrap items-center gap-1 text-xs capitalize opacity-80"
+    >
+      <button
+        class="flex-shrink-0"
+        title="View User Profile"
+        type="button"
+      >
+        <img
+          alt="gitify-app's avatar"
+          class="rounded-full object-cover size-4"
+          src="https://avatars.githubusercontent.com/u/133795385?s=200&v=4"
+        />
+      </button>
+      <div
+        title="You're watching the repository."
+      >
+        Updated
+      </div>
+      <div
+        title="gitify-app updated 7 years ago"
+      >
+        7 years ago
+      </div>
+      <div
+        class="flex"
+      >
+        <button
+          class="flex gap-1 items-center m-0.5 rounded-full bg-gray-100 px-1 text-xxs hover:bg-gray-200 dark:bg-gray-800 dark:hover:bg-gray-700"
+          title="octocat approved these changes"
+          type="button"
+        >
+          <svg
+            aria-label="octocat approved these changes"
+            class="text-green-500"
+            fill="currentColor"
+            focusable="false"
+            height="12"
+            role="img"
+            style="display: inline-block; user-select: none; vertical-align: text-bottom; overflow: visible;"
+            viewBox="0 0 16 16"
+            width="12"
+          >
+            <path
+              d="M13.78 4.22a.75.75 0 0 1 0 1.06l-7.25 7.25a.75.75 0 0 1-1.06 0L2.22 9.28a.751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018L6 10.94l6.72-6.72a.75.75 0 0 1 1.06 0Z"
+            />
+          </svg>
+          1
+        </button>
+        <button
+          class="flex gap-1 items-center m-0.5 rounded-full bg-gray-100 px-1 text-xxs hover:bg-gray-200 dark:bg-gray-800 dark:hover:bg-gray-700"
+          title="gitify-app requested changes"
+          type="button"
+        >
+          <svg
+            aria-label="gitify-app requested changes"
+            class="text-red-500"
+            fill="currentColor"
+            focusable="false"
+            height="12"
+            role="img"
+            style="display: inline-block; user-select: none; vertical-align: text-bottom; overflow: visible;"
+            viewBox="0 0 16 16"
+            width="12"
+          >
+            <path
+              d="M1 1.75C1 .784 1.784 0 2.75 0h7.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16H2.75A1.75 1.75 0 0 1 1 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h10.5a.25.25 0 0 0 .25-.25V4.664a.25.25 0 0 0-.073-.177l-2.914-2.914a.25.25 0 0 0-.177-.073ZM8 3.25a.75.75 0 0 1 .75.75v1.5h1.5a.75.75 0 0 1 0 1.5h-1.5v1.5a.75.75 0 0 1-1.5 0V7h-1.5a.75.75 0 0 1 0-1.5h1.5V4A.75.75 0 0 1 8 3.25Zm-3 8a.75.75 0 0 1 .75-.75h4.5a.75.75 0 0 1 0 1.5h-4.5a.75.75 0 0 1-.75-.75Z"
+            />
+          </svg>
+          1
+        </button>
+      </div>
+    </div>
+  </div>,
+  "debug": [Function],
+  "findAllByAltText": [Function],
+  "findAllByDisplayValue": [Function],
+  "findAllByLabelText": [Function],
+  "findAllByPlaceholderText": [Function],
+  "findAllByRole": [Function],
+  "findAllByTestId": [Function],
+  "findAllByText": [Function],
+  "findAllByTitle": [Function],
+  "findByAltText": [Function],
+  "findByDisplayValue": [Function],
+  "findByLabelText": [Function],
+  "findByPlaceholderText": [Function],
+  "findByRole": [Function],
+  "findByTestId": [Function],
+  "findByText": [Function],
+  "findByTitle": [Function],
+  "getAllByAltText": [Function],
+  "getAllByDisplayValue": [Function],
+  "getAllByLabelText": [Function],
+  "getAllByPlaceholderText": [Function],
+  "getAllByRole": [Function],
+  "getAllByTestId": [Function],
+  "getAllByText": [Function],
+  "getAllByTitle": [Function],
+  "getByAltText": [Function],
+  "getByDisplayValue": [Function],
+  "getByLabelText": [Function],
+  "getByPlaceholderText": [Function],
+  "getByRole": [Function],
+  "getByTestId": [Function],
+  "getByText": [Function],
+  "getByTitle": [Function],
+  "queryAllByAltText": [Function],
+  "queryAllByDisplayValue": [Function],
+  "queryAllByLabelText": [Function],
+  "queryAllByPlaceholderText": [Function],
+  "queryAllByRole": [Function],
+  "queryAllByTestId": [Function],
+  "queryAllByText": [Function],
+  "queryAllByTitle": [Function],
+  "queryByAltText": [Function],
+  "queryByDisplayValue": [Function],
+  "queryByLabelText": [Function],
+  "queryByPlaceholderText": [Function],
+  "queryByRole": [Function],
+  "queryByTestId": [Function],
+  "queryByText": [Function],
+  "queryByTitle": [Function],
+  "rerender": [Function],
+  "unmount": [Function],
+}
+`;
+
+exports[`components/notification/NotificationFooter.tsx should render itself & its children when last_read_at is null 1`] = `
+{
+  "asFragment": [Function],
+  "baseElement": <body>
+    <div>
+      <div
+        class="flex flex-wrap items-center gap-1 text-xs capitalize opacity-80"
+      >
+        <button
+          class="flex-shrink-0"
+          title="View User Profile"
+          type="button"
+        >
+          <img
+            alt="gitify-app's avatar"
+            class="rounded-full object-cover size-4"
+            src="https://avatars.githubusercontent.com/u/133795385?s=200&v=4"
+          />
+        </button>
+        <div
+          title="You're watching the repository."
+        >
+          Updated
+        </div>
+        <div
+          title="gitify-app updated 7 years ago"
+        >
+          7 years ago
+        </div>
+        <div
+          class="flex"
+        >
+          <button
+            class="flex gap-1 items-center m-0.5 rounded-full bg-gray-100 px-1 text-xxs hover:bg-gray-200 dark:bg-gray-800 dark:hover:bg-gray-700"
+            title="octocat approved these changes"
+            type="button"
+          >
+            <svg
+              aria-label="octocat approved these changes"
+              class="text-green-500"
+              fill="currentColor"
+              focusable="false"
+              height="12"
+              role="img"
+              style="display: inline-block; user-select: none; vertical-align: text-bottom; overflow: visible;"
+              viewBox="0 0 16 16"
+              width="12"
+            >
+              <path
+                d="M13.78 4.22a.75.75 0 0 1 0 1.06l-7.25 7.25a.75.75 0 0 1-1.06 0L2.22 9.28a.751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018L6 10.94l6.72-6.72a.75.75 0 0 1 1.06 0Z"
+              />
+            </svg>
+            1
+          </button>
+          <button
+            class="flex gap-1 items-center m-0.5 rounded-full bg-gray-100 px-1 text-xxs hover:bg-gray-200 dark:bg-gray-800 dark:hover:bg-gray-700"
+            title="gitify-app requested changes"
+            type="button"
+          >
+            <svg
+              aria-label="gitify-app requested changes"
+              class="text-red-500"
+              fill="currentColor"
+              focusable="false"
+              height="12"
+              role="img"
+              style="display: inline-block; user-select: none; vertical-align: text-bottom; overflow: visible;"
+              viewBox="0 0 16 16"
+              width="12"
+            >
+              <path
+                d="M1 1.75C1 .784 1.784 0 2.75 0h7.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16H2.75A1.75 1.75 0 0 1 1 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h10.5a.25.25 0 0 0 .25-.25V4.664a.25.25 0 0 0-.073-.177l-2.914-2.914a.25.25 0 0 0-.177-.073ZM8 3.25a.75.75 0 0 1 .75.75v1.5h1.5a.75.75 0 0 1 0 1.5h-1.5v1.5a.75.75 0 0 1-1.5 0V7h-1.5a.75.75 0 0 1 0-1.5h1.5V4A.75.75 0 0 1 8 3.25Zm-3 8a.75.75 0 0 1 .75-.75h4.5a.75.75 0 0 1 0 1.5h-4.5a.75.75 0 0 1-.75-.75Z"
+              />
+            </svg>
+            1
+          </button>
+        </div>
+      </div>
+    </div>
+  </body>,
+  "container": <div>
+    <div
+      class="flex flex-wrap items-center gap-1 text-xs capitalize opacity-80"
+    >
+      <button
+        class="flex-shrink-0"
+        title="View User Profile"
+        type="button"
+      >
+        <img
+          alt="gitify-app's avatar"
+          class="rounded-full object-cover size-4"
+          src="https://avatars.githubusercontent.com/u/133795385?s=200&v=4"
+        />
+      </button>
+      <div
+        title="You're watching the repository."
+      >
+        Updated
+      </div>
+      <div
+        title="gitify-app updated 7 years ago"
+      >
+        7 years ago
+      </div>
+      <div
+        class="flex"
+      >
+        <button
+          class="flex gap-1 items-center m-0.5 rounded-full bg-gray-100 px-1 text-xxs hover:bg-gray-200 dark:bg-gray-800 dark:hover:bg-gray-700"
+          title="octocat approved these changes"
+          type="button"
+        >
+          <svg
+            aria-label="octocat approved these changes"
+            class="text-green-500"
+            fill="currentColor"
+            focusable="false"
+            height="12"
+            role="img"
+            style="display: inline-block; user-select: none; vertical-align: text-bottom; overflow: visible;"
+            viewBox="0 0 16 16"
+            width="12"
+          >
+            <path
+              d="M13.78 4.22a.75.75 0 0 1 0 1.06l-7.25 7.25a.75.75 0 0 1-1.06 0L2.22 9.28a.751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018L6 10.94l6.72-6.72a.75.75 0 0 1 1.06 0Z"
+            />
+          </svg>
+          1
+        </button>
+        <button
+          class="flex gap-1 items-center m-0.5 rounded-full bg-gray-100 px-1 text-xxs hover:bg-gray-200 dark:bg-gray-800 dark:hover:bg-gray-700"
+          title="gitify-app requested changes"
+          type="button"
+        >
+          <svg
+            aria-label="gitify-app requested changes"
+            class="text-red-500"
+            fill="currentColor"
+            focusable="false"
+            height="12"
+            role="img"
+            style="display: inline-block; user-select: none; vertical-align: text-bottom; overflow: visible;"
+            viewBox="0 0 16 16"
+            width="12"
+          >
+            <path
+              d="M1 1.75C1 .784 1.784 0 2.75 0h7.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16H2.75A1.75 1.75 0 0 1 1 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h10.5a.25.25 0 0 0 .25-.25V4.664a.25.25 0 0 0-.073-.177l-2.914-2.914a.25.25 0 0 0-.177-.073ZM8 3.25a.75.75 0 0 1 .75.75v1.5h1.5a.75.75 0 0 1 0 1.5h-1.5v1.5a.75.75 0 0 1-1.5 0V7h-1.5a.75.75 0 0 1 0-1.5h1.5V4A.75.75 0 0 1 8 3.25Zm-3 8a.75.75 0 0 1 .75-.75h4.5a.75.75 0 0 1 0 1.5h-4.5a.75.75 0 0 1-.75-.75Z"
+            />
+          </svg>
+          1
+        </button>
+      </div>
+    </div>
+  </div>,
+  "debug": [Function],
+  "findAllByAltText": [Function],
+  "findAllByDisplayValue": [Function],
+  "findAllByLabelText": [Function],
+  "findAllByPlaceholderText": [Function],
+  "findAllByRole": [Function],
+  "findAllByTestId": [Function],
+  "findAllByText": [Function],
+  "findAllByTitle": [Function],
+  "findByAltText": [Function],
+  "findByDisplayValue": [Function],
+  "findByLabelText": [Function],
+  "findByPlaceholderText": [Function],
+  "findByRole": [Function],
+  "findByTestId": [Function],
+  "findByText": [Function],
+  "findByTitle": [Function],
+  "getAllByAltText": [Function],
+  "getAllByDisplayValue": [Function],
+  "getAllByLabelText": [Function],
+  "getAllByPlaceholderText": [Function],
+  "getAllByRole": [Function],
+  "getAllByTestId": [Function],
+  "getAllByText": [Function],
+  "getAllByTitle": [Function],
+  "getByAltText": [Function],
+  "getByDisplayValue": [Function],
+  "getByLabelText": [Function],
+  "getByPlaceholderText": [Function],
+  "getByRole": [Function],
+  "getByTestId": [Function],
+  "getByText": [Function],
+  "getByTitle": [Function],
+  "queryAllByAltText": [Function],
+  "queryAllByDisplayValue": [Function],
+  "queryAllByLabelText": [Function],
+  "queryAllByPlaceholderText": [Function],
+  "queryAllByRole": [Function],
+  "queryAllByTestId": [Function],
+  "queryAllByText": [Function],
+  "queryAllByTitle": [Function],
+  "queryByAltText": [Function],
+  "queryByDisplayValue": [Function],
+  "queryByLabelText": [Function],
+  "queryByPlaceholderText": [Function],
+  "queryByRole": [Function],
+  "queryByTestId": [Function],
+  "queryByText": [Function],
+  "queryByTitle": [Function],
+  "rerender": [Function],
+  "unmount": [Function],
+}
+`;
diff --git a/src/utils/helpers.test.ts b/src/utils/helpers.test.ts
index 2dd65315..49c83bfe 100644
--- a/src/utils/helpers.test.ts
+++ b/src/utils/helpers.test.ts
@@ -375,6 +375,25 @@ describe('utils/helpers.ts', () => {
       );
     });
 
+    it('Repository Dependabot Alerts Thread url', async () => {
+      const subject = {
+        title: 'Your repository has dependencies with security vulnerabilities',
+        url: null,
+        latest_comment_url: null,
+        type: 'RepositoryDependabotAlertsThread' as SubjectType,
+      };
+
+      const result = await generateGitHubWebUrl({
+        ...mockSingleNotification,
+        subject: subject,
+      });
+
+      expect(apiRequestAuthMock).toHaveBeenCalledTimes(0);
+      expect(result).toBe(
+        `https://github.com/gitify-app/notifications-test/security/dependabot?${mockNotificationReferrer}`,
+      );
+    });
+
     describe('Workflow Run URLs', () => {
       it('approval requested', async () => {
         const subject = {
diff --git a/src/utils/icons.test.ts b/src/utils/icons.test.ts
index 9e991f51..20d9d8aa 100644
--- a/src/utils/icons.test.ts
+++ b/src/utils/icons.test.ts
@@ -149,6 +149,13 @@ describe('utils/icons.ts', () => {
         }),
       ).displayName,
     ).toBe('TagIcon');
+    expect(
+      getNotificationTypeIcon(
+        createSubjectMock({
+          type: 'RepositoryDependabotAlertsThread',
+        }),
+      ).displayName,
+    ).toBe('AlertIcon');
     expect(
       getNotificationTypeIcon(
         createSubjectMock({