🚀 Launch v1.0 pre-alpha testing

This commit is contained in:
LittleSheep 2024-03-29 13:19:58 +08:00
parent d221be90b5
commit ac7533dec5
37 changed files with 194 additions and 101 deletions

View File

@ -38,4 +38,9 @@
<!-- Permissions --> <!-- Permissions -->
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"
android:maxSdkVersion="32" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
android:maxSdkVersion="29" />
</manifest> </manifest>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.7 KiB

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.2 KiB

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 845 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.7 KiB

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.9 KiB

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.4 KiB

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.5 KiB

After

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.2 KiB

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 9.7 KiB

View File

@ -7,7 +7,7 @@ buildscript {
mavenCentral() mavenCentral()
} }
dependencies { dependencies {
classpath 'com.android.tools.build:gradle:8.0.0' classpath 'com.android.tools.build:gradle:8.3.1'
classpath 'com.google.gms:google-services:4.3.15' classpath 'com.google.gms:google-services:4.3.15'
// NOTE: Do not place your application dependencies here; they belong // NOTE: Do not place your application dependencies here; they belong

View File

@ -1,6 +1,6 @@
distributionBase=GRADLE_USER_HOME distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.0.2-all.zip distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-all.zip
networkTimeout=10000 networkTimeout=10000
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists zipStorePath=wrapper/dists

View File

@ -6,8 +6,6 @@ const config: CapacitorConfig = {
webDir: "dist", webDir: "dist",
server: { server: {
androidScheme: "https", androidScheme: "https",
url: "http://localhost:5173",
cleartext: true
} }
} }

View File

@ -122,8 +122,8 @@
504EC2FC1FED79650016851F /* Project object */ = { 504EC2FC1FED79650016851F /* Project object */ = {
isa = PBXProject; isa = PBXProject;
attributes = { attributes = {
LastSwiftUpdateCheck = 0920; LastSwiftUpdateCheck = 920;
LastUpgradeCheck = 0920; LastUpgradeCheck = 920;
TargetAttributes = { TargetAttributes = {
504EC3031FED79650016851F = { 504EC3031FED79650016851F = {
CreatedOnToolsVersion = 9.2; CreatedOnToolsVersion = 9.2;
@ -347,6 +347,7 @@
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1; CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = W7HPZ53V6B;
INFOPLIST_FILE = App/Info.plist; INFOPLIST_FILE = App/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = Solian; INFOPLIST_KEY_CFBundleDisplayName = Solian;
IPHONEOS_DEPLOYMENT_TARGET = 13.0; IPHONEOS_DEPLOYMENT_TARGET = 13.0;
@ -368,6 +369,7 @@
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1; CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = W7HPZ53V6B;
INFOPLIST_FILE = App/Info.plist; INFOPLIST_FILE = App/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = Solian; INFOPLIST_KEY_CFBundleDisplayName = Solian;
IPHONEOS_DEPLOYMENT_TARGET = 13.0; IPHONEOS_DEPLOYMENT_TARGET = 13.0;

Binary file not shown.

Before

Width:  |  Height:  |  Size: 108 KiB

After

Width:  |  Height:  |  Size: 48 KiB

View File

@ -1,10 +1,10 @@
{ {
"images": [ "images": [
{ {
"filename" : "AppIcon-512@2x.png",
"idiom": "universal", "idiom": "universal",
"platform" : "ios", "size": "1024x1024",
"size" : "1024x1024" "filename": "AppIcon-512@2x.png",
"platform": "ios"
} }
], ],
"info": { "info": {

View File

@ -2,18 +2,51 @@
"images": [ "images": [
{ {
"idiom": "universal", "idiom": "universal",
"filename" : "splash-2732x2732-2.png", "filename": "Default@1x~universal~anyany.png",
"scale": "1x" "scale": "1x"
}, },
{ {
"idiom": "universal", "idiom": "universal",
"filename" : "splash-2732x2732-1.png", "filename": "Default@2x~universal~anyany.png",
"scale": "2x" "scale": "2x"
}, },
{ {
"idiom": "universal", "idiom": "universal",
"filename" : "splash-2732x2732.png", "filename": "Default@3x~universal~anyany.png",
"scale": "3x" "scale": "3x"
},
{
"appearances": [
{
"appearance": "luminosity",
"value": "dark"
}
],
"idiom": "universal",
"scale": "1x",
"filename": "Default@1x~universal~anyany-dark.png"
},
{
"appearances": [
{
"appearance": "luminosity",
"value": "dark"
}
],
"idiom": "universal",
"scale": "2x",
"filename": "Default@2x~universal~anyany-dark.png"
},
{
"appearances": [
{
"appearance": "luminosity",
"value": "dark"
}
],
"idiom": "universal",
"scale": "3x",
"filename": "Default@3x~universal~anyany-dark.png"
} }
], ],
"info": { "info": {

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

View File

@ -43,7 +43,15 @@
<string>UIInterfaceOrientationLandscapeLeft</string> <string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string> <string>UIInterfaceOrientationLandscapeRight</string>
</array> </array>
<key>LSApplicationCategoryType</key>
<string></string>
<key>UIViewControllerBasedStatusBarAppearance</key> <key>UIViewControllerBasedStatusBarAppearance</key>
<false/> <false/>
<key>NSPhotoLibraryAddUsageDescription</key>
<string>Allow Solian full access your photo library so that you can share photos more easily.</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>Allow Solian access your photo library so that you can share photos.</string>
<key>NSCameraUsageDescription</key>
<string>Allow Solian use your camera so that you can take photo for your post.</string>
</dict> </dict>
</plist> </plist>

View File

@ -29,6 +29,7 @@
"vuetify": "^3.5.12" "vuetify": "^3.5.12"
}, },
"devDependencies": { "devDependencies": {
"@capacitor/assets": "^3.0.4",
"@capacitor/cli": "^5.7.4", "@capacitor/cli": "^5.7.4",
"@rushstack/eslint-patch": "^1.3.3", "@rushstack/eslint-patch": "^1.3.3",
"@tsconfig/node20": "^20.1.2", "@tsconfig/node20": "^20.1.2",

View File

@ -0,0 +1,46 @@
{
"icons": [
{
"src": "../icons/icon-48.webp",
"type": "image/png",
"sizes": "48x48",
"purpose": "any maskable"
},
{
"src": "../icons/icon-72.webp",
"type": "image/png",
"sizes": "72x72",
"purpose": "any maskable"
},
{
"src": "../icons/icon-96.webp",
"type": "image/png",
"sizes": "96x96",
"purpose": "any maskable"
},
{
"src": "../icons/icon-128.webp",
"type": "image/png",
"sizes": "128x128",
"purpose": "any maskable"
},
{
"src": "../icons/icon-192.webp",
"type": "image/png",
"sizes": "192x192",
"purpose": "any maskable"
},
{
"src": "../icons/icon-256.webp",
"type": "image/png",
"sizes": "256x256",
"purpose": "any maskable"
},
{
"src": "../icons/icon-512.webp",
"type": "image/png",
"sizes": "512x512",
"purpose": "any maskable"
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

BIN
resources/icon-foreground.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 KiB

BIN
resources/icon-only.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 KiB

BIN
resources/splash-dark.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 112 KiB

BIN
resources/splash.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 134 KiB

View File

@ -1,6 +1,6 @@
<template> <template>
<v-app> <v-app>
<v-system-bar v-if="safeAreaHeight > 0" color="primary" :order="1" :height="safeAreaHeight" /> <v-system-bar v-show="ui.safeArea.top > 0" color="primary" :order="1" :height="ui.safeArea.top" />
<router-view /> <router-view />
</v-app> </v-app>
@ -8,13 +8,22 @@
<script setup lang="ts"> <script setup lang="ts">
import { onMounted, ref } from "vue" import { onMounted, ref } from "vue"
import { Capacitor } from "@capacitor/core"
import { useUI } from "@/stores/ui"
const safeAreaHeight = ref(0) const ui = useUI()
function updateSafeArea() { function updateSafeArea() {
const property = getComputedStyle(document.documentElement).getPropertyValue("--safe-area-top") const topProperty = getComputedStyle(document.documentElement).getPropertyValue("--safe-area-top")
safeAreaHeight.value = parseInt(property.replace("px", "")) ui.safeArea.top = parseInt(topProperty.replace("px", ""))
const bottomProperty = getComputedStyle(document.documentElement).getPropertyValue("--safe-area-top")
ui.safeArea.bottom = parseInt(bottomProperty.replace("px", ""))
} }
onMounted(() => updateSafeArea()) onMounted(() => {
updateSafeArea()
for (let idx = 1; idx <= 10; idx++) {
setTimeout(() => updateSafeArea(), 250 * idx)
}
})
</script> </script>

View File

@ -1,11 +1,8 @@
<template> <template>
<v-navigation-drawer v-model="drawerOpen" color="grey-lighten-5" width="320" :order="0" floating> <v-navigation-drawer v-model="drawerOpen" color="grey-lighten-5" width="320" :order="0" floating>
<div class="flex flex-col h-full"> <div class="flex flex-col h-full">
<div <div class="flex items-center px-3 pb-2.5 border-opacity-15" style="border-bottom-width: thin"
class="flex items-center px-3 pb-2.5 border-opacity-15" :style="`padding-top: max(${safeAreaTop}, 16px)`">
style="border-bottom-width: thin"
:style="`padding-top: max(${safeAreaTop}, 16px)`"
>
<img src="/favicon.png" width="36" height="36" class="block" /> <img src="/favicon.png" width="36" height="36" class="block" />
<div class="ms-6 font-medium">Solar Network</div> <div class="ms-6 font-medium">Solar Network</div>
</div> </div>
@ -15,14 +12,11 @@
</div> </div>
<!-- User info --> <!-- User info -->
<v-list <v-list class="border-opacity-15 h-[64px]" style="border-top-width: thin"
class="border-opacity-15 h-[64px]" :style="`margin-bottom: ${safeAreaBottom}`">
style="border-top-width: thin"
:style="`margin-bottom: ${safeAreaBottom}`"
>
<v-list-item :subtitle="username" :title="nickname"> <v-list-item :subtitle="username" :title="nickname">
<template #prepend> <template #prepend>
<v-avatar icon="mdi-account-circle" :image="id.userinfo.data?.avatar" /> <v-avatar icon="mdi-account-circle" :image="id.userinfo.data?.picture" />
</template> </template>
<template #append> <template #append>
<v-menu v-if="id.userinfo.isLoggedIn"> <v-menu v-if="id.userinfo.isLoggedIn">
@ -31,12 +25,8 @@
</template> </template>
<v-list density="compact"> <v-list density="compact">
<v-list-item <v-list-item title="Solarpass" prepend-icon="mdi-passport-biometric" target="_blank"
title="Solarpass" :href="passportUrl" />
prepend-icon="mdi-passport-biometric"
target="_blank"
:href="passportUrl"
/>
</v-list> </v-list>
</v-menu> </v-menu>
@ -67,24 +57,11 @@
<router-view /> <router-view />
</v-main> </v-main>
<v-menu <v-menu open-on-hover open-on-click :open-delay="0" :close-delay="0" location="top"
open-on-hover transition="scroll-y-reverse-transition">
open-on-click
:open-delay="0"
:close-delay="0"
location="top"
transition="scroll-y-reverse-transition"
>
<template v-slot:activator="{ props }"> <template v-slot:activator="{ props }">
<v-fab <v-fab v-bind="props" appear class="editor-fab" icon="mdi-pencil" color="primary" size="64"
v-bind="props" :active="id.userinfo.isLoggedIn" />
appear
class="editor-fab"
icon="mdi-pencil"
color="primary"
size="64"
:active="id.userinfo.isLoggedIn"
/>
</template> </template>
<div class="flex flex-col items-center gap-4 mb-4"> <div class="flex flex-col items-center gap-4 mb-4">
@ -102,17 +79,20 @@ import { computed, ref } from "vue"
import { useEditor } from "@/stores/editor" import { useEditor } from "@/stores/editor"
import { useUserinfo } from "@/stores/userinfo" import { useUserinfo } from "@/stores/userinfo"
import { useWellKnown } from "@/stores/wellKnown" import { useWellKnown } from "@/stores/wellKnown"
import { useUI } from "@/stores/ui"
import PostTools from "@/components/publish/PostTools.vue" import PostTools from "@/components/publish/PostTools.vue"
import RealmTools from "@/components/realms/RealmTools.vue" import RealmTools from "@/components/realms/RealmTools.vue"
import RealmList from "@/components/realms/RealmList.vue" import RealmList from "@/components/realms/RealmList.vue"
import NotificationList from "@/components/NotificationList.vue" import NotificationList from "@/components/NotificationList.vue"
const ui = useUI()
const safeAreaTop = computed(() => { const safeAreaTop = computed(() => {
return getComputedStyle(document.documentElement).getPropertyValue("--safe-area-top") return `${ui.safeArea.top}px`
}) })
const safeAreaBottom = computed(() => { const safeAreaBottom = computed(() => {
return getComputedStyle(document.documentElement).getPropertyValue("--safe-area-bottom") return `${ui.safeArea.bottom}px`
}) })
const id = useUserinfo() const id = useUserinfo()

11
src/stores/ui.ts Normal file
View File

@ -0,0 +1,11 @@
import { defineStore } from "pinia"
import { reactive } from "vue"
export const useUI = defineStore("ui", () => {
const safeArea = reactive({
top: 0,
bottom: 0,
})
return { safeArea }
})