@@ -41,6 +41,7 @@ import React, { useEffect, useState } from "react";
4141import { Trans , useTranslation } from "react-i18next" ;
4242import { fetchClient } from "../../api_client/api" ;
4343import { serverAddress } from "../../api_client/apiClient" ;
44+ import { useAccessToken } from "../../api_client/auth/hooks" ;
4445import { useTrainFacesMutation } from "../../api_client/faces" ;
4546import { useFetchNextcloudDirsQuery } from "../../api_client/folders/hooks/useFetchNextcloudDirsQuery" ;
4647import {
@@ -53,12 +54,13 @@ import {
5354import { useDeleteMissingPhotosMutation } from "../../api_client/photos/hooks" ;
5455import { useFetchCountStatsQuery } from "../../api_client/stats/hooks" ;
5556import { COUNT_STATS_DEFAULTS } from "../../api_client/stats/types" ;
56- import { useUpdateUserMutation } from "../../api_client/user/hooks" ;
57+ import { useFetchUserListQuery , useUpdateUserMutation } from "../../api_client/user/hooks" ;
5758import { useCurrentUserSelfDetailsQuery } from "../../api_client/user/hooks/useCurrentUserSelfDetailsQuery" ;
5859import { User } from "../../api_client/user/types" ;
5960import { notification } from "../../service/notifications" ;
6061import { CountStats } from "../CountStats" ;
6162import { ModalNextcloudScanDirectoryEdit } from "../modals/ModalNextcloudScanDirectoryEdit" ;
63+ import { ModalUserEdit } from "../modals/ModalUserEdit" ;
6264
6365function BadgeIcon ( details : User , isSuccess : boolean , isError : boolean , isFetching : boolean ) {
6466 const { nextcloud_server_address : server } = details ;
@@ -80,7 +82,10 @@ export function Library() {
8082 const [ isOpenNextcloudHelp , setIsOpenNextcloudHelp ] = useState ( false ) ;
8183 const [ avatarImgSrc , setAvatarImgSrc ] = useState ( "/unknown_user.jpg" ) ;
8284 const [ modalNextcloudScanDirectoryOpen , setModalNextcloudScanDirectoryOpen ] = useState ( false ) ;
85+ const [ scanDirectorySetupOpen , setScanDirectorySetupOpen ] = useState ( false ) ;
8386 const { data : userSelfDetails } = useCurrentUserSelfDetailsQuery ( ) ;
87+ const { data : auth } = useAccessToken ( ) ;
88+ const { data : userList } = useFetchUserListQuery ( ) ;
8489 const [ editedUser , setEditedUser ] = useState < User | null > ( null ) ;
8590 const { data : worker } = useWorkerQuery ( ) ;
8691 const [ workerAvailability , setWorkerAvailability ] = useState ( false ) ;
@@ -111,6 +116,18 @@ export function Library() {
111116 close ( ) ;
112117 } ;
113118
119+ const guardScan = ( run : ( ) => void ) => {
120+ if ( userSelfDetails ?. scan_directory ) {
121+ run ( ) ;
122+ return ;
123+ }
124+ if ( auth ?. access ?. is_admin ) {
125+ setScanDirectorySetupOpen ( true ) ;
126+ } else {
127+ notification . scanDirectoryRequired ( ) ;
128+ }
129+ } ;
130+
114131 // open update dialog, when user was edited
115132 useEffect ( ( ) => {
116133 if ( JSON . stringify ( editedUser ) !== JSON . stringify ( userSelfDetails ) ) {
@@ -266,7 +283,7 @@ export function Library() {
266283 < Grid . Col span = { { base : 12 , sm : 2 } } >
267284 < Group wrap = "nowrap" gap = { 0 } justify = "flex-end" >
268285 < Button
269- onClick = { ( ) => scanPhotos . mutate ( ) }
286+ onClick = { ( ) => guardScan ( ( ) => scanPhotos . mutate ( ) ) }
270287 disabled = { ! workerAvailability }
271288 leftSection = { < Refresh /> }
272289 variant = "filled"
@@ -295,7 +312,7 @@ export function Library() {
295312 < Menu . Dropdown >
296313 < Menu . Item
297314 leftSection = { < Refresh size = "1rem" /> }
298- onClick = { ( ) => rescanPhotos . mutate ( ) }
315+ onClick = { ( ) => guardScan ( ( ) => rescanPhotos . mutate ( ) ) }
299316 disabled = { ! workerAvailability }
300317 >
301318 { t ( "settings.statusrescanphotosfalse" ) }
@@ -609,6 +626,16 @@ export function Library() {
609626 />
610627 </ Card >
611628
629+ < ModalUserEdit
630+ onRequestClose = { ( ) => setScanDirectorySetupOpen ( false ) }
631+ userToEdit = { userSelfDetails }
632+ isOpen = { scanDirectorySetupOpen }
633+ updateAndScan
634+ userList = { userList ?? [ ] }
635+ createNew = { false }
636+ firstTimeSetup
637+ />
638+
612639 < Dialog opened = { isOpenUpdateDialog } withCloseButton onClose = { handleCancel } size = "lg" radius = "md" >
613640 < Text size = "sm" style = { { marginBottom : 10 } } fw = { 500 } >
614641 Save Changes?
0 commit comments