{"version":3,"sources":["Components/AppTile.tsx","Components/AppList.tsx","Components/UserApps.tsx","Components/AppSortable.tsx","Components/EditUserApps.tsx","Components/StudentRedirect.tsx","Hooks/useGraph.ts","Hooks/useApps.ts","Helper/Debug.ts","Hooks/useOneDrive.ts","Images/logo.png","Components/UserProfile.tsx","Components/Header.tsx","Hooks/userUserRole.tsx","Helper/saveToOneDrive.ts","Helper/checkForAppChanges.ts","Modules/PasswordExpiry.tsx","Modules/PortalMessages.tsx","Hooks/usePreferences.ts","Components/Tour.tsx","App.tsx","reportWebVitals.ts","index.tsx"],"names":["AppTile","React","render","isVisible","undefined","this","props","app","visible","showHidden","forceVisible","hiddenButShown","loginURL","loginUrl","title","displayName","notes","JSON","parse","Description","length","err","console","log","_jsx","className","style","display","opacity","children","_jsxs","href","target","rel","Icon","iconName","color","fontSize","position","right","top","backgroundColor","borderRadius","padding","src","info","logoUrl","alt","AppList","constructor","super","state","list","value","map","item","id","UserApps","userApps","setUserApps","useState","visibleApps","setVisibleApps","hasODAccess","setHasODAccess","clearSearch","useEffect","apps","SearchBox","placeholder","onChange","e","preventDefault","searchText","filteredApps","filter","toUpperCase","indexOf","searchLinks","onClear","left","pinned","showHiddenApps","AppSortable","group","regionId","onSortChange","onSetList","onPinnedToggle","localApps","setLocalApps","ReactSortable","ghostClass","animation","setList","newState","updated","TileEdit","onTogglePin","handleTogglePin","onToggleVisible","ind","findIndex","handleHideToggle","cursor","IconButton","onClick","menuProps","items","key","text","iconProps","directionalHintFixed","ariaLabel","menuIconProps","EditUserApps","pinnedSortableList","setPinnedSortableList","sortableList","setSortableList","updatedApps","setUpdatedApps","restoreDialog","setRestoreDialog","handlePinToggle","dupe","appInd","CommandButton","saveSortChanges","saveEditChanges","restorePrompt","undoSortChanges","canceEditMode","toggleEditMode","_Fragment","width","textAlign","pinnedApps","fullList","concat","updatePinnedSortable","unpinnedApps","updateSortable","Dialog","onDismiss","hidden","dialogContentProps","subText","type","DialogType","close","DialogFooter","DefaultButton","PrimaryButton","restoreFromBackup","ignoredDepartments","StudentRedirect","userDetails","query","data","setData","msalInstance","acquireTokenSilent","scopes","then","res","accessToken","headers","Headers","bearer","append","fetch","method","resp","json","useGraph","cancelRedirect","department","userPrincipalName","test","setTimeout","window","open","async","fetchApps","graphEndpoint","result","options","useApps","setApps","fetching","setFetching","allApps","accounts","getAllAccounts","setActiveAccount","fetchMyAPI","useCallback","newapps","nextLink","forEach","element","push","_app$tags","tags","chunkedApps","chunk","validApps","chunkArray","batchInAppRoleAssignments","usersApps","visa","userBlockedApps","appsWithBlocks","notesJSON","bg","i","app_id","blockedGroup","chunkedBlockedApps","batchInBlockedApps","substring","_appsBlocked","filtered","ua","some","uba","sort","a","b","arr","len","chunks","n","slice","$batch","requests","url","body","stringify","results","responses","r","groups","status","_URLParamExists","URLSearchParams","location","search","get","_Debug","_debug","_len","arguments","args","Array","_key","cb","call","hasOneDriveAccess","fetchOneDrive","fileName","filePath","Error","saveOneDrive","content","newFileName","UserPofile","setUserDetails","calloutVisible","setCalloutVisible","confirmLogout","setConfirmLogout","useRef","_userFetchedDetails$g","_userFetchedDetails$s","userGraph","userFetchedDetails","photo","pBlob","blob","photoBlobUrl","URL","webkitURL","createObjectURL","userInfo","givenName","surname","initials","mail","mobilePhone","businessPhones","companyName","fetchUserInfo","onRenderPlainCard","modalProps","isBlocking","normal","logoutRedirect","Persona","size","PersonaSize","size72","imageInitials","secondaryText","onRenderSecondaryText","showInitialsUntilImageLoads","imageUrl","hidePersonaDetails","Callout","isBeakVisible","size48","primaryText","Header","logo","useUserRole","userRole","setUserRole","setUserPrincipalName","currentUserRole","includes","saveToOneDrive","checkForAppChanges","serverApps","appsChanged","addedApps","serverApp","removedApps","getModifiedApps","hasChanged","removeApps","newApps","checkForUpdates","rApps","indToRemove","array","attr","findWithAttr","splice","aApps","addNewApps","modifiedApps","modApp","vApp","updateModifiedApps","updateApps","getDiff","expireDays","lastChangeDate","today","Date","Math","round","getTime","PasswordExpiry","expiry","setExpiry","setVisible","lastPasswordChangeDateTime","staffDiff","expiryInfo","domain","link","days","studentDiff","getPasswordExpiry","styles","main","isModeless","getFetchOptions","accessScopes","PortalMessages","visibleMessages","setVisibleMessages","portalMessages","setPortalMessages","readMessages","setReadMessages","usersReadMessages","setUsersReadMessages","userReadID","setUserReadID","currentIndex","setCurrentIndex","init","fetchedPortalMessages","todayString","toISOString","getPortalMessages","pMessages","userSPValues","getUserSharepointListItem","spItem","_spItem$value$","_spItem$value$2","_spItem$value$2$field","_spItem$value$3","_spItem$value$3$field","_spItem$value$4","_spItem$value$4$field","values","fields","Value","split","dismissMessages","localCopy","vals","updateVals","join","putUrl","currentAccount","getActiveAccount","Title","username","updateUserSharepointListItem","saveReadState","nextMessage","markRead","updatedReadMessages","currentId","unreadMessages","message","ri","toString","isDarkOverlay","containerClassName","dangerouslySetInnerHTML","__html","Content","prefFileName","usePreferences","preferenceValue","setPreferenceValue","prefsFetched","setPrefsFetched","Init","preferences","getPreferences","savePreferences","Tour","step","currentStep","_nextStep","setState","componentDidUpdate","prevProps","prevState","_this$step","onShow","steps","maxSteps","delay","TeachingBubble","hasCloseButton","closeButtonAriaLabel","footerContent","calloutProps","preventDismissOnEvent","ev","directionalHint","DirectionalHint","rightCenter","hasSmallHeadline","primaryButtonProps","nextText","callback","secondaryButtonProps","prevText","prevCallback","headline","App","_ref","pca","editMode","setEditMode","setShowHidden","setPreferences","siteUrl","urlParams","isEmbed","isSpredirect","newPreferences","newPreferencesFetched","setNewPreferences","setRestorePrompt","odFile","fileExists","fileLoading","backupFile","hasAccess","setHasAccess","setExists","backupFileExists","setBackupExists","oldFile","setOldFile","setBackupFile","oldFileExists","setOldExists","setFile","loading","setLoading","dLoadLink","fileData","SyntaxError","code","getBackup","fetchedFileOK","oldFileerr","getData","useOneDrive","studentDefaultPinnedCondition","table","studentDefaultPinnedApps","subData","newSub","noPinnedApps","studentsFullApps","initializeIcons","disableWarnings","setIconOptions","displayEditMode","appsToSave","newFile","refreshDate","userPreferenceExists","reduce","upp","up","updateUserPreferenceValue","prefExists","tempPrefs","AuthenticatedTemplate","Spinner","label","SpinnerSize","large","lst","getUserPreference","topCenter","toLocaleUpperCase","reportWebVitals","onPerfEntry","Function","getCLS","getFID","getFCP","getLCP","getTTFB","configuration","auth","clientId","authority","redirectUri","system","allowRedirectInIframe","PublicClientApplication","active","addEventCallback","event","eventType","EventType","LOGIN_SUCCESS","payload","account","ReactDOM","StrictMode","MsalProvider","instance","MsalAuthenticationTemplate","interactionType","InteractionType","Redirect","authenticationRequest","errorComponent","error","marginTop","loadingComponent","document","getElementById"],"mappings":"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","file":"static/js/main.1db8c41d.chunk.js","sourcesContent":["import * as React from 'react';\n//import styles from '../CduMyApps.module.scss';\nimport { IApp } from '../Interfaces/IApp';\nimport { IAppsState } from '../Interfaces/IAppsState';\n//import { ICduMyAppsProps } from '../Interfaces/ICduMyAppsProps';\nimport { Icon } from '@fluentui/react';\n\nexport class AppTile extends React.Component {\n /*constructor(props:IAppTile){\n super(props);\n }*/\n\n public render(): React.ReactElement {\n //let optional = this.props.app.notes != undefined && this.props.app.notes.indexOf('|OPTIONAL|') > -1 ;\n //if(optional){ console.log(\"optional\",this.props.app.notes);}\n let isVisible =\n this.props.app.visible === undefined || this.props.app.visible || this.props.showHidden;\n\n //if( optional && this.props.app.visible === undefined ){\n // isVisible = false;\n //}\n\n if (this.props.forceVisible) {\n isVisible = true;\n }\n\n //if(optional){ console.log(\"optional\",this.props.app.notes);console.log(\"isVisible\",isVisible);}\n\n let hiddenButShown =\n !this.props.app.visible && this.props.app.visible !== undefined && this.props.showHidden;\n let loginURL = this.props.app.loginUrl;\n //let loginURL = `javascript:(window.open('${this.props.app.loginUrl}','_blank'))`;\n\n let title = this.props.app.displayName;\n\n try {\n let notes = JSON.parse(this.props.app.notes);\n\n if (\n notes !== undefined &&\n notes !== null &&\n notes.Description !== undefined &&\n notes.Description !== null &&\n notes.Description.length > 0\n ) {\n //console.log('notes',notes);\n title = notes.Description;\n }\n } catch (err) {\n console.log('Error getting app notes description', err);\n }\n\n //let title = notes.Description || this.props.app.displayName;\n\n return (\n \n {\n //\n }\n\n \n {hiddenButShown && (\n \n )}\n {this.props.app.displayName}\n
{this.props.app.displayName}
\n
\n \n );\n }\n}\n\nexport interface IAppTile {\n app: IApp;\n showHidden: boolean;\n forceVisible?: boolean;\n}\n","import * as React from 'react';\nimport { IApp } from '../Interfaces/IApp';\nimport { AppTile } from './AppTile';\n\nexport interface IAppList {\n value: IApp[];\n showHidden: boolean;\n}\n\ninterface IAppListState {\n list: IApp[];\n showHidden: boolean;\n}\n\nexport class AppList extends React.Component {\n constructor(props: IAppList) {\n super(props);\n\n this.state = {\n list: this.props.value,\n showHidden: this.props.showHidden,\n };\n }\n\n public render(): React.ReactElement {\n // console.log(\"AppList showhidden\",this.props.showHidden);\n return (\n
\n {this.props.value.map(item => (\n \n ))}\n
\n );\n }\n}\n","import { Icon, SearchBox, TextField } from '@fluentui/react';\nimport { useEffect, useState } from 'react';\nimport { AppList } from './AppList';\nimport './UserApps.css';\n\nexport default function UserApps(props: any) {\n const [userApps, setUserApps] = useState();\n const [visibleApps, setVisibleApps] = useState([]);\n const [hasODAccess, setHasODAccess] = useState(true);\n\n useEffect(() => {\n setUserApps(props.apps);\n setVisibleApps(props.apps);\n setHasODAccess(props.hasODAccess);\n }, [props.apps]);\n\n function searchLinks(e: any) {\n if (e) {\n e.preventDefault();\n let searchText = e.target.value;\n let filteredApps = userApps.filter((app: any) => {\n return app.displayName.toUpperCase().indexOf(searchText.toUpperCase()) >= 0;\n });\n //console.log({ filteredApps });\n setVisibleApps(filteredApps);\n } else {\n clearSearch();\n }\n }\n\n function clearSearch() {\n setVisibleApps(userApps);\n }\n\n return (\n
\n {\n searchLinks(e);\n }}\n onClear={() => {\n clearSearch();\n }}\n className=\"searchField\"\n />\n {false && (\n {\n searchLinks(e);\n }}\n className=\"searchField\"\n placeholder=\"Search : Start typing here\"\n >\n )}\n {userApps && hasODAccess && (\n
\n \n {visibleApps.filter((item: any) => {\n return item.pinned;\n }).length > 0 ? (\n {\n return item.pinned;\n })}\n showHidden={props.showHiddenApps}\n />\n ) : (\n
\n No apps currently pinned. Edit your apps to pin your favorite ones to the top.\n
\n )}\n
\n )}\n\n {userApps && (\n {\n return !item.pinned;\n })}\n showHidden={props.showHiddenApps}\n >\n )}\n
\n );\n}\n","import React, { useEffect, useState } from 'react'\nimport { IApp } from '../Interfaces/IApp';\nimport { ReactSortable } from 'react-sortablejs';\nimport { IconButton } from '@fluentui/react';\nimport { AppTile } from './AppTile';\n\ninterface AppSortableEditProps{\n apps:IApp[];\n group:string;\n regionId:string;\n onSortChange?:(apps:IApp[])=>void;\n onSetList?:(apps:IApp[]) => IApp[];\n onPinnedToggle?:(appid:string) => void;\n \n}\n\n\nconst AppSortable = (props:AppSortableEditProps) => {\n const {apps,group,regionId,onSortChange,onSetList,onPinnedToggle} = props;\n \n const [localApps,setLocalApps] = useState(apps);\n \n \n useEffect(()=>{setLocalApps(apps)},[apps])\n \n const handleHideToggle = (id:string)=>{\n \n const apps = [...localApps];\n const ind = apps.findIndex(app => app.id === id)\n const visible = apps[ind].visible !== false;\n apps[ind].visible = !visible;\n setLocalApps(apps)\n }\n\n const handleTogglePin = (id:string)=>{\n onPinnedToggle?.(id);\n }\n \n return (\n console.log(\"Updated\",res)}\n \n setList={(newState: any) => {\n const updated = onSetList?.(newState) || newState;\n setLocalApps(updated);\n //onSortChange(updated);\n }}\n >\n {localApps.map(app => \n handleTogglePin(app.id)} onToggleVisible={()=>{handleHideToggle(app.id)}}\n />)}\n \n )\n \n \n}\n\nexport default AppSortable;\n\n\ninterface TileEditProps{\n app:IApp;\n onTogglePin?:()=>void;\n onToggleVisible?:()=>void;\n}\n\nconst TileEdit = (props:TileEditProps)=>{\n const {app,onTogglePin,onToggleVisible} = props;\n\n\n return (\n \n {' '}\n \n
\n {\n //console.log(\"Open Context\");\n }}\n menuProps={{\n items: [\n {\n key: 'pinTile',\n text: app.pinned ? 'Unpin' : 'Pin',\n iconProps: { iconName: app.pinned ? 'UnPin' : 'Pin' },\n onClick: () => {\n onTogglePin?.();\n },\n },\n {\n key: 'toggleVisible',\n text: app.visible || app.visible === undefined ? 'Hide' : 'Show', //'Hide/Show',\n iconProps: {\n iconName: app.visible || app.visible === undefined ? 'Hide' : 'RedEye',\n }, //{ iconName: 'Hide' },\n onClick: () => {\n onToggleVisible?.();\n },\n },\n ],\n directionalHintFixed: false,\n }}\n iconProps={{ iconName: 'MoreVertical' }}\n title=\"Edit\"\n ariaLabel=\"Edit\"\n menuIconProps={{ style: { display: 'none' } }}\n >\n
\n )\n}","import {\n CommandButton,\n DefaultButton,\n Dialog,\n DialogFooter,\n Icon,\n PrimaryButton,\n DialogType,\n} from '@fluentui/react';\nimport React, { useEffect, useState } from 'react';\nimport { AppSortableGrid } from './AppSortableGrid';\nimport AppSortable from './AppSortable';\nimport { IApp } from '../Interfaces/IApp';\n\nexport default function EditUserApps(props: any) {\n const [pinnedSortableList, setPinnedSortableList] = useState();\n const [sortableList, setSortableList] = useState();\n const [updatedApps, setUpdatedApps] = useState();\n const [restoreDialog, setRestoreDialog] = useState(false);\n //const userApps = props.apps;\n\n useEffect(() => {\n // console.log('sortableList',sortableList)\n\n if (props.apps) {\n setUpdatedApps(props.apps);\n /*setPinnedSortableList(props.apps.filter((item:any)=>{return item.pinned;}));\n\n setSortableList(props.apps.filter((item:any)=>{return !item.pinned;}));*/\n }\n /* props.apps.then(\n (res:any)=>{\n\n console.log(res);\n setPinnedSortableList(res.filter((item:any)=>{return item.pinned;}));\n\n setSortableList(res.filter((item:any)=>{return !item.pinned;}));\n })\n*/\n }, [props.apps]);\n\n useEffect(() => {\n // console.log('Updated apps Updated');\n if (updatedApps) {\n setPinnedSortableList(\n updatedApps.filter((item: any) => {\n return item.pinned;\n }),\n );\n\n setSortableList(\n updatedApps.filter((item: any) => {\n return !item.pinned;\n }),\n );\n }\n return () => {};\n }, [updatedApps]);\n\n const saveSortChanges = () => {\n props.saveEditChanges(updatedApps);\n };\n\n const restorePrompt = () => {\n setRestoreDialog(true);\n //props.restoreFromBackup();\n };\n\n const undoSortChanges = () => {\n setUpdatedApps(props.apps);\n };\n\n const canceEditMode = () => {\n props.toggleEditMode();\n };\n\n const updatePinnedSortable = (list: any) => {\n const fullList = sortableList?.concat(list);\n setUpdatedApps(fullList);\n /* this.setState({\n editList : fullList,\n pinnedSortableList:fullList.filter((item) => {return item.pinned;}),\n sortableList:fullList.filter((item) => {return !item.pinned;})\n });*/\n };\n\n const updateSortable = (list: any) => {\n const fullList = pinnedSortableList?.concat(list);\n setUpdatedApps(fullList);\n // console.log('Changed SortedList');\n /* this.setState({\n editList : fullList,\n pinnedSortableList:fullList.filter((item) => {return item.pinned;}),\n sortableList:fullList.filter((item) => {return !item.pinned;})\n });*/\n };\n\n //let sortableList:any[] = [];\n\n //let pinnedSortableList:any[] = props.apps.filter((item:any)=>{return item.pinned;});\n\n //console.log('edit apps props',sortableList);\n\n const handlePinToggle = (id:string) =>{\n \n const dupe = updatedApps ? [...updatedApps] : [];\n const appInd = dupe?.findIndex(app => app.id === id);\n if (appInd > -1){\n dupe[appInd].pinned = !dupe[appInd].pinned;\n setUpdatedApps(dupe)\n }\n\n }\n\n return (\n
\n
\n \n \n \n \n
\n\n <>\n
\n
\n
\n

Edit Mode

\n

\n To sort your apps drag and drop them. To Pin apps Drag them into the pinned area at\n the top.\n
\n To hide/show apps click on the menu icon at the top right corner of the app tile.\n
\n

\n
\n {pinnedSortableList && (\n <>\n \n app.pinned) || []}\n onSetList={(apps:IApp[])=>{\n const pinnedApps = apps.map(app=>({...app,pinned:true}));\n updatePinnedSortable(pinnedApps);\n \n //console.log(\"Pinned\",pinnedApps);\n return pinnedApps;}}\n onPinnedToggle={handlePinToggle}\n >\n {/* */}\n \n )}\n
\n {sortableList && (\n
\n !app.pinned) || []} \n onSetList={(apps:IApp[])=>{\n const unpinnedApps = apps.map(app=>({...app,pinned:false}));\n //console.log(\"Unpinned\",unpinnedApps);\n updateSortable(unpinnedApps);\n return unpinnedApps;\n }} \n onPinnedToggle={handlePinToggle}\n >\n {/* !app.pinned)}\n onSortChange={updateSortable}\n > */}\n
\n )}\n\n {restoreDialog && (\n {\n setRestoreDialog(false);\n }}\n hidden={!restoreDialog}\n dialogContentProps={{\n title: 'Restore Settings?',\n subText:\n 'Are you sure you would like to attempt to restore your settings from a previous saved file?',\n type: DialogType.close,\n }}\n >\n \n {\n setRestoreDialog(false);\n }}\n >\n Cancel\n \n {\n props.restoreFromBackup();\n }}\n >\n Restore\n \n \n \n )}\n
\n \n
\n );\n}\n","import _Debug from '../Helper/Debug';\nimport useGraph from '../Hooks/useGraph';\n/**\n * This component is used for validating a student then redirect to Student Portal website.\n \n */\n\n// Any department in this array will cancel the redirect.\nconst ignoredDepartments = ['Alumni'];\n\nexport default function StudentRedirect(props: any) {\n const userDetails: { department: string } | undefined = useGraph(\n 'https://graph.microsoft.com/v1.0/me?$select=displayName,givenName,surname,userPrincipalName,mail,mobilePhone,id,businessPhone,companyName,department',\n );\n let cancelRedirect = true;\n\n if (\n userDetails\n // userDetails &&\n // typeof userDetails === 'object' &&\n // userDetails != null &&\n // 'department' in userDetails\n ) {\n const department = userDetails.department as string;\n if (ignoredDepartments.indexOf(department) > -1) {\n cancelRedirect = true;\n } else {\n cancelRedirect = false;\n }\n }\n\n const studentRedirectSite = 'https://charlesdarwinuni.sharepoint.com/teams/StudentPortal';\n const redirectToWebsite = () => {\n if (!cancelRedirect) window.open(studentRedirectSite, '_self');\n };\n\n const userPrincipalName = props?.userPrincipalName;\n // Regex to check CDU student principle name with pattern s and 6 digits or more and student domain name\n // For example: s123456@students.cdu.edu.au or s12345678@students.cdu.edu.au\n const studentRegex = /^[sS]\\d{6,}@students\\.cdu\\.edu\\.au$/;\n const isStudent = studentRegex.test(userPrincipalName);\n // console.log('is Student', isStudent);\n\n if (isStudent) {\n setTimeout(() => {\n redirectToWebsite();\n }, 0);\n }\n // if (isStudent) {\n // return (\n //
\n //

