import { useAuth } from "#/components/SessionProvider"; import { Agent } from "@atproto/api"; import { useRouter } from "expo-router"; import { useEffect, useState } from "react"; import { ActivityIndicator, FlatList, Image, Pressable, Text, View } from "react-native"; import { getPendingRecords, removePendingRecord, type PendingRecord } from "#/lib/recordQueue"; type PendingEntry = { record: PendingRecord; did: string; handle: string; displayName: string; avatar?: string; }; export default function Queue() { const { requireSession, hasSavedDid, isLoading } = useAuth(); const [records, setRecords] = useState(() => getPendingRecords()); const [entries, setEntries] = useState([]); const [agent, setAgent] = useState(null); const [profilesLoading, setProfilesLoading] = useState(false); const [uploading, setUploading] = useState(false); const router = useRouter(); useEffect(() => { let isMounted = true; const checkSession = async () => { try { const a = await requireSession(); if (isMounted) { setAgent(a); } } catch (error) { console.error("Failed to require session:", error); if (isMounted) { router.replace("/sign-in"); } } }; if (!isLoading) { if (!hasSavedDid) { router.replace("/sign-in"); } else { checkSession(); } } return () => { isMounted = false; }; }, [hasSavedDid, isLoading, router, requireSession]); useEffect(() => { if (!agent || records.length === 0) { return; } let isMounted = true; const loadProfiles = async () => { setProfilesLoading(true); try { const results = await Promise.all( records.map(async (record): Promise => { try { const profile = await agent.getProfile({ actor: record.record.Target, }); return { record, did: profile.data.did, handle: profile.data.handle, displayName: profile.data.displayName || profile.data.handle, avatar: profile.data.avatar, }; } catch (error) { console.error(`Failed to load profile for ${record.record.Target}:`, error); return null; } }), ); if (isMounted) { setEntries(results.filter((entry): entry is PendingEntry => entry !== null)); } } catch (error) { console.error("Failed to load profiles:", error); } finally { if (isMounted) { setProfilesLoading(false); } } }; loadProfiles(); return () => { isMounted = false; }; }, [agent, records]); const publish = async () => { if (!agent || uploading || records.length === 0) { return; } setUploading(true); for (const record of records) { try { const resp = await agent.com.atproto.repo.putRecord({ repo: agent.assertDid, rkey: record.rkey, collection: "club.touchfluffytail.touchedfluffytail", record: record.record, }); if (!resp.success) { throw new Error("once more i thought this was not possible"); } else { // if we some how hit that error we're fucked removePendingRecord(record.rkey); setRecords((prev) => prev.filter((entry) => entry.rkey !== record.rkey)); setEntries((prev) => prev.filter((entry) => entry.record.rkey !== record.rkey)); } } catch { console.error("AHHHHHHHHHHHHHHHHHHHHHHHH"); } } setUploading(false); }; return ( Pending uploads {records.length === 0 ? ( There are no pending uploads, get to touching fluffy tail ) : profilesLoading ? ( Loading pending uploads... ) : ( `${item.did}-${index}`} renderItem={({ item, index }) => ( {item.avatar ? ( ) : ( )} {item.displayName} @{item.handle} )} contentContainerStyle={{ flexGrow: 1 }} showsVerticalScrollIndicator bounces={false} /> )} {uploading ? "Uploading..." : "Upload?"} ); }