fix: prevent My Apps crash when installing apps + add filebrowser to demo

The My Apps page went blank after installing apps because pkg['static-files'].icon
was accessed without optional chaining on dynamically installed packages that lack
the static-files property.

- Make static-files optional in PackageDataEntry type
- Add defensive ?.icon access with fallback in Apps.vue and AppDetails.vue
- Add filebrowser to mock backend staticDevApps (enables Cloud page in demo)
- Expand portMappings and marketplaceMetadata for all marketplace apps
- installPackage now uses staticApp() format for consistent data shape

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Dorian
2026-03-09 17:09:59 +00:00
co-authored by Claude Opus 4.6
parent 9c7ffbb263
commit a2aa9657b1
24 changed files with 1200 additions and 141 deletions
+17
View File
@@ -112,6 +112,7 @@
@navigate="cloudStore.navigate($event)"
@delete="handleDelete"
@play="handlePlay"
@share="handleShare"
/>
<!-- Mini Audio Player -->
@@ -152,6 +153,15 @@
/>
</div>
<!-- Share Modal -->
<ShareModal
v-if="shareTarget"
:filename="shareTarget.name"
:filepath="shareTarget.path"
:is-dir="shareTarget.isDir"
@close="shareTarget = null"
@saved="shareTarget = null"
/>
</div>
</template>
@@ -162,6 +172,7 @@ import { useAppStore } from '../stores/app'
import { useCloudStore } from '../stores/cloud'
import CloudToolbar from '../components/cloud/CloudToolbar.vue'
import FileGrid from '../components/cloud/FileGrid.vue'
import ShareModal from '../components/cloud/ShareModal.vue'
import { useAudioPlayer } from '../composables/useAudioPlayer'
const router = useRouter()
@@ -284,6 +295,12 @@ watch(useNativeUI, async (native) => {
}
}, { immediate: true })
const shareTarget = ref<{ path: string; name: string; isDir: boolean } | null>(null)
function handleShare(path: string, name: string, isDir: boolean) {
shareTarget.value = { path, name, isDir }
}
const uploadError = ref<string | null>(null)
const draggingOver = ref(false)
let dragLeaveTimer: ReturnType<typeof setTimeout> | null = null