Skip to content

Commit 20d2508

Browse files
authored
Merge pull request #517 from nextcloud/feat/init-later
feat: Initialize cached values later
2 parents a9e621c + e7a4ee6 commit 20d2508

3 files changed

Lines changed: 39 additions & 24 deletions

File tree

lib/requesttoken.ts

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,31 @@
11
import { subscribe } from '@nextcloud/event-bus'
22

3-
const tokenElement = document.getElementsByTagName('head')[0]
4-
let token = tokenElement ? tokenElement.getAttribute('data-requesttoken') : null
5-
63
export interface CsrfTokenObserver {
74
(token: string): void;
85
}
96

7+
let token: string | null | undefined = undefined
108
const observers: CsrfTokenObserver[] = []
119

10+
/**
11+
* Get current request token
12+
*
13+
* @return {string|null} Current request token or null if not set
14+
*/
1215
export function getRequestToken(): string | null {
16+
if (token === undefined) {
17+
// Only on first load, try to get token from document
18+
const tokenElement = document?.getElementsByTagName('head')[0]
19+
token = tokenElement ? tokenElement.getAttribute('data-requesttoken') : null
20+
}
1321
return token
1422
}
1523

24+
/**
25+
* Add an observer which is called when the CSRF token changes
26+
*
27+
* @param observer The observer
28+
*/
1629
export function onRequestTokenUpdate(observer: CsrfTokenObserver): void {
1730
observers.push(observer)
1831
}

lib/user.ts

Lines changed: 22 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,8 @@
11
/// <reference types="@nextcloud/typings" />
22

3-
declare var OC: Nextcloud.v16.OC
4-
| Nextcloud.v17.OC
5-
| Nextcloud.v18.OC
6-
| Nextcloud.v19.OC
7-
| Nextcloud.v20.OC
8-
| Nextcloud.v21.OC
9-
| Nextcloud.v22.OC
10-
| Nextcloud.v20.OC
11-
| Nextcloud.v24.OC;
3+
declare var OC: Nextcloud.v23.OC
4+
| Nextcloud.v24.OC
5+
| Nextcloud.v25.OC;
126

137
const getAttribute = (el: HTMLHeadElement | undefined, attribute: string): string | null => {
148
if (el) {
@@ -18,13 +12,7 @@ const getAttribute = (el: HTMLHeadElement | undefined, attribute: string): strin
1812
return null
1913
}
2014

21-
const head = document.getElementsByTagName('head')[0]
22-
const uid = getAttribute(head, 'data-user')
23-
const displayName = getAttribute(head, 'data-user-displayname')
24-
25-
const isAdmin = (typeof OC === 'undefined')
26-
? false
27-
: OC.isUserAdmin()
15+
let currentUser: NextcloudUser | null | undefined = undefined
2816

2917
export interface NextcloudUser {
3018
uid: string,
@@ -33,13 +21,27 @@ export interface NextcloudUser {
3321
}
3422

3523
export function getCurrentUser(): NextcloudUser | null {
36-
if (uid === null) {
24+
if (currentUser !== undefined) {
25+
return currentUser
26+
}
27+
28+
const head = document?.getElementsByTagName('head')[0]
29+
if (!head) {
3730
return null
3831
}
3932

40-
return {
33+
// No user logged in so cache and return null
34+
const uid = getAttribute(head, 'data-user')
35+
if (uid === null) {
36+
currentUser = null
37+
return currentUser
38+
}
39+
40+
currentUser = {
4141
uid,
42-
displayName,
43-
isAdmin,
42+
displayName: getAttribute(head, 'data-user-displayname'),
43+
isAdmin: (typeof OC === 'undefined') ? false : OC.isUserAdmin(),
4444
} as NextcloudUser
45+
46+
return currentUser
4547
}

test/request-token.test.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ describe('request token', () => {
1212
})
1313

1414
test('updates token via event', () => {
15-
expect(getRequestToken()).toBe(undefined)
15+
expect(getRequestToken()).toBe(null)
1616
})
1717

1818
test('find correct value', () => {

0 commit comments

Comments
 (0)