Перейти к содержимому

Приложение для посетителей турниров: найти турнир, записаться, следить за игрой, расти в рейтинге.

Где код: github.com/Klonaps/poker-player, локально repos/poker-player.

Expo 57 / React Native 0.86, expo-router, TanStack Query, zustand, i18next, socket.io-client, reanimated. Таргеты — iOS, Android и веб-сборка.

Окно терминала
pnpm --dir repos/poker-player exec expo start --web --port 8090 --clear

Адрес API задаётся переменной EXPO_PUBLIC_API_URL; для локального стенда это http://localhost:3001. Конфигурация стенда лежит в .claude/launch.json корневого репозитория.

pnpm build:webexpo export --platform web плюс минификация HTML. В образе статику раздаёт nginx, app.json задаёт web.output = "single", то есть SPA с клиентской маршрутизацией: nginx заворачивает неизвестные пути в index.html.

Обе переменные EXPO_PUBLIC_* — аргументы сборки, а не переменные рантайма. Metro подставляет значения прямо в бандл, поэтому сменить их можно только пересборкой образа; в Dokploy они задаются в Build Args, не в Env:

Аргумент Что задаёт
EXPO_PUBLIC_API_URL голый origin API, без /api/v1
EXPO_PUBLIC_SHARE_BASE_URL база для ссылок «поделиться турниром»

Значение EXPO_PUBLIC_API_URL — именно голый origin: префикс версии дописывает HTTP-клиент, а socket.io берёт этот же origin для namespace /live, который под префиксом не живёт.

Окно терминала
pnpm gen:api

Генерирует src/api/schema.d.ts из openapi.json бэкенда. Запускать после каждого изменения контракта, иначе типы разъедутся с реальностью молча.

Окно терминала
pnpm test

Это jest --forceExit. Флаг обязателен: без него открытые хендлы не дают процессу завершиться, и прогон висит до таймаута.