Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
106 commits
Select commit Hold shift + click to select a range
777b8d0
Update dependencies
musale Oct 30, 2024
2e63a79
Merge branch 'dev' into feat/fluent-v4
musale Nov 13, 2024
c843775
Merge branch 'dev' into feat/fluent-v9-upgrade
musale Nov 14, 2024
867d0af
Add dependencies
musale Nov 14, 2024
a02496f
Add dependencies
musale Nov 14, 2024
e039e12
Lock dependencies
musale Nov 14, 2024
a4b0ec0
Add theming support for fluent ui v9
musale Nov 14, 2024
327b302
feat: update the sidebar tabs to use fluent UI v9 (#3431)
musale Nov 19, 2024
6349725
feat: update the heading, icons and menu items on the header (#3432)
musale Nov 19, 2024
fe67391
feat: upgrade the sample queries tab to use fluent UI v9 components (…
musale Nov 19, 2024
bc2ad9f
use tab and tablist components
ElinorW Nov 26, 2024
7abdbfd
migrate theme popover to v9
Mnickii Nov 26, 2024
5277684
modify request headers
ElinorW Nov 27, 2024
97da4d7
modify access token area
ElinorW Nov 27, 2024
8a3eb39
update copy button
ElinorW Nov 27, 2024
4c81805
revert loadGETheme removal for v8 components
Mnickii Nov 28, 2024
7f546a9
use customized radio Group
Mnickii Nov 28, 2024
7dfd148
adjusst icon size
Mnickii Nov 28, 2024
f4aa8d5
remove checked
Mnickii Dec 2, 2024
1f9d50a
feat: migrate the history tab components to fluent UI v9 (#3444)
musale Dec 3, 2024
0becb35
detect system theme in theme-chooser and set as default
Mnickii Dec 3, 2024
82be809
resolve changes
ElinorW Dec 4, 2024
87a0e4a
migrate components with MessageBar and type
Mnickii Dec 4, 2024
21ba3c9
include system theme appwise
Mnickii Dec 4, 2024
4db27b5
use v9 component
Mnickii Dec 5, 2024
6b56ffa
Merge branch 'dev' into feat/fluent-v9-upgrade
musale Dec 9, 2024
7a3a077
Fix merging from dev issues
musale Dec 9, 2024
a12130a
Merge branch 'feat/fluent-v9-upgrade' into feat/message-status
Mnickii Dec 9, 2024
4d8f773
Merge branch 'feat/fluent-v9-upgrade' into feat/theme-popover
Mnickii Dec 9, 2024
25d1888
fix messageBarType
Mnickii Dec 9, 2024
f2f521c
update height
ElinorW Dec 9, 2024
c25fe22
fix: update the sample queries signed in/out click functionality (#3483)
musale Dec 10, 2024
08411d8
add system to options
Mnickii Dec 10, 2024
be5a415
Merge pull request #3442 from microsoftgraph/feat/theme-popover
Mnickii Dec 11, 2024
fc4cd4b
fix tests
Mnickii Dec 11, 2024
e5e2ba4
Merge pull request #3479 from microsoftgraph/feat/message-status
Mnickii Dec 11, 2024
f11865e
Merge pull request #3441 from microsoftgraph/feat/fluent-v9-request-body
Mnickii Dec 11, 2024
c427d6e
remove system default for now
Mnickii Dec 11, 2024
e4957e6
Merge pull request #3490 from microsoftgraph/fix/theme
Mnickii Dec 16, 2024
4b780e0
Merge branch 'dev' into feat/fluent-v9-upgrade
musale Jan 7, 2025
d5e0044
Merge branch 'dev' into feat/fluent-v9-upgrade
musale Jan 14, 2025
e7141d6
feat: migrate Modify Permissions component to fluent v9 (#3527)
ElinorW Jan 16, 2025
bb93368
Merge branch 'dev' into feat/fluent-v9-upgrade
musale Jan 21, 2025
14cd4bb
feat: migrate full permission's list component (#3549)
ElinorW Jan 29, 2025
588a54f
Merge branch 'dev' into feat/fluent-v9-upgrade
musale Feb 4, 2025
1d7ec4b
Merge branch 'feat/fluent-v9-upgrade' of https://github.com/microsoft…
musale Feb 4, 2025
a91bbc4
feat: migrate components in collections (#3530)
Mnickii Feb 4, 2025
fe63685
feat: migrate wrappers (#3556)
Mnickii Feb 4, 2025
5accda8
feat: migrate components in api explorer (#3494)
Mnickii Feb 10, 2025
6f85162
feat: migrate query input components (#3555)
ElinorW Feb 10, 2025
1deec76
feat: update theme chooser (#3587)
Mnickii Feb 10, 2025
e7ba451
Merge branch 'dev' into feat/fluent-v9-upgrade
Mnickii Feb 10, 2025
ce2ebb3
Update the lock file
musale Feb 10, 2025
96b2abb
chore: remove usage of `geLocale` in urls (#3591)
Mnickii Feb 11, 2025
a05dcb9
update lockfile
Mnickii Feb 11, 2025
09400dd
feat: migrate consent type component to v9 (#3606)
Mnickii Feb 12, 2025
5e1cc14
feat: migrate request headerList (#3605)
Mnickii Feb 12, 2025
27aa2ca
feat: update component designs (#3609)
Mnickii Feb 12, 2025
daaacb1
feat: migrate response section to fluent UI v9 (#3473)
musale Feb 13, 2025
5f01650
feat: add request and response icons (#3616)
ElinorW Feb 13, 2025
e5caf11
Remove unused imports
musale Feb 14, 2025
2ec59b8
feat: update sidebar component designs, fix regressions (#3621)
Mnickii Feb 17, 2025
bc2849b
fix: flickering theme (#3624)
Mnickii Feb 17, 2025
f249b1f
fix: use initials in profile icon when signed in (#3625)
Mnickii Feb 17, 2025
ca62b3d
Fix: Response and Request area heights and style (#3619)
ElinorW Feb 18, 2025
fd4fb32
fix: component layout issues (#3629)
ElinorW Feb 19, 2025
4e87c1a
fix: regressions in component functionality (#3633)
Mnickii Feb 20, 2025
e9bb674
fix: Adjust sidebar resizing and responsiveness (#3639)
ElinorW Feb 20, 2025
3a46567
Merge branch 'dev' into feat/fluent-v9-upgrade
Mnickii Feb 21, 2025
a71c6b1
feat: update collections design, fix permissions alignment (#3638)
Mnickii Feb 21, 2025
a421750
fix: sidebar components badge alignment (#3641)
Mnickii Feb 21, 2025
8382f34
fix: paths misalignment (#3643)
Mnickii Feb 21, 2025
629c677
fix: adaptive card regressions (#3642)
ElinorW Feb 21, 2025
669965a
fix: sample bug, history regressions (#3647)
Mnickii Feb 24, 2025
7a9b2bd
fix: fluent v9 upgrade accessibility issues from Accessibility Insigh…
ElinorW Feb 24, 2025
9553ebc
Merge branch 'dev' into feat/fluent-v9-upgrade
Mnickii Feb 25, 2025
73b4290
Merge branch 'feat/fluent-v9-upgrade' of https://github.com/microsoft…
Mnickii Feb 25, 2025
140fdc8
fix build
Mnickii Feb 25, 2025
1022070
fix: correct CTA buttons (#3650)
Mnickii Feb 25, 2025
281f7d3
Merge branch 'dev' into feat/fluent-v9-upgrade
Mnickii Feb 26, 2025
929914d
feat: update response icon (#3657)
Mnickii Feb 26, 2025
4651227
fix: sample queries and history keyboard navigation (#3652)
ElinorW Feb 27, 2025
40274cf
feat: v8 component cleanup, modifications (#3557)
Mnickii Mar 12, 2025
0af4717
Merge branch 'dev' into feat/fluent-v9-upgrade
Mnickii Mar 12, 2025
ba4e82d
fix: remove duplicates in collections (#3663)
Mnickii Mar 12, 2025
e7c0ff4
fix: history actions button accessible with keyboard. (#3707)
ElinorW Mar 14, 2025
cd845a5
fix: accessibility issues on share query dialog (#3708)
ElinorW Mar 14, 2025
526a15f
fix: api explorer accessibility issues from test pass findings (#3706)
Mnickii Mar 17, 2025
9d0437b
fix: closing expand dialog returns focus to expand button (#3710)
ElinorW Mar 17, 2025
903caec
fix: accessibility fixes for the Profile Card (#3709)
musale Mar 17, 2025
c2e57f0
fix: refocus to the trigger button after closing the ShareQuery dialo…
musale Mar 17, 2025
9f89977
fix: return focus to previous element on close/back button (#3716)
Mnickii Mar 18, 2025
195656e
Merge branch 'dev' into feat/fluent-v9-upgrade
Mnickii Mar 18, 2025
2d0122b
fix build errors
Mnickii Mar 18, 2025
2e00fdc
fix: components visible at various page resolutions/zoom sizes (#3718)
ElinorW Mar 19, 2025
980f58a
fix: announce search results (#3719)
Mnickii Mar 20, 2025
b2b31ea
fix: make resource tree keyboard accessible (#3715)
Mnickii Mar 20, 2025
6abe8ad
fix: overflow on response area tabs (#3725)
ElinorW Mar 26, 2025
52de44e
fix: sidebar height getting truncated on some screen sizes (#3726)
ElinorW Mar 26, 2025
654f416
fix: announce changed scope activation after selecting checkbox items…
Mnickii Mar 26, 2025
07e822a
Merge branch 'dev' into feat/fluent-v9-upgrade
Mnickii Mar 27, 2025
03b4e3f
remove caret
Mnickii Mar 27, 2025
c81203c
fix: app crashing issues from dropdown interaction (#3728)
Mnickii Mar 28, 2025
4921a5e
fix: add ui/ux enhancements (#3723)
ElinorW Mar 28, 2025
911184a
fix: collections action buttons moving up with few items (#3731)
Mnickii Mar 28, 2025
de14bab
Merge branch 'dev' into feat/fluent-v9-upgrade
Mnickii Mar 28, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion .vscode/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
"package.json": "package-lock.json, .npmrc"
},
"cSpell.words": [
"fluentui"
"fluentui",
"noreferrer"
],
}
826 changes: 21 additions & 805 deletions package-lock.json

Large diffs are not rendered by default.

8 changes: 4 additions & 4 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,13 @@
"@azure/msal-browser": "4.5.1",
"@babel/core": "7.26.10",
"@babel/runtime": "7.26.10",
"@fluentui/react": "8.122.9",
"@fluentui-contrib/react-resize-handle": "0.6.1",
"@fluentui/react-components": "9.60.0",
"@fluentui/react-icons": "2.0.274",
"@fluentui/react-icons-mdl2": "1.3.83",
"@microsoft/applicationinsights-react-js": "17.3.4",
"@microsoft/applicationinsights-web": "3.3.6",
"@microsoft/microsoft-graph-client": "3.0.7",
"@microsoft/microsoft-graph-types": "2.40.0",
"@monaco-editor/react": "4.7.0",
"@ms-ofb/officebrowserfeedbacknpm": "file:packages/officebrowserfeedbacknpm-1.6.6.tgz",
"@reduxjs/toolkit": "2.6.0",
Expand Down Expand Up @@ -48,7 +48,6 @@
"postcss-flexbugs-fixes": "5.0.2",
"postcss-loader": "8.1.1",
"postcss-preset-env": "10.1.1",
"re-resizable": "6.11.2",
"react": "18.3.0",
"react-app-polyfill": "3.0.0",
"react-dom": "18.3.0",
Expand All @@ -69,7 +68,8 @@
"start": "node scripts/start.js",
"build": "node scripts/build.js && node versioned-build.js",
"test": "node scripts/test.js --no-watch --testPathIgnorePatterns=src/tests/ui src/tests/accessibility /scripts/ --max-old-space-size=8192",
"lint": "eslint . \"**/*.{js,ts,tsx}\"",
"lint": "eslint . \"**/*.{js,ts,tsx}\" --quiet",
"lint-fix": "eslint . \"**/*.{js,ts,tsx}\" --quiet --fix",
"prebuild:prod": "standard-version",
"build:prod": "npm run build",
"bump": "standard-version --skip.tag --skip.changelog",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import { ApplicationState, store } from '../../../../src/store/index';
import { fetchAutoCompleteOptions } from '../../../app/services/slices/autocomplete.slice';
import { suggestions } from '../../../modules/suggestions/suggestions';
import { Mode } from '../../../types/enums';
import { SnippetError } from '../../../types/snippets';
import { AUTOCOMPLETE_FETCH_ERROR, AUTOCOMPLETE_FETCH_PENDING, AUTOCOMPLETE_FETCH_SUCCESS } from '../redux-constants';
import { mockThunkMiddleware } from './mockThunkMiddleware';

Expand Down Expand Up @@ -61,13 +62,13 @@ const mockState: ApplicationState = {
isLoadingData: false,
response: {
body: undefined,
headers: undefined
headers: {}
}
},
snippets: {
pending: false,
data: [],
error: null
data: {},
error: {} as SnippetError
},
responseAreaExpanded: false,
dimensions: {
Expand Down
13 changes: 7 additions & 6 deletions src/app/services/actions/permissions-action-creator.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import {
import { authenticationWrapper } from '../../../modules/authentication';
import { ApplicationState, store } from '../../../store/index';
import { Mode } from '../../../types/enums';
import { SnippetError } from '../../../types/snippets';
import { getPermissionsScopeType } from '../../utils/getPermissionsScopeType';
import { translateMessage } from '../../utils/translate-messages';
import { ACCOUNT_TYPE } from '../graph-constants';
Expand Down Expand Up @@ -82,13 +83,13 @@ const mockState: ApplicationState = {
isLoadingData: false,
response: {
body: undefined,
headers: undefined
headers: {}
}
},
snippets: {
pending: false,
data: [],
error: null
data: {},
error: {} as SnippetError
},
responseAreaExpanded: false,
dimensions: {
Expand Down Expand Up @@ -301,7 +302,7 @@ describe('Permissions action creators', () => {
statusText: translateMessage('Revoking'),
status: translateMessage('Please wait while we revoke this permission'),
ok: false,
messageType: 0
messageBarType: 'info'
}
}
]
Expand Down Expand Up @@ -357,7 +358,7 @@ describe('Permissions action creators', () => {
statusText: translateMessage('Revoking '),
status: translateMessage('Please wait while we revoke this permission'),
ok: false,
messageType: 0
messageBarType: 'info'
}
}
]
Expand Down Expand Up @@ -416,7 +417,7 @@ describe('Permissions action creators', () => {
statusText: translateMessage('Revoking'),
status: translateMessage('Please wait while we revoke this permission'),
ok: false,
messageType: 0
messageBarType: 'info'
}
}
]
Expand Down
45 changes: 21 additions & 24 deletions src/app/services/actions/permissions-action-creator.util.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
import { User } from '@microsoft/microsoft-graph-types';
import { componentNames, eventTypes, telemetry } from '../../../telemetry';
import { IOAuthGrantPayload, IPermissionGrant } from '../../../types/permissions';
import { IUser } from '../../../types/profile';
import { CustomBody, ResponseValue } from '../../../types/query-response';
import { IQuery } from '../../../types/query-runner';
import { RevokeScopesError } from '../../utils/error-utils/RevokeScopesError';
import { exponentialFetchRetry } from '../../utils/fetch-retry-handler';
import { GRAPH_URL } from '../graph-constants';
import { makeGraphRequest, parseResponse } from './query-action-creator-util';
import { parseResponse, makeGraphRequest as queryMakeGraphRequest } from './query-action-creator-util';

interface IPreliminaryChecksObject {
defaultUserScopes: string[];
Expand Down Expand Up @@ -107,7 +109,9 @@ export class RevokePermissionsUtil {
const tenantAdminQuery = { ...genericQuery };
tenantAdminQuery.sampleUrl = `${GRAPH_URL}/v1.0/me/memberOf`;
const response = await RevokePermissionsUtil.makeExponentialFetch([], tenantAdminQuery);
return response ? response.value.some((value: any) => value.displayName === 'Global Administrator') : false
const value = (response as CustomBody).value
const isAdmin = value ? value.some((v: Partial<User>)=>v?.displayName === 'Global Administrator') : false
return isAdmin
}

public async getUserPermissionChecks(preliminaryObject: PartialCheckObject): Promise<{
Expand Down Expand Up @@ -191,7 +195,7 @@ export class RevokePermissionsUtil {
genericQuery.sampleUrl = `${GRAPH_URL}/v1.0/oauth2PermissionGrants?$filter=clientId eq '${servicePrincipalAppId}'`;
genericQuery.sampleHeaders = [{ name: 'ConsistencyLevel', value: 'eventual' }];
const oAuthGrant = await RevokePermissionsUtil.makeExponentialFetch(scopes, genericQuery);
return oAuthGrant;
return oAuthGrant as IOAuthGrantPayload;
}

public permissionToRevokeInGrant(permissionsGrant: IPermissionGrant, allPrincipalGrant: IPermissionGrant,
Expand All @@ -207,7 +211,8 @@ export class RevokePermissionsUtil {
const currentAppId = process.env.REACT_APP_CLIENT_ID;
genericQuery.sampleUrl = `${GRAPH_URL}/v1.0/servicePrincipals?$filter=appId eq '${currentAppId}'`;
const response = await this.makeGraphRequest(scopes, genericQuery);
return response ? response.value[0].id : '';
const value = (response as CustomBody)?.value
return value ? value[0]?.id ?? '' : ''
}

private async revokePermission(permissionGrantId: string, newScopes: string): Promise<boolean> {
Expand All @@ -219,32 +224,24 @@ export class RevokePermissionsUtil {
patchQuery.sampleUrl = `${GRAPH_URL}/v1.0/oauth2PermissionGrants/${permissionGrantId}`;
genericQuery.sampleHeaders = [{ name: 'ConsistencyLevel', value: 'eventual' }];
patchQuery.selectedVerb = 'PATCH';
// eslint-disable-next-line no-useless-catch
try {
const response = await RevokePermissionsUtil.makeGraphRequest([], patchQuery);
const { error } = response;
if (error) {
return false;
}
return true;
}
catch (error: any) {
throw error;

const response = await RevokePermissionsUtil.makeGraphRequest([], patchQuery);
const error = (response as CustomBody).error;
if (error) {
return false;
}
return true;
}

private static async makeExponentialFetch(scopes: string[], query: IQuery, condition?:
(args?: any) => Promise<boolean>) {
const respHeaders: any = {};
const response = await exponentialFetchRetry(() => makeGraphRequest(scopes)(query),
8, 100, condition);
return parseResponse(response, respHeaders);
private static async makeExponentialFetch(
scopes: string[], query: IQuery, condition?: (args?: unknown) => Promise<boolean>) {
const response = await exponentialFetchRetry(() => queryMakeGraphRequest(scopes)(query), 8, 100, condition);
return parseResponse(response as Response);
}

private static async makeGraphRequest(scopes: string[], query: IQuery) {
const respHeaders: any = {};
const response = await makeGraphRequest(scopes)(query);
return parseResponse(response, respHeaders);
const response = await queryMakeGraphRequest(scopes)(query);
return parseResponse(response as Response);
}

private trackRevokeConsentEvent = (status: string, permissionObject: any) => {
Expand Down
3 changes: 1 addition & 2 deletions src/app/services/actions/profile-actions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -103,10 +103,9 @@ export async function getProfileImage(): Promise<string> {

export async function getProfileResponse(): Promise<IProfileResponse> {
const scopes = DEFAULT_USER_SCOPES.split(' ');
const respHeaders: Record<string, string> = {};

const response = await makeGraphRequest(scopes)(query);
const userInfo = await parseResponse(response, respHeaders);
const userInfo = await parseResponse(response as Response);
return {
userInfo,
response
Expand Down
93 changes: 40 additions & 53 deletions src/app/services/actions/query-action-creator-util.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,12 @@ import {

import { authenticationWrapper } from '../../../modules/authentication';
import { ApplicationState } from '../../../store';
import { ContentType } from '../../../types/enums';
import { ResponseBody } from '../../../types/query-response';
import { IQuery } from '../../../types/query-runner';
import { IRequestOptions } from '../../../types/request';
import { IStatus } from '../../../types/status';
import { ClientError } from '../../utils/error-utils/ClientError';
import { getHeaders } from '../../utils/http-methods.utils';
import { encodeHashCharacters } from '../../utils/query-url-sanitization';
import { translateMessage } from '../../utils/translate-messages';
import { authProvider, GraphClient } from '../graph-client';
Expand All @@ -36,7 +37,7 @@ export async function anonymousRequest(
export function createAnonymousRequest(query: IQuery, proxyUrl: string, queryRunnerStatus: IStatus) {
const escapedUrl = encodeURIComponent(query.sampleUrl);
const graphUrl = `${proxyUrl}?url=${escapedUrl}`;
const sampleHeaders: any = {};
const sampleHeaders: Record<string, string> = {};

if (query.sampleHeaders && query.sampleHeaders.length > 0) {
query.sampleHeaders.forEach((header) => {
Expand Down Expand Up @@ -106,30 +107,30 @@ function createAuthenticatedRequest(

export function makeGraphRequest(scopes: string[]) {
return async (query: IQuery) => {
let response;
let response: ResponseBody;

const graphRequest: GraphRequest = createAuthenticatedRequest(scopes, query);

switch (query.selectedVerb) {
case 'GET':
response = await graphRequest.get();
response = await graphRequest.get() as ResponseBody;
break;
case 'POST':
response = await graphRequest.post(query.sampleBody);
response = await graphRequest.post(query.sampleBody) as ResponseBody;
break;
case 'PUT':
response = await graphRequest.put(query.sampleBody);
response = await graphRequest.put(query.sampleBody) as ResponseBody;
break;
case 'PATCH':
response = await graphRequest.patch(query.sampleBody);
response = await graphRequest.patch(query.sampleBody) as ResponseBody;
break;
case 'DELETE':
response = await graphRequest.delete();
response = await graphRequest.delete() as ResponseBody;
break;
default:
return;
}
return Promise.resolve(response);
return Promise.resolve(response) as ResponseBody;
};
}

Expand All @@ -146,32 +147,26 @@ export function isBetaURLResponse(json: any) {
return !!json?.account?.[0]?.source?.type?.[0];
}

export function getContentType(headers: any) {
let contentType = null;

if (headers) {
let contentTypes = headers['content-type'];
if (headers instanceof Headers) {
contentTypes = headers.get('content-type');
}
if (contentTypes) {
/* Example: application/json;odata.metadata=minimal;odata.streaming=true;IEEE754Compatible=false;charset=utf-8
* Take the first option after splitting since it is the only value useful in the description of the content
*/
const splitContentTypes = contentTypes.split(';');
if (splitContentTypes.length > 0) {
contentType = splitContentTypes[0].toLowerCase();
}
}
export function getContentType(headers: Record<string, string>): string {
const contentTypeHeader = Object.keys(headers).find(header => header.toLowerCase() === 'content-type');
let contentType = contentTypeHeader ? headers[contentTypeHeader] : '';
/* Example: application/json;odata.metadata=minimal;odata.streaming=true;IEEE754Compatible=false;charset=utf-8
* Take the first option after splitting since it is the only value useful in the description of the content
*/
if (contentType) {
const splitContentTypes = contentType.split(';');
contentType = (splitContentTypes.length > 0) ? splitContentTypes[0].toLowerCase() : contentType;
}
return contentType;
return contentType.toLowerCase();
}

export function isFileResponse(headers: any) {
const contentDisposition = headers['content-disposition'];
export function isFileResponse(headers: Record<string, string>) {
const contentDisposition: string | null = (headers instanceof Headers) ?
headers.get('content-disposition') : headers['content-disposition'];

if (contentDisposition) {
const directives = contentDisposition.split(';');
if (directives.contains('attachment')) {
if (directives.includes('attachment')) {
return true;
}
}
Expand All @@ -191,48 +186,40 @@ export function isFileResponse(headers: any) {
return false;
}

export async function generateResponseDownloadUrl(
response: Response,
respHeaders: any
) {
export async function generateResponseDownloadUrl(response: Response) {
const headers = getHeaders(response)
try {
const fileContents = await parseResponse(response, respHeaders);
const contentType = getContentType(respHeaders);
const fileContents = await parseResponse(response);
const contentType = getContentType(headers);
if (fileContents) {
const buffer = await response.arrayBuffer();
const blob = new Blob([buffer], { type: contentType });
return URL.createObjectURL(blob);
}
} catch (error) {
} catch {
return null;
}
}

async function tryParseJson(textValue: string) {
try {
return JSON.parse(textValue);
} catch (error) {
} catch {
return textValue;
}
}

export function parseResponse(
response: Response,
respHeaders: { [key: string]: string } = {}
): Promise<any> {
if (response && response.headers) {
response.headers.forEach((val: string, key: string) => {
respHeaders[key] = val;
});

const contentType = getContentType(response.headers);
export const parseResponse = (response: ResponseBody): Promise<ResponseBody> => {
if (response instanceof Response && response.headers) {
const headers = getHeaders(response)
const contentType = getContentType(headers);
switch (contentType) {
case ContentType.Json:
case 'application/json':
return response.text().then(tryParseJson);
case ContentType.XML:
case ContentType.HTML:
case ContentType.TextCsv:
case ContentType.TextPlain:
case 'application/xml':
case 'text/html':
case 'text/csv':
case 'text/plain':
return response.text();

default:
Expand Down
Loading
Loading