feat: watchlist (premium), mobile bottom nav
Build & Push Docker Image / build (push) Successful in 2m35s

This commit is contained in:
opencode
2026-08-02 13:00:10 +02:00
parent c77610786b
commit d033b20dfb
14 changed files with 383 additions and 12 deletions
+29 -3
View File
@@ -485,7 +485,8 @@ export const GetMeResponse = zod.object({
*/
export const GetMePreferencesResponse = zod.object({
"view": zod.enum(['grid', 'table', 'rows']).optional(),
"density": zod.enum(['cozy', 'compact']).optional()
"density": zod.enum(['cozy', 'compact']).optional(),
"watchlist": zod.array(zod.number()).optional()
})
@@ -494,15 +495,40 @@ export const GetMePreferencesResponse = zod.object({
*/
export const UpdateMePreferencesBody = zod.object({
"view": zod.enum(['grid', 'table', 'rows']).optional(),
"density": zod.enum(['cozy', 'compact']).optional()
"density": zod.enum(['cozy', 'compact']).optional(),
"watchlist": zod.array(zod.number()).optional()
})
export const UpdateMePreferencesResponse = zod.object({
"view": zod.enum(['grid', 'table', 'rows']).optional(),
"density": zod.enum(['cozy', 'compact']).optional()
"density": zod.enum(['cozy', 'compact']).optional(),
"watchlist": zod.array(zod.number()).optional()
})
/**
* @summary Get current user's watchlist tools (premium)
*/
export const GetMeWatchlistResponseItem = zod.object({
"id": zod.number(),
"name": zod.string(),
"description": zod.string(),
"category": zod.string(),
"websiteUrl": zod.string().nullish(),
"iconUrl": zod.string().nullish(),
"createdBy": zod.string().nullish(),
"features": zod.array(zod.string()).optional(),
"tags": zod.array(zod.string()).optional(),
"createdAt": zod.coerce.date(),
"updatedAt": zod.coerce.date(),
"ratingCount": zod.number(),
"avgUsefulness": zod.number().nullable(),
"avgUsability": zod.number().nullable(),
"avgCombined": zod.number().nullable()
})
export const GetMeWatchlistResponse = zod.array(GetMeWatchlistResponseItem)
/**
* @summary List all local users (admin only)
*/
@@ -11,4 +11,5 @@ import type { UserPreferencesView } from './userPreferencesView';
export interface UserPreferences {
view?: UserPreferencesView;
density?: UserPreferencesDensity;
watchlist?: number[];
}