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.

fix: resolve TypeScript errors across mobile and web apps

+15 -21
+4 -7
apps/mobile/app/person/[id].tsx
··· 76 76 function toMovieItem(item: PersonFilmographyItemDto): { 77 77 id: number; 78 78 title: string; 79 - poster_path?: string | null; 79 + poster_path?: string; 80 80 release_date?: string; 81 81 } { 82 82 return { 83 83 id: item.id, 84 84 title: item.title, 85 - poster_path: item.poster_path, 85 + poster_path: item.poster_path ?? undefined, 86 86 release_date: item.release_date, 87 87 }; 88 88 } ··· 380 380 keyExtractor={keyExtractor} 381 381 numColumns={COLUMNS} 382 382 contentContainerStyle={styles.listContent} 383 - columnWrapperStyle={styles.columnWrapper} 384 383 onScroll={onScroll} 385 384 scrollEventThrottle={16} 386 385 refreshControl={ ··· 600 599 </View> 601 600 ) : null 602 601 } 603 - estimatedItemSize={200} 604 602 /> 605 603 606 604 <ScrollRevealHeader ··· 612 610 {/* Add to List Modal */} 613 611 {activeListModal && user && ( 614 612 <AddToListModal 615 - open={!!activeListModal} 616 - onOpenChange={(open) => !open && setActiveListModal(null)} 613 + visible={!!activeListModal} 614 + onClose={() => setActiveListModal(null)} 617 615 mediaType={activeListModal.mediaType} 618 616 mediaId={activeListModal.mediaId} 619 617 mediaTitle={activeListModal.title} 620 - user={user} 621 618 /> 622 619 )} 623 620 </SafeAreaView>
+5
apps/web/src/components/DatePickerModal.tsx
··· 22 22 onClose: () => void; 23 23 userDid: string | undefined; 24 24 modalTitle?: string; 25 + onSelect?: (date: Date) => void; 25 26 } & ( 26 27 | { 27 28 mode?: "movie"; ··· 49 50 onClose, 50 51 userDid, 51 52 modalTitle, 53 + onSelect, 52 54 ...target 53 55 }: DatePickerModalProps) { 54 56 const queryClient = useQueryClient(); ··· 193 195 } else { 194 196 return; 195 197 } 198 + 199 + // Call onSelect callback if provided 200 + onSelect?.(dateTime); 196 201 197 202 if (isEpisodeMode) { 198 203 markEpisodeMutation.mutate({
+2 -2
apps/web/src/components/ErrorPage.tsx
··· 26 26 return error; 27 27 } 28 28 if (error && typeof error === "object" && "message" in error) { 29 - return String(error.message); 29 + return String((error as { message: unknown }).message); 30 30 } 31 31 return "An unexpected error occurred"; 32 32 }, [error]); ··· 93 93 </a> 94 94 </M3Button> 95 95 96 - <M3Button variant="tonal" size="lg" onClick={reset}> 96 + <M3Button variant="filled-tonal" size="lg" onClick={reset}> 97 97 <RefreshCw className="size-5" /> 98 98 Try again 99 99 </M3Button>
+4 -12
apps/web/src/routes/person.$personId.$name.tsx
··· 316 316 } else { 317 317 // Open date picker for marking 318 318 setDatePickerModal({ 319 - mediaType: item.media_type, 319 + mediaType: item.media_type as "movie" | "show", 320 320 mediaId, 321 321 title: item.title, 322 322 isWatched: false, ··· 560 560 <DatePickerModal 561 561 open={!!datePickerModal} 562 562 onClose={() => setDatePickerModal(null)} 563 - mode={datePickerModal.mediaType === "movie" ? "movie" : "show"} 564 - movieId={ 565 - datePickerModal.mediaType === "movie" 566 - ? datePickerModal.mediaId 567 - : undefined 568 - } 569 - showId={ 570 - datePickerModal.mediaType === "show" 571 - ? datePickerModal.mediaId 572 - : undefined 573 - } 563 + {...(datePickerModal.mediaType === "movie" 564 + ? { mode: "movie" as const, movieId: datePickerModal.mediaId } 565 + : { mode: "show" as const, showId: datePickerModal.mediaId })} 574 566 userDid={user.did} 575 567 modalTitle={`Mark "${datePickerModal.title}" as watched`} 576 568 onSelect={handleMarkWithDate}