Star Wars Galaxies

Access to all the Star Wars information at your fingertips.
I followed the tutorial for this on Galaxies.dev. It goes through making reusable components, JSX and styling, Navigation, storing data, working with JSON data, API calls, Tab bar, AsyncStorage, useEffect, useState and a few other things. I added several features including finishing the 'people' page as the instructor suggested, some background images and much more! I had a blast making this and I’m ready to become a huge Star Wars nerd. Please read on to see the details of the added features, the best one is at the bottom!

Skills Used:

Skills Learned:

Github
Info Website
See it here!

Characters Tab

I added a search bar to the header of this screen and made the FlatList searchable. This uses the useContext provided by React to manage state. It handles the pagination of the ‘people’ data from the Star Wars API by adding to the list of characters for each page. This is stored in the RAM by the function and destroyed when the application closes, unlike the favorites data stored in AsyncStorage which is stored on the user’s device drive. I also created a loading state variable in the PeopleContext so and exposed it so that the page displaying the data would be able to render a loading screen while the data is being fetched. The character details page has a styled Touchable Opacity to bring the user to that Character’s home world. This page also displays the character’s movies. Both are done by manipulating the URL that is in place for the home world or movie and then using dot notation to display the name or title respectively.

Planets Tab

I also added a planets tab that is searchable as well, but this one uses a native search bar. This uses SWAPI's search API call rather than loading all the elements into a state variable. While both lists are small enough to load into memory, I wanted to have two different methods in place to practice querying in different ways. The user can search and see the results displayed immediately just like the Characters tab.

Opening Crawl

If you’ve ever watched a Star Wars movie, you know this iconic opening marquee.
The React Native component, crawl.tsx, is designed to bring the iconic Star Wars opening crawl animation to life in mobile applications and on the web. Utilizing the Animated library, it features a sequence of animations including fading, scaling, and translating elements within a modal. The component dynamically displays a provided opening crawl text with cinematic effects: a fade-in and fade-out introduction text ("A long time ago in a galaxy far, far away..."), a scaling and fading logo animation, a scrolling and tilted crawl text animation with customizable content, and a starry background image for immersion. Styled using StyleSheet, it supports responsive design with Dimensions. This component demonstrates expertise in React Native animations, dynamic content handling, and creative UI design. And I just had to do it. I hope you enjoy being able to watch the opening crawl of the Star Wars films in the palm of your hand.
useEffect(() => { // Sequence of animations Animated.sequence([ // Step 1: Fade in the View with texts Animated.timing(viewOpacity, { toValue: 1, duration: 1000, // 1 second fade-in useNativeDriver: true, }), Animated.timing(viewOpacity, { toValue: 0, duration: 1000, // 1 second fade-out after 5 seconds delay: 4000, // Wait for 4 seconds before fading out useNativeDriver: true, }), // Step 2: Scale and fade in the logo Animated.parallel([ Animated.timing(logoOpacity, { toValue: 1, duration: 1000, // 1 second fade-in useNativeDriver: true, }), Animated.timing(logoScale, { toValue: 0.05, // Shrink to 1/20th of the size duration: 12000, // 10 seconds useNativeDriver: true, }), ]), // Step 3: Fade out the logo Animated.timing(logoOpacity, { toValue: 0, duration: 1000, // 1 second fade-out useNativeDriver: true, }), ]).start(); // Step 4: Animate the crawl text Animated.parallel([ Animated.timing(translateY, { toValue: -1000, // Move the text far up duration: 70000, // Duration of the animation (70 seconds) delay: 4000, // Delay before starting the crawl useNativeDriver: true, }), // Animated.timing(crawlScale, { // toValue: 0.5, // Shrink to 50% of the original size // duration: 70000, // Match the duration of the crawl // delay: 8000, // Delay before starting the crawl // useNativeDriver: true, // }), ]).start(); }, [viewOpacity, logoScale, logoOpacity, translateY, crawlScale]);
Home
These practice and production projects have extensive information on how they were built.
Portfolio
Mobile Apps
APIs and MCP servers available for public use.
Public Facing
Services
Contact