This commit is contained in:
EthanShoeDev
2025-09-02 01:18:03 -04:00
parent b57dbd9cf5
commit 43bf24b11c
13 changed files with 931 additions and 102 deletions

2
.prettierignore Normal file
View File

@@ -0,0 +1,2 @@
android/
docs/

10
.vscode/settings.json vendored
View File

@@ -1,7 +1,7 @@
{
"editor.codeActionsOnSave": {
"source.fixAll": "explicit",
"source.organizeImports": "explicit",
"source.sortMembers": "explicit"
}
"editor.codeActionsOnSave": {
"source.fixAll": "explicit",
"source.organizeImports": "explicit",
"source.sortMembers": "explicit"
}
}

View File

@@ -1,6 +1,7 @@
# Welcome to your Expo app 👋
This is an [Expo](https://expo.dev) project created with [`create-expo-app`](https://www.npmjs.com/package/create-expo-app).
This is an [Expo](https://expo.dev) project created with
[`create-expo-app`](https://www.npmjs.com/package/create-expo-app).
## Get started
@@ -21,9 +22,11 @@ In the output, you'll find options to open the app in a
- [development build](https://docs.expo.dev/develop/development-builds/introduction/)
- [Android emulator](https://docs.expo.dev/workflow/android-studio-emulator/)
- [iOS simulator](https://docs.expo.dev/workflow/ios-simulator/)
- [Expo Go](https://expo.dev/go), a limited sandbox for trying out app development with Expo
- [Expo Go](https://expo.dev/go), a limited sandbox for trying out app
development with Expo
You can start developing by editing the files inside the **app** directory. This project uses [file-based routing](https://docs.expo.dev/router/introduction).
You can start developing by editing the files inside the **app** directory. This
project uses [file-based routing](https://docs.expo.dev/router/introduction).
## Get a fresh project
@@ -33,18 +36,25 @@ When you're ready, run:
pnpm run reset-project
```
This command will move the starter code to the **app-example** directory and create a blank **app** directory where you can start developing.
This command will move the starter code to the **app-example** directory and
create a blank **app** directory where you can start developing.
## Learn more
To learn more about developing your project with Expo, look at the following resources:
To learn more about developing your project with Expo, look at the following
resources:
- [Expo documentation](https://docs.expo.dev/): Learn fundamentals, or go into advanced topics with our [guides](https://docs.expo.dev/guides).
- [Learn Expo tutorial](https://docs.expo.dev/tutorial/introduction/): Follow a step-by-step tutorial where you'll create a project that runs on Android, iOS, and the web.
- [Expo documentation](https://docs.expo.dev/): Learn fundamentals, or go into
advanced topics with our [guides](https://docs.expo.dev/guides).
- [Learn Expo tutorial](https://docs.expo.dev/tutorial/introduction/): Follow a
step-by-step tutorial where you'll create a project that runs on Android, iOS,
and the web.
## Join the community
Join our community of developers creating universal apps.
- [Expo on GitHub](https://github.com/expo/expo): View our open source platform and contribute.
- [Discord community](https://chat.expo.dev): Chat with Expo users and ask questions.
- [Expo on GitHub](https://github.com/expo/expo): View our open source platform
and contribute.
- [Discord community](https://chat.expo.dev): Chat with Expo users and ask
questions.

View File

@@ -63,3 +63,6 @@ expo.useLegacyPackaging=false
# Specifies whether the app is configured to use edge-to-edge via the app config or plugin
# WARNING: This property has been deprecated and will be removed in Expo SDK 55. Use `edgeToEdgeEnabled` or `react.edgeToEdgeEnabled` to determine whether the project is using edge-to-edge.
expo.edgeToEdgeEnabled=true
android.packagingOptions.pickFirsts=META-INF/versions/9/OSGI-INF/MANIFEST.MF

View File

@@ -1,44 +1,44 @@
{
"expo": {
"name": "fressh",
"slug": "fressh",
"version": "1.0.0",
"orientation": "portrait",
"icon": "./assets/images/icon.png",
"scheme": "fressh",
"userInterfaceStyle": "automatic",
"newArchEnabled": true,
"ios": {
"supportsTablet": true
},
"android": {
"package": "dev.fressh.app",
"adaptiveIcon": {
"foregroundImage": "./assets/images/adaptive-icon.png",
"backgroundColor": "#ffffff"
},
"edgeToEdgeEnabled": true,
"predictiveBackGestureEnabled": false
},
"web": {
"output": "static",
"favicon": "./assets/images/favicon.png"
},
"plugins": [
"expo-router",
[
"expo-splash-screen",
{
"image": "./assets/images/splash-icon.png",
"imageWidth": 200,
"resizeMode": "contain",
"backgroundColor": "#ffffff"
}
]
],
"experiments": {
"typedRoutes": true,
"reactCompiler": true
}
}
"expo": {
"name": "fressh",
"slug": "fressh",
"version": "1.0.0",
"orientation": "portrait",
"icon": "./assets/images/icon.png",
"scheme": "fressh",
"userInterfaceStyle": "automatic",
"newArchEnabled": true,
"ios": {
"supportsTablet": true
},
"android": {
"package": "dev.fressh.app",
"adaptiveIcon": {
"foregroundImage": "./assets/images/adaptive-icon.png",
"backgroundColor": "#ffffff"
},
"edgeToEdgeEnabled": true,
"predictiveBackGestureEnabled": false
},
"web": {
"output": "static",
"favicon": "./assets/images/favicon.png"
},
"plugins": [
"expo-router",
[
"expo-splash-screen",
{
"image": "./assets/images/splash-icon.png",
"imageWidth": 200,
"resizeMode": "contain",
"backgroundColor": "#ffffff"
}
]
],
"experiments": {
"typedRoutes": true,
"reactCompiler": true
}
}
}

View File

@@ -1,5 +1,5 @@
import { Stack } from "expo-router";
import { Stack } from 'expo-router'
export default function RootLayout() {
return <Stack />;
return <Stack />
}

View File

@@ -1,15 +1,38 @@
import { Text, View } from "react-native";
import SSHClient, { PtyType } from '@dylankenneally/react-native-ssh-sftp'
import { Button, Text, View } from 'react-native'
export default function Index() {
return (
<View
style={{
flex: 1,
justifyContent: "center",
alignItems: "center",
}}
>
<Text>Edit app/index.tsx to edit this screen.</Text>
</View>
);
return (
<View
style={{
flex: 1,
justifyContent: 'center',
alignItems: 'center',
}}
>
<Text>Edit app/index.tsx to edit this screen.</Text>
<Button
title="Click me"
onPress={() => {
console.log('Connecting...')
SSHClient.connectWithPassword(
'test.rebex.net',
22,
'demo',
'password',
).then(async (client) => {
alert('Connected')
client.on('Shell', (data) => {
console.log(data)
})
await client.startShell(PtyType.XTERM)
setTimeout(() => {
client.disconnect()
}, 5_000)
})
}}
/>
</View>
)
}

3
docs/ssh_client.md Normal file
View File

@@ -0,0 +1,3 @@
https://github.com/dylankenneally/react-native-ssh-sftp
https://xtermjs.org/
https://docs.expo.dev/versions/latest/sdk/webview/

View File

@@ -1,10 +1,10 @@
// https://docs.expo.dev/guides/using-eslint/
const { defineConfig } = require('eslint/config');
const expoConfig = require('eslint-config-expo/flat');
const { defineConfig } = require('eslint/config')
const expoConfig = require('eslint-config-expo/flat')
module.exports = defineConfig([
expoConfig,
{
ignores: ['dist/*'],
},
]);
expoConfig,
{
ignores: ['dist/*'],
},
])

View File

@@ -8,9 +8,12 @@
"android": "expo run:android",
"ios": "expo run:ios",
"web": "expo start --web",
"lint": "expo lint"
"lint": "expo lint",
"format": "prettier . --write",
"typecheck": "tsc"
},
"dependencies": {
"@dylankenneally/react-native-ssh-sftp": "^1.5.20",
"@expo/vector-icons": "^15.0.2",
"@react-navigation/bottom-tabs": "^7.4.0",
"@react-navigation/elements": "^2.6.3",
@@ -30,17 +33,21 @@
"react-dom": "19.1.0",
"react-native": "0.81.1",
"react-native-gesture-handler": "~2.28.0",
"react-native-worklets": "~0.4.2",
"react-native-reanimated": "~4.0.2",
"react-native-safe-area-context": "~5.6.0",
"react-native-screens": "~4.15.4",
"react-native-web": "~0.21.0"
"react-native-web": "~0.21.0",
"react-native-worklets": "~0.4.2"
},
"devDependencies": {
"@epic-web/config": "^1.21.3",
"@types/react": "~19.1.0",
"typescript": "~5.9.2",
"eslint": "^9.25.0",
"eslint-config-expo": "~10.0.0"
"eslint-config-expo": "~10.0.0",
"prettier": "^3.6.2",
"prettier-plugin-organize-imports": "^4.2.0",
"tsx": "^4.20.5",
"typescript": "~5.9.2"
},
"private": true
}

785
pnpm-lock.yaml generated

File diff suppressed because it is too large Load Diff

13
prettier.config.js Normal file
View File

@@ -0,0 +1,13 @@
import defaultConfig from '@epic-web/config/prettier'
// Sometimes this plugin can remove imports that are in use.
// As a workaround we will only use this in the cli. (npm run fmt)
const sortImports = process.env.SORT_IMPORTS === 'true'
/** @type {import("prettier").Options} */
export default {
...defaultConfig,
plugins: [
...(sortImports ? ['prettier-plugin-organize-imports'] : []),
...(defaultConfig.plugins || []),
],
}

View File

@@ -1,17 +1,10 @@
{
"extends": "expo/tsconfig.base",
"compilerOptions": {
"strict": true,
"paths": {
"@/*": [
"./*"
]
}
},
"include": [
"**/*.ts",
"**/*.tsx",
".expo/types/**/*.ts",
"expo-env.d.ts"
]
"extends": "expo/tsconfig.base",
"compilerOptions": {
"strict": true,
"paths": {
"@/*": ["./*"]
}
},
"include": ["**/*.ts", "**/*.tsx", ".expo/types/**/*.ts", "expo-env.d.ts"]
}