colorProfile = Scheme::profile() ?? ''; $this->defaultExpiration = Setting::get('default_expiration', '') ?? ''; $this->maxFileSize = min( (int) Setting::get('max_file_size', 100 * 1024 * 1024) / (1024 * 1024), self::phpMaxUploadMb(), ); $this->maxStorageQuota = (int) Setting::get('max_storage_quota', 20 * 1024 * 1024 * 1024) / (1024 * 1024 * 1024); $this->maxFilesPerShare = (int) Setting::get('max_files_per_share', 50); $this->maxSizePerShare = (int) Setting::get('max_size_per_share', 2 * 1024 * 1024 * 1024) / (1024 * 1024 * 1024); $this->allowNeverExpire = (bool) Setting::get('allow_never_expire', false); $this->siteTitle = Setting::get('site_title', '') ?? ''; $this->siteDescription = Setting::get('site_description', '') ?? ''; } public static function phpMaxUploadMb(): int { $parse = function (string $value): int { $value = trim($value); $last = strtolower($value[strlen($value) - 1]); $num = (int) $value; return match ($last) { 'g' => $num * 1024, 'm' => $num, 'k' => max(1, (int) ($num / 1024)), default => max(1, (int) ($num / (1024 * 1024))), }; }; $upload = $parse(ini_get('upload_max_filesize') ?: '2M'); $post = $parse(ini_get('post_max_size') ?: '8M'); return min($upload, $post); } public function saveSettings(): void { $phpMaxMb = self::phpMaxUploadMb(); $this->validate([ 'colorProfile' => ['required', 'string', Rule::in(array_keys(Scheme::profiles()))], 'maxFileSize' => ['required', 'integer', 'min:1', 'max:'.$phpMaxMb], 'maxStorageQuota' => ['required', 'integer', 'min:1'], 'maxFilesPerShare' => ['required', 'integer', 'min:1'], 'maxSizePerShare' => ['required', 'integer', 'min:1'], 'siteTitle' => ['nullable', 'string', 'max:255'], 'siteDescription' => ['nullable', 'string', 'max:1000'], 'siteLogo' => ['nullable', 'file', 'mimes:png,jpg,jpeg,gif,webp', 'max:2048'], ], [ 'maxFileSize.max' => __('Cannot exceed the PHP limit of :max MB. Increase upload_max_filesize and post_max_size in your PHP configuration.', ['max' => $phpMaxMb]), ]); if ($this->systemPassword) { Setting::set('system_password', Hash::make($this->systemPassword)); } Setting::set('color_profile', $this->colorProfile); Setting::set('default_expiration', $this->defaultExpiration ?: null); Setting::set('max_file_size', $this->maxFileSize * 1024 * 1024); Setting::set('max_storage_quota', $this->maxStorageQuota * 1024 * 1024 * 1024); Setting::set('max_files_per_share', $this->maxFilesPerShare); Setting::set('max_size_per_share', $this->maxSizePerShare * 1024 * 1024 * 1024); Setting::set('allow_never_expire', $this->allowNeverExpire ? '1' : null); Setting::set('site_title', $this->siteTitle ?: null); Setting::set('site_description', $this->siteDescription ?: null); if ($this->siteLogo && is_object($this->siteLogo)) { $existingLogo = Setting::get('site_logo'); if ($existingLogo) { Storage::disk('public')->delete($existingLogo); } $path = $this->siteLogo->store('branding', 'public'); Setting::set('site_logo', $path); $this->siteLogo = null; } $this->systemPassword = ''; $this->success(__('Settings saved successfully.')); } public function removeLogo(): void { $existingLogo = Setting::get('site_logo'); if ($existingLogo) { Storage::disk('public')->delete($existingLogo); Setting::set('site_logo', null); } $this->confirmingLogoRemoval = false; $this->success(__('Logo removed.')); } public function clearSystemPassword(): void { Setting::set('system_password', null); $this->confirmingPasswordRemoval = false; $this->success(__('System password cleared.')); } public function render(): mixed { return view('livewire.admin.admin-settings', [ 'hasSystemPassword' => (bool) Setting::get('system_password'), 'currentLogo' => Setting::get('site_logo'), 'phpMaxUploadMb' => self::phpMaxUploadMb(), ]); } }