import { attachmentPath, socialApi, type ActivityVisibility, type MusicAttachment, type SocialAction, type SocialPerson } from '@pipu/core'; import { eventId } from '../../player/eventId'; import { ListeningPanel, ListenTogetherButton } from './Listening'; import { ChatConversation } from './ChatConversation'; import { useInfiniteQuery, useMutation, useQuery, useQueryClient } from '@tanstack/react-query'; import { useFocusEffect, useRouter } from 'expo-router'; import { createContext, useContext, useCallback, useEffect, useMemo, useRef, useState, type ReactNode } from 'react'; import { useTranslation } from 'react-i18next'; import { AppState, Clipboard, KeyboardAvoidingView, Modal, Pressable, ScrollView, Share, Text, View } from 'react-native'; import { useSession, useSessionCtx, useUser } from '../../lib/session'; import { useColors } from '../../theme'; import { Button, ErrorBox, Field, H1, Muted, Screen, useErrorText } from '../../ui/kit'; function useSocial() { const session = useSession(); const { server } = useSessionCtx(); const user = useUser(); const api = useMemo(() => socialApi(session), [session]); const [active, setActive] = useState(AppState.currentState === 'active'); useEffect(() => { const sub = AppState.addEventListener('change', s => setActive(s === 'active')); return () => sub.remove(); }, []); const key = ['m-social', server, user.id] as const; const inbox = useQuery({ queryKey: key, queryFn: api.inbox, enabled: active, refetchInterval: active ? 15_000 : false }); return { api, key, inbox, user, active }; } export function useSocialUnread() { return useSocial().inbox.data?.unread ?? 0; } const ChatDockContext = createContext<(id: string) => boolean>(() => false); export function NativeChatProvider({ children }: { children: ReactNode }) { const { inbox } = useSocial(); const colors = useColors(); const { t } = useTranslation(); const [open, setOpen] = useState(false); const [peer, setPeer] = useState(null); const friends = inbox.data?.people.filter(p => p.relationship === 'friend') ?? []; const selected = friends.find(p => p.id === peer); const unread = friends.reduce((sum,p) => sum+p.unread,0); return { setPeer(id); setOpen(true); return true; }}>{children}