Материки нарисованы сеткой точек в Skia, города отмечены пульсирующими метками, а между ними натянуты дуги. По дугам по очереди летят кометы с градиентным хвостом, и в точке прибытия расходится кольцо. По нажатию на город — или при наведении курсора в вебе — метка увеличивается и появляется подпись.
Карта подстраивается под ширину контейнера, анимация идёт на UI-потоке Reanimated. При «Уменьшении движения» кометы не летят. Светлая и тёмная палитры переключаются пропом theme. Работает на iOS, Android и в вебе.
Поставьте зависимости:
npm install @shopify/react-native-skia react-native-gesture-handler react-native-reanimated react-native-workletspnpm add @shopify/react-native-skia react-native-gesture-handler react-native-reanimated react-native-workletsyarn add @shopify/react-native-skia react-native-gesture-handler react-native-reanimated react-native-workletsbun add @shopify/react-native-skia react-native-gesture-handler react-native-reanimated react-native-workletsСкопируйте эти файлы в src/shared/components/organisms/world-map/:
Код доступен по подпискеPro
Исходник «Карта мира» открывается с подпиской Pro. Уже оформили? Войдите в аккаунт.
Проверьте алиас путей. Импорты в коде выше записаны так, как их пишет astra-rn add: @/shared/components, @/shared/utils и @/shared/hooks. Нужен алиас "@/*": ["./src/*"] в tsconfig.json — или поправьте импорты под свои пути.
Код доступен по подпискеPro
Исходник «Карта мира» открывается с подпиской Pro. Уже оформили? Войдите в аккаунт.
Дуги в arcs ссылаются на метки по индексам в массиве markers.
markers?Тип readonly IWorldMapMarker[]
arcs?Тип readonly IWorldMapArc[]
color?Тип string
arcFrom?Тип string
arcTo?Тип string
interval?Тип number
cometDuration?Тип number
arcLift?Тип number
theme?Тип WorldMapTheme
style?Тип StyleProp<ViewStyle>