import { AadHttpClient, HttpClientResponse } from '@microsoft/sp-http'; import { WebPartContext } from '@microsoft/sp-webpart-base'; import { APPROVAL_API_CLIENT_ID, DICTIONARY_API_BASE_URL } from '../config'; import { IDepartment } from './models/IDepartment'; // GET /Dictionary/Departments — справочник отделов по всем компаниям, ответ — // плоский массив (без обёртки {data: ...}, в отличие от approval-route API). async function fetchDepartments(context: WebPartContext): Promise { const client = await context.aadHttpClientFactory.getClient(APPROVAL_API_CLIENT_ID); const response: HttpClientResponse = await client.get( `${DICTIONARY_API_BASE_URL}/Dictionary/Departments`, AadHttpClient.configurations.v1 ); if (!response.ok) { throw new Error(`Dictionary/Departments: ${response.status} ${response.statusText}`); } return response.json(); } // Справочник большой (сотни записей) и в рамках сессии не меняется — грузим // один раз и отдаём тот же промис повторным вызовам (иначе каждое открытие // формы/пикера заново тянуло бы весь список). let cache: Promise | undefined; export function getDepartments(context: WebPartContext): Promise { if (!cache) { cache = fetchDepartments(context).catch((e) => { cache = undefined; throw e; }); } return cache; }