diff --git a/.github/workflows/sentry-release.yml b/.github/workflows/sentry-release.yml index 7142df4..a6ac475 100644 --- a/.github/workflows/sentry-release.yml +++ b/.github/workflows/sentry-release.yml @@ -16,6 +16,12 @@ jobs: steps: - uses: actions/checkout@v3 + - uses: actions/setup-node@v3 + with: + node-version: "lts/*" + cache: "npm" + - run: npm install + - run: npm run build - name: Sentry Release uses: getsentry/action-release@v1.2.0 env: @@ -25,3 +31,4 @@ jobs: with: environment: production ignore_empty: true + sourcemaps: './build/assets' diff --git a/src/contexts/AuthContext.tsx b/src/contexts/AuthContext.tsx index af33d34..bff91db 100644 --- a/src/contexts/AuthContext.tsx +++ b/src/contexts/AuthContext.tsx @@ -6,10 +6,10 @@ import { useMemo, useState, } from 'react'; -import { User } from 'pocketbase'; import { client, formatError, + User, } from '../pocketbase'; import { buildRedirectUrl } from '../utils/url'; import { Collections } from '../@types/pocketbase-types'; diff --git a/src/hooks/useDb.ts b/src/hooks/useDb.ts index 66d8ace..4e12d5b 100644 --- a/src/hooks/useDb.ts +++ b/src/hooks/useDb.ts @@ -2,6 +2,7 @@ import * as Sentry from '@sentry/browser'; import { client, formatError, + ClientResponseError, } from '../pocketbase'; import { IniFilesRecordFull, @@ -49,6 +50,10 @@ const useDb = () => { return Promise.resolve(tune.totalItems > 0 ? tune.items[0] as TunesRecordFull : null); } catch (error) { + if ((error as ClientResponseError).isAbort) { + return Promise.reject(new Error('Cancelled')); + } + Sentry.captureException(error); databaseGenericError(new Error(formatError(error))); @@ -64,6 +69,10 @@ const useDb = () => { return Promise.resolve(tune.totalItems > 0 ? tune.items[0] as IniFilesRecordFull : null); } catch (error) { + if ((error as ClientResponseError).isAbort) { + return Promise.reject(new Error('Cancelled')); + } + Sentry.captureException(error); databaseGenericError(new Error(formatError(error))); @@ -90,6 +99,10 @@ const useDb = () => { totalItems: list.totalItems, }); } catch (error) { + if ((error as ClientResponseError).isAbort) { + return Promise.reject(new Error('Cancelled')); + } + Sentry.captureException(error); databaseGenericError(new Error(formatError(error))); diff --git a/src/pages/Hub.tsx b/src/pages/Hub.tsx index f123c19..0eaf315 100644 --- a/src/pages/Hub.tsx +++ b/src/pages/Hub.tsx @@ -57,26 +57,31 @@ const Hub = () => { const loadData = debounce(async (searchText: string) => { setIsLoading(true); - const { items, totalItems } = await searchTunes(searchText, page, pageSize); - setTotal(totalItems); - const mapped = items.map((tune) => ({ - ...tune, - key: tune.tuneId, - year: tune.year, - author: (tune['@expand'] as { userProfile: ProfilesRecord }).userProfile.username, - displacement: `${tune.displacement}l`, - aspiration: aspirationMapper[tune.aspiration], - published: formatTime(tune.updated), - stars: 0, - })); - setDataSource(mapped); - setIsLoading(false); + try { + const { items, totalItems } = await searchTunes(searchText, page, pageSize); + setTotal(totalItems); + const mapped = items.map((tune) => ({ + ...tune, + key: tune.tuneId, + year: tune.year, + author: (tune['@expand'] as { userProfile: ProfilesRecord }).userProfile.username, + displacement: `${tune.displacement}l`, + aspiration: aspirationMapper[tune.aspiration], + published: formatTime(tune.updated), + stars: 0, + })); + setDataSource(mapped); + } catch (error) { + // request cancelled + } finally { + setIsLoading(false); + } }, 300); const debounceLoadData = useCallback((value: string) => { setSearchQuery(value); loadData(value); - // eslint-disable-next-line react-hooks/exhaustive-deps + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); const handleGlobalKeyboard = useCallback((e: KeyboardEvent) => { diff --git a/src/pocketbase.ts b/src/pocketbase.ts index 410e3e4..a5e5259 100644 --- a/src/pocketbase.ts +++ b/src/pocketbase.ts @@ -1,4 +1,8 @@ -import PocketBase from 'pocketbase'; +import PocketBase, { + ClientResponseError, + User, + Record, +} from 'pocketbase'; import { fetchEnv } from './utils/env'; const API_URL = fetchEnv('VITE_POCKETBASE_API_URL'); @@ -28,4 +32,7 @@ export { formatError, formatTime, removeFilenameSuffix, + ClientResponseError, + User, + Record, }; diff --git a/src/types/dbData.ts b/src/types/dbData.ts index 38c3b48..a2a57ff 100644 --- a/src/types/dbData.ts +++ b/src/types/dbData.ts @@ -1,4 +1,4 @@ -import { Record } from 'pocketbase'; +import { Record } from '../pocketbase'; import { IniFilesRecord, ProfilesRecord, diff --git a/vite.config.ts b/vite.config.ts index 11c3a92..68bc7d5 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -5,7 +5,7 @@ import { visualizer } from 'rollup-plugin-visualizer'; // https://vitejs.dev/config/ export default defineConfig({ build: { - outDir: 'build', // This changes the out put dir from dist to build + outDir: 'build', sourcemap: true, rollupOptions: { output: {