adsdad
All checks were successful
Deploy / deploy-staging (push) Successful in 24s
Deploy / deploy-production (push) Has been skipped

This commit is contained in:
2026-06-25 00:36:14 +02:00
parent ac2d95fc56
commit 487f592ca3
12 changed files with 188 additions and 17 deletions

View File

@@ -0,0 +1,82 @@
<?php
declare(strict_types=1);
namespace Desktop;
final class ShellAppRegistry
{
/**
* @var array<int, array<string, mixed>>|null
*/
private ?array $apps = null;
public function __construct(
private readonly string $shellRoot,
) {
}
/**
* @return array<int, array<string, mixed>>
*/
public function all(): array
{
if ($this->apps !== null) {
return $this->apps;
}
if (!is_dir($this->shellRoot)) {
return $this->apps = [];
}
$apps = [];
foreach (glob($this->shellRoot . '/*/definition.php') ?: [] as $definitionPath) {
$app = require $definitionPath;
if (!is_array($app)) {
continue;
}
$appId = trim((string) ($app['app_id'] ?? ''));
if ($appId === '') {
continue;
}
$apps[] = [
'app_id' => $appId,
'title' => (string) ($app['title'] ?? $appId),
'label' => (string) ($app['label'] ?? $appId),
'content_mode' => (string) ($app['content_mode'] ?? 'shell'),
'admin_only' => (bool) ($app['admin_only'] ?? false),
'entry_route' => (string) ($app['entry_route'] ?? ''),
'content' => (string) ($app['content'] ?? ''),
'window' => is_array($app['window'] ?? null) ? $app['window'] : [],
'ui' => is_array($app['ui'] ?? null) ? $app['ui'] : [],
];
}
usort(
$apps,
static fn (array $left, array $right): int => strcmp(
(string) ($left['title'] ?? $left['app_id'] ?? ''),
(string) ($right['title'] ?? $right['app_id'] ?? '')
)
);
return $this->apps = array_values($apps);
}
/**
* @return array<string, mixed>|null
*/
public function find(string $appId): ?array
{
foreach ($this->all() as $app) {
if ((string) ($app['app_id'] ?? '') === $appId) {
return $app;
}
}
return null;
}
}