Wszystkie projekty

Marketplace

Najlepszy projekt

Cross-platformowy mobilny marketplace z adaptacyjnym ciemnym/jasnym motywem, backendem Firebase, synchronizacją Firestore w czasie rzeczywistym i pełnym wsparciem języków (EN/PL). Zbudowany z Expo SDK 54.

iOS · Android
ExpoReact NativeFirebaseTypeScriptZod
Problem

Tworzenie nowoczesnego marketplace oznacza wybór między kosztownym natywnym rozwojem dla każdej platformy lub wolnymi hybrydowymi rozwiązaniami. Większość rozwiązań nie ma adaptacyjnego motywu, wydaje się ciężka na urządzeniach mobilnych i zamyka w jednym ekosystemie bez możliwości pracy w czasie rzeczywistym.

Rozwiązanie

Cross-platformowy marketplace zapewniający natywną jakość na iOS, Android i Web z jednego kodu źródłowego Expo. Oferuje synchronizację w czasie rzeczywistym przez Firebase, płynny proces realizacji zamówienia, powiadomienia push i dopracowany adaptacyjny motyw respektujący systemowe preferencje trybu ciemnego/jasnego.

Architektura

Expo Router kieruje nawigacją opartą na plikach przez 14+ ekranów z chronioną routingiem autoryzacji. Firebase obsługuje uwierzytelnianie, Firestore zapewnia synchronizację danych w czasie rzeczywistym przez nasłuchiwacze onSnapshot. Stan jest zarządzany przez React Context z niestandardowymi hookami. Schematy Zod zapewniają walidację typową od rejestracji do realizacji zamówienia.

System projektowania

Spójny system projektowania z fioletowym (#6055D8) akcentem, 16px promieniem obręczy na inputach, przyciskami w kształcie pigułek i spójnymi odstępami. Każdy komponent automatycznie dostosowuje się do systemowej palety kolorów przez useColorScheme. Osiem wariantów szkieletów zapewnia płynne postrzeganie ładowania na wszystkich ekranach.

Główne funkcje

### Synchronizacja w czasie rzeczywistym Firestore nasłuchiwacze onSnapshot utrzymują produkty, koszyk i zamówienia zsynchronizowane między urządzeniami natychmiast. Bez odświeżania, bez ręcznego aktualizowania. ### Adaptacyjny motyw Automatyczny tryb ciemny/jasny na wszystkich 14+ ekranach. Wykrywanie systemowej palety kolorów z płynnymi przejściami i semantycznym systemem tokenów. ### Pełne wsparcie języków Tłumaczenia na język angielski i polski oparte na i18n-js z automatycznym wykrywaniem języka urządzenia przez expo-localization. Przełączanie bez restartu aplikacji. ### Typowa walidacja formularzy Schematy Zod + react-hook-form kierują walidacją od autoryzacji do realizacji. Wspólne wywnioskowanie typów między logiką walidacji a interfejsem. ### 8 wariantów szkieletów Animowane szkielety ładowania dla produktów, banerów, zamówień, wierszy koszyka, sekcji formularzy i nie tylko — bez migotania treści, płynne postrzeganie wydajności. ### Powiadomienia push Expo Push API + Firebase Cloud Messaging v1 dla aktualizacji zamówień i powiadomień promocyjnych. Przełącznik uprawnień systemowych z informacją zwrotną w czasie rzeczywistym. ### Przepływ autoryzacji Logowanie email/hasło, Google Sign-In, reset hasła i Telegram OIDC. Trwałe sesje przez AsyncStorage z automatyczną ochroną routingiem. ### System promo Serwerowa walidacja kodów promocyjnych przez Firestore. Konfigurowalne stawki rabatów i terminy ważności zarządzane przez Firebase Console.

Kod

```ts import { onSnapshot, doc, getDoc, setDoc, serverTimestamp } from 'firebase/firestore'; export const CartService = { subscribe(callback: (items: CartItem[]) => void): Unsubscribe { const uid = auth.currentUser?.uid; if (!uid) { callback([]); return () => {}; } return onSnapshot(doc(db, 'carts', uid), (snapshot) => { callback(snapshot.exists() ? (snapshot.data().items ?? []) : []); }); }, async upsertItem(item: CartItem): Promise<void> { const uid = auth.currentUser!.uid; const cartRef = doc(db, 'carts', uid); const snapshot = await getDoc(cartRef); const currentItems: CartItem[] = snapshot.exists() ? (snapshot.data().items ?? []) : []; const idx = currentItems.findIndex(i => i.id === item.id); if (idx >= 0) { currentItems[idx].quantity += item.quantity; } else { currentItems.push(item); } await setDoc(cartRef, { items: currentItems, updatedAt: serverTimestamp() }); }, }; ``` Subskrypcja Firestore w czasie rzeczywistym przez `onSnapshot` utrzymuje koszyk zsynchronizowany między urządzeniami. Metoda `upsertItem` łączy ilości przy ponownym dodawaniu istniejącego produktu — bez duplikatów, bez utraty danych.

Galeria

Chcesz zobaczyć więcej?

Przegląd pełny katalog projektów lub pobierz kod źródłowy.