diff --git a/src/lib/api/adapters/__tests__/party.adapter.test.ts b/src/lib/api/adapters/__tests__/party.adapter.test.ts index a7c7bb8e..d792ab93 100644 --- a/src/lib/api/adapters/__tests__/party.adapter.test.ts +++ b/src/lib/api/adapters/__tests__/party.adapter.test.ts @@ -18,7 +18,7 @@ describe('PartyAdapter', () => { shortcode: 'ABC123', name: 'Test Party', description: 'Test description', - visibility: 0, + visibility: 'public', user: { id: 'user-1', username: 'testuser' diff --git a/src/lib/api/adapters/__tests__/user.adapter.test.ts b/src/lib/api/adapters/__tests__/user.adapter.test.ts index 0a5e62d6..e691992e 100644 --- a/src/lib/api/adapters/__tests__/user.adapter.test.ts +++ b/src/lib/api/adapters/__tests__/user.adapter.test.ts @@ -52,7 +52,7 @@ describe('UserAdapter', () => { shortcode: 'abc123', name: 'Fire Team', user: mockUser, - visibility: 0, + visibility: 'public', element: 1, characters: [], weapons: [], diff --git a/src/lib/api/schemas/party.ts b/src/lib/api/schemas/party.ts index 6999626d..75700a6d 100644 --- a/src/lib/api/schemas/party.ts +++ b/src/lib/api/schemas/party.ts @@ -120,7 +120,7 @@ const MinimalScalarsSchema = z buttonCount: z.number().nullish().optional(), chainCount: z.number().nullish().optional(), turnCount: z.number().nullish().optional(), - visibility: z.number().nullish().optional() + visibility: z.enum(['public', 'private', 'unlisted']).nullish().optional() }) .partial() @@ -344,7 +344,7 @@ export const PartySchemaRaw = z.object({ name: z.string().nullish(), description: z.string().nullish(), shortcode: z.string(), - visibility: z.number().nullish().default(1), + visibility: z.enum(['public', 'private', 'unlisted']).nullish().default('private'), element: z.number().nullish(), // Battle settings diff --git a/src/lib/services/party.service.ts b/src/lib/services/party.service.ts index 82a3911d..ba362ccf 100644 --- a/src/lib/services/party.service.ts +++ b/src/lib/services/party.service.ts @@ -35,7 +35,7 @@ export interface PartyUpdatePayload { chainCount?: number | null turnCount?: number | null jobId?: string - visibility?: number + visibility?: import('$lib/types/visibility').PartyVisibility localId?: string } @@ -295,15 +295,7 @@ export class PartyService { if (payload.chainCount !== undefined) mapped.chainCount = payload.chainCount if (payload.turnCount !== undefined) mapped.turnCount = payload.turnCount if (payload.jobId !== undefined) mapped.jobId = payload.jobId - if (payload.visibility !== undefined) { - // Convert number visibility to string - const visibilityMap: Record = { - 0: 'public', - 1: 'private', - 2: 'unlisted' - } - mapped.visibility = visibilityMap[payload.visibility] || 'public' - } + if (payload.visibility !== undefined) mapped.visibility = payload.visibility if (payload.localId !== undefined) mapped.localId = payload.localId return mapped diff --git a/src/lib/types/api/party.ts b/src/lib/types/api/party.ts index 627323f8..7a70d442 100644 --- a/src/lib/types/api/party.ts +++ b/src/lib/types/api/party.ts @@ -92,7 +92,7 @@ export interface Party { buttonCount?: number turnCount?: number chainCount?: number - visibility?: number + visibility?: import('$lib/types/visibility').PartyVisibility element?: number favorited?: boolean extra?: boolean @@ -125,7 +125,7 @@ export interface PartyPreview { shortcode: string name?: string favorited?: boolean - visibility?: number + visibility?: import('$lib/types/visibility').PartyVisibility raid?: { name: { en: string; ja: string } group?: { diff --git a/src/lib/types/visibility.ts b/src/lib/types/visibility.ts new file mode 100644 index 00000000..fe8a511a --- /dev/null +++ b/src/lib/types/visibility.ts @@ -0,0 +1,44 @@ +/** + * Party visibility values + * + * These determine who can view a party: + * - public: Anyone can see it + * - private: Only the owner can see it + * - unlisted: Anyone with the link can see it (not in public listings) + */ +export const PartyVisibility = { + PUBLIC: 'public', + PRIVATE: 'private', + UNLISTED: 'unlisted' +} as const + +export type PartyVisibility = (typeof PartyVisibility)[keyof typeof PartyVisibility] + +/** + * Legacy mapping from numeric visibility values to string literals + * Used for backward compatibility when reading from API + * + * @deprecated New code should use string literals directly + */ +export function numericToVisibility(value: number): PartyVisibility { + const map: Record = { + 0: PartyVisibility.PUBLIC, + 1: PartyVisibility.PRIVATE, + 2: PartyVisibility.UNLISTED + } + return map[value] ?? PartyVisibility.PUBLIC +} + +/** + * Convert visibility string to numeric value for API compatibility + * + * @deprecated Should be removed once API accepts string literals + */ +export function visibilityToNumeric(value: PartyVisibility): number { + const map: Record = { + [PartyVisibility.PUBLIC]: 0, + [PartyVisibility.PRIVATE]: 1, + [PartyVisibility.UNLISTED]: 2 + } + return map[value] +}