Initialize Expo app structure
This commit is contained in:
@@ -0,0 +1,8 @@
|
|||||||
|
node_modules/
|
||||||
|
.expo/
|
||||||
|
dist/
|
||||||
|
web-build/
|
||||||
|
.idea/
|
||||||
|
npm-debug.log*
|
||||||
|
yarn-debug.log*
|
||||||
|
yarn-error.log*
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
import { StatusBar } from 'expo-status-bar';
|
||||||
|
import { SafeAreaView, StyleSheet } from 'react-native';
|
||||||
|
|
||||||
|
import HomeScreen from './src/screens/HomeScreen';
|
||||||
|
|
||||||
|
export default function App() {
|
||||||
|
return (
|
||||||
|
<SafeAreaView style={styles.container}>
|
||||||
|
<HomeScreen />
|
||||||
|
<StatusBar style="dark" />
|
||||||
|
</SafeAreaView>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const styles = StyleSheet.create({
|
||||||
|
container: {
|
||||||
|
flex: 1,
|
||||||
|
backgroundColor: '#f7f3ea'
|
||||||
|
}
|
||||||
|
});
|
||||||
@@ -1,2 +1,75 @@
|
|||||||
# Shoppy
|
# Shoppy
|
||||||
|
|
||||||
Smart Shopping Companion
|
Smart Shopping Companion
|
||||||
|
|
||||||
|
## App-Idee
|
||||||
|
|
||||||
|
Shoppy ist eine mobile Expo-App, die Einkaufsvorbereitung einfacher macht. Nutzerinnen und Nutzer sollen Einkaufslisten schnell erfassen, organisieren und im Laden effizient abarbeiten koennen.
|
||||||
|
|
||||||
|
## Zielgruppe
|
||||||
|
|
||||||
|
Die App richtet sich an Studierende, Familien und Berufstaetige, die regelmaessig einkaufen und ihre Einkaufsplanung uebersichtlich digitalisieren moechten.
|
||||||
|
|
||||||
|
## Wichtigste Funktionen
|
||||||
|
|
||||||
|
- Einkaufslisten erstellen und bearbeiten
|
||||||
|
- Artikel nach Status markieren
|
||||||
|
- Uebersichtlicher Startbildschirm mit aktuellem Listenstatus
|
||||||
|
- Spaeter geplant: Kategorien, Favoriten, Budget-Hinweise und geteilte Listen
|
||||||
|
|
||||||
|
## One-Pager
|
||||||
|
|
||||||
|
Der One-Pager aus Aufgabe 6.1 wird hier verlinkt:
|
||||||
|
|
||||||
|
- One-Pager: TODO Link eintragen
|
||||||
|
|
||||||
|
## Geplanter Tech-Stack
|
||||||
|
|
||||||
|
- Expo
|
||||||
|
- React Native
|
||||||
|
- JavaScript
|
||||||
|
- GitHub oder GitLab fuer Versionsverwaltung und Abgabe
|
||||||
|
|
||||||
|
## Ordnerstruktur
|
||||||
|
|
||||||
|
```text
|
||||||
|
Shoppy/
|
||||||
|
├── assets/
|
||||||
|
├── src/
|
||||||
|
│ ├── assets/
|
||||||
|
│ ├── components/
|
||||||
|
│ │ └── PrimaryButton.js
|
||||||
|
│ └── screens/
|
||||||
|
│ └── HomeScreen.js
|
||||||
|
├── App.js
|
||||||
|
├── app.json
|
||||||
|
├── babel.config.js
|
||||||
|
├── package.json
|
||||||
|
└── README.md
|
||||||
|
```
|
||||||
|
|
||||||
|
## Runbook
|
||||||
|
|
||||||
|
Projekt installieren:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm install
|
||||||
|
```
|
||||||
|
|
||||||
|
Projekt starten:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm start
|
||||||
|
```
|
||||||
|
|
||||||
|
Alternativ direkt mit Expo:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npx expo start
|
||||||
|
```
|
||||||
|
|
||||||
|
Danach kann die App mit Expo Go auf einem Smartphone oder in einem Emulator gestartet werden.
|
||||||
|
|
||||||
|
## Repository teilen
|
||||||
|
|
||||||
|
Nach dem Push zu GitHub oder GitLab den Repository-Link an den Kursleiter senden.
|
||||||
|
|||||||
@@ -0,0 +1,23 @@
|
|||||||
|
{
|
||||||
|
"expo": {
|
||||||
|
"name": "Shoppy",
|
||||||
|
"slug": "shoppy",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"orientation": "portrait",
|
||||||
|
"userInterfaceStyle": "automatic",
|
||||||
|
"splash": {
|
||||||
|
"backgroundColor": "#f7f3ea"
|
||||||
|
},
|
||||||
|
"assetBundlePatterns": [
|
||||||
|
"**/*"
|
||||||
|
],
|
||||||
|
"ios": {
|
||||||
|
"supportsTablet": true
|
||||||
|
},
|
||||||
|
"android": {
|
||||||
|
"adaptiveIcon": {
|
||||||
|
"backgroundColor": "#f7f3ea"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
module.exports = function (api) {
|
||||||
|
api.cache(true);
|
||||||
|
|
||||||
|
return {
|
||||||
|
presets: ['babel-preset-expo']
|
||||||
|
};
|
||||||
|
};
|
||||||
Generated
+14187
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,20 @@
|
|||||||
|
{
|
||||||
|
"name": "shoppy",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"private": true,
|
||||||
|
"main": "node_modules/expo/AppEntry.js",
|
||||||
|
"scripts": {
|
||||||
|
"start": "expo start",
|
||||||
|
"android": "expo start --android",
|
||||||
|
"ios": "expo start --ios",
|
||||||
|
"web": "expo start --web"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"expo": "~51.0.0",
|
||||||
|
"react": "18.2.0",
|
||||||
|
"react-native": "0.74.5"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@babel/core": "^7.24.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
import { Pressable, StyleSheet, Text } from 'react-native';
|
||||||
|
|
||||||
|
export default function PrimaryButton({ label, onPress }) {
|
||||||
|
return (
|
||||||
|
<Pressable
|
||||||
|
accessibilityRole="button"
|
||||||
|
onPress={onPress}
|
||||||
|
style={({ pressed }) => [
|
||||||
|
styles.button,
|
||||||
|
pressed ? styles.buttonPressed : null
|
||||||
|
]}
|
||||||
|
>
|
||||||
|
<Text style={styles.label}>{label}</Text>
|
||||||
|
</Pressable>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const styles = StyleSheet.create({
|
||||||
|
button: {
|
||||||
|
alignItems: 'center',
|
||||||
|
backgroundColor: '#256f5b',
|
||||||
|
borderRadius: 8,
|
||||||
|
paddingHorizontal: 20,
|
||||||
|
paddingVertical: 14
|
||||||
|
},
|
||||||
|
buttonPressed: {
|
||||||
|
opacity: 0.82
|
||||||
|
},
|
||||||
|
label: {
|
||||||
|
color: '#ffffff',
|
||||||
|
fontSize: 16,
|
||||||
|
fontWeight: '700'
|
||||||
|
}
|
||||||
|
});
|
||||||
@@ -0,0 +1,81 @@
|
|||||||
|
import { useState } from 'react';
|
||||||
|
import { StyleSheet, Text, View } from 'react-native';
|
||||||
|
|
||||||
|
import PrimaryButton from '../components/PrimaryButton';
|
||||||
|
|
||||||
|
export default function HomeScreen() {
|
||||||
|
const [status, setStatus] = useState('Bereit fuer deine erste Einkaufsliste.');
|
||||||
|
|
||||||
|
return (
|
||||||
|
<View style={styles.screen}>
|
||||||
|
<View style={styles.header}>
|
||||||
|
<Text style={styles.eyebrow}>Smart Shopping Companion</Text>
|
||||||
|
<Text style={styles.title}>Shoppy</Text>
|
||||||
|
<Text style={styles.subtitle}>
|
||||||
|
Plane Einkaeufe schneller, behalte Listen im Blick und spare Zeit im Laden.
|
||||||
|
</Text>
|
||||||
|
</View>
|
||||||
|
|
||||||
|
<View style={styles.panel}>
|
||||||
|
<Text style={styles.panelTitle}>Startseite</Text>
|
||||||
|
<Text style={styles.status}>{status}</Text>
|
||||||
|
<PrimaryButton
|
||||||
|
label="Liste vorbereiten"
|
||||||
|
onPress={() => setStatus('Demo-Status: Deine Einkaufsliste wird vorbereitet.')}
|
||||||
|
/>
|
||||||
|
</View>
|
||||||
|
</View>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const styles = StyleSheet.create({
|
||||||
|
screen: {
|
||||||
|
flex: 1,
|
||||||
|
justifyContent: 'center',
|
||||||
|
padding: 24
|
||||||
|
},
|
||||||
|
header: {
|
||||||
|
marginBottom: 28
|
||||||
|
},
|
||||||
|
eyebrow: {
|
||||||
|
color: '#256f5b',
|
||||||
|
fontSize: 14,
|
||||||
|
fontWeight: '700',
|
||||||
|
marginBottom: 8,
|
||||||
|
textTransform: 'uppercase'
|
||||||
|
},
|
||||||
|
title: {
|
||||||
|
color: '#18201d',
|
||||||
|
fontSize: 42,
|
||||||
|
fontWeight: '800',
|
||||||
|
marginBottom: 10
|
||||||
|
},
|
||||||
|
subtitle: {
|
||||||
|
color: '#4f5f59',
|
||||||
|
fontSize: 17,
|
||||||
|
lineHeight: 24
|
||||||
|
},
|
||||||
|
panel: {
|
||||||
|
backgroundColor: '#ffffff',
|
||||||
|
borderRadius: 8,
|
||||||
|
gap: 16,
|
||||||
|
padding: 20,
|
||||||
|
shadowColor: '#000000',
|
||||||
|
shadowOffset: {
|
||||||
|
height: 4,
|
||||||
|
width: 0
|
||||||
|
},
|
||||||
|
shadowOpacity: 0.08,
|
||||||
|
shadowRadius: 12
|
||||||
|
},
|
||||||
|
panelTitle: {
|
||||||
|
color: '#18201d',
|
||||||
|
fontSize: 20,
|
||||||
|
fontWeight: '700'
|
||||||
|
},
|
||||||
|
status: {
|
||||||
|
color: '#4f5f59',
|
||||||
|
fontSize: 16,
|
||||||
|
lineHeight: 22
|
||||||
|
}
|
||||||
|
});
|
||||||
Reference in New Issue
Block a user