Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
23 / 23
100.00% covered (success)
100.00%
3 / 3
CRAP
100.00% covered (success)
100.00%
1 / 1
Media
100.00% covered (success)
100.00%
23 / 23
100.00% covered (success)
100.00%
3 / 3
8
100.00% covered (success)
100.00%
1 / 1
 __construct
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 card
100.00% covered (success)
100.00%
9 / 9
100.00% covered (success)
100.00%
1 / 1
1
 humanSize
100.00% covered (success)
100.00%
13 / 13
100.00% covered (success)
100.00%
1 / 1
6
1<?php
2
3declare(strict_types=1);
4
5namespace Cosray\Panel\Dashboard;
6
7use Celema\Core\Request;
8use Celema\Quma\Database;
9use Cosray\Config;
10use Cosray\Contract\DashboardCard;
11use NumberFormatter;
12
13final readonly class Media implements DashboardCard
14{
15    public function __construct(
16        private Database $db,
17        private Config $config,
18        private Request $request,
19    ) {}
20
21    public function card(): Card
22    {
23        $row = $this->db->dashboard->media()->one();
24
25        return new Card(
26            label: __('dashboard:media'),
27            value: (int) ($row['total'] ?? 0),
28            note: __('dashboard:storage-used', [
29                'size' => $this->humanSize((int) ($row['bytes'] ?? 0)),
30            ]),
31            url: $this->config->panel->path . '/media',
32        );
33    }
34
35    private function humanSize(int $bytes): string
36    {
37        $units = ['B', 'KB', 'MB', 'GB', 'TB'];
38        $size = (float) max(0, $bytes);
39        $unit = 0;
40
41        while ($size >= 1024 && $unit < (count($units) - 1)) {
42            $size /= 1024;
43            $unit++;
44        }
45
46        $locale = $this->request->get('panelLocale', 'en');
47        $formatter = new NumberFormatter(is_string($locale) ? $locale : 'en', NumberFormatter::DECIMAL);
48        $digits = $unit === 0 ? 0 : 1;
49        $formatter->setAttribute(NumberFormatter::MIN_FRACTION_DIGITS, $digits);
50        $formatter->setAttribute(NumberFormatter::MAX_FRACTION_DIGITS, $digits);
51        $value = $formatter->format($size);
52
53        return ($value === false ? (string) $size : $value) . ' ' . $units[$unit];
54    }
55}