refactor(person-mention): hoist LoadState + HoverData into shared types module
Markus flagged the LoadState export from PersonHoverCard.svelte as a view-vs-orchestrator boundary smell — both files own the same shape, and a third caller (admin previews, briefwechsel cards) would create a circular import. Move the types into src/lib/types/personHoverCard.ts so the contract is module-stable. Also harden .prettierignore + eslint.config.js so a stray .svelte-kit.old/ backup directory (rotated by SvelteKit during dev) doesn't break the lint hook — matches the existing .svelte-kit-backup/ convention. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -11,6 +11,7 @@ bun.lockb
|
|||||||
# Build artifacts
|
# Build artifacts
|
||||||
/.svelte-kit/
|
/.svelte-kit/
|
||||||
/.svelte-kit-backup/
|
/.svelte-kit-backup/
|
||||||
|
/.svelte-kit.old/
|
||||||
|
|
||||||
# Generated files
|
# Generated files
|
||||||
/.svelte-kit-backup/
|
/.svelte-kit-backup/
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ const gitignorePath = fileURLToPath(new URL('./.gitignore', import.meta.url));
|
|||||||
|
|
||||||
export default defineConfig(
|
export default defineConfig(
|
||||||
includeIgnoreFile(gitignorePath),
|
includeIgnoreFile(gitignorePath),
|
||||||
{ ignores: ['src/paraglide/**'] },
|
{ ignores: ['src/paraglide/**', '.svelte-kit.old/**'] },
|
||||||
js.configs.recommended,
|
js.configs.recommended,
|
||||||
...ts.configs.recommended,
|
...ts.configs.recommended,
|
||||||
...svelte.configs.recommended,
|
...svelte.configs.recommended,
|
||||||
|
|||||||
@@ -2,15 +2,10 @@
|
|||||||
import { m } from '$lib/paraglide/messages.js';
|
import { m } from '$lib/paraglide/messages.js';
|
||||||
import { formatLifeDateRange } from '$lib/utils/personLifeDates';
|
import { formatLifeDateRange } from '$lib/utils/personLifeDates';
|
||||||
import type { components } from '$lib/generated/api';
|
import type { components } from '$lib/generated/api';
|
||||||
|
import type { LoadState } from '$lib/types/personHoverCard';
|
||||||
|
|
||||||
type Person = components['schemas']['Person'];
|
|
||||||
type RelationshipDTO = components['schemas']['RelationshipDTO'];
|
type RelationshipDTO = components['schemas']['RelationshipDTO'];
|
||||||
|
|
||||||
export type LoadState =
|
|
||||||
| { status: 'loading' }
|
|
||||||
| { status: 'error' }
|
|
||||||
| { status: 'loaded'; person: Person; relationships: RelationshipDTO[] };
|
|
||||||
|
|
||||||
type Props = {
|
type Props = {
|
||||||
personId: string;
|
personId: string;
|
||||||
cardId: string;
|
cardId: string;
|
||||||
|
|||||||
@@ -3,15 +3,14 @@ import type { TranscriptionBlockData } from '$lib/types';
|
|||||||
import type { components } from '$lib/generated/api';
|
import type { components } from '$lib/generated/api';
|
||||||
import { splitByMarkers } from '$lib/utils/transcriptionMarkers';
|
import { splitByMarkers } from '$lib/utils/transcriptionMarkers';
|
||||||
import { renderTranscriptionBody } from '$lib/utils/mention';
|
import { renderTranscriptionBody } from '$lib/utils/mention';
|
||||||
import PersonHoverCard, { type LoadState } from './PersonHoverCard.svelte';
|
import PersonHoverCard from './PersonHoverCard.svelte';
|
||||||
|
import type { HoverData, LoadState } from '$lib/types/personHoverCard';
|
||||||
import { goto } from '$app/navigation';
|
import { goto } from '$app/navigation';
|
||||||
import { SvelteMap, SvelteSet } from 'svelte/reactivity';
|
import { SvelteMap, SvelteSet } from 'svelte/reactivity';
|
||||||
|
|
||||||
type Person = components['schemas']['Person'];
|
type Person = components['schemas']['Person'];
|
||||||
type RelationshipDTO = components['schemas']['RelationshipDTO'];
|
type RelationshipDTO = components['schemas']['RelationshipDTO'];
|
||||||
|
|
||||||
type HoverData = { person: Person; relationships: RelationshipDTO[] };
|
|
||||||
|
|
||||||
interface Props {
|
interface Props {
|
||||||
blocks: TranscriptionBlockData[];
|
blocks: TranscriptionBlockData[];
|
||||||
onParagraphClick: (annotationId: string) => void;
|
onParagraphClick: (annotationId: string) => void;
|
||||||
|
|||||||
23
frontend/src/lib/types/personHoverCard.ts
Normal file
23
frontend/src/lib/types/personHoverCard.ts
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
import type { components } from '$lib/generated/api';
|
||||||
|
|
||||||
|
type Person = components['schemas']['Person'];
|
||||||
|
type RelationshipDTO = components['schemas']['RelationshipDTO'];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Data the PersonHoverCard needs to render its loaded state.
|
||||||
|
* Bundled here so the orchestrator (TranscriptionReadView) and the view
|
||||||
|
* (PersonHoverCard) share one canonical shape.
|
||||||
|
*/
|
||||||
|
export type HoverData = { person: Person; relationships: RelationshipDTO[] };
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The hover card's three visible states.
|
||||||
|
*
|
||||||
|
* `loading` — initial fetch in flight; skeleton is shown
|
||||||
|
* `error` — fetch failed (non-404, non-OK); generic error message + footer link
|
||||||
|
* `loaded` — fetch succeeded; person + relationships available
|
||||||
|
*/
|
||||||
|
export type LoadState =
|
||||||
|
| { status: 'loading' }
|
||||||
|
| { status: 'error' }
|
||||||
|
| { status: 'loaded'; person: Person; relationships: RelationshipDTO[] };
|
||||||
Reference in New Issue
Block a user