Init
This commit is contained in:
parent
fc32f4c18e
commit
41f829ef3f
11 changed files with 217 additions and 0 deletions
3
.gitignore
vendored
Normal file
3
.gitignore
vendored
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
.DS_Store
|
||||||
|
yarn.lock
|
||||||
|
node_modules/
|
106
App.js
Executable file
106
App.js
Executable file
|
@ -0,0 +1,106 @@
|
||||||
|
import * as React from 'react';
|
||||||
|
import { Button, StyleSheet, Text, View } from 'react-native';
|
||||||
|
import { NavigationContainer } from '@react-navigation/native';
|
||||||
|
import { createMaterialTopTabNavigator } from '@react-navigation/material-top-tabs';
|
||||||
|
import { SafeAreaView } from 'react-native-safe-area-context';
|
||||||
|
import { WebView } from 'react-native-webview'
|
||||||
|
import { StatusBar } from 'expo-status-bar';
|
||||||
|
|
||||||
|
const Tab = createMaterialTopTabNavigator();
|
||||||
|
|
||||||
|
|
||||||
|
export default function App() {
|
||||||
|
|
||||||
|
|
||||||
|
const [tabs, setTabs] = React.useState([
|
||||||
|
{
|
||||||
|
name : "tab-1",
|
||||||
|
component : TabScreen,
|
||||||
|
}
|
||||||
|
])
|
||||||
|
|
||||||
|
|
||||||
|
const addNewTab = () => {
|
||||||
|
setTabs(tabs => [
|
||||||
|
...tabs,
|
||||||
|
{
|
||||||
|
name : "tab-" + (parseInt(tabs.pop().name.replace("tab-", "")) + 1),
|
||||||
|
component : TabScreen,
|
||||||
|
}
|
||||||
|
])
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
const remove = (route) => {
|
||||||
|
setTabs(tabs => tabs.filter(tab => tab.name !== route.name))
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function TabScreen({route}) {
|
||||||
|
return (
|
||||||
|
<SafeAreaView style={S.container}>
|
||||||
|
<WebView
|
||||||
|
onError={() => Alert.alert("Page failed to load", "The page you're trying to view has failed to load. Either caused by a connection error or the a server-side issue.", [{text: 'OK'}])}
|
||||||
|
source={{ uri: 'https://design.penpot.app' }}
|
||||||
|
javaScriptEnabled={true}
|
||||||
|
javaScriptEnabledAndroid={true}
|
||||||
|
onMessage={(event) => {}}
|
||||||
|
scalesPageToFit={false}
|
||||||
|
allowsBackForwardNavigationGestures
|
||||||
|
/>
|
||||||
|
<Button
|
||||||
|
title="Add a new tab"
|
||||||
|
style={S.AddButton}
|
||||||
|
onPress={addNewTab}
|
||||||
|
></Button>
|
||||||
|
{
|
||||||
|
route.name !== "tab-1" && <Text onPress={() => remove(route)}>close me</Text>
|
||||||
|
}
|
||||||
|
</SafeAreaView>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const S = StyleSheet.create({
|
||||||
|
container: {
|
||||||
|
flex: 1,
|
||||||
|
position: 'relative'
|
||||||
|
},
|
||||||
|
AddButton: {
|
||||||
|
position: 'absolute',
|
||||||
|
bottom: 0,
|
||||||
|
right: 0,
|
||||||
|
left: 0,
|
||||||
|
height: 100,
|
||||||
|
borderWidth: 2,
|
||||||
|
borderColor: 'blue',
|
||||||
|
backgroundColor: 'white',
|
||||||
|
display: 'flex',
|
||||||
|
alignItems: 'center',
|
||||||
|
justifyContent: 'center',
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
return (
|
||||||
|
<NavigationContainer>
|
||||||
|
<Tab.Navigator styles={S.Tab}>
|
||||||
|
{
|
||||||
|
tabs.map(tab => <Tab.Screen
|
||||||
|
key={tab.name}
|
||||||
|
name={tab.name}
|
||||||
|
component={tab.component}
|
||||||
|
options={{
|
||||||
|
headerTitle: (props) => <LogoTitle {...props} />,
|
||||||
|
headerRight: () => (
|
||||||
|
<Button
|
||||||
|
onPress={() => alert('This is a button!')}
|
||||||
|
title="Info"
|
||||||
|
color="#fff"
|
||||||
|
/>
|
||||||
|
),
|
||||||
|
}}
|
||||||
|
/>)
|
||||||
|
}
|
||||||
|
</Tab.Navigator>
|
||||||
|
</NavigationContainer>
|
||||||
|
);
|
||||||
|
}
|
14
README.md
14
README.md
|
@ -1,2 +1,16 @@
|
||||||
# Penpot-App
|
# Penpot-App
|
||||||
|
> In progress
|
||||||
|
|
||||||
|
The app is currently being developed for Android at the moment, iPadOS support is planned.
|
||||||
|
|
||||||
|
Tested on OnePlus Tab.
|
||||||
|
|
||||||
|
## Building
|
||||||
|
### Requirements
|
||||||
|
- Android SDK
|
||||||
|
- Expo
|
||||||
|
- Expo Go (On Android/iOS device)
|
||||||
|
- NodeJS
|
||||||
|
|
||||||
|
### Running App
|
||||||
|
Simply connect your Android tablet and run `npm start`, then using the Expo Go app scan the QR code.
|
42
app.json
Executable file
42
app.json
Executable file
|
@ -0,0 +1,42 @@
|
||||||
|
{
|
||||||
|
"expo": {
|
||||||
|
"name": "penpot-app",
|
||||||
|
"slug": "penpot-app",
|
||||||
|
"owner": "sudovanilla",
|
||||||
|
"version": "0.0.1",
|
||||||
|
"orientation": "landscape",
|
||||||
|
"icon": "./assets/icon.png",
|
||||||
|
"userInterfaceStyle": "dark",
|
||||||
|
"githubUrl": "https://sudovanilla.com/code/Korbs/Penpot-App/",
|
||||||
|
"platforms": [
|
||||||
|
"android"
|
||||||
|
],
|
||||||
|
"splash": {
|
||||||
|
"image": "./assets/splash.png",
|
||||||
|
"resizeMode": "contain",
|
||||||
|
"backgroundColor": "#FFF"
|
||||||
|
},
|
||||||
|
"ios": {
|
||||||
|
"supportsTablet": true
|
||||||
|
},
|
||||||
|
"android": {
|
||||||
|
"adaptiveIcon": {
|
||||||
|
"foregroundImage": "./assets/adaptive-icon.png",
|
||||||
|
"backgroundColor": "#FFF"
|
||||||
|
},
|
||||||
|
"package": "com.sudovanilla.penpotapp"
|
||||||
|
},
|
||||||
|
"androidStatusBar": {
|
||||||
|
"backgroundColor": "#000",
|
||||||
|
"translucent": false
|
||||||
|
},
|
||||||
|
"assetBundlePatterns": [
|
||||||
|
"**/*"
|
||||||
|
],
|
||||||
|
"extra": {
|
||||||
|
"eas": {
|
||||||
|
"projectId": "9f3d77d2-68f6-463f-909f-cb600ef6eeac"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
BIN
assets/adaptive-icon.png
Normal file
BIN
assets/adaptive-icon.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 32 KiB |
BIN
assets/favicon.png
Normal file
BIN
assets/favicon.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 956 B |
BIN
assets/icon.png
Normal file
BIN
assets/icon.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 32 KiB |
BIN
assets/splash.png
Normal file
BIN
assets/splash.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 33 KiB |
6
babel.config.js
Executable file
6
babel.config.js
Executable file
|
@ -0,0 +1,6 @@
|
||||||
|
module.exports = function(api) {
|
||||||
|
api.cache(true);
|
||||||
|
return {
|
||||||
|
presets: ['babel-preset-expo'],
|
||||||
|
};
|
||||||
|
};
|
18
eas.json
Normal file
18
eas.json
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
{
|
||||||
|
"cli": {
|
||||||
|
"version": ">= 3.13.2"
|
||||||
|
},
|
||||||
|
"build": {
|
||||||
|
"development": {
|
||||||
|
"developmentClient": true,
|
||||||
|
"distribution": "internal"
|
||||||
|
},
|
||||||
|
"preview": {
|
||||||
|
"distribution": "internal"
|
||||||
|
},
|
||||||
|
"production": {}
|
||||||
|
},
|
||||||
|
"submit": {
|
||||||
|
"production": {}
|
||||||
|
}
|
||||||
|
}
|
28
package.json
Executable file
28
package.json
Executable file
|
@ -0,0 +1,28 @@
|
||||||
|
{
|
||||||
|
"name": "penpot-app",
|
||||||
|
"version": "0.0.1",
|
||||||
|
"main": "node_modules/expo/AppEntry.js",
|
||||||
|
"scripts": {
|
||||||
|
"start": "expo start",
|
||||||
|
"android": "expo start --android",
|
||||||
|
"ios": "expo start --ios"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"@react-navigation/material-top-tabs": "^6.6.2",
|
||||||
|
"@react-navigation/native": "^6.1.6",
|
||||||
|
"expo": "~48.0.18",
|
||||||
|
"expo-status-bar": "~1.4.4",
|
||||||
|
"react": "18.2.0",
|
||||||
|
"react-native": "0.71.8",
|
||||||
|
"react-native-floating-action": "^1.22.0",
|
||||||
|
"react-native-pager-view": "^6.2.0",
|
||||||
|
"react-native-safe-area-context": "4.5.0",
|
||||||
|
"react-native-screens": "~3.20.0",
|
||||||
|
"react-native-tab-view": "^3.5.1",
|
||||||
|
"react-native-webview": "^12.2.0"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@babel/core": "^7.20.0"
|
||||||
|
},
|
||||||
|
"private": true
|
||||||
|
}
|
Reference in a new issue