\n // Hello student, this site is redirected to Student Portal.{' '}\n // \n //

\n //
\n // );\n // } else {\n // return null;\n // }\n return null;\n}\n","import { useMsal } from '@azure/msal-react';\nimport React, { useState, useReducer, useEffect } from 'react';\nimport { IPublicClientApplication } from '@azure/msal-browser';\nimport { msalInstance } from '..';\n\nexport default function useGraph(query: string) {\n const [data, setData] = useState();\n\n useEffect(() => {\n msalInstance.acquireTokenSilent({ scopes: ['User.Read', 'Mail.Read'] }).then(res => {\n if (res.accessToken) {\n var headers = new Headers();\n var bearer = 'Bearer ' + res.accessToken;\n headers.append('Authorization', bearer);\n\n var options = {\n method: 'GET',\n headers: headers,\n };\n var graphEndpoint = query || 'https://graph.microsoft.com/v1.0/me';\n\n fetch(graphEndpoint, options)\n .then(resp => {\n return resp.json();\n })\n .then(resp => {\n //do something with response\n //console.log('resp',resp);\n setData(resp);\n //return resp;\n });\n }\n });\n }, []);\n\n return data;\n\n /* const [data,setData] = useState();\n const { instance, accounts, inProgress } = useMsal();\n let accessToken = null;\n useEffect(() => {\n if (inProgress === \"none\" && accounts.length > 0) {\n // Retrieve an access token\n accessToken = instance.acquireTokenSilent({\n account: accounts[0],\n scopes: [\"User.Read\"]\n }).then(response => {\n if (response.accessToken) {\n return response.accessToken;\n }\n return null;\n });\n }\n }, [inProgress, accounts, instance]);\n \n if (inProgress === \"login\") {\n // Render loading component\n } else if (accessToken) {\n // Call your api and render component\n\n var headers = new Headers();\n var bearer = \"Bearer \" + accessToken;\n headers.append(\"Authorization\", bearer);\n\n var options = {\n method: \"GET\",\n headers: headers\n };\n var graphEndpoint = query || \"https://graph.microsoft.com/v1.0/me\";\n\n fetch(graphEndpoint, options)\n .then(resp => {\n //do something with response\n console.log('resp',resp);\n return resp;\n });\n //tData(results.json());\n return [data];\n }\n \n*/\n}\n","//import { useMsal } from \"@azure/msal-react\";\nimport { useState, useEffect, useCallback } from 'react';\n//import { IPublicClientApplication } from \"@azure/msal-browser\";\nimport { msalInstance } from '..';\n//import { ResponseType } from \"@microsoft/microsoft-graph-client\";\n\nasync function fetchApps(graphEndpoint: any) {\n try {\n let result = await msalInstance.acquireTokenSilent({\n scopes: ['User.Read', 'Directory.AccessAsUser.All'],\n });\n\n if (result.accessToken) {\n var headers = new Headers();\n var bearer = 'Bearer ' + result.accessToken;\n headers.append('Authorization', bearer);\n\n var options = {\n method: 'GET',\n headers: headers,\n };\n\n let results: any = await fetch(graphEndpoint, options);\n let apps = results.json();\n //let nextLink = apps['@odata.nextLink'];\n //console.log('nl',nextLink);\n //console.log('results apps',apps);\n\n return apps;\n }\n } catch (err) {\n console.log(err);\n }\n}\n\nexport default function useApps() {\n const [apps, setApps] = useState();\n const [fetching, setFetching] = useState(true);\n\n let allApps: any = [];\n\n // if (!msalInstance.getActiveAccount()){\n const accounts = msalInstance.getAllAccounts();\n if (accounts.length > 0) {\n msalInstance.setActiveAccount(accounts[0]);\n }\n //}\n const fetchMyAPI = useCallback(async () => {\n try {\n setFetching(true);\n let newapps = await fetchApps(\n \"https://graph.microsoft.com/v1.0/servicePrincipals?$select=appRoleAssignedTo,info,displayName,loginURL,id,notes,tags&$filter=tags/any(t:t eq 'WindowsAzureActiveDirectoryCustomSingleSignOnApplication')&$expand=appRoleAssignedTo\",\n );\n //newappps = await newappps.json()\n\n let nextLink = newapps['@odata.nextLink'];\n\n newapps.value.forEach((element: any) => {\n allApps.push(element);\n });\n while (nextLink) {\n let resp = await fetchApps(nextLink);\n //console.log('NL',nextLink);\n nextLink = resp['@odata.nextLink'];\n let newApps = resp.value;\n newApps.forEach((element: any) => {\n allApps.push(element);\n });\n }\n //console.log(allApps);\n\n let visibleApps = allApps.filter((app: any) => {\n return app.tags?.indexOf('HideApp') < 0;\n });\n\n /**\n * Split the apps into chunks to performing batch checks.\n */\n\n let chunkedApps = chunk(visibleApps, 20);\n let validApps: any = [];\n\n for (let chunkArray of chunkedApps) {\n //_Debug('Chunk app role assignment',chunkArray);\n let batchCheck = await batchInAppRoleAssignments(chunkArray);\n\n batchCheck.forEach((element: any) => {\n validApps.push(element.id);\n });\n }\n\n let usersApps = visibleApps.filter((visa: any) => {\n return validApps.indexOf(visa.id) > -1;\n });\n\n let userBlockedApps = await _appsBlocked(usersApps);\n //console.log({userBlockedApps});\n\n let filtered = usersApps.filter((ua: any) => {\n return !userBlockedApps.some((uba: any) => {\n return uba === ua.id;\n });\n });\n\n filtered.sort((a: any, b: any) => {\n if (a.displayName.toUpperCase() < b.displayName.toUpperCase()) {\n return -1;\n }\n if (a.displayName.toUpperCase() > b.displayName.toUpperCase()) {\n return 1;\n }\n return 0;\n });\n\n //console.log('Chunked Apps',chunkedApps);\n //console.log({filtered});\n //console.log('userApps',usersApps);\n setApps(filtered);\n setFetching(false);\n } catch (err) {\n console.log(err);\n }\n }, []);\n\n useEffect(() => {\n fetchMyAPI();\n }, [fetchMyAPI]);\n\n //console.log('useApps',apps)\n\n return [apps, fetching];\n}\n\n/**\n * Split a longer array into an array of arrays of certain length\n * @param arr Array of to split into chunks\n * @param len Number of items per array chunk\n * @returns An Array of arrays.\n */\n\nfunction chunk(arr: any, len: number) {\n var chunks = [],\n i = 0,\n n = arr.length;\n\n while (i < n) {\n chunks.push(arr.slice(i, (i += len)));\n }\n\n return chunks;\n}\n\n/**\n * Checks the App role assignments of the applications against the users appRoleAssignments.\n * @param apps Array of applications to check App Role Assignments against.\n * @returns\n */\nexport async function batchInAppRoleAssignments(apps: any) {\n let $batch = { requests: [] };\n\n apps.forEach((app: any) => {\n $batch.requests.push({\n url: '/me/appRoleAssignments?$filter=resourceId eq ' + app.id,\n method: 'GET',\n id: app.id,\n });\n });\n\n //console.log($batch);\n // _Debug('Performing Batch request to check user has appRoleAssignment match ',$batch);\n //console.log( JSON.stringify($batch))\n\n try {\n let result = await msalInstance.acquireTokenSilent({\n scopes: ['User.Read', 'Directory.AccessAsUser.All'],\n });\n\n if (result.accessToken) {\n var headers = new Headers();\n var bearer = 'Bearer ' + result.accessToken;\n headers.append('Authorization', bearer);\n headers.append('Content-Type', 'application/json');\n var options = {\n method: 'POST',\n headers: headers,\n\n body: JSON.stringify($batch),\n };\n\n let results = await fetch('https://graph.microsoft.com/v1.0/$batch', options);\n let apps: any = await results.json();\n\n //let nextLink = apps['@odata.nextLink'];\n //console.log('nl',nextLink);\n //console.log('results apps',apps);\n //console.log('Batched Apps',results.json());\n\n let filteredApps = apps.responses.filter((r: any) => {\n return r.body.value.length > 0;\n });\n //console.log('Filtered Apps in Batch',filteredApps);\n return filteredApps;\n // return apps;\n }\n } catch (err) {\n console.log(err);\n }\n\n /* return graphClient\n .api('/$batch')\n .version(\"v1.0\")\n .post($batch)\n .then((res:any) =>{\n if(res){\n \n \n return res.responses.filter((r:any)=>{return r.body.value.length > 0;});\n //return res.responses.some((r)=>{return r.status == 200;});\n \n }\n });*/\n}\n\nexport async function _appsBlocked(apps: any) {\n //let $batch = {requests:[]};\n let appsWithBlocks: any[] = [];\n apps.forEach((app: any) => {\n try {\n let notesJSON = JSON.parse(app.notes);\n if (notesJSON !== null && notesJSON['BlockedGroups'] !== undefined) {\n // _Debug('Checking user against blocked groups for app \"'+app.displayName+'\"');\n // return await _userInGroup(graphClient,notesJSON[\"BlockedGroups\"]);\n let blockedGroups = notesJSON['BlockedGroups'];\n //console.log(blockedGroups);\n blockedGroups.forEach((bg: any, i: any) => {\n let res = { app_id: app.id + '#' + i, blockedGroup: bg };\n appsWithBlocks.push(res);\n });\n }\n } catch (err) {\n return false;\n }\n });\n\n //console.log('appsWithBlocks',appsWithBlocks);\n\n let chunkedBlockedApps = chunk(appsWithBlocks, 20);\n //console.log(chunkedBlockedApps);\n let userBlockedApps: any = [];\n for (let chunkArray of chunkedBlockedApps) {\n //_Debug('Chunk app role assignment',chunkArray);\n let batchCheck = await batchInBlockedApps(chunkArray);\n batchCheck.forEach((element: any) => {\n let app_id = element.id.substring(0, 36);\n userBlockedApps.push(app_id);\n });\n }\n\n //console.log(\"userBlockedApps\",userBlockedApps);\n\n return userBlockedApps;\n}\n\nexport async function batchInBlockedApps(groups: any) {\n let $batch = { requests: [] };\n\n groups.forEach((app: any) => {\n $batch.requests.push({\n url: '/me/memberOf/' + app.blockedGroup,\n method: 'GET',\n id: app.app_id,\n });\n });\n\n //_Debug('Performing Batch request to check user is in blocked group ',$batch);\n\n try {\n let result = await msalInstance.acquireTokenSilent({ scopes: ['User.Read'] });\n\n if (result.accessToken) {\n var headers = new Headers();\n var bearer = 'Bearer ' + result.accessToken;\n headers.append('Authorization', bearer);\n headers.append('Content-Type', 'application/json');\n var options = {\n method: 'POST',\n headers: headers,\n\n body: JSON.stringify($batch),\n };\n\n let results = await fetch('https://graph.microsoft.com/v1.0/$batch', options);\n let apps: any = await results.json();\n\n let filteredApps = apps.responses.filter((r: any) => {\n return r.status === 200;\n });\n //console.log('Filtered Apps in Batch',filteredApps);\n return filteredApps;\n // return apps;\n }\n } catch (err) {\n console.log(err);\n }\n\n /* return graphClient\n .api('/$batch')\n .version(\"v1.0\")\n .post($batch)\n .then((res:any) =>{\n if(res){\n \n return res.responses.filter((r)=>{return r.status == 200;});\n \n }\n });*/\n}\n","/**\n *\n * @param key the name of the parameter\n * @param value the value of parameter required to return true\n * @returns boolean value\n */\nexport const _URLParamExists = (key: string, value: string) => {\n return new URLSearchParams(window.location.search).get(key) === value;\n};\n\n/**\n * Used to display console logs only if the url contains the '?debugPortal=true' parameter.\n */\nexport const _Debug = (...args: any[]) => {\n //const _debug = new URLSearchParams(window.location.search).get('debugPortal') == \"true\";\n\n const _debug = _URLParamExists('debugPortal', 'true');\n if (_debug) {\n let cb = args.slice(args.length - 1, args.length);\n if (typeof cb[0] === 'function') {\n let arr = args.slice(0, args.length - 1);\n console.log(...arr);\n cb[0].call();\n } else {\n console.log(...args);\n }\n }\n //if(_debug){\n // console.log(...args);\n //}\n};\n\nexport default _Debug;\n","import { useState, useEffect } from 'react';\nimport { msalInstance } from '..';\nimport _Debug from '../Helper/Debug';\n\nexport async function hasOneDriveAccess() {\n let result = await msalInstance.acquireTokenSilent({\n scopes: ['User.Read', 'Files.ReadWrite'],\n });\n\n if (result.accessToken) {\n var headers = new Headers();\n var bearer = 'Bearer ' + result.accessToken;\n headers.append('Authorization', bearer);\n\n var options = {\n method: 'GET',\n headers: headers,\n };\n\n try {\n let results: any = await fetch('https://graph.microsoft.com/v1.0/me/drive/', options);\n // console.log(results, results.status);\n\n if (results.status !== 403) {\n _Debug('%cUser has One Drive Access.', 'color:green;');\n\n return true;\n } else {\n _Debug(\n '%cUser does NOT have One Drive Access.',\n 'color:red;font-size:16px;font-weight:bolder;',\n );\n return false;\n }\n } catch (err: any) {\n _Debug(\n '%cUser does NOT have One Drive Access.',\n 'color:red;font-size:16px;font-weight:bolder;',\n );\n _Debug(err);\n\n if (err['statusCode'] === 403) {\n _Debug(\n '%cUser does not have a valid License that provides access to One Drive.',\n 'color:red;',\n );\n return false;\n } else {\n return false;\n }\n }\n }\n}\n\nexport async function fetchOneDrive(fileName: string, filePath?: string) {\n try {\n let result = await msalInstance.acquireTokenSilent({\n scopes: ['User.Read', 'Files.ReadWrite'],\n });\n\n if (result.accessToken) {\n var headers = new Headers();\n var bearer = 'Bearer ' + result.accessToken;\n headers.append('Authorization', bearer);\n\n var options = {\n method: 'GET',\n headers: headers,\n };\n\n const newFilePath = filePath || 'https://graph.microsoft.com/v1.0/me/drive/special/approot:/';\n\n const graphEndpoint: string = newFilePath + fileName;\n let results: any = await fetch(graphEndpoint, options);\n\n let odFile = await results.json();\n\n return odFile;\n }\n } catch (err) {\n console.log('Fetch one Drive Error', err);\n return new Error();\n }\n}\n\nexport async function saveOneDrive(content: any, fileName?: string) {\n try {\n let result = await msalInstance.acquireTokenSilent({\n scopes: ['User.Read', 'Files.ReadWrite'],\n });\n\n if (result.accessToken) {\n var headers = new Headers();\n var bearer = 'Bearer ' + result.accessToken;\n headers.append('Authorization', bearer);\n\n var options: any = {\n method: 'PUT',\n headers: headers,\n body: JSON.stringify(content),\n };\n\n const newFileName = fileName || 'CDUPortalApps.json';\n //console.log(newFileName,options.body);\n\n const response = await fetch(\n `https://graph.microsoft.com/v1.0/me/drive/special/approot:/${newFileName}:/content`,\n options,\n );\n }\n } catch (err) {}\n}\n\nexport default function useOneDrive() {\n const [hasAccess, setHasAccess] = useState(false);\n const [fileExists, setExists] = useState(false);\n const [backupFileExists, setBackupExists] = useState(false);\n const [oldFile, setOldFile] = useState();\n const [backupFile, setBackupFile] = useState();\n const [oldFileExists, setOldExists] = useState(false);\n const [odFile, setFile] = useState();\n const [loading, setLoading] = useState(false);\n\n useEffect(() => {\n async function getBackup() {\n try {\n let fetchedBackupFile = await fetchOneDrive('CDUPortalAppsBackup.json');\n let dLoadLink = fetchedBackupFile['@microsoft.graph.downloadUrl'];\n let fileData = await fetch(dLoadLink);\n let data = await fileData.json();\n\n setBackupFile(data);\n setBackupExists(true);\n } catch (err: any) {\n if (err instanceof SyntaxError) {\n _Debug('%cUser Backup file corrupted or wrong format.', 'color:red;');\n }\n if (err.code == 'itemNotFound') {\n //console.error(\"No File Found\");\n _Debug('%cUser Backup file does not exist.', 'color:red;');\n }\n\n setBackupFile(odFile);\n saveOneDrive(odFile, 'CDUPortalAppsBackup.json');\n setBackupExists(true);\n }\n }\n\n if (!backupFileExists) {\n getBackup();\n }\n }, [fileExists, backupFileExists]);\n\n useEffect(() => {\n /*async function setBackUp(){\n if(!backupFileExists){\n setBackupFile(odFile);\n saveOneDrive(odFile,'CDUPortalAppsBackup.json');\n }\n }*/\n\n async function getData() {\n setLoading(true);\n /**\n * Check if the user has access to one drive.\n */\n let hasODAccess = await hasOneDriveAccess();\n setHasAccess(hasODAccess);\n\n if (hasODAccess) {\n let fetchedFileOK = false;\n\n try {\n let file = await fetchOneDrive('CDUPortalApps.json');\n\n let dLoadLink = file['@microsoft.graph.downloadUrl'];\n let fileData = await fetch(dLoadLink);\n let data = await fileData.json();\n //console.log(\"Data\",data);\n setFile(data);\n setExists(true);\n setLoading(false);\n fetchedFileOK = true;\n } catch (err) {\n if (err instanceof SyntaxError) {\n _Debug('%cCorrupted CDUPortalAppsFile ', 'color:red', err);\n }\n fetchedFileOK = false;\n }\n\n if (!fetchedFileOK) {\n try {\n const filePath: string =\n 'https://graph.microsoft.com/v1.0/me/drive/root:/Apps/SharePoint Online Client Extensibility Web Application Principal/';\n\n const fileName: string = 'CDUMyApps.json';\n\n let file = await fetchOneDrive(fileName, filePath);\n let dLoadLink = file['@microsoft.graph.downloadUrl'];\n\n let fileData = await fetch(dLoadLink);\n let data = await fileData.json();\n\n setOldFile(data);\n setOldExists(true);\n } catch (oldFileerr: any) {\n console.log(oldFileerr.code);\n console.log('No Old File exist at all!', oldFileerr);\n if (oldFileerr instanceof SyntaxError) {\n //_Debug('%cThe ')\n }\n setExists(false);\n setLoading(false);\n }\n }\n } else {\n console.log('User Cannot access One Drive');\n }\n }\n\n if (!fileExists) {\n getData();\n }\n\n return () => {};\n }, [fileExists]);\n\n useEffect(() => {\n if (oldFile) {\n saveOneDrive(oldFile, 'CDUPortalApps.json');\n setFile(oldFile);\n setExists(true);\n setLoading(false);\n }\n\n return () => {};\n }, [oldFile]);\n\n return [odFile, fileExists, loading, backupFile, hasAccess];\n}\n","export default __webpack_public_path__ + \"static/media/logo.e9c6276b.png\";","import {\n Persona,\n PersonaSize,\n IPersonaStyles,\n HoverCard,\n HoverCardType,\n IPlainCardProps,\n IHoverCard,\n PrimaryButton,\n DefaultButton,\n Dialog,\n DialogFooter,\n DialogType,\n Callout,\n} from '@fluentui/react';\nimport React, { useState, useEffect, useRef } from 'react';\n\nimport { msalInstance } from '..';\nimport _Debug from '../Helper/Debug';\nimport './UserProfile.css';\n\n//const personaStyles: Partial = { primaryText:{color:'white'}};\n\nexport default function UserPofile() {\n const [userDetails, setUserDetails] = useState();\n const [calloutVisible, setCalloutVisible] = useState(false);\n const [confirmLogout, setConfirmLogout] = useState(false);\n //const user = msalInstance.getActiveAccount();\n\n //const [cardVisible, setCardVisible] = useState(false);\n\n const hoverCard = useRef(null);\n\n async function fetchUserInfo() {\n let result = await msalInstance.acquireTokenSilent({\n scopes: ['User.Read', 'Directory.AccessAsUser.All'],\n });\n\n if (result.accessToken) {\n var headers = new Headers();\n var bearer = 'Bearer ' + result.accessToken;\n headers.append('Authorization', bearer);\n\n var options = {\n method: 'GET',\n headers: headers,\n };\n\n const userGraph = await fetch(\n 'https://graph.microsoft.com/v1.0/me?$select=displayName,givenName,surname,userPrincipalName,mail,mobilePhone,id,businessPhone,companyName,department',\n options,\n );\n const userFetchedDetails = await userGraph.json();\n\n const photo = await fetch('https://graph.microsoft.com/v1.0/me/photo/$value', options);\n const pBlob = await photo.blob();\n\n const photoUrl = window.URL || window.webkitURL;\n const photoBlobUrl = photoUrl.createObjectURL(pBlob);\n\n const userInfo = {\n displayName: userFetchedDetails?.displayName,\n givenName: userFetchedDetails?.givenName,\n surname: userFetchedDetails?.surname,\n userPrincipalName: userFetchedDetails?.userPrincipalName,\n initials:\n (userFetchedDetails?.givenName ? userFetchedDetails?.givenName?.substring(0, 1) : '') +\n (userFetchedDetails?.surname ? userFetchedDetails?.surname?.substring(0, 1) : ''),\n mail: userFetchedDetails?.mail,\n mobilePhone: userFetchedDetails?.mobilePhone,\n id: userFetchedDetails?.id,\n businessPhones: userFetchedDetails?.businessPhones,\n photo: photoBlobUrl,\n companyName: userFetchedDetails?.companyName || '',\n department: userFetchedDetails?.department || '',\n };\n\n _Debug('Users Profile Details ', userInfo);\n\n setUserDetails(userInfo);\n }\n }\n\n useEffect(() => {\n fetchUserInfo();\n }, []);\n\n const onRenderPlainCard = () => {\n return (\n
\n
\n
{userDetails?.companyName || userDetails?.department}
\n {\n setConfirmLogout(true);\n //msalInstance.logoutRedirect()\n }}\n >\n Sign Out\n \n\n
\n
\n {\n return (\n
\n {userDetails?.userPrincipalName}\n
\n \n View Account\n \n \n My Office Profile\n \n
\n );\n }}\n showInitialsUntilImageLoads\n imageUrl={userDetails?.photo}\n hidePersonaDetails={false}\n />\n
\n
\n
\n );\n };\n\n const plainCardProps: IPlainCardProps = {\n onRenderPlainCard: onRenderPlainCard,\n };\n\n return (\n
\n {calloutVisible && (\n {\n setCalloutVisible(false);\n }}\n isBeakVisible={false}\n >\n {onRenderPlainCard()}\n \n )}\n\n {false && (\n \n )}\n {\n return (\n {\n msalInstance.logoutRedirect();\n }}\n >\n Sign Out\n
\n );\n }}\n showInitialsUntilImageLoads\n imageUrl={userDetails?.photo}\n hidePersonaDetails={true}\n onClick={() => {\n setCalloutVisible(true);\n //console.log(\"Open Proifile\");\n }}\n />\n \n );\n}\n","import React from 'react';\n\nimport logo from '../Images/logo.png';\nimport UserPofile from './UserProfile';\n\nexport default function Header() {\n return (\n <>\n
\n \"CDU\n CDU Portal\n \n
\n \n );\n}\n","import React, { useState, useEffect, useRef } from 'react';\nimport { msalInstance } from '..';\nimport _Debug from '../Helper/Debug';\n\n/**\n * This hook component is used to verify whether a student or non-student by email\n */\nexport default function useUserRole() {\n const [userRole, setUserRole] = useState();\n const [userPrincipalName, setUserPrincipalName] = useState();\n\n async function fetchUserInfo() {\n let result = await msalInstance.acquireTokenSilent({\n scopes: ['User.Read', 'Directory.AccessAsUser.All'],\n });\n\n if (result.accessToken) {\n var headers = new Headers();\n var bearer = 'Bearer ' + result.accessToken;\n headers.append('Authorization', bearer);\n\n var options = {\n method: 'GET',\n headers: headers,\n };\n\n const userGraph = await fetch(\n 'https://graph.microsoft.com/v1.0/me?$select=userPrincipalName',\n options,\n );\n const userFetchedDetails = await userGraph.json();\n // check if userPrincipalName contains cdu student domain name\n const currentUserRole = (userFetchedDetails?.userPrincipalName).includes(\n 'students.cdu.edu.au',\n )\n ? 'students'\n : 'non-students';\n // set student role name\n setUserRole(currentUserRole);\n setUserPrincipalName(userFetchedDetails?.userPrincipalName);\n }\n }\n\n useEffect(() => {\n fetchUserInfo();\n }, []);\n\n _Debug('User role', userRole, userPrincipalName);\n\n return [userRole, userPrincipalName];\n}\n","import { msalInstance } from '..';\n\nexport default async function saveToOneDrive(fileName: string, content: any) {\n try {\n let result = await msalInstance.acquireTokenSilent({\n scopes: ['User.Read', 'Files.ReadWrite'],\n });\n\n if (result.accessToken) {\n var headers = new Headers();\n var bearer = 'Bearer ' + result.accessToken;\n headers.append('Authorization', bearer);\n\n var options: any = {\n method: 'PUT',\n headers: headers,\n body: JSON.stringify(content),\n };\n const newFileName = fileName || 'CDUPortalApps.json';\n //console.log(newFileName,content)\n const response = await fetch(\n `https://graph.microsoft.com/v1.0/me/drive/special/approot:/${newFileName}:/content`,\n options,\n );\n\n //console.log('post response',response);\n }\n } catch (err) {\n console.log('Saving Error ', err);\n }\n}\n","import React from 'react';\n\nimport { IApp } from '../Interfaces/IApp';\n\n/**\n *Returns an array of applications that are new the the user since it last checked.\n */\n\nfunction findWithAttr(array: any[], attr: any, value: any) {\n for (var i = 0; i < array.length; i += 1) {\n if (array[i][attr] === value) {\n return i;\n }\n }\n return -1;\n}\n\nexport default function checkForAppChanges(userApps: IApp[], serverApps: any[]): [boolean, IApp[]] {\n let updatedApps: IApp[] = userApps;\n\n let appsChanged: boolean = false;\n\n //console.log({userApps});\n //console.log({serverApps});\n\n function addedApps(): IApp[] {\n let addedApps = serverApps.filter(serverApp => {\n //this.state.apps\n let newArr = userApps.some(app => {\n return app.id === serverApp.id;\n });\n\n return !newArr;\n });\n return addedApps;\n }\n\n function addNewApps() {\n let aApps = addedApps();\n // let apps = this._oneDriveApps;\n //console.log({aApps});\n if (aApps.length > 0)\n //_Debug(\"Adding new apps \",addedApps);\n appsChanged = true;\n aApps.forEach(app => {\n updatedApps.push(app);\n //console.log({updatedApps})\n });\n\n //this._oneDriveApps = apps;\n //this._visibleUserApps = apps;\n //this._saveOneDriveApps();\n //this._saveOneDriveAppsBackup();\n }\n\n /* \n Returns an array of applications that have the user USED to have but no longer appear on Azure.\n */\n function removedApps(): IApp[] {\n let removedApps = userApps.filter(serverApp => {\n let newArr = serverApps.some(app => {\n return app.id === serverApp.id;\n });\n return !newArr;\n });\n return removedApps;\n }\n\n function removeApps() {\n let rApps = removedApps();\n //console.log({rApps});\n if (rApps.length > 0)\n //_Debug(\"Removing apps \",removedApps);\n appsChanged = true;\n rApps.forEach(app => {\n let indToRemove = findWithAttr(userApps, 'id', app.id);\n updatedApps.splice(indToRemove, 1);\n });\n }\n\n /**\n * Check if any of the users apps have had attributes changed.\n * Check\n * 1. Icon\n * 2. Name\n * 3. Link\n * 4. Notes\n */\n function getModifiedApps(): IApp[] {\n let modifiedApps = serverApps.filter(serverApp => {\n let newArr = userApps.some(app => {\n return (\n app.id === serverApp.id &&\n (app.displayName !== serverApp.displayName ||\n app.loginUrl !== serverApp.loginUrl ||\n app.info.logoUrl !== serverApp.info.logoUrl ||\n app.notes !== serverApp.notes)\n );\n }); //this.state.apps\n //_allFetchedApps\n return newArr;\n });\n return modifiedApps;\n }\n\n function updateModifiedApps() {\n let modifiedApps: IApp[] = getModifiedApps();\n modifiedApps.forEach(modApp => {\n //userApps.map((vApp)=>{\n userApps.forEach(vApp => {\n if (vApp.id === modApp.id) {\n vApp.displayName = modApp.displayName;\n vApp.loginUrl = modApp.loginUrl;\n vApp.notes = modApp.notes;\n vApp.info.logoUrl = modApp.info.logoUrl;\n }\n });\n });\n //this._saveOneDriveApps();\n //this._saveOneDriveAppsBackup();\n //this.setState({apps:this._visibleUserApps});\n return modifiedApps;\n }\n\n function checkForUpdates(): boolean {\n let removeApps: IApp[] = removedApps();\n let newApps: IApp[] = addedApps();\n //console.log({newApps},{removeApps});\n return removeApps.length > 0 || newApps.length > 0;\n }\n\n function updateApps() {\n let hasChanged = checkForUpdates();\n //_Debug(\"Apps Changed Status \" + hasChanged);\n if (hasChanged) {\n removeApps();\n //console.log('hasCHanged',hasChanged);\n addNewApps();\n }\n let modifiedApps = getModifiedApps();\n //console.log({modifiedApps});\n if (modifiedApps.length > 0) {\n appsChanged = true;\n //_Debug(\"Updating Applications with changed values.\",modifiedApps);\n updateModifiedApps();\n //console.log('modifiedApps',updatedModifiedApps);\n }\n }\n\n updateApps();\n\n //console.log({updatedApps});\n\n return [appsChanged, updatedApps];\n}\n","import { Dialog, DialogFooter, PrimaryButton, DialogType } from '@fluentui/react';\nimport React, { useEffect, useState } from 'react';\n\nimport { msalInstance } from '..';\nimport _Debug from '../Helper/Debug';\nimport './PasswordExpiry.css';\n\nconst getPasswordExpiry = async () => {\n let result = await msalInstance.acquireTokenSilent({ scopes: ['User.Read'] });\n\n const expireStudent = 180;\n const expireStaff = 90;\n const lessThanDays = 15;\n const staffURL = 'https://sso.cdu.edu.au/dashboard/f?p=1051';\n const studentURL = 'https://sso.cdu.edu.au/dashboard/f?p=1051';\n\n if (result.accessToken) {\n var headers = new Headers();\n var bearer = 'Bearer ' + result.accessToken;\n headers.append('Authorization', bearer);\n\n var options = {\n method: 'GET',\n headers: headers,\n };\n\n const userGraph = await fetch(\n 'https://graph.microsoft.com/v1.0/me?$select=lastPasswordChangeDateTime,displayName,userPrincipalName',\n options,\n );\n const userFetchedDetails = await userGraph.json();\n\n let lastChangeDate = new Date(userFetchedDetails.lastPasswordChangeDateTime);\n let staffDiff = getDiff(expireStaff, lastChangeDate);\n let expiryInfo: IPasswordExpiry = {\n visible: staffDiff < lessThanDays,\n domain: 'staff',\n link: staffURL,\n days: staffDiff,\n };\n\n if (userFetchedDetails.userPrincipalName.indexOf('student') >= 0) {\n let studentDiff = getDiff(expireStudent, lastChangeDate);\n expiryInfo = {\n visible: studentDiff < lessThanDays,\n domain: 'student',\n link: studentURL,\n days: studentDiff,\n };\n }\n\n return expiryInfo;\n }\n};\n\nfunction getDiff(expireDays: number, lastChangeDate: Date) {\n const today = new Date();\n return Math.round(\n expireDays - (today.getTime() - lastChangeDate.getTime()) / (1000 * 60 * 60 * 24),\n );\n}\n\ninterface IPasswordExpiry {\n visible: boolean;\n domain: string;\n link: string;\n days: number;\n}\n\nexport default function PasswordExpiry() {\n const [expiry, setExpiry] = useState();\n const [visible, setVisible] = useState(false);\n\n useEffect(() => {\n getPasswordExpiry().then(res => {\n _Debug('User Password Expiry Information: ', res);\n setExpiry(res);\n });\n }, []);\n\n useEffect(() => {\n setVisible(expiry?.visible || false);\n }, [expiry]);\n\n return (\n <>\n