Navigation access icon
parent
2f725bf80d
commit
2500ce0920
|
@ -256,25 +256,25 @@ class AccountApi {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
console.log(`[AccountApi] Syncing account`);
|
console.log(`[AccountApi] Syncing account`);
|
||||||
const remoteAccount = await this.get();
|
const account = await this.get();
|
||||||
if (remoteAccount.language) {
|
if (account.language) {
|
||||||
await i18n.changeLanguage(remoteAccount.language);
|
await i18n.changeLanguage(account.language);
|
||||||
}
|
}
|
||||||
if (remoteAccount.notification) {
|
if (account.notification) {
|
||||||
if (remoteAccount.notification.sound) {
|
if (account.notification.sound) {
|
||||||
await prefs.setSound(remoteAccount.notification.sound);
|
await prefs.setSound(account.notification.sound);
|
||||||
}
|
}
|
||||||
if (remoteAccount.notification.delete_after) {
|
if (account.notification.delete_after) {
|
||||||
await prefs.setDeleteAfter(remoteAccount.notification.delete_after);
|
await prefs.setDeleteAfter(account.notification.delete_after);
|
||||||
}
|
}
|
||||||
if (remoteAccount.notification.min_priority) {
|
if (account.notification.min_priority) {
|
||||||
await prefs.setMinPriority(remoteAccount.notification.min_priority);
|
await prefs.setMinPriority(account.notification.min_priority);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (remoteAccount.subscriptions) {
|
if (account.subscriptions) {
|
||||||
await subscriptionManager.syncFromRemote(remoteAccount.subscriptions);
|
await subscriptionManager.syncFromRemote(account.subscriptions, account.reservations);
|
||||||
}
|
}
|
||||||
return remoteAccount;
|
return account;
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.log(`[AccountApi] Error fetching account`, e);
|
console.log(`[AccountApi] Error fetching account`, e);
|
||||||
if ((e instanceof UnauthorizedError)) {
|
if ((e instanceof UnauthorizedError)) {
|
||||||
|
|
|
@ -35,7 +35,7 @@ class SubscriptionManager {
|
||||||
return subscription;
|
return subscription;
|
||||||
}
|
}
|
||||||
|
|
||||||
async syncFromRemote(remoteSubscriptions) {
|
async syncFromRemote(remoteSubscriptions, remoteReservations) {
|
||||||
console.log(`[SubscriptionManager] Syncing subscriptions from remote`, remoteSubscriptions);
|
console.log(`[SubscriptionManager] Syncing subscriptions from remote`, remoteSubscriptions);
|
||||||
|
|
||||||
// Add remote subscriptions
|
// Add remote subscriptions
|
||||||
|
@ -43,8 +43,10 @@ class SubscriptionManager {
|
||||||
for (let i = 0; i < remoteSubscriptions.length; i++) {
|
for (let i = 0; i < remoteSubscriptions.length; i++) {
|
||||||
const remote = remoteSubscriptions[i];
|
const remote = remoteSubscriptions[i];
|
||||||
const local = await this.add(remote.base_url, remote.topic);
|
const local = await this.add(remote.base_url, remote.topic);
|
||||||
|
const reservation = remoteReservations?.find(r => remote.base_url === config.baseUrl && remote.topic === r.topic) || null;
|
||||||
await this.setRemoteId(local.id, remote.id);
|
await this.setRemoteId(local.id, remote.id);
|
||||||
await this.setDisplayName(local.id, remote.display_name);
|
await this.setDisplayName(local.id, remote.display_name);
|
||||||
|
await this.setReservation(local.id, reservation); // May be null!
|
||||||
remoteIds.push(remote.id);
|
remoteIds.push(remote.id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -174,6 +176,12 @@ class SubscriptionManager {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async setReservation(subscriptionId, reservation) {
|
||||||
|
await db.subscriptions.update(subscriptionId, {
|
||||||
|
reservation: reservation
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
async pruneNotifications(thresholdTimestamp) {
|
async pruneNotifications(thresholdTimestamp) {
|
||||||
await db.notifications
|
await db.notifications
|
||||||
.where("time").below(thresholdTimestamp)
|
.where("time").below(thresholdTimestamp)
|
||||||
|
|
|
@ -12,15 +12,24 @@ import List from "@mui/material/List";
|
||||||
import SettingsIcon from "@mui/icons-material/Settings";
|
import SettingsIcon from "@mui/icons-material/Settings";
|
||||||
import AddIcon from "@mui/icons-material/Add";
|
import AddIcon from "@mui/icons-material/Add";
|
||||||
import SubscribeDialog from "./SubscribeDialog";
|
import SubscribeDialog from "./SubscribeDialog";
|
||||||
import {Alert, AlertTitle, Badge, CircularProgress, Link, ListSubheader} from "@mui/material";
|
import {
|
||||||
|
Alert,
|
||||||
|
AlertTitle,
|
||||||
|
Badge,
|
||||||
|
CircularProgress,
|
||||||
|
Link,
|
||||||
|
ListItem,
|
||||||
|
ListItemSecondaryAction,
|
||||||
|
ListSubheader, Tooltip
|
||||||
|
} from "@mui/material";
|
||||||
import Button from "@mui/material/Button";
|
import Button from "@mui/material/Button";
|
||||||
import Typography from "@mui/material/Typography";
|
import Typography from "@mui/material/Typography";
|
||||||
import {openUrl, topicDisplayName, topicUrl} from "../app/utils";
|
import {openUrl, topicDisplayName, topicUrl} from "../app/utils";
|
||||||
import routes from "./routes";
|
import routes from "./routes";
|
||||||
import {ConnectionState} from "../app/Connection";
|
import {ConnectionState} from "../app/Connection";
|
||||||
import {useLocation, useNavigate} from "react-router-dom";
|
import {useLocation, useNavigate, useOutletContext} from "react-router-dom";
|
||||||
import subscriptionManager from "../app/SubscriptionManager";
|
import subscriptionManager from "../app/SubscriptionManager";
|
||||||
import {ChatBubble, NotificationsOffOutlined, Send} from "@mui/icons-material";
|
import {ChatBubble, Lock, MoreVert, NotificationsOffOutlined, Public, PublicOff, Send} from "@mui/icons-material";
|
||||||
import Box from "@mui/material/Box";
|
import Box from "@mui/material/Box";
|
||||||
import notifier from "../app/Notifier";
|
import notifier from "../app/Notifier";
|
||||||
import config from "../app/config";
|
import config from "../app/config";
|
||||||
|
@ -28,6 +37,8 @@ import ArticleIcon from '@mui/icons-material/Article';
|
||||||
import {Trans, useTranslation} from "react-i18next";
|
import {Trans, useTranslation} from "react-i18next";
|
||||||
import session from "../app/Session";
|
import session from "../app/Session";
|
||||||
import accountApi from "../app/AccountApi";
|
import accountApi from "../app/AccountApi";
|
||||||
|
import IconButton from "@mui/material/IconButton";
|
||||||
|
import CloseIcon from "@mui/icons-material/Close";
|
||||||
|
|
||||||
const navWidth = 280;
|
const navWidth = 280;
|
||||||
|
|
||||||
|
@ -198,9 +209,28 @@ const SubscriptionItem = (props) => {
|
||||||
return (
|
return (
|
||||||
<ListItemButton onClick={handleClick} selected={props.selected} aria-label={ariaLabel} aria-live="polite">
|
<ListItemButton onClick={handleClick} selected={props.selected} aria-label={ariaLabel} aria-live="polite">
|
||||||
<ListItemIcon>{icon}</ListItemIcon>
|
<ListItemIcon>{icon}</ListItemIcon>
|
||||||
<ListItemText primary={displayName}/>
|
<ListItemText primary={displayName} primaryTypographyProps={{ style: { overflow: "hidden", textOverflow: "ellipsis" } }}/>
|
||||||
|
{subscription.reservation?.everyone &&
|
||||||
|
<ListItemIcon edge="end" sx={{ minWidth: "26px" }}>
|
||||||
|
{subscription.reservation?.everyone === "read-write" &&
|
||||||
|
<Tooltip title={t("prefs_reservations_table_everyone_read_write")}><Public fontSize="small"/></Tooltip>
|
||||||
|
}
|
||||||
|
{subscription.reservation?.everyone === "read-only" &&
|
||||||
|
<Tooltip title={t("prefs_reservations_table_everyone_read_only")}><PublicOff fontSize="small"/></Tooltip>
|
||||||
|
}
|
||||||
|
{subscription.reservation?.everyone === "write-only" &&
|
||||||
|
<Tooltip title={t("prefs_reservations_table_everyone_write_only")}><PublicOff fontSize="small"/></Tooltip>
|
||||||
|
}
|
||||||
|
{subscription.reservation?.everyone === "deny-all" &&
|
||||||
|
<Tooltip title={t("prefs_reservations_table_everyone_deny_all")}><Lock fontSize="small"/></Tooltip>
|
||||||
|
}
|
||||||
|
</ListItemIcon>
|
||||||
|
}
|
||||||
{subscription.mutedUntil > 0 &&
|
{subscription.mutedUntil > 0 &&
|
||||||
<ListItemIcon edge="end" aria-label={t("nav_button_muted")}><NotificationsOffOutlined /></ListItemIcon>}
|
<ListItemIcon edge="end" sx={{ minWidth: "26px" }} aria-label={t("nav_button_muted")}>
|
||||||
|
<Tooltip title={t("nav_button_muted")}><NotificationsOffOutlined /></Tooltip>
|
||||||
|
</ListItemIcon>
|
||||||
|
}
|
||||||
</ListItemButton>
|
</ListItemButton>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue