A React Native mobile application built with Expo, designed to facilitate help requests and offers within the METU community.
METU Help is a cross-platform mobile application that connects students and staff at Middle East Technical University (METU) to help each other. Users can post help requests, offer assistance, and browse available opportunities to contribute to the community.
Key Features:
- Browse help requests and offers
- Post and manage help requests
- Ask questions within the community
- User profile management
- Multi-language support (Turkish/English)
- Dark mode support
- Responsive design
Supported Platforms:
- iOS (Apple devices)
- Android (Google devices)
- Web (Browser-based)
| Category | Technology |
|---|---|
| Framework | React Native 0.81.5 / Expo 54.0.23 |
| Language | TypeScript 5.9.2 |
| Navigation | React Navigation 7.x |
| Styling | React Native native components with theme system |
| Linting | ESLint 9.25.0 |
| Formatting | Prettier 3.6.2 |
| Build Tool | Expo CLI |
| Package Manager | npm/yarn |
-MetuAPP/
├── components/ # Reusable UI components
│ ├── Button.tsx
│ ├── Card.tsx
│ ├── ErrorBoundary.tsx
│ ├── HeaderTitle.tsx
│ ├── LanguageToggle.tsx
│ ├── ScreenFlatList.tsx
│ ├── ScreenKeyboardAwareScrollView.tsx
│ ├── ScreenScrollView.tsx
│ ├── Spacer.tsx
│ ├── ThemedText.tsx
│ └── ThemedView.tsx
│
├── screens/ # Screen components
│ ├── HomeScreen.tsx
│ ├── BrowseScreen.tsx
│ ├── AskQuestionScreen.tsx
│ ├── NeedHelpScreen.tsx
│ ├── OfferHelpScreen.tsx
│ ├── ProfileScreen.tsx
│ ├── PostNeedScreen.tsx
│ ├── QuestionDetailScreen.tsx
│ └── RequestDetailScreen.tsx
│
├── navigation/ # Navigation configuration
│ ├── MainTabNavigator.tsx
│ ├── HomeStackNavigator.tsx
│ ├── BrowseStackNavigator.tsx
│ ├── ProfileStackNavigator.tsx
│ └── screenOptions.ts
│
├── contexts/ # React Context for state management
│ └── LanguageContext.tsx
│
├── hooks/ # Custom React hooks
│ ├── useColorScheme.ts
│ ├── useColorScheme.web.ts
│ ├── useScreenInsets.ts
│ └── useTheme.ts
│
├── constants/ # Application constants
│ └── theme.ts
│
├── assets/ # Static assets
│ └── images/
│
├── scripts/ # Build and utility scripts
│ ├── build.js
│ └── landing-page-template.html
│
├── App.tsx # Root component
├── app.json # Expo configuration
├── package.json # Dependencies and scripts
├── tsconfig.json # TypeScript configuration
├── babel.config.js # Babel configuration
├── eslint.config.js # ESLint configuration
└── README.md # This file
The project uses Prettier for code formatting and ESLint for linting.
npm run formatnpm run check:formatnpm run lintnpm run lint -- --fixAll files should use TypeScript (.tsx for React components, .ts for utilities).
Type Checking:
tsc --noEmit- Components: PascalCase (e.g.,
HomeScreen.tsx) - Hooks: camelCase prefixed with "use" (e.g.,
useTheme.ts) - Constants: UPPER_SNAKE_CASE
- Variables/Functions: camelCase
- Types/Interfaces: PascalCase
import React from 'react';
import { View, Text } from 'react-native';
interface ComponentProps {
title: string;
onPress?: () => void;
}
export const MyComponent: React.FC<ComponentProps> = ({
title,
onPress
}) => {
return (
<View>
<Text>{title}</Text>
</View>
);
};Use the useTheme hook for consistent styling:
import { useTheme } from '@/hooks/useTheme';
export const MyComponent = () => {
const { colors, spacing } = useTheme();
return (
<View style={{ backgroundColor: colors.background }}>
{/* Component */}
</View>
);
};Use the LanguageContext for internationalization:
import { useContext } from 'react';
import { LanguageContext } from '@/contexts/LanguageContext';
export const MyComponent = () => {
const { language, translate } = useContext(LanguageContext);
return <Text>{translate('key')}</Text>;
};- Create feature branch:
git checkout -b feature/feature-name- Make changes and commit:
git add .
git commit -m "feat: add new feature"- Push and create PR:
git push origin feature/feature-nameIf port 8081 is already in use:
# Kill the process using the port (Linux/macOS)
lsof -ti:8081 | xargs kill -9
# Or use a different port
npx expo start --web --port 3000If you experience build issues, clear cache:
# Clear all cache
rm -rf node_modules .expo dist
npm install
# Or use Expo's cache clearing
npx expo start --clearUpdate dependencies:
npm install
npx expo prebuild --clean# Clean iOS build
rm -rf ios
npx expo prebuild --clean
# Or reinstall pods
cd ios
rm -rf Pods Podfile.lock
pod install
cd ..# Clean Android build
rm -rf android
npx expo prebuild --clean
# Or clear Gradle cache
cd android
./gradlew clean
cd ..Ensure Metro bundler is running properly:
npx expo start --reset-cacheCheck credentials and app configuration:
npx eas credentials
npx eas build:list
npx eas submit:list- Store sensitive data (API keys, tokens) in environment variables
- Use
.envfiles (never commit to git) - Add
.envto.gitignore - Implement proper authentication mechanisms
- Validate all user inputs
- Use HTTPS for all API communications
- Keep dependencies updated regularly
- React Native Documentation
- Expo Documentation
- React Navigation Docs
- TypeScript Documentation
- Expo EAS Build
- App Store Connect
- Google Play Console
For issues, questions, or contributions:
- Check existing issues on GitHub
- Create a new issue with detailed description
- Fork the repository and create a pull request
- Follow the project's code style and conventions
This project is private and proprietary to METU Help.
Last Updated: December 2025 Version: 1.0.0