feat: i18n control, Gitea auto-update CI, license-gated updater, fixes
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -17,6 +17,28 @@ type Preferences = {
|
||||
eulaAcceptedVersion?: number;
|
||||
};
|
||||
|
||||
type LicenseChangeListener = () => void;
|
||||
|
||||
const licenseChangeListeners = new Set<LicenseChangeListener>();
|
||||
|
||||
/** Слушатели вызываются после смены состояния лицензии (сохранённый токен, EULA, отзыв). */
|
||||
export function addLicenseChangeListener(fn: LicenseChangeListener): () => void {
|
||||
licenseChangeListeners.add(fn);
|
||||
return () => {
|
||||
licenseChangeListeners.delete(fn);
|
||||
};
|
||||
}
|
||||
|
||||
function notifyLicenseChangeListeners(): void {
|
||||
for (const fn of licenseChangeListeners) {
|
||||
try {
|
||||
fn();
|
||||
} catch (err) {
|
||||
console.error('[license] change listener failed', err);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function readPreferences(userData: string): Preferences {
|
||||
try {
|
||||
const raw = fs.readFileSync(preferencesPath(userData), 'utf8');
|
||||
@@ -35,6 +57,7 @@ function emitLicenseStatusChanged(): void {
|
||||
for (const win of BrowserWindow.getAllWindows()) {
|
||||
win.webContents.send(ipcChannels.license.statusChanged, {});
|
||||
}
|
||||
notifyLicenseChangeListeners();
|
||||
}
|
||||
|
||||
export class LicenseService {
|
||||
|
||||
Reference in New Issue
Block a user