Figure out user manager for account user
This commit is contained in:
		
							parent
							
								
									3492558e06
								
							
						
					
					
						commit
						95a8e64fbb
					
				
					 16 changed files with 152 additions and 106 deletions
				
			
		|  | @ -88,7 +88,7 @@ const Stats = () => { | |||
|                     </div> | ||||
|                     <LinearProgress variant="determinate" value={account.limits.emails > 0 ? normalize(account.stats.emails, account.limits.emails) : 100} /> | ||||
|                 </Pref> | ||||
|                 <Pref labelId={"attachments"} title={t("Attachment storage")} subtitle={t("5 MB per file")}> | ||||
|                 <Pref labelId={"attachments"} title={t("Attachment storage")} subtitle={t("{{filesize}} per file", { filesize: formatBytes(account.limits.attachment_file_size) })}> | ||||
|                     <div> | ||||
|                         <Typography variant="body2" sx={{float: "left"}}>{formatBytes(account.stats.attachment_total_size)}</Typography> | ||||
|                         <Typography variant="body2" sx={{float: "right"}}>{account.limits.attachment_total_size > 0 ? t("of {{limit}}", { limit: formatBytes(account.limits.attachment_total_size) }) : t("Unlimited")}</Typography> | ||||
|  | @ -153,8 +153,7 @@ const ChangePassword = () => { | |||
|         } catch (e) { | ||||
|             console.log(`[Account] Error changing password`, e); | ||||
|             if ((e instanceof UnauthorizedError)) { | ||||
|                 session.reset(); | ||||
|                 window.location.href = routes.login; | ||||
|                 session.resetAndRedirect(routes.login); | ||||
|             } | ||||
|             // TODO show error
 | ||||
|         } | ||||
|  | @ -238,13 +237,11 @@ const DeleteAccount = () => { | |||
|             setDialogOpen(false); | ||||
|             console.debug(`[Account] Account deleted`); | ||||
|             // TODO delete local storage
 | ||||
|             session.reset(); | ||||
|             window.location.href = routes.app; | ||||
|             session.resetAndRedirect(routes.app); | ||||
|         } catch (e) { | ||||
|             console.log(`[Account] Error deleting account`, e); | ||||
|             if ((e instanceof UnauthorizedError)) { | ||||
|                 session.reset(); | ||||
|                 window.location.href = routes.login; | ||||
|                 session.resetAndRedirect(routes.login); | ||||
|             } | ||||
|             // TODO show error
 | ||||
|         } | ||||
|  |  | |||
|  | @ -124,8 +124,7 @@ const SettingsIcons = (props) => { | |||
|             } catch (e) { | ||||
|                 console.log(`[ActionBar] Error unsubscribing`, e); | ||||
|                 if ((e instanceof UnauthorizedError)) { | ||||
|                     session.reset(); | ||||
|                     window.location.href = routes.login; | ||||
|                     session.resetAndRedirect(routes.login); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|  | @ -272,8 +271,7 @@ const ProfileIcon = (props) => { | |||
|         try { | ||||
|             await accountApi.logout(); | ||||
|         } finally { | ||||
|             session.reset(); | ||||
|             window.location.href = routes.app; | ||||
|             session.resetAndRedirect(routes.app); | ||||
|         } | ||||
|     }; | ||||
|     return ( | ||||
|  |  | |||
|  | @ -123,8 +123,7 @@ const Layout = () => { | |||
|             } catch (e) { | ||||
|                 console.log(`[App] Error fetching account`, e); | ||||
|                 if ((e instanceof UnauthorizedError)) { | ||||
|                     session.reset(); | ||||
|                     window.location.href = routes.login; | ||||
|                     session.resetAndRedirect(routes.login); | ||||
|                 } | ||||
|             } | ||||
|         })(); | ||||
|  |  | |||
|  | @ -270,6 +270,7 @@ const Users = () => { | |||
|                 </Typography> | ||||
|                 <Paragraph> | ||||
|                     {t("prefs_users_description")} | ||||
|                     {session.exists() && <>{" " + t("prefs_users_description_no_sync")}</>} | ||||
|                 </Paragraph> | ||||
|                 {users?.length > 0 && <UserTable users={users}/>} | ||||
|             </CardContent> | ||||
|  | @ -319,52 +320,49 @@ const UserTable = (props) => { | |||
|         } | ||||
|     }; | ||||
|     return ( | ||||
|         <div> | ||||
|             <Table size="small" aria-label={t("prefs_users_table")}> | ||||
|                 <TableHead> | ||||
|                     <TableRow> | ||||
|                         <TableCell sx={{paddingLeft: 0}}>{t("prefs_users_table_user_header")}</TableCell> | ||||
|                         <TableCell>{t("prefs_users_table_base_url_header")}</TableCell> | ||||
|                         <TableCell/> | ||||
|         <Table size="small" aria-label={t("prefs_users_table")}> | ||||
|             <TableHead> | ||||
|                 <TableRow> | ||||
|                     <TableCell sx={{paddingLeft: 0}}>{t("prefs_users_table_user_header")}</TableCell> | ||||
|                     <TableCell>{t("prefs_users_table_base_url_header")}</TableCell> | ||||
|                     <TableCell/> | ||||
|                 </TableRow> | ||||
|             </TableHead> | ||||
|             <TableBody> | ||||
|                 {props.users?.map(user => ( | ||||
|                     <TableRow | ||||
|                         key={user.baseUrl} | ||||
|                         sx={{'&:last-child td, &:last-child th': {border: 0}}} | ||||
|                     > | ||||
|                         <TableCell component="th" scope="row" sx={{paddingLeft: 0}} | ||||
|                                    aria-label={t("prefs_users_table_user_header")}>{user.username}</TableCell> | ||||
|                         <TableCell aria-label={t("prefs_users_table_base_url_header")}>{user.baseUrl}</TableCell> | ||||
|                         <TableCell align="right"> | ||||
|                             {user.baseUrl !== config.baseUrl && | ||||
|                                 <> | ||||
|                                     <IconButton onClick={() => handleEditClick(user)} | ||||
|                                                 aria-label={t("prefs_users_edit_button")}> | ||||
|                                         <EditIcon/> | ||||
|                                     </IconButton> | ||||
|                                     <IconButton onClick={() => handleDeleteClick(user)} | ||||
|                                                 aria-label={t("prefs_users_delete_button")}> | ||||
|                                         <CloseIcon/> | ||||
|                                     </IconButton> | ||||
|                                 </> | ||||
|                             } | ||||
|                         </TableCell> | ||||
|                     </TableRow> | ||||
|                 </TableHead> | ||||
|                 <TableBody> | ||||
|                     {props.users?.map(user => ( | ||||
|                         <TableRow | ||||
|                             key={user.baseUrl} | ||||
|                             sx={{'&:last-child td, &:last-child th': {border: 0}}} | ||||
|                         > | ||||
|                             <TableCell component="th" scope="row" sx={{paddingLeft: 0}} | ||||
|                                        aria-label={t("prefs_users_table_user_header")}>{user.username}</TableCell> | ||||
|                             <TableCell aria-label={t("prefs_users_table_base_url_header")}>{user.baseUrl}</TableCell> | ||||
|                             <TableCell align="right"> | ||||
|                                 <IconButton onClick={() => handleEditClick(user)} | ||||
|                                             aria-label={t("prefs_users_edit_button")}> | ||||
|                                     <EditIcon/> | ||||
|                                 </IconButton> | ||||
|                                 <IconButton onClick={() => handleDeleteClick(user)} | ||||
|                                             aria-label={t("prefs_users_delete_button")}> | ||||
|                                     <CloseIcon/> | ||||
|                                 </IconButton> | ||||
|                             </TableCell> | ||||
|                         </TableRow> | ||||
|                     ))} | ||||
|                 </TableBody> | ||||
|                 <UserDialog | ||||
|                     key={`userEditDialog${dialogKey}`} | ||||
|                     open={dialogOpen} | ||||
|                     user={dialogUser} | ||||
|                     users={props.users} | ||||
|                     onCancel={handleDialogCancel} | ||||
|                     onSubmit={handleDialogSubmit} | ||||
|                 /> | ||||
|             </Table> | ||||
|             {session.exists() && | ||||
|                 <Typography> | ||||
|                     xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | ||||
|                 </Typography> | ||||
|             } | ||||
|         </div> | ||||
|                 ))} | ||||
|             </TableBody> | ||||
|             <UserDialog | ||||
|                 key={`userEditDialog${dialogKey}`} | ||||
|                 open={dialogOpen} | ||||
|                 user={dialogUser} | ||||
|                 users={props.users} | ||||
|                 onCancel={handleDialogCancel} | ||||
|                 onSubmit={handleDialogSubmit} | ||||
|             /> | ||||
|         </Table> | ||||
|     ); | ||||
| }; | ||||
| 
 | ||||
|  |  | |||
|  | @ -17,7 +17,15 @@ import IconButton from "@mui/material/IconButton"; | |||
| import InsertEmoticonIcon from '@mui/icons-material/InsertEmoticon'; | ||||
| import {Close} from "@mui/icons-material"; | ||||
| import MenuItem from "@mui/material/MenuItem"; | ||||
| import {formatBytes, maybeWithBasicAuth, topicShortUrl, topicUrl, validTopic, validUrl} from "../app/utils"; | ||||
| import { | ||||
|     formatBytes, | ||||
|     maybeWithAuth, | ||||
|     withBasicAuth, | ||||
|     topicShortUrl, | ||||
|     topicUrl, | ||||
|     validTopic, | ||||
|     validUrl | ||||
| } from "../app/utils"; | ||||
| import Box from "@mui/material/Box"; | ||||
| import AttachmentIcon from "./AttachmentIcon"; | ||||
| import DialogFooter from "./DialogFooter"; | ||||
|  | @ -132,7 +140,7 @@ const PublishDialog = (props) => { | |||
|         const body = (attachFile) ? attachFile : message; | ||||
|         try { | ||||
|             const user = await userManager.get(baseUrl); | ||||
|             const headers = maybeWithBasicAuth({}, user); | ||||
|             const headers = maybeWithAuth({}, user); | ||||
|             const progressFn = (ev) => { | ||||
|                 if (ev.loaded > 0 && ev.total > 0) { | ||||
|                     setStatus(t("publish_dialog_progress_uploading_detail", { | ||||
|  | @ -180,8 +188,7 @@ const PublishDialog = (props) => { | |||
|         } catch (e) { | ||||
|             console.log(`[PublishDialog] Retrieving attachment limits failed`, e); | ||||
|             if ((e instanceof UnauthorizedError)) { | ||||
|                 session.reset(); | ||||
|                 window.location.href = routes.login; | ||||
|                 session.resetAndRedirect(routes.login); | ||||
|             } else { | ||||
|                 setAttachFileError(""); // Reset error (rely on server-side checking)
 | ||||
|             } | ||||
|  |  | |||
|  | @ -40,8 +40,7 @@ const SubscribeDialog = (props) => { | |||
|             } catch (e) { | ||||
|                 console.log(`[SubscribeDialog] Subscribing to topic ${topic} failed`, e); | ||||
|                 if ((e instanceof UnauthorizedError)) { | ||||
|                     session.reset(); | ||||
|                     window.location.href = routes.login; | ||||
|                     session.resetAndRedirect(routes.login); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|  |  | |||
|  | @ -74,8 +74,7 @@ export const useAutoSubscribe = (subscriptions, selected) => { | |||
|                     } catch (e) { | ||||
|                         console.log(`[App] Auto-subscribing failed`, e); | ||||
|                         if ((e instanceof UnauthorizedError)) { | ||||
|                             session.reset(); | ||||
|                             window.location.href = routes.login; | ||||
|                             session.resetAndRedirect(routes.login); | ||||
|                         } | ||||
|                     } | ||||
|                 } | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue