From 9438ee30ad2a5467ebc53b16e31e2c7ad743470f Mon Sep 17 00:00:00 2001 From: "gorbenko.pavel" Date: Wed, 5 Aug 2026 15:13:52 +0500 Subject: [PATCH] =?UTF-8?q?=D0=BF=D0=B5=D1=80=D1=81=D0=B8=D1=81=D1=82?= =?UTF-8?q?=D0=BD=D1=81=20=D1=81=D1=82=D1=80=D0=BE=D0=BA=D0=B8=20=D0=BF?= =?UTF-8?q?=D0=BE=D0=B8=D1=81=D0=BA=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../features/myRequests/RequestsTableView.tsx | 3 +- .../features/myRequests/SearchView.tsx | 3 +- .../requestPortal/shared/usePersistedQuery.ts | 35 +++++++++++++++++++ 3 files changed, 39 insertions(+), 2 deletions(-) create mode 100644 src/webparts/requestPortal/shared/usePersistedQuery.ts diff --git a/src/webparts/requestPortal/features/myRequests/RequestsTableView.tsx b/src/webparts/requestPortal/features/myRequests/RequestsTableView.tsx index 22dc127..dd76b42 100644 --- a/src/webparts/requestPortal/features/myRequests/RequestsTableView.tsx +++ b/src/webparts/requestPortal/features/myRequests/RequestsTableView.tsx @@ -12,6 +12,7 @@ import { import { IMyRequest } from './models/IMyRequest'; import { REQUEST_STATUS, IRequestType } from '../../shared/approval'; import { onRequestsChanged } from '../../shared/requestEvents'; +import { usePersistedQuery } from '../../shared/usePersistedQuery'; import { Pager } from './Pager'; import styles from './RequestsTableView.module.scss'; @@ -150,7 +151,7 @@ export const RequestsTableView: React.FC = ({ const [rows, setRows] = React.useState(undefined); const [totalRows, setTotalRows] = React.useState(0); const [page, setPage] = React.useState(1); - const [query, setQuery] = React.useState(''); + const [query, setQuery] = usePersistedQuery(kind); const [error, setError] = React.useState(''); React.useEffect(() => setPage(1), [query, kind]); diff --git a/src/webparts/requestPortal/features/myRequests/SearchView.tsx b/src/webparts/requestPortal/features/myRequests/SearchView.tsx index ceda798..1ce9a4b 100644 --- a/src/webparts/requestPortal/features/myRequests/SearchView.tsx +++ b/src/webparts/requestPortal/features/myRequests/SearchView.tsx @@ -4,6 +4,7 @@ import { getLinkedTypes, searchMyRequests } from './myRequests.service'; import { IMyRequest } from './models/IMyRequest'; import { REQUEST_STATUS, IRequestType } from '../../shared/approval'; import { onRequestsChanged } from '../../shared/requestEvents'; +import { usePersistedQuery } from '../../shared/usePersistedQuery'; import { Pager } from './Pager'; import styles from './SearchView.module.scss'; @@ -107,7 +108,7 @@ export const SearchView: React.FC = ({ context, onOpen }) => { const [rows, setRows] = React.useState(undefined); const [totalRows, setTotalRows] = React.useState(0); const [page, setPage] = React.useState(1); - const [query, setQuery] = React.useState(''); + const [query, setQuery] = usePersistedQuery('search'); const [error, setError] = React.useState(''); React.useEffect(() => setPage(1), [query]); diff --git a/src/webparts/requestPortal/shared/usePersistedQuery.ts b/src/webparts/requestPortal/shared/usePersistedQuery.ts new file mode 100644 index 0000000..f813bda --- /dev/null +++ b/src/webparts/requestPortal/shared/usePersistedQuery.ts @@ -0,0 +1,35 @@ +import * as React from 'react'; + +// Текст поиска переживает перезагрузку страницы (localStorage), но не более +// того — это просто «продолжить с того же места», а не синхронизация между +// вкладками/устройствами. key должен быть уникальным на раздел (см. вызовы в +// RequestsTableView/SearchView), иначе значения разных таблиц перепишут друг друга. +export function usePersistedQuery(key: string): [string, (value: string) => void] { + const storageKey = `rp-search-query:${key}`; + + const [value, setValue] = React.useState(() => { + try { + return window.localStorage.getItem(storageKey) || ''; + } catch { + return ''; + } + }); + + const setPersisted = React.useCallback( + (next: string): void => { + setValue(next); + try { + if (next) { + window.localStorage.setItem(storageKey, next); + } else { + window.localStorage.removeItem(storageKey); + } + } catch { + // localStorage недоступен (приватный режим и т.п.) — просто не сохраняем. + } + }, + [storageKey] + ); + + return [value, setPersisted]; +}