Skip to content

Commit 11b05bc

Browse files
committed
Refactor to move Banner and message store
1 parent 990cb65 commit 11b05bc

File tree

5 files changed

+99
-55
lines changed

5 files changed

+99
-55
lines changed
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
import {
2+
MessageBar,
3+
MessageBarBody,
4+
MessageBarActions,
5+
Button,
6+
MessageBarTitle,
7+
} from "@fluentui/react-components";
8+
import { DismissRegular } from "@fluentui/react-icons";
9+
import { useEffect } from "react";
10+
import { useSnapshot } from "valtio";
11+
12+
import {
13+
clearMessages,
14+
dismissMessage,
15+
Message,
16+
messageStore,
17+
} from "./messageStore";
18+
19+
export function Banner() {
20+
const snap = useSnapshot(messageStore);
21+
22+
useEffect(() => {
23+
return clearMessages();
24+
}, []);
25+
26+
if (!snap.messages.length) {
27+
return null;
28+
}
29+
30+
return snap.messages.map((message) => (
31+
<SingleBanner
32+
key={message.id}
33+
message={message}
34+
onClick={() => dismissMessage(message.id)}
35+
/>
36+
));
37+
}
38+
39+
export function SingleBanner({
40+
message,
41+
onClick,
42+
}: {
43+
message: Omit<Message, "id">;
44+
onClick?: () => void;
45+
}) {
46+
return (
47+
<MessageBar
48+
intent={message.intent}
49+
role={message.intent === "error" ? "alert" : "status"}
50+
>
51+
<MessageBarBody>
52+
<MessageBarTitle>{message.title}</MessageBarTitle>
53+
{message.text}
54+
</MessageBarBody>
55+
<MessageBarActions
56+
containerAction={
57+
<Button
58+
aria-label="dismiss"
59+
appearance="transparent"
60+
icon={<DismissRegular />}
61+
onClick={onClick}
62+
/>
63+
}
64+
/>
65+
</MessageBar>
66+
);
67+
}

urbackupserver/www2/src/features/settings/SettingsUsers/messageStore.ts renamed to urbackupserver/www2/src/components/Banner/messageStore.ts

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,21 @@
11
import { MessageBarIntent } from "@fluentui/react-components";
22
import { proxy } from "valtio";
33

4-
interface Message {
4+
export interface Message {
55
id: string;
6-
intent: MessageBarIntent;
7-
message: string;
6+
text: string;
7+
intent?: MessageBarIntent;
8+
title?: string;
89
}
910

1011
export const messageStore = proxy<{ messages: Message[] }>({
1112
messages: [],
1213
});
1314

14-
export function addMessage(
15-
intent: Message["intent"],
16-
message: Message["message"],
17-
) {
18-
messageStore.messages.push({
15+
export function addMessage(message: Omit<Message, "id">) {
16+
messageStore.messages.unshift({
17+
...message,
1918
id: crypto.randomUUID(),
20-
intent,
21-
message,
2219
});
2320
}
2421

urbackupserver/www2/src/features/settings/SettingsUsers/CreateUser.tsx

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,10 @@ import {
2222
} from "../Fields/validation";
2323
import { DismissRegular } from "@fluentui/react-icons";
2424
import { UserAlreadyExistsError, UserRight } from "../../../api/urbackupserver";
25-
import { addMessage, clearMessages } from "./messageStore";
25+
import {
26+
addMessage,
27+
clearMessages,
28+
} from "../../../components/Banner/messageStore";
2629
import { useUsers, type UserInput } from "./useUsers";
2730

2831
const ADMIN_RIGHTS: UserRight[] = [
@@ -84,14 +87,20 @@ export const CreateUser = () => {
8487

8588
const handleSuccess = () => {
8689
clearMessages();
87-
addMessage("success", `New user successfully added.`);
90+
addMessage({
91+
intent: "success",
92+
text: "New user successfully added.",
93+
});
8894

8995
setOpen(false);
9096
};
9197

9298
const handleFailure = () => {
9399
clearMessages();
94-
addMessage("error", `Failed to create new user.`);
100+
addMessage({
101+
intent: "error",
102+
text: "Failed to create new user.",
103+
});
95104

96105
setOpen(false);
97106
};
Lines changed: 1 addition & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,8 @@
1-
import { useEffect } from "react";
2-
31
import { useSettings } from "../useSettings";
42
import { UsersTable } from "./UsersTable";
53
import { TableWrapper } from "../../../components/TableWrapper";
6-
import {
7-
Button,
8-
MessageBar,
9-
MessageBarActions,
10-
MessageBarBody,
11-
} from "@fluentui/react-components";
124
import { CreateUser } from "./CreateUser";
13-
import { useSnapshot } from "valtio";
14-
import { clearMessages, dismissMessage, messageStore } from "./messageStore";
15-
import { DismissRegular } from "@fluentui/react-icons";
5+
import { Banner } from "../../../components/Banner/Banner";
166

177
export function SettingsUsers() {
188
const { settings } = useSettings();
@@ -36,31 +26,3 @@ export function SettingsUsers() {
3626
</div>
3727
);
3828
}
39-
40-
function Banner() {
41-
const snap = useSnapshot(messageStore);
42-
43-
useEffect(() => {
44-
return clearMessages();
45-
}, []);
46-
47-
if (!snap.messages.length) {
48-
return null;
49-
}
50-
51-
return snap.messages.map((m) => (
52-
<MessageBar key={m.id} intent={m.intent}>
53-
<MessageBarBody>{m.message}</MessageBarBody>
54-
<MessageBarActions
55-
containerAction={
56-
<Button
57-
aria-label="dismiss"
58-
appearance="transparent"
59-
icon={<DismissRegular />}
60-
onClick={() => dismissMessage(m.id)}
61-
/>
62-
}
63-
/>
64-
</MessageBar>
65-
));
66-
}

urbackupserver/www2/src/features/settings/SettingsUsers/UserTableActions.tsx

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,20 +11,29 @@ import {
1111

1212
import { UserListItem } from "../../../api/urbackupserver";
1313
import { useUsers } from "./useUsers";
14-
import { addMessage, clearMessages } from "./messageStore";
14+
import {
15+
addMessage,
16+
clearMessages,
17+
} from "../../../components/Banner/messageStore";
1518
import { useState } from "react";
1619

1720
export function UserTableActions(user: UserListItem) {
1821
const { removeUser, isRemovable } = useUsers();
1922

2023
const handleSuccess = () => {
2124
clearMessages();
22-
addMessage("success", "Successfully removed user.");
25+
addMessage({
26+
intent: "success",
27+
text: "Successfully removed user.",
28+
});
2329
};
2430

2531
const handleFailure = () => {
2632
clearMessages();
27-
addMessage("error", `Failed to remove user.`);
33+
addMessage({
34+
intent: "error",
35+
text: "Failed to remove user.",
36+
});
2837
};
2938

3039
const handleRemove = () => {

0 commit comments

Comments
 (0)