Co-authored-by: gorbenko.pavel <gorbenko.pavel@tansu.kz> Reviewed-on: http://git.tnsu.kz/timur.gorodetskiy/request-portal/pulls/18
This commit was merged in pull request #18.
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
import * as React from 'react';
|
||||
import { WebPartContext } from '@microsoft/sp-webpart-base';
|
||||
import { resolveDebugUser } from '../shared/impersonation';
|
||||
import { useStableCallback } from '../shared/useStableCallback';
|
||||
|
||||
export interface IDebugUserFieldProps {
|
||||
label: string;
|
||||
@@ -22,6 +23,10 @@ const DEBOUNCE_MS = 400;
|
||||
* чтобы не гадать, кого именно подставили.
|
||||
*/
|
||||
export const DebugUserField: React.FC<IDebugUserFieldProps> = ({ label, description, context, initialQuery, onResolved }) => {
|
||||
// onResolved приходит из панели свойств и пересоздаётся на каждом её рендере:
|
||||
// в зависимостях эффекта он перезапускал бы поиск, без него — эффект звал бы
|
||||
// навсегда запомненную первую версию колбэка. Стабильная обёртка снимает оба.
|
||||
const notifyResolved = useStableCallback(onResolved);
|
||||
const [query, setQuery] = React.useState(initialQuery || '');
|
||||
const [status, setStatus] = React.useState<Status>('idle');
|
||||
const [found, setFound] = React.useState<{ email: string; displayName: string } | undefined>(undefined);
|
||||
@@ -32,7 +37,7 @@ export const DebugUserField: React.FC<IDebugUserFieldProps> = ({ label, descript
|
||||
if (!text) {
|
||||
setStatus('idle');
|
||||
setFound(undefined);
|
||||
onResolved('', '', '');
|
||||
notifyResolved('', '', '');
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -49,25 +54,25 @@ export const DebugUserField: React.FC<IDebugUserFieldProps> = ({ label, descript
|
||||
if (cancelled) return;
|
||||
if (isEmail) {
|
||||
setFound(hit);
|
||||
onResolved(text, text, hit ? hit.displayName : '');
|
||||
notifyResolved(text, text, hit ? hit.displayName : '');
|
||||
} else if (hit) {
|
||||
setStatus('found');
|
||||
setFound(hit);
|
||||
onResolved(text, hit.email, hit.displayName);
|
||||
notifyResolved(text, hit.email, hit.displayName);
|
||||
} else {
|
||||
setStatus('notfound');
|
||||
setFound(undefined);
|
||||
onResolved(text, '', '');
|
||||
notifyResolved(text, '', '');
|
||||
}
|
||||
})
|
||||
.catch(() => {
|
||||
if (cancelled) return;
|
||||
if (isEmail) {
|
||||
onResolved(text, text, '');
|
||||
notifyResolved(text, text, '');
|
||||
} else {
|
||||
setStatus('notfound');
|
||||
setFound(undefined);
|
||||
onResolved(text, '', '');
|
||||
notifyResolved(text, '', '');
|
||||
}
|
||||
});
|
||||
}, DEBOUNCE_MS);
|
||||
@@ -76,8 +81,7 @@ export const DebugUserField: React.FC<IDebugUserFieldProps> = ({ label, descript
|
||||
cancelled = true;
|
||||
window.clearTimeout(timer);
|
||||
};
|
||||
// eslint-disable-next-line react-hooks/exhaustive-deps
|
||||
}, [query]);
|
||||
}, [query, context, notifyResolved]);
|
||||
|
||||
return (
|
||||
<div>
|
||||
|
||||
Reference in New Issue
Block a user