import { defaultProvider, screencastManager, themeManager, ThemePreference, type ActionItem } from '@immich/ui'; import { mdiAccountMultipleOutline, mdiAccountOutline, mdiArchiveArrowDownOutline, mdiBookshelf, mdiCog, mdiContentDuplicate, mdiCrosshairsGps, mdiFolderOutline, mdiHeartOutline, mdiImageAlbum, mdiImageMultipleOutline, mdiImageSizeSelectLarge, mdiKeyboard, mdiLink, mdiLockOutline, mdiMagnify, mdiMapOutline, mdiServer, mdiStateMachine, mdiSync, mdiTagMultipleOutline, mdiThemeLightDark, mdiToolboxOutline, mdiTrashCanOutline, } from '@mdi/js'; import type { MessageFormatter } from 'svelte-i18n'; import { goto } from '$app/navigation'; import { page } from '$app/state'; import { authManager } from '$lib/managers/auth-manager.svelte'; import { featureFlagsManager } from '$lib/managers/feature-flags-manager.svelte'; import { Route } from '$lib/route'; import { copyToClipboard } from '$lib/utils'; export const getPagesProvider = ($t: MessageFormatter) => { const adminPages: ActionItem[] = [ { title: $t('admin.user_management'), description: $t('admin.users_page_description'), icon: mdiAccountMultipleOutline, onAction: () => goto(Route.users()), }, { title: $t('admin.system_settings'), description: $t('admin.settings_page_description'), icon: mdiCog, onAction: () => goto(Route.systemSettings()), }, { title: $t('admin.queues'), description: $t('admin.queues_page_description'), icon: mdiSync, onAction: () => goto(Route.queues()), }, { title: $t('external_libraries'), description: $t('admin.external_libraries_page_description'), icon: mdiBookshelf, onAction: () => goto(Route.libraries()), }, { title: $t('server_stats'), description: $t('admin.server_stats_page_description'), icon: mdiServer, onAction: () => goto(Route.systemStatistics()), }, ].map((route) => ({ ...route, $if: () => authManager.authenticated && authManager.user.isAdmin })); const userPages: ActionItem[] = [ { title: $t('photos'), icon: mdiImageMultipleOutline, onAction: () => goto(Route.photos()), }, { title: $t('explore'), icon: mdiMagnify, onAction: () => goto(Route.explore()), $if: () => authManager.authenticated && featureFlagsManager.value.search, }, { title: $t('map'), icon: mdiMapOutline, onAction: () => goto(Route.map()), $if: () => authManager.authenticated && featureFlagsManager.value.map, }, { title: $t('people'), description: $t('people_feature_description'), icon: mdiAccountOutline, onAction: () => goto(Route.people()), $if: () => authManager.authenticated && authManager.preferences.people.enabled, }, { title: $t('shared_links'), icon: mdiLink, onAction: () => goto(Route.sharedLinks()), $if: () => authManager.authenticated && authManager.preferences.sharedLinks.enabled, }, { title: $t('recently_added'), icon: mdiMagnify, onAction: () => goto(Route.recentlyAdded()), $if: () => authManager.authenticated, }, { title: $t('sharing'), icon: mdiAccountMultipleOutline, onAction: () => goto(Route.sharing()), $if: () => authManager.authenticated, }, { title: $t('favorites'), icon: mdiHeartOutline, onAction: () => goto(Route.favorites()), $if: () => authManager.authenticated, }, { title: $t('albums'), description: $t('albums_feature_description'), icon: mdiImageAlbum, onAction: () => goto(Route.albums()), $if: () => authManager.authenticated, }, { title: $t('tags'), description: $t('tag_feature_description'), icon: mdiTagMultipleOutline, onAction: () => goto(Route.tags()), $if: () => authManager.authenticated && authManager.preferences.tags.enabled, }, { title: $t('folders'), description: $t('folders_feature_description'), icon: mdiFolderOutline, onAction: () => goto(Route.folders()), $if: () => authManager.authenticated && authManager.preferences.folders.enabled, }, { title: $t('utilities'), icon: mdiToolboxOutline, onAction: () => goto(Route.utilities()), $if: () => authManager.authenticated, }, { title: $t('archive'), icon: mdiArchiveArrowDownOutline, onAction: () => goto(Route.archive()), $if: () => authManager.authenticated, }, { title: $t('locked_folder'), icon: mdiLockOutline, onAction: () => goto(Route.locked()), $if: () => authManager.authenticated, }, { title: $t('trash'), icon: mdiTrashCanOutline, onAction: () => goto(Route.trash()), $if: () => authManager.authenticated && featureFlagsManager.value.trash, }, { title: $t('admin.user_settings'), icon: mdiCog, onAction: () => goto(Route.userSettings()), $if: () => authManager.authenticated, }, ].map((route) => ({ $if: () => authManager.authenticated, ...route })); const utilityPages: ActionItem[] = [ { title: $t('review_duplicates'), icon: mdiContentDuplicate, onAction: () => goto(Route.duplicatesUtility()), }, { title: $t('review_large_files'), icon: mdiImageSizeSelectLarge, onAction: () => goto(Route.largeFileUtility()), }, { title: $t('manage_geolocation'), icon: mdiCrosshairsGps, onAction: () => goto(Route.geolocationUtility()), }, { title: $t('workflows'), icon: mdiStateMachine, onAction: () => goto(Route.workflows()), }, ].map((route) => ({ ...route, $if: () => authManager.authenticated })); return defaultProvider({ name: $t('page'), actions: [...userPages, ...utilityPages, ...adminPages] }); }; const getMyImmichLink = () => { return new URL(page.url.pathname + page.url.search, 'https://my.immich.app'); }; export const getSettingsProvider = ($t: MessageFormatter) => { const settings: ActionItem[] = [ { title: $t('theme'), description: $t('toggle_theme_description'), icon: mdiThemeLightDark, onAction: () => themeManager.toggle(), shortcuts: { shift: true, key: 't' }, }, { title: $t('system_theme'), description: $t('system_theme_command_description', { values: { value: themeManager.prefersDark ? $t('dark') : $t('light') }, }), icon: mdiThemeLightDark, onAction: () => themeManager.setPreference(ThemePreference.System), }, { title: $t('screencast_mode_title'), description: $t('screencast_mode_description'), icon: mdiKeyboard, onAction: () => screencastManager.toggle(), }, { title: $t('my_immich_title'), description: $t('my_immich_description'), onAction: () => copyToClipboard(getMyImmichLink().toString()), shortcuts: { ctrl: true, shift: true, key: 'm' }, }, ]; return defaultProvider({ name: $t('command'), actions: settings }); };