enunciados + leetcode
Enunciados como los de una entrevista real para resolver por tu cuenta, con el tiempo que te darían, y problemas de LeetCode recomendados para cada tecnología y seniority. Nada se corrige acá: resolvelo en tu editor, en voz alta, y marcá lo que ya practicaste.
Implementá un feed de posts con scroll infinito. La API mockeada es fetchFeed(cursor?: string): Promise<{ items: Post[], nextCursor: string | null }>, con Post de la forma { id: string, author: string, text: string, imageUrl?: string }. Devuelve 15 posts por página, tarda 800 ms y a veces repite un post que ya vino en la página anterior.
El feed tiene que sentirse fluido en un Android de gama media aunque haya cientos de posts cargados.
# requisitos
onEndReached y onEndReachedThreshold, sin pedir la misma página dos veces.id.FlatList (windowSize, initialNumToRender, removeClippedSubviews) y explicá por qué.# si te sobra tiempo, te van a preguntar
FlatList?Armá un formulario para publicar una reseña con título, texto y puntaje de 1 a 5. Si el usuario cierra la app a mitad de camino, al volver a abrir la pantalla tiene que encontrar su borrador tal como lo dejó.
Al enviar se llama a submitReview(review): Promise<void>, mockeada con 1 segundo de delay y un 20% de fallas. Si el envío sale bien, el borrador se borra.
# requisitos
AsyncStorage (o MMKV) con debounce, no en cada tecla.KeyboardAvoidingView con el comportamiento correcto en iOS y Android.# si te sobra tiempo, te van a preguntar
Implementá fetchJson(url, { timeoutMs = 5000, retries = 2 }) sobre fetch. Si la respuesta tarda más de timeoutMs, se aborta. Si falla por red, timeout o un status 5xx, se reintenta con backoff exponencial (500 ms, 1 s). Si responde 4xx, no se reintenta.
Devuelve el body parseado como JSON o tira un error que permita distinguir si fue timeout, red o HTTP (incluyendo el status).
# requisitos
AbortController, no solo un Promise.race que deja el request vivo.type para distinguirlos.signal externo para que el llamador pueda cancelar todo.fetchJson<User>(url) devuelve Promise<User>.# si te sobra tiempo, te van a preguntar
POST que no es idempotente?useMemo y evitar trabajo repetido.Map, la misma lógica que armar secciones para una SectionList.