Skip to content

Commit 42ebe14

Browse files
authored
Merge pull request #795 from nextcloud-libraries/feat/guest-user
2 parents 34caccb + 56c6fa1 commit 42ebe14

File tree

5 files changed

+560
-1280
lines changed

5 files changed

+560
-1280
lines changed

lib/guest.ts

Lines changed: 50 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,20 +3,68 @@
33
* SPDX-License-Identifier: GPL-3.0-or-later
44
*/
55
import { getBuilder } from '@nextcloud/browser-storage'
6+
import { NextcloudUser } from './user'
7+
import { emit } from '@nextcloud/event-bus'
68

79
const browserStorage = getBuilder('public').persist().build()
810

11+
class GuestUser implements NextcloudUser {
12+
13+
private _displayName: string | null
14+
readonly uid: string
15+
readonly isAdmin: boolean
16+
17+
constructor() {
18+
if (!browserStorage.getItem('guestUid')) {
19+
browserStorage.setItem('guestUid', self.crypto.randomUUID())
20+
}
21+
22+
this._displayName = browserStorage.getItem('guestNickname') || ''
23+
this.uid = browserStorage.getItem('guestUid') || self.crypto.randomUUID()
24+
this.isAdmin = false
25+
26+
}
27+
28+
get displayName(): string | null {
29+
return this._displayName
30+
}
31+
32+
set displayName(displayName: string) {
33+
this._displayName = displayName
34+
browserStorage.setItem('guestNickname', displayName)
35+
emit('user:info:changed', this)
36+
}
37+
38+
}
39+
40+
let currentUser: GuestUser | undefined
41+
42+
/**
43+
* Get the currently Guest user or null if not logged in
44+
*/
45+
export function getGuestUser(): GuestUser {
46+
if (!currentUser) {
47+
currentUser = new GuestUser()
48+
}
49+
50+
return currentUser
51+
}
52+
953
/**
1054
* Get the guest nickname for public pages
1155
*/
1256
export function getGuestNickname(): string | null {
13-
return browserStorage.getItem('guestNickname')
57+
return getGuestUser()?.displayName || null
1458
}
1559

1660
/**
1761
* Set the guest nickname for public pages
1862
* @param nickname The nickname to set
1963
*/
2064
export function setGuestNickname(nickname: string): void {
21-
browserStorage.setItem('guestNickname', nickname)
65+
if (!nickname || nickname.trim().length === 0) {
66+
throw new Error('Nickname cannot be empty')
67+
}
68+
69+
getGuestUser().displayName = nickname
2270
}

lib/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,6 @@ export type { CsrfTokenObserver } from './requesttoken'
66
export type { NextcloudUser } from './user'
77

88
export { getCSPNonce } from './csp-nonce'
9-
export { getGuestNickname, setGuestNickname } from './guest'
9+
export { getGuestUser, getGuestNickname, setGuestNickname } from './guest'
1010
export { getRequestToken, onRequestTokenUpdate } from './requesttoken'
1111
export { getCurrentUser } from './user'

0 commit comments

Comments
 (0)