merge: branch 'quark/permissions'

This commit is contained in:
Paul Makles
2022-04-29 13:48:38 +01:00
117 changed files with 10609 additions and 6253 deletions

View File

@@ -94,6 +94,7 @@ export function grabFiles(
input.addEventListener("change", async (e) => {
const files = (e.currentTarget as HTMLInputElement)?.files;
if (!files) return;
for (const file of files) {
if (file.size > maxFileSize) {
return tooLarge();
@@ -184,6 +185,7 @@ export function FileUploader(props: Props) {
id: "error",
error: "FileTooLarge",
});
continue;
}
files.push(blob);
@@ -212,6 +214,7 @@ export function FileUploader(props: Props) {
for (const item of dropped) {
if (item.size > props.maxFileSize) {
openScreen({ id: "error", error: "FileTooLarge" });
continue;
}
files.push(item);

View File

@@ -1,7 +1,5 @@
import { Route, Switch, useHistory, useParams } from "react-router-dom";
import { Presence, RelationshipStatus } from "revolt-api/types/Users";
import { Message } from "revolt.js/dist/maps/Messages";
import { User } from "revolt.js/dist/maps/Users";
import { Message, User } from "revolt.js";
import { decodeTime } from "ulid";
import { useCallback, useContext, useEffect } from "preact/hooks";
@@ -84,7 +82,7 @@ function Notifier() {
}
let body, icon;
if (typeof msg.content === "string") {
if (msg.content) {
body = client.markdownToText(msg.content);
if (msg.masquerade?.avatar) {
@@ -92,22 +90,23 @@ function Notifier() {
} else {
icon = msg.author?.generateAvatarURL({ max_side: 256 });
}
} else {
} else if (msg.system) {
const users = client.users;
switch (msg.content.type) {
switch (msg.system.type) {
case "user_added":
case "user_remove":
{
const user = users.get(msg.content.id);
const user = users.get(msg.system.id);
body = translate(
`app.main.channel.system.${
msg.content.type === "user_added"
msg.system.type === "user_added"
? "added_by"
: "removed_by"
}`,
{
user: user?.username,
other_user: users.get(msg.content.by)
other_user: users.get(msg.system.by)
?.username,
},
);
@@ -121,9 +120,9 @@ function Notifier() {
case "user_kicked":
case "user_banned":
{
const user = users.get(msg.content.id);
const user = users.get(msg.system.id);
body = translate(
`app.main.channel.system.${msg.content.type}`,
`app.main.channel.system.${msg.system.type}`,
{ user: user?.username },
);
icon = user?.generateAvatarURL({
@@ -133,12 +132,12 @@ function Notifier() {
break;
case "channel_renamed":
{
const user = users.get(msg.content.by);
const user = users.get(msg.system.by);
body = translate(
`app.main.channel.system.channel_renamed`,
{
user: users.get(msg.content.by)?.username,
name: msg.content.name,
user: users.get(msg.system.by)?.username,
name: msg.system.name,
},
);
icon = user?.generateAvatarURL({
@@ -149,10 +148,10 @@ function Notifier() {
case "channel_description_changed":
case "channel_icon_changed":
{
const user = users.get(msg.content.by);
const user = users.get(msg.system.by);
body = translate(
`app.main.channel.system.${msg.content.type}`,
{ user: users.get(msg.content.by)?.username },
`app.main.channel.system.${msg.system.type}`,
{ user: users.get(msg.system.by)?.username },
);
icon = user?.generateAvatarURL({
max_side: 256,
@@ -210,17 +209,17 @@ function Notifier() {
const relationship = useCallback(
async (user: User) => {
if (client.user?.status?.presence === Presence.Busy) return;
if (client.user?.status?.presence === "Busy") return;
if (!showNotification) return;
let event;
switch (user.relationship) {
case RelationshipStatus.Incoming:
case "Incoming":
event = translate("notifications.sent_request", {
person: user.username,
});
break;
case RelationshipStatus.Friend:
case "Friend":
event = translate("notifications.now_friends", {
person: user.username,
});

View File

@@ -50,7 +50,7 @@ export default observer(({ children }: Props) => {
useEffect(() => {
if (navigator.onLine) {
state.config.createClient().req("GET", "/").then(state.config.set);
state.config.createClient().api.get("/").then(state.config.set);
}
}, []);
@@ -79,7 +79,7 @@ export default observer(({ children }: Props) => {
}
}, [state.auth.getSession()]);
useEffect(() => registerEvents(state.auth, setStatus, client), [client]);
useEffect(() => registerEvents(state, setStatus, client), [client]);
if (!loaded || status === ClientStatus.LOADING) {
return <Preloader type="spinner" />;

View File

@@ -1,7 +1,7 @@
/**
* This file monitors the message cache to delete any queued messages that have already sent.
*/
import { Message } from "revolt.js/dist/maps/Messages";
import { Message } from "revolt.js";
import { useContext, useEffect } from "preact/hooks";

View File

@@ -1,7 +1,7 @@
/**
* This file monitors changes to settings and syncs them to the server.
*/
import { ClientboundNotification } from "revolt.js/dist/websocket/notifications";
import { ClientboundNotification } from "revolt.js";
import { useEffect } from "preact/hooks";

View File

@@ -1,14 +1,16 @@
import { Client } from "revolt.js/dist";
import { Client, Server } from "revolt.js";
import { StateUpdater } from "preact/hooks";
import Auth from "../../mobx/stores/Auth";
import { deleteRenderer } from "../../lib/renderer/Singleton";
import State from "../../mobx/State";
import { resetMemberSidebarFetched } from "../../components/navigation/right/MemberSidebar";
import { ClientStatus } from "./RevoltClient";
export function registerEvents(
auth: Auth,
state: State,
setStatus: StateUpdater<ClientStatus>,
client: Client,
) {
@@ -25,9 +27,22 @@ export function registerEvents(
},
logout: () => {
auth.logout();
state.auth.logout();
state.reset();
setStatus(ClientStatus.READY);
},
"channel/delete": (channel_id: string) => {
deleteRenderer(channel_id);
},
"server/delete": (_, server: Server) => {
if (server) {
for (const channel_id of server.channel_ids) {
deleteRenderer(channel_id);
}
}
},
};
if (import.meta.env.DEV) {

View File

@@ -1,4 +1,4 @@
import { Channel } from "revolt.js/dist/maps/Channels";
import { Channel } from "revolt.js";
import { Text } from "preact-i18n";
@@ -6,23 +6,23 @@ import { Children } from "../../types/Preact";
// eslint-disable-next-line @typescript-eslint/no-explicit-any
export function takeError(error: any): string {
const type = error?.response?.data?.type;
const id = type;
if (!type) {
if (
error?.response?.status === 401 ||
error?.response?.status === 403
) {
return "Unauthorized";
} else if (error && !!error.isAxiosError && !error.response) {
return "NetworkError";
if (error.response) {
const status = error.response.status;
switch (status) {
case 429:
return "TooManyRequests";
case 401:
case 403:
return "Unauthorized";
default:
return error.response.type ?? "UnknownError";
}
console.error(error);
return "UnknownError";
} else if (error.request) {
return "NetworkError";
}
return id;
console.error(error);
return "UnknownError";
}
export function getChannelName(