mirror of
https://github.com/4gray/iptvnator.git
synced 2026-10-10 10:06:15 -08:00
* feat(about): show build commit next to the app version Settings > About now renders "<version> (<short-sha>)" with the full SHA in the tooltip, so bug reports from test and nightly builds identify the exact commit. The commit is injected at CI build time into apps/web/src/environments/build-commit.ts (same placeholder pattern as the TMDB key inject); PR builds use the real head SHA instead of the ephemeral merge commit. Local/dev builds keep the plain version. The semver version itself deliberately stays untouched: a "-sha" suffix would flip electron-updater into prerelease mode and leak into installer/artifact version fields. Requested by WolfganP in #1202. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * style(settings): keep relative import after monorepo alias imports Addresses Greptile feedback on #1208. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * feat(docker): inject build commit into published PWA images The Docker/PWA build path bypassed the Electron workflow's inject step, so published images showed the plain version in About. Pass the commit as a build arg and run the inject script before the PWA build; the script no-ops when BUILD_COMMIT is empty, leaving local docker builds unchanged. Addresses Codex feedback on #1208. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> --------- Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
113 lines
3.9 KiB
TypeScript
113 lines
3.9 KiB
TypeScript
import {
|
|
Component,
|
|
computed,
|
|
input,
|
|
output,
|
|
ViewEncapsulation,
|
|
} from '@angular/core';
|
|
import { MatButtonModule } from '@angular/material/button';
|
|
import { MatIconModule } from '@angular/material/icon';
|
|
import { TranslateModule } from '@ngx-translate/core';
|
|
import {
|
|
ELECTRON_BRIDGE_APP_UPDATE_STATUSES,
|
|
ElectronBridgeAppUpdateStatus,
|
|
} from '@iptvnator/shared/interfaces';
|
|
|
|
@Component({
|
|
selector: 'app-settings-about-section',
|
|
imports: [MatButtonModule, MatIconModule, TranslateModule],
|
|
templateUrl: './settings-about-section.component.html',
|
|
encapsulation: ViewEncapsulation.None,
|
|
styles: [
|
|
':host { display: contents; }',
|
|
'.version-block .build-commit { opacity: 0.65; font-size: 0.85em; }',
|
|
],
|
|
})
|
|
export class SettingsAboutSectionComponent {
|
|
readonly activeSection = input.required<string>();
|
|
readonly isDesktop = input(false);
|
|
readonly version = input<string | undefined>();
|
|
readonly buildCommit = input<string | undefined>();
|
|
readonly updateMessage = input<string | undefined>();
|
|
readonly appUpdateStatus = input<ElectronBridgeAppUpdateStatus | null>(null);
|
|
|
|
readonly buildCommitShort = computed(() => {
|
|
const commit = this.buildCommit()?.trim();
|
|
|
|
return commit ? commit.slice(0, 7) : undefined;
|
|
});
|
|
|
|
readonly checkForAppUpdate = output<void>();
|
|
readonly downloadAppUpdate = output<void>();
|
|
readonly installAppUpdate = output<void>();
|
|
readonly openManualAppUpdate = output<void>();
|
|
readonly openAppUpdateReleaseNotes = output<void>();
|
|
|
|
readonly isAppUpdateBusy = computed(() => {
|
|
const status = this.appUpdateStatus()?.status;
|
|
|
|
return (
|
|
status === ELECTRON_BRIDGE_APP_UPDATE_STATUSES.Checking ||
|
|
status === ELECTRON_BRIDGE_APP_UPDATE_STATUSES.Downloading
|
|
);
|
|
});
|
|
|
|
readonly canDownloadAppUpdate = computed(() => {
|
|
const status = this.appUpdateStatus();
|
|
|
|
return (
|
|
status?.supportedSelfUpdate === true &&
|
|
status.status === ELECTRON_BRIDGE_APP_UPDATE_STATUSES.Available
|
|
);
|
|
});
|
|
|
|
readonly canInstallAppUpdate = computed(() => {
|
|
const status = this.appUpdateStatus();
|
|
|
|
return (
|
|
status?.supportedSelfUpdate === true &&
|
|
status.status === ELECTRON_BRIDGE_APP_UPDATE_STATUSES.Downloaded
|
|
);
|
|
});
|
|
|
|
readonly canOpenAppUpdateReleaseNotes = computed(() => {
|
|
const status = this.appUpdateStatus();
|
|
|
|
return Boolean(
|
|
status?.currentVersion &&
|
|
status.status !== ELECTRON_BRIDGE_APP_UPDATE_STATUSES.Checking
|
|
);
|
|
});
|
|
|
|
readonly canOpenManualAppUpdate = computed(() => {
|
|
const status = this.appUpdateStatus();
|
|
|
|
return Boolean(status && !status.supportedSelfUpdate);
|
|
});
|
|
|
|
readonly appUpdateStatusLabelKey = computed(() => {
|
|
const status =
|
|
this.appUpdateStatus()?.status ??
|
|
ELECTRON_BRIDGE_APP_UPDATE_STATUSES.Idle;
|
|
|
|
switch (status) {
|
|
case ELECTRON_BRIDGE_APP_UPDATE_STATUSES.Checking:
|
|
return 'SETTINGS.APP_UPDATE_CHECKING';
|
|
case ELECTRON_BRIDGE_APP_UPDATE_STATUSES.Available:
|
|
return 'SETTINGS.APP_UPDATE_AVAILABLE';
|
|
case ELECTRON_BRIDGE_APP_UPDATE_STATUSES.NotAvailable:
|
|
return 'SETTINGS.APP_UPDATE_NOT_AVAILABLE';
|
|
case ELECTRON_BRIDGE_APP_UPDATE_STATUSES.Downloading:
|
|
return 'SETTINGS.APP_UPDATE_DOWNLOADING';
|
|
case ELECTRON_BRIDGE_APP_UPDATE_STATUSES.Downloaded:
|
|
return 'SETTINGS.APP_UPDATE_DOWNLOADED';
|
|
case ELECTRON_BRIDGE_APP_UPDATE_STATUSES.Unsupported:
|
|
return 'SETTINGS.APP_UPDATE_IDLE';
|
|
case ELECTRON_BRIDGE_APP_UPDATE_STATUSES.Error:
|
|
return 'SETTINGS.APP_UPDATE_ERROR';
|
|
default:
|
|
return 'SETTINGS.APP_UPDATE_IDLE';
|
|
}
|
|
});
|
|
}
|