Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
46 changes: 26 additions & 20 deletions frontend/src/components/mining/stepper-panels/mine/MinePanel.vue
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,7 @@
import type { TreeSelectionKeys } from 'primevue/tree';

import ProgressCard from '@/components/mining/ProgressCard.vue';
import { requiresActiveMiningSource } from '@/utils/mining-source-guards';
import { useWebNotification } from '@vueuse/core';
import type { MiningSource } from '~/types/mining';
import MiningSettingsDialog from './MiningSettingsDialog.vue';
Expand Down Expand Up @@ -136,24 +137,29 @@

async function handleAuthErrorAndRetry(
retryFn: () => Promise<void>,
sourceEmail: string,
sourceTypeVal: string,
sourceEmail?: string,
sourceTypeVal?: string,
) {
try {
const { error: refreshError } = await $supabase.auth.refreshSession();
if (refreshError) {
console.error('Token refresh failed:', refreshError);

Check warning on line 146 in frontend/src/components/mining/stepper-panels/mine/MinePanel.vue

View workflow job for this annotation

GitHub Actions / frontend

Unexpected console statement
}
await retryFn();
} catch (error) {
if (error instanceof FetchError && error.response?.status === 401) {
if (
error instanceof FetchError &&
error.response?.status === 401 &&
sourceEmail &&
sourceTypeVal
) {
$consentSidebar.show(
sourceTypeVal as 'google' | 'microsoft' | 'imap',
sourceEmail,
'/mine',
);
} else {
console.error('Mining error:', error);

Check warning on line 162 in frontend/src/components/mining/stepper-panels/mine/MinePanel.vue

View workflow job for this annotation

GitHub Actions / frontend

Unexpected console statement
$toast.add({
severity: 'error',
summary: $t('common.start_mining'),
Expand Down Expand Up @@ -266,7 +272,7 @@

try {
await $leadminerStore.fetchInbox();
} catch (error: any) {

Check warning on line 275 in frontend/src/components/mining/stepper-panels/mine/MinePanel.vue

View workflow job for this annotation

GitHub Actions / frontend

Unexpected any. Specify a different type
if (error?.statusCode === 502 || error?.statusCode === 503) {
$stepper.prev();
} else if (miningSource) {
Expand Down Expand Up @@ -349,33 +355,33 @@
return;
}
canceled.value = false;
if (!$leadminerStore.activeMiningSource) return;

if (
requiresActiveMiningSource(sourceType.value) &&
!$leadminerStore.activeMiningSource
) {
return;
}

const activeSource = $leadminerStore.activeMiningSource;
if (!activeSource) return;

await handleAuthErrorAndRetry(
() => $leadminerStore.startMining(sourceType.value),
$leadminerStore.activeMiningSource.email,
$leadminerStore.activeMiningSource.type,
activeSource.email,
activeSource.type,
);
}

async function startMiningFile() {
if (!$leadminerStore.activeMiningSource) return;
await handleAuthErrorAndRetry(
() => $leadminerStore.startMining(sourceType.value),
$leadminerStore.activeMiningSource.email,
$leadminerStore.activeMiningSource.type,
await handleAuthErrorAndRetry(() =>
$leadminerStore.startMining(sourceType.value),
);
}

async function startMiningPst() {
if (!$leadminerStore.activeMiningSource) return;
await handleAuthErrorAndRetry(
() =>
$leadminerStore.startMining(
sourceType.value,
$leadminerStore.pstFilePath,
),
$leadminerStore.activeMiningSource.email,
$leadminerStore.activeMiningSource.type,
await handleAuthErrorAndRetry(() =>
$leadminerStore.startMining(sourceType.value, $leadminerStore.pstFilePath),
);
}

Expand Down
16 changes: 16 additions & 0 deletions frontend/src/pages/u/[token].vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
<template>
<div />
</template>

<script setup lang="ts">
const $route = useRoute();
const token = $route.params.token as string;

const previewModes = ['preview-unsubscribe', 'preview-open', 'preview-click'];

if (previewModes.includes(token)) {
await navigateTo(`/unsubscribe/success?preview=true`, { external: true });
} else {
await navigateTo(`/unsubscribe/success?sender=`, { external: true });
}
</script>
11 changes: 11 additions & 0 deletions frontend/src/tests/unit/mining-source-guards.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import { describe, expect, it } from 'vitest';

import { requiresActiveMiningSource } from '@/utils/mining-source-guards';

describe('requiresActiveMiningSource', () => {
it('requires an active source only for email mining', () => {
expect(requiresActiveMiningSource('email')).toBe(true);
expect(requiresActiveMiningSource('file')).toBe(false);
expect(requiresActiveMiningSource('pst')).toBe(false);
});
});
5 changes: 5 additions & 0 deletions frontend/src/utils/mining-source-guards.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import type { MiningType } from '~/types/mining';

export function requiresActiveMiningSource(miningType: MiningType): boolean {
return miningType === 'email';
}
Loading