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: fix episode link

+39 -33
+2 -1
apps/mobile/app/(tabs)/index.tsx
··· 345 345 onPress={() => 346 346 isEpisode 347 347 ? router.push({ 348 - pathname: "/episode/[id]", 348 + pathname: 349 + "/show/[id]/season/[seasonNumber]/episode/[episodeNumber]", 349 350 params: { 350 351 id: tracked.showId, 351 352 seasonNumber: (
+2 -4
apps/mobile/app/_layout.tsx
··· 1 1 import { QueryClientProvider } from "@tanstack/react-query"; 2 2 import { Stack } from "expo-router"; 3 3 import { StatusBar } from "expo-status-bar"; 4 - import { useEffect, useState } from "react"; 4 + import { useCallback, useEffect, useState } from "react"; 5 5 6 6 import { DevToolsBubble } from "react-native-react-query-devtools"; 7 7 import { LoadingScreen } from "@/components/LoadingScreen"; ··· 10 10 import { ThemeProvider } from "@/contexts/theme"; 11 11 import { initializeApiClient } from "@/lib/api"; 12 12 import { queryClient } from "@/lib/query-client"; 13 - 14 - const isDev = process.env.NODE_ENV === "development"; 15 13 16 14 function LocaleInitializer({ children }: { children: React.ReactNode }) { 17 15 const [isReady, setIsReady] = useState(false); ··· 84 82 85 83 return ( 86 84 <QueryClientProvider client={queryClient}> 87 - {isDev && <DevToolsBubble queryClient={queryClient} />} 88 85 <ThemeProvider> 89 86 <AuthProvider> 90 87 <LocaleInitializer> ··· 92 89 </LocaleInitializer> 93 90 </AuthProvider> 94 91 </ThemeProvider> 92 + <DevToolsBubble queryClient={queryClient} /> 95 93 </QueryClientProvider> 96 94 ); 97 95 }
+31 -25
apps/mobile/app/show/[id]/season/[seasonNumber]/episode/[episodeNumber]/index.tsx
··· 538 538 onPress={handleMarkWatched} 539 539 disabled={isPending} 540 540 activeOpacity={0.8} 541 - style={[ 542 - styles.primaryAction, 543 - { 544 - backgroundColor: colors.primary, 545 - opacity: isPending ? 0.7 : 1, 546 - }, 547 - ]} 541 + style={{ opacity: isPending ? 0.7 : 1 }} 548 542 > 549 - {isPending ? ( 550 - <ActivityIndicator 551 - size="small" 552 - color={colors.onPrimary} 553 - /> 554 - ) : ( 555 - <Ionicons 556 - name={isWatchedEpisode ? "refresh" : "add"} 557 - size={18} 558 - color={colors.onPrimary} 559 - /> 560 - )} 561 - <Text 562 - style={[ 563 - styles.primaryActionText, 564 - { color: colors.onPrimary }, 543 + <LinearGradient 544 + colors={[ 545 + showColors.primary || colors.primary, 546 + showColors.secondary || colors.primary, 565 547 ]} 548 + start={{ x: 0, y: 0 }} 549 + end={{ x: 1, y: 1 }} 550 + style={styles.primaryAction} 566 551 > 567 - {isWatchedEpisode ? "Watch Again" : "Add to Shelf"} 568 - </Text> 552 + {isPending ? ( 553 + <ActivityIndicator 554 + size="small" 555 + color={colors.onPrimary} 556 + /> 557 + ) : ( 558 + <> 559 + <Ionicons 560 + name={isWatchedEpisode ? "refresh" : "add"} 561 + size={18} 562 + color={colors.onPrimary} 563 + /> 564 + <Text 565 + style={[ 566 + styles.primaryActionText, 567 + { color: colors.onPrimary }, 568 + ]} 569 + > 570 + {isWatchedEpisode ? "Watch Again" : "Add to Shelf"} 571 + </Text> 572 + </> 573 + )} 574 + </LinearGradient> 569 575 </TouchableOpacity> 570 576 571 577 <TouchableOpacity
+3 -3
apps/mobile/package.json
··· 8 8 "android": "expo run:android", 9 9 "ios": "expo run:ios", 10 10 "web": "expo start --web", 11 - "lint": "biome check .", 12 - "format": "biome format .", 13 - "check": "biome check .", 11 + "lint": "biome check .", 12 + "format": "biome format .", 13 + "check": "biome check .", 14 14 "typecheck": "tsc --noEmit" 15 15 }, 16 16 "dependencies": {
+1
pnpm-lock.yaml
··· 7184 7184 prebuild-install@7.1.3: 7185 7185 resolution: {integrity: sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==} 7186 7186 engines: {node: '>=10'} 7187 + deprecated: No longer maintained. Please contact the author of the relevant native addon; alternatives are available. 7187 7188 hasBin: true 7188 7189 7189 7190 prettier@3.8.1: