Skip to content

Commit

Permalink
Add long polling to update unread counts in navbar. (#1271)
Browse files Browse the repository at this point in the history
* Upping version.

* Add long-polling to update unread counts in navbar.

- Fixes #1148

* Using async for polling.

* Update src/shared/utils.ts

Co-authored-by: Sander Saarend <[email protected]>

* Adding window visibility check, removing generic sleep.

---------

Co-authored-by: SleeplessOne1917 <[email protected]>
Co-authored-by: Sander Saarend <[email protected]>
  • Loading branch information
3 people authored Jun 15, 2023
1 parent d75e050 commit 89be27b
Show file tree
Hide file tree
Showing 3 changed files with 47 additions and 28 deletions.
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "lemmy-ui",
"version": "0.18.0-beta.6",
"version": "0.18.0-rc.1",
"description": "An isomorphic UI for lemmy",
"repository": "https://github.com/LemmyNet/lemmy-ui",
"license": "AGPL-3.0",
Expand Down
57 changes: 30 additions & 27 deletions src/shared/components/app/navbar.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,10 @@ import {
isBrowser,
myAuth,
numToSI,
poll,
showAvatars,
toast,
updateUnreadCountsInterval,
} from "../../utils";
import { Icon } from "../common/icon";
import { PictrsImage } from "../common/pictrs-image";
Expand Down Expand Up @@ -64,7 +66,7 @@ export class Navbar extends Component<NavbarProps, NavbarState> {
if (isBrowser()) {
// On the first load, check the unreads
this.requestNotificationPermission();
await this.fetchUnreads();
this.fetchUnreads();
this.requestNotificationPermission();

document.addEventListener("mouseup", this.handleOutsideMenuClick);
Expand Down Expand Up @@ -406,35 +408,36 @@ export class Navbar extends Component<NavbarProps, NavbarState> {
return amAdmin() || moderatesS;
}

async fetchUnreads() {
const auth = myAuth();
if (auth) {
this.setState({ unreadInboxCountRes: { state: "loading" } });
this.setState({
unreadInboxCountRes: await HttpService.client.getUnreadCount({
auth,
}),
});

if (this.moderatesSomething) {
this.setState({ unreadReportCountRes: { state: "loading" } });
this.setState({
unreadReportCountRes: await HttpService.client.getReportCount({
auth,
}),
});
}

if (amAdmin()) {
this.setState({ unreadApplicationCountRes: { state: "loading" } });
this.setState({
unreadApplicationCountRes:
await HttpService.client.getUnreadRegistrationApplicationCount({
fetchUnreads() {
poll(async () => {
if (window.document.visibilityState !== "hidden") {
const auth = myAuth();
if (auth) {
this.setState({
unreadInboxCountRes: await HttpService.client.getUnreadCount({
auth,
}),
});
});

if (this.moderatesSomething) {
this.setState({
unreadReportCountRes: await HttpService.client.getReportCount({
auth,
}),
});
}

if (amAdmin()) {
this.setState({
unreadApplicationCountRes:
await HttpService.client.getUnreadRegistrationApplicationCount({
auth,
}),
});
}
}
}
}
}, updateUnreadCountsInterval);
}

get unreadInboxCount(): number {
Expand Down
16 changes: 16 additions & 0 deletions src/shared/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,7 @@ export const commentTreeMaxDepth = 8;
export const markdownFieldCharacterLimit = 50000;
export const maxUploadImages = 20;
export const concurrentImageUpload = 4;
export const updateUnreadCountsInterval = 30000;

export const relTags = "noopener nofollow";

Expand Down Expand Up @@ -1490,3 +1491,18 @@ export function newVote(voteType: VoteType, myVote?: number): number {
return myVote == -1 ? 0 : -1;
}
}

function sleep(millis: number): Promise<void> {
return new Promise(resolve => setTimeout(resolve, millis));
}

/**
* Polls / repeatedly runs a promise, every X milliseconds
*/
export async function poll(promiseFn: any, millis: number) {
if (window.document.visibilityState !== "hidden") {
await promiseFn();
}
await sleep(millis);
return poll(promiseFn, millis);
}

0 comments on commit 89be27b

Please sign in to comment.