A personal media tracker built on the AT Protocol opnshelf.xyz
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

feat: profile onboarding

+478 -92
+81
apps/web/src/lib/timezones.ts
··· 1 + export type TimezoneGroup = { 2 + region: string; 3 + zones: string[]; 4 + }; 5 + 6 + export const TIMEZONE_GROUPS: TimezoneGroup[] = [ 7 + { region: "UTC", zones: ["UTC"] }, 8 + { 9 + region: "Americas", 10 + zones: [ 11 + "America/New_York", 12 + "America/Chicago", 13 + "America/Denver", 14 + "America/Los_Angeles", 15 + "America/Toronto", 16 + "America/Vancouver", 17 + "America/Mexico_City", 18 + "America/Sao_Paulo", 19 + "America/Buenos_Aires", 20 + ], 21 + }, 22 + { 23 + region: "Europe", 24 + zones: [ 25 + "Europe/London", 26 + "Europe/Paris", 27 + "Europe/Berlin", 28 + "Europe/Rome", 29 + "Europe/Madrid", 30 + "Europe/Amsterdam", 31 + "Europe/Zurich", 32 + "Europe/Stockholm", 33 + "Europe/Oslo", 34 + "Europe/Copenhagen", 35 + "Europe/Helsinki", 36 + "Europe/Warsaw", 37 + "Europe/Prague", 38 + "Europe/Vienna", 39 + "Europe/Budapest", 40 + "Europe/Moscow", 41 + "Europe/Istanbul", 42 + ], 43 + }, 44 + { 45 + region: "Asia & Pacific", 46 + zones: [ 47 + "Asia/Tokyo", 48 + "Asia/Seoul", 49 + "Asia/Shanghai", 50 + "Asia/Hong_Kong", 51 + "Asia/Singapore", 52 + "Asia/Taipei", 53 + "Asia/Manila", 54 + "Asia/Bangkok", 55 + "Asia/Jakarta", 56 + "Asia/Kuala_Lumpur", 57 + "Asia/Ho_Chi_Minh", 58 + "Asia/Dubai", 59 + "Asia/Mumbai", 60 + "Asia/Kolkata", 61 + "Asia/Dhaka", 62 + "Asia/Karachi", 63 + "Pacific/Auckland", 64 + "Pacific/Sydney", 65 + "Pacific/Melbourne", 66 + "Pacific/Perth", 67 + ], 68 + }, 69 + { 70 + region: "Middle East & Africa", 71 + zones: [ 72 + "Africa/Cairo", 73 + "Africa/Johannesburg", 74 + "Africa/Lagos", 75 + "Africa/Nairobi", 76 + "Asia/Jerusalem", 77 + "Asia/Riyadh", 78 + "Asia/Tehran", 79 + ], 80 + }, 81 + ];
+198 -9
apps/web/src/routes/onboarding.tsx
··· 3 3 type NormalizedImportItemDto, 4 4 usersControllerCompleteOnboardingMutation, 5 5 usersControllerFetchMyTraktPublicHistoryMutation, 6 + usersControllerGetMySettingsOptions, 6 7 usersControllerImportMyHistoryMutation, 8 + usersControllerUpdateMyProfileMutation, 9 + usersControllerUpdateMySettingsMutation, 7 10 } from "@opnshelf/api"; 8 11 import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; 9 12 import { createFileRoute, useNavigate } from "@tanstack/react-router"; 10 13 import Papa from "papaparse"; 11 - import { useEffect, useMemo, useState } from "react"; 14 + import { useEffect, useId, useMemo, useState } from "react"; 12 15 import { toast } from "sonner"; 13 16 import { M3Button } from "@/components/ui/m3-button"; 17 + import { TIMEZONE_GROUPS } from "@/lib/timezones"; 14 18 15 19 type TabValue = "trakt" | "csv"; 16 20 type CsvParseError = { row: number; message: string }; ··· 46 50 }; 47 51 48 52 const MAX_BATCH_SIZE = 25; 53 + const ONBOARDING_STEPS = 4; 49 54 const CSV_HEADERS = [ 50 55 "watched_at", 51 56 "action", ··· 68 73 const [step, setStep] = useState(1); 69 74 const [activeTab, setActiveTab] = useState<TabValue>("trakt"); 70 75 const [traktUsername, setTraktUsername] = useState(""); 76 + const [displayName, setDisplayName] = useState(""); 77 + const [timezone, setTimezone] = useState("UTC"); 78 + const [timeFormat, setTimeFormat] = useState<"12h" | "24h">("24h"); 79 + const displayNameId = useId(); 80 + const timezoneId = useId(); 71 81 const [importResult, setImportResult] = useState({ 72 82 imported: 0, 73 83 skipped: 0, ··· 93 103 staleTime: 0, 94 104 }); 95 105 106 + const { data: settings } = useQuery({ 107 + ...usersControllerGetMySettingsOptions(), 108 + enabled: !!user, 109 + staleTime: 60_000, 110 + }); 111 + 96 112 const completeOnboardingMutation = useMutation({ 97 113 ...usersControllerCompleteOnboardingMutation(), 98 114 onError: () => { ··· 104 120 ...usersControllerFetchMyTraktPublicHistoryMutation(), 105 121 }); 106 122 123 + const updateProfileMutation = useMutation({ 124 + ...usersControllerUpdateMyProfileMutation(), 125 + onError: () => { 126 + toast.error("Could not save profile details"); 127 + }, 128 + }); 129 + 130 + const updateSettingsMutation = useMutation({ 131 + ...usersControllerUpdateMySettingsMutation(), 132 + onError: () => { 133 + toast.error("Could not save time settings"); 134 + }, 135 + }); 136 + 107 137 const importHistoryMutation = useMutation({ 108 138 ...usersControllerImportMyHistoryMutation(), 109 139 }); 110 140 111 - const progress = useMemo(() => (step / 3) * 100, [step]); 141 + const progress = useMemo(() => (step / ONBOARDING_STEPS) * 100, [step]); 112 142 const isImporting = 113 143 fetchTraktMutation.isPending || importHistoryMutation.isPending; 114 144 const isImportBusy = isImporting || importProgress.phase === "parsing_csv"; ··· 116 146 importProgress.totalItems > 0 117 147 ? Math.round((importProgress.processedItems / importProgress.totalItems) * 100) 118 148 : 0; 149 + const userAvatarUrl = typeof user?.avatar === "string" ? user.avatar : ""; 150 + const userDisplayName = 151 + typeof user?.displayName === "string" ? user.displayName : ""; 152 + const userHandle = typeof user?.handle === "string" ? user.handle : ""; 119 153 const isCompleting = completeOnboardingMutation.isPending; 154 + const isSavingProfile = 155 + updateProfileMutation.isPending || updateSettingsMutation.isPending; 120 156 const needsAuthRedirect = !isAuthLoading && !user; 121 157 const needsShelfRedirect = !isAuthLoading && !!user && !user.needsOnboarding; 122 158 ··· 131 167 } 132 168 }, [navigate, needsAuthRedirect, needsShelfRedirect]); 133 169 170 + useEffect(() => { 171 + if (!user) { 172 + return; 173 + } 174 + setDisplayName(userDisplayName || userHandle); 175 + }, [user, userDisplayName, userHandle]); 176 + 177 + useEffect(() => { 178 + if (!settings) { 179 + return; 180 + } 181 + setTimezone(settings.timezone); 182 + setTimeFormat(settings.timeFormat === "12h" ? "12h" : "24h"); 183 + }, [settings]); 184 + 134 185 if (isAuthLoading) { 135 186 return ( 136 187 <div className="flex-1 flex items-center justify-center"> ··· 147 198 await completeOnboardingAndRedirect(); 148 199 }; 149 200 201 + const handleSaveProfileAndContinue = async () => { 202 + await updateProfileMutation.mutateAsync({ 203 + body: { 204 + displayName: displayName.trim() || undefined, 205 + }, 206 + }); 207 + 208 + await updateSettingsMutation.mutateAsync({ 209 + body: { 210 + timezone, 211 + timeFormat, 212 + }, 213 + }); 214 + 215 + toast.success("Profile and time preferences saved"); 216 + setStep(3); 217 + }; 218 + 150 219 const completeOnboardingAndRedirect = async () => { 151 220 await completeOnboardingMutation.mutateAsync({}); 152 221 queryClient.setQueryData(authControllerMeOptions().queryKey, (previousUser) => { ··· 225 294 phase: "done", 226 295 message: "Import complete.", 227 296 })); 228 - setStep(3); 297 + setStep(4); 229 298 } catch (error) { 230 299 const message = 231 300 error instanceof Error ··· 298 367 failed: imported.failed + errors.length, 299 368 message: "Import complete.", 300 369 })); 301 - setStep(3); 370 + setStep(4); 302 371 } catch (error) { 303 372 const message = 304 373 error instanceof Error ··· 334 403 {step === 1 && ( 335 404 <div className="space-y-5"> 336 405 <p className="md-body-large text-(--md-sys-color-on-surface-variant)"> 337 - Step 1 of 3: We can import your existing watches from Trakt or from 338 - a CSV export. 406 + Step 1 of 4: Set your profile and time preferences, then import watch 407 + history from Trakt or CSV. 339 408 </p> 340 409 <div className="flex gap-3"> 341 410 <M3Button variant="filled" onClick={() => setStep(2)}> 342 - Start import 411 + Set up profile 343 412 </M3Button> 344 413 <M3Button 345 414 variant="text" ··· 353 422 )} 354 423 355 424 {step === 2 && ( 425 + <div className="space-y-6"> 426 + <p className="md-body-large text-(--md-sys-color-on-surface-variant)"> 427 + Step 2 of 4: personalize your profile and how times are shown. 428 + </p> 429 + 430 + <div className="rounded-(--md-sys-shape-corner-large) border p-4 md:p-5 bg-(--md-sys-color-surface-container-low)"> 431 + <div className="flex items-center gap-4"> 432 + <div className="w-16 h-16 rounded-full overflow-hidden border bg-(--md-sys-color-surface-container-high)"> 433 + {userAvatarUrl ? ( 434 + <img 435 + src={userAvatarUrl} 436 + alt="BlueSky avatar" 437 + className="w-full h-full object-cover" 438 + /> 439 + ) : ( 440 + <div className="w-full h-full flex items-center justify-center text-sm text-(--md-sys-color-on-surface-variant)"> 441 + No avatar 442 + </div> 443 + )} 444 + </div> 445 + <div className="flex-1 min-w-0"> 446 + <p className="md-title-medium">BlueSky avatar</p> 447 + <p className="md-body-small text-(--md-sys-color-on-surface-variant)"> 448 + Imported from BlueSky. Avatar upload coming soon. 449 + </p> 450 + </div> 451 + <M3Button variant="outlined" disabled> 452 + Upload coming soon 453 + </M3Button> 454 + </div> 455 + </div> 456 + 457 + <div className="grid grid-cols-1 md:grid-cols-2 gap-4"> 458 + <div className="space-y-2"> 459 + <label className="md-label-large" htmlFor={displayNameId}> 460 + Display name 461 + </label> 462 + <input 463 + id={displayNameId} 464 + type="text" 465 + value={displayName} 466 + onChange={(event) => setDisplayName(event.target.value)} 467 + placeholder="How your name appears" 468 + className="w-full rounded-(--md-sys-shape-corner-medium) border px-3 py-2" 469 + /> 470 + </div> 471 + 472 + <div className="space-y-2"> 473 + <label className="md-label-large" htmlFor={timezoneId}> 474 + Timezone 475 + </label> 476 + <select 477 + id={timezoneId} 478 + value={timezone} 479 + onChange={(event) => setTimezone(event.target.value)} 480 + className="w-full rounded-(--md-sys-shape-corner-medium) border px-3 py-2 bg-(--md-sys-color-surface)" 481 + > 482 + {TIMEZONE_GROUPS.map((group) => ( 483 + <optgroup key={group.region} label={group.region}> 484 + {group.zones.map((zone) => ( 485 + <option key={zone} value={zone}> 486 + {zone} 487 + </option> 488 + ))} 489 + </optgroup> 490 + ))} 491 + </select> 492 + </div> 493 + </div> 494 + 495 + <div className="space-y-2"> 496 + <p className="md-label-large">Time format</p> 497 + <div className="inline-flex rounded-(--md-sys-shape-corner-large) border overflow-hidden"> 498 + <button 499 + type="button" 500 + onClick={() => setTimeFormat("12h")} 501 + className="px-4 py-2" 502 + style={{ 503 + backgroundColor: 504 + timeFormat === "12h" 505 + ? "var(--md-sys-color-secondary-container)" 506 + : "transparent", 507 + }} 508 + > 509 + 12h 510 + </button> 511 + <button 512 + type="button" 513 + onClick={() => setTimeFormat("24h")} 514 + className="px-4 py-2" 515 + style={{ 516 + backgroundColor: 517 + timeFormat === "24h" 518 + ? "var(--md-sys-color-secondary-container)" 519 + : "transparent", 520 + }} 521 + > 522 + 24h 523 + </button> 524 + </div> 525 + </div> 526 + 527 + <div className="flex gap-3"> 528 + <M3Button variant="text" onClick={() => setStep(1)} disabled={isSavingProfile}> 529 + Back 530 + </M3Button> 531 + <M3Button 532 + variant="filled" 533 + onClick={() => { 534 + void handleSaveProfileAndContinue(); 535 + }} 536 + disabled={isSavingProfile} 537 + > 538 + {isSavingProfile ? "Saving..." : "Save and continue"} 539 + </M3Button> 540 + </div> 541 + </div> 542 + )} 543 + 544 + {step === 3 && ( 356 545 <div className="space-y-4"> 357 546 {importProgress.phase !== "idle" && ( 358 547 <div className="rounded-(--md-sys-shape-corner-medium) border p-3 space-y-2 bg-(--md-sys-color-surface-container-low)"> ··· 452 641 )} 453 642 454 643 <div className="flex gap-3"> 455 - <M3Button variant="text" onClick={() => setStep(1)} disabled={isImportBusy}> 644 + <M3Button variant="text" onClick={() => setStep(2)} disabled={isImportBusy}> 456 645 Back 457 646 </M3Button> 458 647 <M3Button ··· 466 655 </div> 467 656 )} 468 657 469 - {step === 3 && ( 658 + {step === 4 && ( 470 659 <div className="space-y-4"> 471 660 <h2 className="md-title-large">You&apos;re all set</h2> 472 661 <p className="md-body-medium text-(--md-sys-color-on-surface-variant)">
+2 -78
apps/web/src/routes/profile.settings.tsx
··· 21 21 import { toast } from "sonner"; 22 22 import { useTheme } from "@/components/theme-provider"; 23 23 import { UnauthenticatedState } from "@/components/UnauthenticatedState"; 24 + import { TIMEZONE_GROUPS } from "@/lib/timezones"; 24 25 import { 25 26 Dialog, 26 27 DialogContent, ··· 48 49 } from "@/components/ui/select"; 49 50 import { Skeleton } from "@/components/ui/skeleton"; 50 51 import { Switch } from "@/components/ui/switch"; 51 - 52 - const TIMEZONES = [ 53 - { region: "UTC", zones: ["UTC"] }, 54 - { 55 - region: "Americas", 56 - zones: [ 57 - "America/New_York", 58 - "America/Chicago", 59 - "America/Denver", 60 - "America/Los_Angeles", 61 - "America/Toronto", 62 - "America/Vancouver", 63 - "America/Mexico_City", 64 - "America/Sao_Paulo", 65 - "America/Buenos_Aires", 66 - ], 67 - }, 68 - { 69 - region: "Europe", 70 - zones: [ 71 - "Europe/London", 72 - "Europe/Paris", 73 - "Europe/Berlin", 74 - "Europe/Rome", 75 - "Europe/Madrid", 76 - "Europe/Amsterdam", 77 - "Europe/Zurich", 78 - "Europe/Stockholm", 79 - "Europe/Oslo", 80 - "Europe/Copenhagen", 81 - "Europe/Helsinki", 82 - "Europe/Warsaw", 83 - "Europe/Prague", 84 - "Europe/Vienna", 85 - "Europe/Budapest", 86 - "Europe/Moscow", 87 - "Europe/Istanbul", 88 - ], 89 - }, 90 - { 91 - region: "Asia & Pacific", 92 - zones: [ 93 - "Asia/Tokyo", 94 - "Asia/Seoul", 95 - "Asia/Shanghai", 96 - "Asia/Hong_Kong", 97 - "Asia/Singapore", 98 - "Asia/Taipei", 99 - "Asia/Manila", 100 - "Asia/Bangkok", 101 - "Asia/Jakarta", 102 - "Asia/Kuala_Lumpur", 103 - "Asia/Ho_Chi_Minh", 104 - "Asia/Dubai", 105 - "Asia/Mumbai", 106 - "Asia/Kolkata", 107 - "Asia/Dhaka", 108 - "Asia/Karachi", 109 - "Pacific/Auckland", 110 - "Pacific/Sydney", 111 - "Pacific/Melbourne", 112 - "Pacific/Perth", 113 - ], 114 - }, 115 - { 116 - region: "Middle East & Africa", 117 - zones: [ 118 - "Africa/Cairo", 119 - "Africa/Johannesburg", 120 - "Africa/Lagos", 121 - "Africa/Nairobi", 122 - "Asia/Jerusalem", 123 - "Asia/Riyadh", 124 - "Asia/Tehran", 125 - ], 126 - }, 127 - ]; 128 52 129 53 export const Route = createFileRoute("/profile/settings")({ 130 54 head: () => ({ ··· 302 226 <SelectValue placeholder="Select timezone" /> 303 227 </SelectTrigger> 304 228 <SelectContent className="bg-[var(--md-sys-color-surface-container)] border-[var(--md-sys-color-outline)] max-h-80"> 305 - {TIMEZONES.map((group) => ( 229 + {TIMEZONE_GROUPS.map((group) => ( 306 230 <div key={group.region}> 307 231 <div className="px-2 py-1.5 text-xs font-semibold text-[var(--md-sys-color-on-surface-variant)]"> 308 232 {group.region}
+21
backend/src/users/dto/user-settings.dto.ts
··· 44 44 }) 45 45 timezone!: string; 46 46 } 47 + 48 + export class UpdateUserProfileDto { 49 + @ApiProperty({ 50 + description: "Display name shown in OpnShelf", 51 + required: false, 52 + }) 53 + @IsString() 54 + @IsOptional() 55 + displayName?: string; 56 + } 57 + 58 + export class UserProfileDto { 59 + @ApiProperty({ description: "Display name shown in OpnShelf", nullable: true }) 60 + displayName!: string | null; 61 + 62 + @ApiProperty({ 63 + description: "Avatar URL imported from BlueSky", 64 + nullable: true, 65 + }) 66 + avatar!: string | null; 67 + }
+22
backend/src/users/users.controller.spec.ts
··· 21 21 importNormalizedItems: jest.fn(), 22 22 getUserSettings: jest.fn(), 23 23 updateUserSettings: jest.fn(), 24 + updateUserProfile: jest.fn(), 24 25 deleteUser: jest.fn(), 25 26 }; 26 27 ··· 62 63 controller.fetchMyTraktPublicHistory({ username: "alice", maxItems: 10 }), 63 64 ).resolves.toEqual({ items: [], skipped: [], sourceCount: 0 }); 64 65 expect(usersService.fetchTraktPublicHistory).toHaveBeenCalledWith("alice", 10); 66 + }); 67 + 68 + it("updates profile for authenticated requests", async () => { 69 + usersService.updateUserProfile.mockResolvedValue({ 70 + displayName: "New Name", 71 + avatar: "https://example.com/avatar.jpg", 72 + }); 73 + 74 + const req = { 75 + user: { did: "did:plc:abc", session: { did: "did:plc:abc" } }, 76 + } as AuthenticatedRequest; 77 + 78 + await expect( 79 + controller.updateMyProfile({ displayName: "New Name" }, req), 80 + ).resolves.toEqual({ 81 + displayName: "New Name", 82 + avatar: "https://example.com/avatar.jpg", 83 + }); 84 + expect(usersService.updateUserProfile).toHaveBeenCalledWith("did:plc:abc", { 85 + displayName: "New Name", 86 + }); 65 87 }); 66 88 67 89 it("imports normalized items for authenticated requests", async () => {
+22
backend/src/users/users.controller.ts
··· 21 21 } from "./dto/import-history.dto"; 22 22 import { 23 23 DeleteUserAccountDto, 24 + UpdateUserProfileDto, 24 25 UpdateUserSettingsDto, 26 + UserProfileDto, 25 27 UserSettingsDto, 26 28 } from "./dto/user-settings.dto"; 27 29 import { UsersService } from "./users.service"; ··· 69 71 } 70 72 71 73 return this.usersService.updateUserSettings(did, dto); 74 + } 75 + 76 + /** 77 + * Update current user's profile details 78 + */ 79 + @Patch("me/profile") 80 + @UseGuards(AuthGuard) 81 + @ApiOperation({ summary: "Update current user's profile" }) 82 + @ApiResponse({ status: 200, type: UserProfileDto }) 83 + @ApiResponse({ status: 401, description: "Not authenticated" }) 84 + async updateMyProfile( 85 + @Body() dto: UpdateUserProfileDto, 86 + @Req() req: AuthenticatedRequest, 87 + ): Promise<UserProfileDto> { 88 + const did = req.user?.did; 89 + if (!did) { 90 + throw new Error("User not found in request"); 91 + } 92 + 93 + return this.usersService.updateUserProfile(did, dto); 72 94 } 73 95 74 96 /**
+23
backend/src/users/users.service.spec.ts
··· 63 63 ); 64 64 }); 65 65 66 + it("updates user profile display name", async () => { 67 + prisma.user.findUnique = jest.fn().mockResolvedValue({ did: "did:plc:123" }); 68 + prisma.user.update = jest.fn().mockResolvedValue({ 69 + displayName: "Updated User", 70 + avatar: "https://example.com/avatar.jpg", 71 + }); 72 + 73 + await expect( 74 + service.updateUserProfile("did:plc:123", { displayName: "Updated User" }), 75 + ).resolves.toEqual({ 76 + displayName: "Updated User", 77 + avatar: "https://example.com/avatar.jpg", 78 + }); 79 + }); 80 + 81 + it("throws when updating profile for missing user", async () => { 82 + prisma.user.findUnique = jest.fn().mockResolvedValue(null); 83 + 84 + await expect( 85 + service.updateUserProfile("did:plc:missing", { displayName: "Nope" }), 86 + ).rejects.toThrow(NotFoundException); 87 + }); 88 + 66 89 it("normalizes Trakt movie/episode items and skips unsupported action", async () => { 67 90 const payload = [ 68 91 {
+33
backend/src/users/users.service.ts
··· 25 25 NormalizedImportItemDto, 26 26 } from "./dto/import-history.dto"; 27 27 import type { 28 + UserProfileDto, 28 29 UpdateUserSettingsDto, 30 + UpdateUserProfileDto, 29 31 UserSettingsDto, 30 32 } from "./dto/user-settings.dto"; 31 33 ··· 104 106 return { 105 107 timezone: updatedUser.timezone, 106 108 timeFormat: updatedUser.timeFormat, 109 + }; 110 + } 111 + 112 + async updateUserProfile( 113 + did: string, 114 + dto: UpdateUserProfileDto, 115 + ): Promise<UserProfileDto> { 116 + const user = await this.prisma.user.findUnique({ where: { did } }); 117 + 118 + if (!user) { 119 + throw new NotFoundException("User not found"); 120 + } 121 + 122 + const updatedUser = await this.prisma.user.update({ 123 + where: { did }, 124 + data: { 125 + ...(dto.displayName !== undefined && { 126 + displayName: dto.displayName.trim() || null, 127 + }), 128 + }, 129 + select: { 130 + displayName: true, 131 + avatar: true, 132 + }, 133 + }); 134 + 135 + this.logger.log(`Updated profile for user ${did}`); 136 + 137 + return { 138 + displayName: updatedUser.displayName, 139 + avatar: updatedUser.avatar, 107 140 }; 108 141 } 109 142
+19 -2
packages/api/src/generated/@tanstack/react-query.gen.ts
··· 3 3 import { type DefaultError, type InfiniteData, infiniteQueryOptions, queryOptions, type UseMutationOptions } from '@tanstack/react-query'; 4 4 5 5 import { client } from '../client.gen'; 6 - import { authControllerCallback, authControllerGetClientMetadata, authControllerLogin, authControllerLogout, authControllerMe, authControllerSignup, authControllerSuggestions, listsControllerAddItemToList, listsControllerAddToList, listsControllerCreateList, listsControllerDeleteList, listsControllerGetList, listsControllerGetListsForItem, listsControllerGetListsForMovie, listsControllerGetUserLists, listsControllerInitDefaultLists, listsControllerRemoveFromList, listsControllerRemoveItemFromList, listsControllerUpdateList, moviesControllerDeleteWatchHistoryEntry, moviesControllerDiscoverMovies, moviesControllerGetMovie, moviesControllerGetMovieDetails, moviesControllerGetMovieWatchHistory, moviesControllerGetUserMovies, moviesControllerGetUserMoviesPaginated, moviesControllerMarkWatched, moviesControllerSearchMovies, moviesControllerUnmarkWatched, type Options, searchControllerDiscoverAll, searchControllerSearchAll, shelfControllerGetUserShelf, showsControllerDeleteEpisodeWatchHistoryEntry, showsControllerDiscoverShows, showsControllerGetEpisodeDetails, showsControllerGetSeasonDetails, showsControllerGetShow, showsControllerGetShowDetails, showsControllerGetShowWatchHistory, showsControllerGetUserEpisodesPaginated, showsControllerGetUserShows, showsControllerMarkSeasonWatched, showsControllerMarkShowWatched, showsControllerMarkWatched, showsControllerSearchShows, showsControllerUnmarkWatched, usersControllerCompleteOnboarding, usersControllerDeleteMyAccount, usersControllerFetchMyTraktPublicHistory, usersControllerGetMySettings, usersControllerImportMyHistory, usersControllerUpdateMySettings } from '../sdk.gen'; 7 - import type { AuthControllerCallbackData, AuthControllerGetClientMetadataData, AuthControllerLoginData, AuthControllerLogoutData, AuthControllerMeData, AuthControllerMeResponse, AuthControllerSignupData, AuthControllerSuggestionsData, ListsControllerAddItemToListData, ListsControllerAddToListData, ListsControllerCreateListData, ListsControllerCreateListResponse, ListsControllerDeleteListData, ListsControllerGetListData, ListsControllerGetListResponse, ListsControllerGetListsForItemData, ListsControllerGetListsForItemResponse, ListsControllerGetListsForMovieData, ListsControllerGetUserListsData, ListsControllerGetUserListsResponse, ListsControllerInitDefaultListsData, ListsControllerInitDefaultListsResponse, ListsControllerRemoveFromListData, ListsControllerRemoveItemFromListData, ListsControllerUpdateListData, ListsControllerUpdateListResponse, MoviesControllerDeleteWatchHistoryEntryData, MoviesControllerDeleteWatchHistoryEntryResponse, MoviesControllerDiscoverMoviesData, MoviesControllerDiscoverMoviesResponse, MoviesControllerGetMovieData, MoviesControllerGetMovieDetailsData, MoviesControllerGetMovieDetailsResponse, MoviesControllerGetMovieResponse, MoviesControllerGetMovieWatchHistoryData, MoviesControllerGetMovieWatchHistoryResponse, MoviesControllerGetUserMoviesData, MoviesControllerGetUserMoviesPaginatedData, MoviesControllerGetUserMoviesPaginatedResponse, MoviesControllerGetUserMoviesResponse, MoviesControllerMarkWatchedData, MoviesControllerMarkWatchedResponse, MoviesControllerSearchMoviesData, MoviesControllerSearchMoviesResponse, MoviesControllerUnmarkWatchedData, MoviesControllerUnmarkWatchedResponse, SearchControllerDiscoverAllData, SearchControllerDiscoverAllResponse, SearchControllerSearchAllData, SearchControllerSearchAllResponse, ShelfControllerGetUserShelfData, ShelfControllerGetUserShelfResponse, ShowsControllerDeleteEpisodeWatchHistoryEntryData, ShowsControllerDeleteEpisodeWatchHistoryEntryResponse, ShowsControllerDiscoverShowsData, ShowsControllerDiscoverShowsResponse, ShowsControllerGetEpisodeDetailsData, ShowsControllerGetEpisodeDetailsResponse, ShowsControllerGetSeasonDetailsData, ShowsControllerGetSeasonDetailsResponse, ShowsControllerGetShowData, ShowsControllerGetShowDetailsData, ShowsControllerGetShowDetailsResponse, ShowsControllerGetShowResponse, ShowsControllerGetShowWatchHistoryData, ShowsControllerGetShowWatchHistoryResponse, ShowsControllerGetUserEpisodesPaginatedData, ShowsControllerGetUserEpisodesPaginatedResponse, ShowsControllerGetUserShowsData, ShowsControllerGetUserShowsResponse, ShowsControllerMarkSeasonWatchedData, ShowsControllerMarkSeasonWatchedResponse, ShowsControllerMarkShowWatchedData, ShowsControllerMarkShowWatchedResponse, ShowsControllerMarkWatchedData, ShowsControllerMarkWatchedResponse, ShowsControllerSearchShowsData, ShowsControllerSearchShowsResponse, ShowsControllerUnmarkWatchedData, ShowsControllerUnmarkWatchedResponse, UsersControllerCompleteOnboardingData, UsersControllerCompleteOnboardingResponse, UsersControllerDeleteMyAccountData, UsersControllerDeleteMyAccountResponse, UsersControllerFetchMyTraktPublicHistoryData, UsersControllerFetchMyTraktPublicHistoryResponse, UsersControllerGetMySettingsData, UsersControllerGetMySettingsResponse, UsersControllerImportMyHistoryData, UsersControllerImportMyHistoryResponse, UsersControllerUpdateMySettingsData, UsersControllerUpdateMySettingsResponse } from '../types.gen'; 6 + import { authControllerCallback, authControllerGetClientMetadata, authControllerLogin, authControllerLogout, authControllerMe, authControllerSignup, authControllerSuggestions, listsControllerAddItemToList, listsControllerAddToList, listsControllerCreateList, listsControllerDeleteList, listsControllerGetList, listsControllerGetListsForItem, listsControllerGetListsForMovie, listsControllerGetUserLists, listsControllerInitDefaultLists, listsControllerRemoveFromList, listsControllerRemoveItemFromList, listsControllerUpdateList, moviesControllerDeleteWatchHistoryEntry, moviesControllerDiscoverMovies, moviesControllerGetMovie, moviesControllerGetMovieDetails, moviesControllerGetMovieWatchHistory, moviesControllerGetUserMovies, moviesControllerGetUserMoviesPaginated, moviesControllerMarkWatched, moviesControllerSearchMovies, moviesControllerUnmarkWatched, type Options, searchControllerDiscoverAll, searchControllerSearchAll, shelfControllerGetUserShelf, showsControllerDeleteEpisodeWatchHistoryEntry, showsControllerDiscoverShows, showsControllerGetEpisodeDetails, showsControllerGetSeasonDetails, showsControllerGetShow, showsControllerGetShowDetails, showsControllerGetShowWatchHistory, showsControllerGetUserEpisodesPaginated, showsControllerGetUserShows, showsControllerMarkSeasonWatched, showsControllerMarkShowWatched, showsControllerMarkWatched, showsControllerSearchShows, showsControllerUnmarkWatched, usersControllerCompleteOnboarding, usersControllerDeleteMyAccount, usersControllerFetchMyTraktPublicHistory, usersControllerGetMySettings, usersControllerImportMyHistory, usersControllerUpdateMyProfile, usersControllerUpdateMySettings } from '../sdk.gen'; 7 + import type { AuthControllerCallbackData, AuthControllerGetClientMetadataData, AuthControllerLoginData, AuthControllerLogoutData, AuthControllerMeData, AuthControllerMeResponse, AuthControllerSignupData, AuthControllerSuggestionsData, ListsControllerAddItemToListData, ListsControllerAddToListData, ListsControllerCreateListData, ListsControllerCreateListResponse, ListsControllerDeleteListData, ListsControllerGetListData, ListsControllerGetListResponse, ListsControllerGetListsForItemData, ListsControllerGetListsForItemResponse, ListsControllerGetListsForMovieData, ListsControllerGetUserListsData, ListsControllerGetUserListsResponse, ListsControllerInitDefaultListsData, ListsControllerInitDefaultListsResponse, ListsControllerRemoveFromListData, ListsControllerRemoveItemFromListData, ListsControllerUpdateListData, ListsControllerUpdateListResponse, MoviesControllerDeleteWatchHistoryEntryData, MoviesControllerDeleteWatchHistoryEntryResponse, MoviesControllerDiscoverMoviesData, MoviesControllerDiscoverMoviesResponse, MoviesControllerGetMovieData, MoviesControllerGetMovieDetailsData, MoviesControllerGetMovieDetailsResponse, MoviesControllerGetMovieResponse, MoviesControllerGetMovieWatchHistoryData, MoviesControllerGetMovieWatchHistoryResponse, MoviesControllerGetUserMoviesData, MoviesControllerGetUserMoviesPaginatedData, MoviesControllerGetUserMoviesPaginatedResponse, MoviesControllerGetUserMoviesResponse, MoviesControllerMarkWatchedData, MoviesControllerMarkWatchedResponse, MoviesControllerSearchMoviesData, MoviesControllerSearchMoviesResponse, MoviesControllerUnmarkWatchedData, MoviesControllerUnmarkWatchedResponse, SearchControllerDiscoverAllData, SearchControllerDiscoverAllResponse, SearchControllerSearchAllData, SearchControllerSearchAllResponse, ShelfControllerGetUserShelfData, ShelfControllerGetUserShelfResponse, ShowsControllerDeleteEpisodeWatchHistoryEntryData, ShowsControllerDeleteEpisodeWatchHistoryEntryResponse, ShowsControllerDiscoverShowsData, ShowsControllerDiscoverShowsResponse, ShowsControllerGetEpisodeDetailsData, ShowsControllerGetEpisodeDetailsResponse, ShowsControllerGetSeasonDetailsData, ShowsControllerGetSeasonDetailsResponse, ShowsControllerGetShowData, ShowsControllerGetShowDetailsData, ShowsControllerGetShowDetailsResponse, ShowsControllerGetShowResponse, ShowsControllerGetShowWatchHistoryData, ShowsControllerGetShowWatchHistoryResponse, ShowsControllerGetUserEpisodesPaginatedData, ShowsControllerGetUserEpisodesPaginatedResponse, ShowsControllerGetUserShowsData, ShowsControllerGetUserShowsResponse, ShowsControllerMarkSeasonWatchedData, ShowsControllerMarkSeasonWatchedResponse, ShowsControllerMarkShowWatchedData, ShowsControllerMarkShowWatchedResponse, ShowsControllerMarkWatchedData, ShowsControllerMarkWatchedResponse, ShowsControllerSearchShowsData, ShowsControllerSearchShowsResponse, ShowsControllerUnmarkWatchedData, ShowsControllerUnmarkWatchedResponse, UsersControllerCompleteOnboardingData, UsersControllerCompleteOnboardingResponse, UsersControllerDeleteMyAccountData, UsersControllerDeleteMyAccountResponse, UsersControllerFetchMyTraktPublicHistoryData, UsersControllerFetchMyTraktPublicHistoryResponse, UsersControllerGetMySettingsData, UsersControllerGetMySettingsResponse, UsersControllerImportMyHistoryData, UsersControllerImportMyHistoryResponse, UsersControllerUpdateMyProfileData, UsersControllerUpdateMyProfileResponse, UsersControllerUpdateMySettingsData, UsersControllerUpdateMySettingsResponse } from '../types.gen'; 8 8 9 9 export type QueryKey<TOptions extends Options> = [ 10 10 Pick<TOptions, 'baseUrl' | 'body' | 'headers' | 'path' | 'query'> & { ··· 904 904 const mutationOptions: UseMutationOptions<UsersControllerUpdateMySettingsResponse, DefaultError, Options<UsersControllerUpdateMySettingsData>> = { 905 905 mutationFn: async (fnOptions) => { 906 906 const { data } = await usersControllerUpdateMySettings({ 907 + ...options, 908 + ...fnOptions, 909 + throwOnError: true 910 + }); 911 + return data; 912 + } 913 + }; 914 + return mutationOptions; 915 + }; 916 + 917 + /** 918 + * Update current user's profile 919 + */ 920 + export const usersControllerUpdateMyProfileMutation = (options?: Partial<Options<UsersControllerUpdateMyProfileData>>): UseMutationOptions<UsersControllerUpdateMyProfileResponse, DefaultError, Options<UsersControllerUpdateMyProfileData>> => { 921 + const mutationOptions: UseMutationOptions<UsersControllerUpdateMyProfileResponse, DefaultError, Options<UsersControllerUpdateMyProfileData>> = { 922 + mutationFn: async (fnOptions) => { 923 + const { data } = await usersControllerUpdateMyProfile({ 907 924 ...options, 908 925 ...fnOptions, 909 926 throwOnError: true
+2 -2
packages/api/src/generated/index.ts
··· 1 1 // This file is auto-generated by @hey-api/openapi-ts 2 2 3 - export { authControllerCallback, authControllerGetClientMetadata, authControllerLogin, authControllerLogout, authControllerMe, authControllerSignup, authControllerSuggestions, listsControllerAddItemToList, listsControllerAddToList, listsControllerCreateList, listsControllerDeleteList, listsControllerGetList, listsControllerGetListsForItem, listsControllerGetListsForMovie, listsControllerGetUserLists, listsControllerInitDefaultLists, listsControllerRemoveFromList, listsControllerRemoveItemFromList, listsControllerUpdateList, moviesControllerDeleteWatchHistoryEntry, moviesControllerDiscoverMovies, moviesControllerGetMovie, moviesControllerGetMovieDetails, moviesControllerGetMovieWatchHistory, moviesControllerGetUserMovies, moviesControllerGetUserMoviesPaginated, moviesControllerMarkWatched, moviesControllerSearchMovies, moviesControllerUnmarkWatched, type Options, searchControllerDiscoverAll, searchControllerSearchAll, shelfControllerGetUserShelf, showsControllerDeleteEpisodeWatchHistoryEntry, showsControllerDiscoverShows, showsControllerGetEpisodeDetails, showsControllerGetSeasonDetails, showsControllerGetShow, showsControllerGetShowDetails, showsControllerGetShowWatchHistory, showsControllerGetUserEpisodesPaginated, showsControllerGetUserShows, showsControllerMarkSeasonWatched, showsControllerMarkShowWatched, showsControllerMarkWatched, showsControllerSearchShows, showsControllerUnmarkWatched, usersControllerCompleteOnboarding, usersControllerDeleteMyAccount, usersControllerFetchMyTraktPublicHistory, usersControllerGetMySettings, usersControllerImportMyHistory, usersControllerUpdateMySettings } from './sdk.gen'; 4 - export type { AddToListDto, AuthControllerCallbackData, AuthControllerGetClientMetadataData, AuthControllerGetClientMetadataResponses, AuthControllerLoginData, AuthControllerLogoutData, AuthControllerLogoutResponses, AuthControllerMeData, AuthControllerMeErrors, AuthControllerMeResponse, AuthControllerMeResponses, AuthControllerSignupData, AuthControllerSuggestionsData, AuthControllerSuggestionsResponses, ClientOptions, CompleteOnboardingResponseDto, CreateListDto, DeleteUserAccountDto, EpisodeContextDto, EpisodeHistoryItemDto, EpisodeReferenceDto, FetchTraktPublicHistoryDto, FetchTraktPublicHistoryResponseDto, ImportErrorDto, ImportHistoryDto, ImportHistoryResponseDto, ImportSkipDto, ListsControllerAddItemToListData, ListsControllerAddItemToListErrors, ListsControllerAddItemToListResponses, ListsControllerAddToListData, ListsControllerAddToListResponses, ListsControllerCreateListData, ListsControllerCreateListErrors, ListsControllerCreateListResponse, ListsControllerCreateListResponses, ListsControllerDeleteListData, ListsControllerDeleteListErrors, ListsControllerDeleteListResponses, ListsControllerGetListData, ListsControllerGetListErrors, ListsControllerGetListResponse, ListsControllerGetListResponses, ListsControllerGetListsForItemData, ListsControllerGetListsForItemErrors, ListsControllerGetListsForItemResponse, ListsControllerGetListsForItemResponses, ListsControllerGetListsForMovieData, ListsControllerGetListsForMovieResponses, ListsControllerGetUserListsData, ListsControllerGetUserListsErrors, ListsControllerGetUserListsResponse, ListsControllerGetUserListsResponses, ListsControllerInitDefaultListsData, ListsControllerInitDefaultListsErrors, ListsControllerInitDefaultListsResponse, ListsControllerInitDefaultListsResponses, ListsControllerRemoveFromListData, ListsControllerRemoveFromListResponses, ListsControllerRemoveItemFromListData, ListsControllerRemoveItemFromListErrors, ListsControllerRemoveItemFromListResponses, ListsControllerUpdateListData, ListsControllerUpdateListErrors, ListsControllerUpdateListResponse, ListsControllerUpdateListResponses, MarkedEpisodesResponseDto, MarkEpisodeWatchedDto, MarkSeasonWatchedDto, MarkShowWatchedDto, MediaInListDto, MovieColorsDto, MovieDto, MovieListDto, MovieListsForItemDto, MovieListSummaryDto, MovieListWithMoviesDto, MoviesControllerDeleteWatchHistoryEntryData, MoviesControllerDeleteWatchHistoryEntryErrors, MoviesControllerDeleteWatchHistoryEntryResponse, MoviesControllerDeleteWatchHistoryEntryResponses, MoviesControllerDiscoverMoviesData, MoviesControllerDiscoverMoviesResponse, MoviesControllerDiscoverMoviesResponses, MoviesControllerGetMovieData, MoviesControllerGetMovieDetailsData, MoviesControllerGetMovieDetailsResponse, MoviesControllerGetMovieDetailsResponses, MoviesControllerGetMovieResponse, MoviesControllerGetMovieResponses, MoviesControllerGetMovieWatchHistoryData, MoviesControllerGetMovieWatchHistoryErrors, MoviesControllerGetMovieWatchHistoryResponse, MoviesControllerGetMovieWatchHistoryResponses, MoviesControllerGetUserMoviesData, MoviesControllerGetUserMoviesPaginatedData, MoviesControllerGetUserMoviesPaginatedResponse, MoviesControllerGetUserMoviesPaginatedResponses, MoviesControllerGetUserMoviesResponse, MoviesControllerGetUserMoviesResponses, MoviesControllerMarkWatchedData, MoviesControllerMarkWatchedErrors, MoviesControllerMarkWatchedResponse, MoviesControllerMarkWatchedResponses, MoviesControllerSearchMoviesData, MoviesControllerSearchMoviesResponse, MoviesControllerSearchMoviesResponses, MoviesControllerUnmarkWatchedData, MoviesControllerUnmarkWatchedErrors, MoviesControllerUnmarkWatchedResponse, MoviesControllerUnmarkWatchedResponses, NormalizedImportItemDto, PaginatedEpisodesResponseDto, PaginatedMoviesResponseDto, SearchControllerDiscoverAllData, SearchControllerDiscoverAllResponse, SearchControllerDiscoverAllResponses, SearchControllerSearchAllData, SearchControllerSearchAllResponse, SearchControllerSearchAllResponses, SearchResultsDto, SearchShowsResultsDto, ShelfControllerGetUserShelfData, ShelfControllerGetUserShelfResponse, ShelfControllerGetUserShelfResponses, ShelfResponseDto, ShowDto, ShowsControllerDeleteEpisodeWatchHistoryEntryData, ShowsControllerDeleteEpisodeWatchHistoryEntryErrors, ShowsControllerDeleteEpisodeWatchHistoryEntryResponse, ShowsControllerDeleteEpisodeWatchHistoryEntryResponses, ShowsControllerDiscoverShowsData, ShowsControllerDiscoverShowsResponse, ShowsControllerDiscoverShowsResponses, ShowsControllerGetEpisodeDetailsData, ShowsControllerGetEpisodeDetailsResponse, ShowsControllerGetEpisodeDetailsResponses, ShowsControllerGetSeasonDetailsData, ShowsControllerGetSeasonDetailsResponse, ShowsControllerGetSeasonDetailsResponses, ShowsControllerGetShowData, ShowsControllerGetShowDetailsData, ShowsControllerGetShowDetailsResponse, ShowsControllerGetShowDetailsResponses, ShowsControllerGetShowResponse, ShowsControllerGetShowResponses, ShowsControllerGetShowWatchHistoryData, ShowsControllerGetShowWatchHistoryErrors, ShowsControllerGetShowWatchHistoryResponse, ShowsControllerGetShowWatchHistoryResponses, ShowsControllerGetUserEpisodesPaginatedData, ShowsControllerGetUserEpisodesPaginatedResponse, ShowsControllerGetUserEpisodesPaginatedResponses, ShowsControllerGetUserShowsData, ShowsControllerGetUserShowsResponse, ShowsControllerGetUserShowsResponses, ShowsControllerMarkSeasonWatchedData, ShowsControllerMarkSeasonWatchedErrors, ShowsControllerMarkSeasonWatchedResponse, ShowsControllerMarkSeasonWatchedResponses, ShowsControllerMarkShowWatchedData, ShowsControllerMarkShowWatchedErrors, ShowsControllerMarkShowWatchedResponse, ShowsControllerMarkShowWatchedResponses, ShowsControllerMarkWatchedData, ShowsControllerMarkWatchedErrors, ShowsControllerMarkWatchedResponse, ShowsControllerMarkWatchedResponses, ShowsControllerSearchShowsData, ShowsControllerSearchShowsResponse, ShowsControllerSearchShowsResponses, ShowsControllerUnmarkWatchedData, ShowsControllerUnmarkWatchedResponse, ShowsControllerUnmarkWatchedResponses, TmdbCastDto, TmdbCreditsDto, TmdbCrewDto, TmdbEpisodeDto, TmdbGenreDto, TmdbMovieDetailDto, TmdbMovieResultDto, TmdbNetworkDto, TmdbSeasonDetailDto, TmdbSeasonSummaryDto, TmdbShowDetailDto, TmdbShowResultDto, TrackedEpisodeDto, TrackedMovieDto, TrackedShowSummaryDto, UnifiedDiscoverResponseDto, UnifiedSearchResponseDto, UnifiedSearchResultDto, UpdateListDto, UpdateUserSettingsDto, UserDto, UsersControllerCompleteOnboardingData, UsersControllerCompleteOnboardingErrors, UsersControllerCompleteOnboardingResponse, UsersControllerCompleteOnboardingResponses, UsersControllerDeleteMyAccountData, UsersControllerDeleteMyAccountErrors, UsersControllerDeleteMyAccountResponse, UsersControllerDeleteMyAccountResponses, UsersControllerFetchMyTraktPublicHistoryData, UsersControllerFetchMyTraktPublicHistoryErrors, UsersControllerFetchMyTraktPublicHistoryResponse, UsersControllerFetchMyTraktPublicHistoryResponses, UsersControllerGetMySettingsData, UsersControllerGetMySettingsErrors, UsersControllerGetMySettingsResponse, UsersControllerGetMySettingsResponses, UsersControllerImportMyHistoryData, UsersControllerImportMyHistoryErrors, UsersControllerImportMyHistoryResponse, UsersControllerImportMyHistoryResponses, UsersControllerUpdateMySettingsData, UsersControllerUpdateMySettingsErrors, UsersControllerUpdateMySettingsResponse, UsersControllerUpdateMySettingsResponses, UserSettingsDto, WatchHistoryItemDto } from './types.gen'; 3 + export { authControllerCallback, authControllerGetClientMetadata, authControllerLogin, authControllerLogout, authControllerMe, authControllerSignup, authControllerSuggestions, listsControllerAddItemToList, listsControllerAddToList, listsControllerCreateList, listsControllerDeleteList, listsControllerGetList, listsControllerGetListsForItem, listsControllerGetListsForMovie, listsControllerGetUserLists, listsControllerInitDefaultLists, listsControllerRemoveFromList, listsControllerRemoveItemFromList, listsControllerUpdateList, moviesControllerDeleteWatchHistoryEntry, moviesControllerDiscoverMovies, moviesControllerGetMovie, moviesControllerGetMovieDetails, moviesControllerGetMovieWatchHistory, moviesControllerGetUserMovies, moviesControllerGetUserMoviesPaginated, moviesControllerMarkWatched, moviesControllerSearchMovies, moviesControllerUnmarkWatched, type Options, searchControllerDiscoverAll, searchControllerSearchAll, shelfControllerGetUserShelf, showsControllerDeleteEpisodeWatchHistoryEntry, showsControllerDiscoverShows, showsControllerGetEpisodeDetails, showsControllerGetSeasonDetails, showsControllerGetShow, showsControllerGetShowDetails, showsControllerGetShowWatchHistory, showsControllerGetUserEpisodesPaginated, showsControllerGetUserShows, showsControllerMarkSeasonWatched, showsControllerMarkShowWatched, showsControllerMarkWatched, showsControllerSearchShows, showsControllerUnmarkWatched, usersControllerCompleteOnboarding, usersControllerDeleteMyAccount, usersControllerFetchMyTraktPublicHistory, usersControllerGetMySettings, usersControllerImportMyHistory, usersControllerUpdateMyProfile, usersControllerUpdateMySettings } from './sdk.gen'; 4 + export type { AddToListDto, AuthControllerCallbackData, AuthControllerGetClientMetadataData, AuthControllerGetClientMetadataResponses, AuthControllerLoginData, AuthControllerLogoutData, AuthControllerLogoutResponses, AuthControllerMeData, AuthControllerMeErrors, AuthControllerMeResponse, AuthControllerMeResponses, AuthControllerSignupData, AuthControllerSuggestionsData, AuthControllerSuggestionsResponses, ClientOptions, CompleteOnboardingResponseDto, CreateListDto, DeleteUserAccountDto, EpisodeContextDto, EpisodeHistoryItemDto, EpisodeReferenceDto, FetchTraktPublicHistoryDto, FetchTraktPublicHistoryResponseDto, ImportErrorDto, ImportHistoryDto, ImportHistoryResponseDto, ImportSkipDto, ListsControllerAddItemToListData, ListsControllerAddItemToListErrors, ListsControllerAddItemToListResponses, ListsControllerAddToListData, ListsControllerAddToListResponses, ListsControllerCreateListData, ListsControllerCreateListErrors, ListsControllerCreateListResponse, ListsControllerCreateListResponses, ListsControllerDeleteListData, ListsControllerDeleteListErrors, ListsControllerDeleteListResponses, ListsControllerGetListData, ListsControllerGetListErrors, ListsControllerGetListResponse, ListsControllerGetListResponses, ListsControllerGetListsForItemData, ListsControllerGetListsForItemErrors, ListsControllerGetListsForItemResponse, ListsControllerGetListsForItemResponses, ListsControllerGetListsForMovieData, ListsControllerGetListsForMovieResponses, ListsControllerGetUserListsData, ListsControllerGetUserListsErrors, ListsControllerGetUserListsResponse, ListsControllerGetUserListsResponses, ListsControllerInitDefaultListsData, ListsControllerInitDefaultListsErrors, ListsControllerInitDefaultListsResponse, ListsControllerInitDefaultListsResponses, ListsControllerRemoveFromListData, ListsControllerRemoveFromListResponses, ListsControllerRemoveItemFromListData, ListsControllerRemoveItemFromListErrors, ListsControllerRemoveItemFromListResponses, ListsControllerUpdateListData, ListsControllerUpdateListErrors, ListsControllerUpdateListResponse, ListsControllerUpdateListResponses, MarkedEpisodesResponseDto, MarkEpisodeWatchedDto, MarkSeasonWatchedDto, MarkShowWatchedDto, MediaInListDto, MovieColorsDto, MovieDto, MovieListDto, MovieListsForItemDto, MovieListSummaryDto, MovieListWithMoviesDto, MoviesControllerDeleteWatchHistoryEntryData, MoviesControllerDeleteWatchHistoryEntryErrors, MoviesControllerDeleteWatchHistoryEntryResponse, MoviesControllerDeleteWatchHistoryEntryResponses, MoviesControllerDiscoverMoviesData, MoviesControllerDiscoverMoviesResponse, MoviesControllerDiscoverMoviesResponses, MoviesControllerGetMovieData, MoviesControllerGetMovieDetailsData, MoviesControllerGetMovieDetailsResponse, MoviesControllerGetMovieDetailsResponses, MoviesControllerGetMovieResponse, MoviesControllerGetMovieResponses, MoviesControllerGetMovieWatchHistoryData, MoviesControllerGetMovieWatchHistoryErrors, MoviesControllerGetMovieWatchHistoryResponse, MoviesControllerGetMovieWatchHistoryResponses, MoviesControllerGetUserMoviesData, MoviesControllerGetUserMoviesPaginatedData, MoviesControllerGetUserMoviesPaginatedResponse, MoviesControllerGetUserMoviesPaginatedResponses, MoviesControllerGetUserMoviesResponse, MoviesControllerGetUserMoviesResponses, MoviesControllerMarkWatchedData, MoviesControllerMarkWatchedErrors, MoviesControllerMarkWatchedResponse, MoviesControllerMarkWatchedResponses, MoviesControllerSearchMoviesData, MoviesControllerSearchMoviesResponse, MoviesControllerSearchMoviesResponses, MoviesControllerUnmarkWatchedData, MoviesControllerUnmarkWatchedErrors, MoviesControllerUnmarkWatchedResponse, MoviesControllerUnmarkWatchedResponses, NormalizedImportItemDto, PaginatedEpisodesResponseDto, PaginatedMoviesResponseDto, SearchControllerDiscoverAllData, SearchControllerDiscoverAllResponse, SearchControllerDiscoverAllResponses, SearchControllerSearchAllData, SearchControllerSearchAllResponse, SearchControllerSearchAllResponses, SearchResultsDto, SearchShowsResultsDto, ShelfControllerGetUserShelfData, ShelfControllerGetUserShelfResponse, ShelfControllerGetUserShelfResponses, ShelfResponseDto, ShowDto, ShowsControllerDeleteEpisodeWatchHistoryEntryData, ShowsControllerDeleteEpisodeWatchHistoryEntryErrors, ShowsControllerDeleteEpisodeWatchHistoryEntryResponse, ShowsControllerDeleteEpisodeWatchHistoryEntryResponses, ShowsControllerDiscoverShowsData, ShowsControllerDiscoverShowsResponse, ShowsControllerDiscoverShowsResponses, ShowsControllerGetEpisodeDetailsData, ShowsControllerGetEpisodeDetailsResponse, ShowsControllerGetEpisodeDetailsResponses, ShowsControllerGetSeasonDetailsData, ShowsControllerGetSeasonDetailsResponse, ShowsControllerGetSeasonDetailsResponses, ShowsControllerGetShowData, ShowsControllerGetShowDetailsData, ShowsControllerGetShowDetailsResponse, ShowsControllerGetShowDetailsResponses, ShowsControllerGetShowResponse, ShowsControllerGetShowResponses, ShowsControllerGetShowWatchHistoryData, ShowsControllerGetShowWatchHistoryErrors, ShowsControllerGetShowWatchHistoryResponse, ShowsControllerGetShowWatchHistoryResponses, ShowsControllerGetUserEpisodesPaginatedData, ShowsControllerGetUserEpisodesPaginatedResponse, ShowsControllerGetUserEpisodesPaginatedResponses, ShowsControllerGetUserShowsData, ShowsControllerGetUserShowsResponse, ShowsControllerGetUserShowsResponses, ShowsControllerMarkSeasonWatchedData, ShowsControllerMarkSeasonWatchedErrors, ShowsControllerMarkSeasonWatchedResponse, ShowsControllerMarkSeasonWatchedResponses, ShowsControllerMarkShowWatchedData, ShowsControllerMarkShowWatchedErrors, ShowsControllerMarkShowWatchedResponse, ShowsControllerMarkShowWatchedResponses, ShowsControllerMarkWatchedData, ShowsControllerMarkWatchedErrors, ShowsControllerMarkWatchedResponse, ShowsControllerMarkWatchedResponses, ShowsControllerSearchShowsData, ShowsControllerSearchShowsResponse, ShowsControllerSearchShowsResponses, ShowsControllerUnmarkWatchedData, ShowsControllerUnmarkWatchedResponse, ShowsControllerUnmarkWatchedResponses, TmdbCastDto, TmdbCreditsDto, TmdbCrewDto, TmdbEpisodeDto, TmdbGenreDto, TmdbMovieDetailDto, TmdbMovieResultDto, TmdbNetworkDto, TmdbSeasonDetailDto, TmdbSeasonSummaryDto, TmdbShowDetailDto, TmdbShowResultDto, TrackedEpisodeDto, TrackedMovieDto, TrackedShowSummaryDto, UnifiedDiscoverResponseDto, UnifiedSearchResponseDto, UnifiedSearchResultDto, UpdateListDto, UpdateUserProfileDto, UpdateUserSettingsDto, UserDto, UserProfileDto, UsersControllerCompleteOnboardingData, UsersControllerCompleteOnboardingErrors, UsersControllerCompleteOnboardingResponse, UsersControllerCompleteOnboardingResponses, UsersControllerDeleteMyAccountData, UsersControllerDeleteMyAccountErrors, UsersControllerDeleteMyAccountResponse, UsersControllerDeleteMyAccountResponses, UsersControllerFetchMyTraktPublicHistoryData, UsersControllerFetchMyTraktPublicHistoryErrors, UsersControllerFetchMyTraktPublicHistoryResponse, UsersControllerFetchMyTraktPublicHistoryResponses, UsersControllerGetMySettingsData, UsersControllerGetMySettingsErrors, UsersControllerGetMySettingsResponse, UsersControllerGetMySettingsResponses, UsersControllerImportMyHistoryData, UsersControllerImportMyHistoryErrors, UsersControllerImportMyHistoryResponse, UsersControllerImportMyHistoryResponses, UsersControllerUpdateMyProfileData, UsersControllerUpdateMyProfileErrors, UsersControllerUpdateMyProfileResponse, UsersControllerUpdateMyProfileResponses, UsersControllerUpdateMySettingsData, UsersControllerUpdateMySettingsErrors, UsersControllerUpdateMySettingsResponse, UsersControllerUpdateMySettingsResponses, UserSettingsDto, WatchHistoryItemDto } from './types.gen';
+13 -1
packages/api/src/generated/sdk.gen.ts
··· 2 2 3 3 import type { Client, Options as Options2, TDataShape } from './client'; 4 4 import { client } from './client.gen'; 5 - import type { AuthControllerCallbackData, AuthControllerGetClientMetadataData, AuthControllerGetClientMetadataResponses, AuthControllerLoginData, AuthControllerLogoutData, AuthControllerLogoutResponses, AuthControllerMeData, AuthControllerMeErrors, AuthControllerMeResponses, AuthControllerSignupData, AuthControllerSuggestionsData, AuthControllerSuggestionsResponses, ListsControllerAddItemToListData, ListsControllerAddItemToListErrors, ListsControllerAddItemToListResponses, ListsControllerAddToListData, ListsControllerAddToListResponses, ListsControllerCreateListData, ListsControllerCreateListErrors, ListsControllerCreateListResponses, ListsControllerDeleteListData, ListsControllerDeleteListErrors, ListsControllerDeleteListResponses, ListsControllerGetListData, ListsControllerGetListErrors, ListsControllerGetListResponses, ListsControllerGetListsForItemData, ListsControllerGetListsForItemErrors, ListsControllerGetListsForItemResponses, ListsControllerGetListsForMovieData, ListsControllerGetListsForMovieResponses, ListsControllerGetUserListsData, ListsControllerGetUserListsErrors, ListsControllerGetUserListsResponses, ListsControllerInitDefaultListsData, ListsControllerInitDefaultListsErrors, ListsControllerInitDefaultListsResponses, ListsControllerRemoveFromListData, ListsControllerRemoveFromListResponses, ListsControllerRemoveItemFromListData, ListsControllerRemoveItemFromListErrors, ListsControllerRemoveItemFromListResponses, ListsControllerUpdateListData, ListsControllerUpdateListErrors, ListsControllerUpdateListResponses, MoviesControllerDeleteWatchHistoryEntryData, MoviesControllerDeleteWatchHistoryEntryErrors, MoviesControllerDeleteWatchHistoryEntryResponses, MoviesControllerDiscoverMoviesData, MoviesControllerDiscoverMoviesResponses, MoviesControllerGetMovieData, MoviesControllerGetMovieDetailsData, MoviesControllerGetMovieDetailsResponses, MoviesControllerGetMovieResponses, MoviesControllerGetMovieWatchHistoryData, MoviesControllerGetMovieWatchHistoryErrors, MoviesControllerGetMovieWatchHistoryResponses, MoviesControllerGetUserMoviesData, MoviesControllerGetUserMoviesPaginatedData, MoviesControllerGetUserMoviesPaginatedResponses, MoviesControllerGetUserMoviesResponses, MoviesControllerMarkWatchedData, MoviesControllerMarkWatchedErrors, MoviesControllerMarkWatchedResponses, MoviesControllerSearchMoviesData, MoviesControllerSearchMoviesResponses, MoviesControllerUnmarkWatchedData, MoviesControllerUnmarkWatchedErrors, MoviesControllerUnmarkWatchedResponses, SearchControllerDiscoverAllData, SearchControllerDiscoverAllResponses, SearchControllerSearchAllData, SearchControllerSearchAllResponses, ShelfControllerGetUserShelfData, ShelfControllerGetUserShelfResponses, ShowsControllerDeleteEpisodeWatchHistoryEntryData, ShowsControllerDeleteEpisodeWatchHistoryEntryErrors, ShowsControllerDeleteEpisodeWatchHistoryEntryResponses, ShowsControllerDiscoverShowsData, ShowsControllerDiscoverShowsResponses, ShowsControllerGetEpisodeDetailsData, ShowsControllerGetEpisodeDetailsResponses, ShowsControllerGetSeasonDetailsData, ShowsControllerGetSeasonDetailsResponses, ShowsControllerGetShowData, ShowsControllerGetShowDetailsData, ShowsControllerGetShowDetailsResponses, ShowsControllerGetShowResponses, ShowsControllerGetShowWatchHistoryData, ShowsControllerGetShowWatchHistoryErrors, ShowsControllerGetShowWatchHistoryResponses, ShowsControllerGetUserEpisodesPaginatedData, ShowsControllerGetUserEpisodesPaginatedResponses, ShowsControllerGetUserShowsData, ShowsControllerGetUserShowsResponses, ShowsControllerMarkSeasonWatchedData, ShowsControllerMarkSeasonWatchedErrors, ShowsControllerMarkSeasonWatchedResponses, ShowsControllerMarkShowWatchedData, ShowsControllerMarkShowWatchedErrors, ShowsControllerMarkShowWatchedResponses, ShowsControllerMarkWatchedData, ShowsControllerMarkWatchedErrors, ShowsControllerMarkWatchedResponses, ShowsControllerSearchShowsData, ShowsControllerSearchShowsResponses, ShowsControllerUnmarkWatchedData, ShowsControllerUnmarkWatchedResponses, UsersControllerCompleteOnboardingData, UsersControllerCompleteOnboardingErrors, UsersControllerCompleteOnboardingResponses, UsersControllerDeleteMyAccountData, UsersControllerDeleteMyAccountErrors, UsersControllerDeleteMyAccountResponses, UsersControllerFetchMyTraktPublicHistoryData, UsersControllerFetchMyTraktPublicHistoryErrors, UsersControllerFetchMyTraktPublicHistoryResponses, UsersControllerGetMySettingsData, UsersControllerGetMySettingsErrors, UsersControllerGetMySettingsResponses, UsersControllerImportMyHistoryData, UsersControllerImportMyHistoryErrors, UsersControllerImportMyHistoryResponses, UsersControllerUpdateMySettingsData, UsersControllerUpdateMySettingsErrors, UsersControllerUpdateMySettingsResponses } from './types.gen'; 5 + import type { AuthControllerCallbackData, AuthControllerGetClientMetadataData, AuthControllerGetClientMetadataResponses, AuthControllerLoginData, AuthControllerLogoutData, AuthControllerLogoutResponses, AuthControllerMeData, AuthControllerMeErrors, AuthControllerMeResponses, AuthControllerSignupData, AuthControllerSuggestionsData, AuthControllerSuggestionsResponses, ListsControllerAddItemToListData, ListsControllerAddItemToListErrors, ListsControllerAddItemToListResponses, ListsControllerAddToListData, ListsControllerAddToListResponses, ListsControllerCreateListData, ListsControllerCreateListErrors, ListsControllerCreateListResponses, ListsControllerDeleteListData, ListsControllerDeleteListErrors, ListsControllerDeleteListResponses, ListsControllerGetListData, ListsControllerGetListErrors, ListsControllerGetListResponses, ListsControllerGetListsForItemData, ListsControllerGetListsForItemErrors, ListsControllerGetListsForItemResponses, ListsControllerGetListsForMovieData, ListsControllerGetListsForMovieResponses, ListsControllerGetUserListsData, ListsControllerGetUserListsErrors, ListsControllerGetUserListsResponses, ListsControllerInitDefaultListsData, ListsControllerInitDefaultListsErrors, ListsControllerInitDefaultListsResponses, ListsControllerRemoveFromListData, ListsControllerRemoveFromListResponses, ListsControllerRemoveItemFromListData, ListsControllerRemoveItemFromListErrors, ListsControllerRemoveItemFromListResponses, ListsControllerUpdateListData, ListsControllerUpdateListErrors, ListsControllerUpdateListResponses, MoviesControllerDeleteWatchHistoryEntryData, MoviesControllerDeleteWatchHistoryEntryErrors, MoviesControllerDeleteWatchHistoryEntryResponses, MoviesControllerDiscoverMoviesData, MoviesControllerDiscoverMoviesResponses, MoviesControllerGetMovieData, MoviesControllerGetMovieDetailsData, MoviesControllerGetMovieDetailsResponses, MoviesControllerGetMovieResponses, MoviesControllerGetMovieWatchHistoryData, MoviesControllerGetMovieWatchHistoryErrors, MoviesControllerGetMovieWatchHistoryResponses, MoviesControllerGetUserMoviesData, MoviesControllerGetUserMoviesPaginatedData, MoviesControllerGetUserMoviesPaginatedResponses, MoviesControllerGetUserMoviesResponses, MoviesControllerMarkWatchedData, MoviesControllerMarkWatchedErrors, MoviesControllerMarkWatchedResponses, MoviesControllerSearchMoviesData, MoviesControllerSearchMoviesResponses, MoviesControllerUnmarkWatchedData, MoviesControllerUnmarkWatchedErrors, MoviesControllerUnmarkWatchedResponses, SearchControllerDiscoverAllData, SearchControllerDiscoverAllResponses, SearchControllerSearchAllData, SearchControllerSearchAllResponses, ShelfControllerGetUserShelfData, ShelfControllerGetUserShelfResponses, ShowsControllerDeleteEpisodeWatchHistoryEntryData, ShowsControllerDeleteEpisodeWatchHistoryEntryErrors, ShowsControllerDeleteEpisodeWatchHistoryEntryResponses, ShowsControllerDiscoverShowsData, ShowsControllerDiscoverShowsResponses, ShowsControllerGetEpisodeDetailsData, ShowsControllerGetEpisodeDetailsResponses, ShowsControllerGetSeasonDetailsData, ShowsControllerGetSeasonDetailsResponses, ShowsControllerGetShowData, ShowsControllerGetShowDetailsData, ShowsControllerGetShowDetailsResponses, ShowsControllerGetShowResponses, ShowsControllerGetShowWatchHistoryData, ShowsControllerGetShowWatchHistoryErrors, ShowsControllerGetShowWatchHistoryResponses, ShowsControllerGetUserEpisodesPaginatedData, ShowsControllerGetUserEpisodesPaginatedResponses, ShowsControllerGetUserShowsData, ShowsControllerGetUserShowsResponses, ShowsControllerMarkSeasonWatchedData, ShowsControllerMarkSeasonWatchedErrors, ShowsControllerMarkSeasonWatchedResponses, ShowsControllerMarkShowWatchedData, ShowsControllerMarkShowWatchedErrors, ShowsControllerMarkShowWatchedResponses, ShowsControllerMarkWatchedData, ShowsControllerMarkWatchedErrors, ShowsControllerMarkWatchedResponses, ShowsControllerSearchShowsData, ShowsControllerSearchShowsResponses, ShowsControllerUnmarkWatchedData, ShowsControllerUnmarkWatchedResponses, UsersControllerCompleteOnboardingData, UsersControllerCompleteOnboardingErrors, UsersControllerCompleteOnboardingResponses, UsersControllerDeleteMyAccountData, UsersControllerDeleteMyAccountErrors, UsersControllerDeleteMyAccountResponses, UsersControllerFetchMyTraktPublicHistoryData, UsersControllerFetchMyTraktPublicHistoryErrors, UsersControllerFetchMyTraktPublicHistoryResponses, UsersControllerGetMySettingsData, UsersControllerGetMySettingsErrors, UsersControllerGetMySettingsResponses, UsersControllerImportMyHistoryData, UsersControllerImportMyHistoryErrors, UsersControllerImportMyHistoryResponses, UsersControllerUpdateMyProfileData, UsersControllerUpdateMyProfileErrors, UsersControllerUpdateMyProfileResponses, UsersControllerUpdateMySettingsData, UsersControllerUpdateMySettingsErrors, UsersControllerUpdateMySettingsResponses } from './types.gen'; 6 6 7 7 export type Options<TData extends TDataShape = TDataShape, ThrowOnError extends boolean = boolean> = Options2<TData, ThrowOnError> & { 8 8 /** ··· 292 292 */ 293 293 export const usersControllerUpdateMySettings = <ThrowOnError extends boolean = false>(options: Options<UsersControllerUpdateMySettingsData, ThrowOnError>) => (options.client ?? client).patch<UsersControllerUpdateMySettingsResponses, UsersControllerUpdateMySettingsErrors, ThrowOnError>({ 294 294 url: '/users/me/settings', 295 + ...options, 296 + headers: { 297 + 'Content-Type': 'application/json', 298 + ...options.headers 299 + } 300 + }); 301 + 302 + /** 303 + * Update current user's profile 304 + */ 305 + export const usersControllerUpdateMyProfile = <ThrowOnError extends boolean = false>(options: Options<UsersControllerUpdateMyProfileData, ThrowOnError>) => (options.client ?? client).patch<UsersControllerUpdateMyProfileResponses, UsersControllerUpdateMyProfileErrors, ThrowOnError>({ 306 + url: '/users/me/profile', 295 307 ...options, 296 308 headers: { 297 309 'Content-Type': 'application/json',
+42
packages/api/src/generated/types.gen.ts
··· 480 480 timezone?: string; 481 481 }; 482 482 483 + export type UpdateUserProfileDto = { 484 + /** 485 + * Display name shown in OpnShelf 486 + */ 487 + displayName?: string; 488 + }; 489 + 490 + export type UserProfileDto = { 491 + /** 492 + * Display name shown in OpnShelf 493 + */ 494 + displayName: { 495 + [key: string]: unknown; 496 + } | null; 497 + /** 498 + * Avatar URL imported from BlueSky 499 + */ 500 + avatar: { 501 + [key: string]: unknown; 502 + } | null; 503 + }; 504 + 483 505 export type DeleteUserAccountDto = { 484 506 /** 485 507 * Whether to delete the user's watch history from their PDS. If false, the data remains on their PDS. ··· 1600 1622 }; 1601 1623 1602 1624 export type UsersControllerUpdateMySettingsResponse = UsersControllerUpdateMySettingsResponses[keyof UsersControllerUpdateMySettingsResponses]; 1625 + 1626 + export type UsersControllerUpdateMyProfileData = { 1627 + body: UpdateUserProfileDto; 1628 + path?: never; 1629 + query?: never; 1630 + url: '/users/me/profile'; 1631 + }; 1632 + 1633 + export type UsersControllerUpdateMyProfileErrors = { 1634 + /** 1635 + * Not authenticated 1636 + */ 1637 + 401: unknown; 1638 + }; 1639 + 1640 + export type UsersControllerUpdateMyProfileResponses = { 1641 + 200: UserProfileDto; 1642 + }; 1643 + 1644 + export type UsersControllerUpdateMyProfileResponse = UsersControllerUpdateMyProfileResponses[keyof UsersControllerUpdateMyProfileResponses]; 1603 1645 1604 1646 export type UsersControllerDeleteMyAccountData = { 1605 1647 body: DeleteUserAccountDto;