Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 | // API types (match backend DTOs)
export interface ShoppingList {
id: string
name: string
emoji: string
shareToken: string | null
itemCount: number
checkedCount: number
participantCount: number
createdAt: string
updatedAt: string
}
export interface Label {
id: string
name: string
color: string | null
}
export interface Favorite {
id: string
itemName: string
emoji: string | null
}
export interface Item {
id: string
listId: string
name: string
checked: boolean
position: number
categoryId: string | null
categoryName: string | null
categoryColor: string | null
quantity: number | null
quantityUnit: string | null
price: number | null
imageUrl: string | null
labels: Label[]
createdAt: string
updatedAt: string
deletedAt: string | null
createdByDeviceId: string | null
}
export interface BudgetSummary {
total: number
byCategory: Record<string, number>
}
export interface Category {
id: string
name: string
color: string | null
position: number
}
// API response types for sharing
export interface ShareTokenResponse {
token: string
listId: string
listName: string
}
export interface SyncTokenResponse {
token: string
listCount: number
expiresAt: string
}
export interface SyncPreviewResponse {
lists: ShoppingList[]
sourceDisplayName: string | null
sourceProfilePicture: string | null
theme: string
}
export interface SyncApplyResponse {
lists: ShoppingList[]
displayName: string | null
profilePicture: string | null
theme: string
presetsImported: number
}
export interface ParticipantResponse {
deviceId: string
role: string
joinedAt: string
displayName: string | null
profilePicture: string | null
}
// UI-only helpers
export type AccentColor = 'green' | 'teal' | 'sapphire'
export interface Participant {
id: string
initials: string
online: boolean
}
// Request types
export interface CreateListRequest {
name: string
emoji?: string
presetId?: string | null
}
export interface UpdateListRequest {
name: string
emoji?: string
}
export interface CreateItemRequest {
name: string
categoryId?: string
labelIds?: string[]
quantity?: number | null
quantityUnit?: string | null
price?: number | null
imageUrl?: string | null
}
export interface UpdateItemRequest {
name: string
categoryId?: string
labelIds?: string[]
quantity?: number | null
quantityUnit?: string | null
price?: number | null
imageUrl?: string | null
}
export interface CreateLabelRequest {
name: string
color?: string
}
export interface CreateFavoriteRequest {
itemName: string
emoji?: string
}
export interface CreateCategoryRequest {
name: string
color?: string
}
|