mirror of
https://github.com/immich-app/immich
synced 2025-11-07 17:27:20 +00:00
refactor: move managers to new folder (#17929)
This commit is contained in:
parent
1b5fc9c665
commit
a17390a422
15 changed files with 16 additions and 16 deletions
33
web/src/lib/managers/auth-manager.svelte.ts
Normal file
33
web/src/lib/managers/auth-manager.svelte.ts
Normal file
|
|
@ -0,0 +1,33 @@
|
|||
import { goto } from '$app/navigation';
|
||||
import { AppRoute } from '$lib/constants';
|
||||
import { eventManager } from '$lib/managers/event-manager.svelte';
|
||||
import { logout } from '@immich/sdk';
|
||||
|
||||
class AuthManager {
|
||||
async logout() {
|
||||
let redirectUri;
|
||||
|
||||
try {
|
||||
const response = await logout();
|
||||
if (response.redirectUri) {
|
||||
redirectUri = response.redirectUri;
|
||||
}
|
||||
} catch (error) {
|
||||
console.log('Error logging out:', error);
|
||||
}
|
||||
|
||||
redirectUri = redirectUri ?? AppRoute.AUTH_LOGIN;
|
||||
|
||||
try {
|
||||
if (redirectUri.startsWith('/')) {
|
||||
await goto(redirectUri);
|
||||
} else {
|
||||
globalThis.location.href = redirectUri;
|
||||
}
|
||||
} finally {
|
||||
eventManager.emit('auth.logout');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export const authManager = new AuthManager();
|
||||
55
web/src/lib/managers/event-manager.svelte.ts
Normal file
55
web/src/lib/managers/event-manager.svelte.ts
Normal file
|
|
@ -0,0 +1,55 @@
|
|||
type Listener<EventMap extends Record<string, unknown[]>, K extends keyof EventMap> = (...params: EventMap[K]) => void;
|
||||
|
||||
class EventManager<EventMap extends Record<string, unknown[]>> {
|
||||
private listeners: {
|
||||
[K in keyof EventMap]?: {
|
||||
listener: Listener<EventMap, K>;
|
||||
once?: boolean;
|
||||
}[];
|
||||
} = {};
|
||||
|
||||
on<T extends keyof EventMap>(key: T, listener: (...params: EventMap[T]) => void) {
|
||||
return this.addListener(key, listener, false);
|
||||
}
|
||||
|
||||
once<T extends keyof EventMap>(key: T, listener: (...params: EventMap[T]) => void) {
|
||||
return this.addListener(key, listener, true);
|
||||
}
|
||||
|
||||
off<K extends keyof EventMap>(key: K, listener: Listener<EventMap, K>) {
|
||||
if (this.listeners[key]) {
|
||||
this.listeners[key] = this.listeners[key].filter((item) => item.listener !== listener);
|
||||
}
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
emit<T extends keyof EventMap>(key: T, ...params: EventMap[T]) {
|
||||
if (!this.listeners[key]) {
|
||||
return;
|
||||
}
|
||||
|
||||
for (const { listener } of this.listeners[key]) {
|
||||
listener(...params);
|
||||
}
|
||||
|
||||
// remove one time listeners
|
||||
this.listeners[key] = this.listeners[key].filter((item) => !item.once);
|
||||
}
|
||||
|
||||
private addListener<T extends keyof EventMap>(key: T, listener: (...params: EventMap[T]) => void, once: boolean) {
|
||||
if (!this.listeners[key]) {
|
||||
this.listeners[key] = [];
|
||||
}
|
||||
|
||||
this.listeners[key].push({ listener, once });
|
||||
|
||||
return this;
|
||||
}
|
||||
}
|
||||
|
||||
export const eventManager = new EventManager<{
|
||||
'user.login': [];
|
||||
'auth.logout': [];
|
||||
'language.change': [{ name: string; code: string; rtl?: boolean }];
|
||||
}>();
|
||||
21
web/src/lib/managers/language-manager.svelte.ts
Normal file
21
web/src/lib/managers/language-manager.svelte.ts
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
import { langs } from '$lib/constants';
|
||||
import { eventManager } from '$lib/managers/event-manager.svelte';
|
||||
|
||||
class LanguageManager {
|
||||
rtl = $state(false);
|
||||
|
||||
setLanguage(code: string) {
|
||||
const item = langs.find((item) => item.code === code);
|
||||
if (!item) {
|
||||
return;
|
||||
}
|
||||
|
||||
this.rtl = item.rtl ?? false;
|
||||
|
||||
document.body.setAttribute('dir', item.rtl ? 'rtl' : 'ltr');
|
||||
|
||||
eventManager.emit('language.change', item);
|
||||
}
|
||||
}
|
||||
|
||||
export const languageManager = new LanguageManager();
|
||||
Loading…
Add table
Add a link
Reference in a new issue