invites: add /invites/send, store more details in new SentTo field

deprecated SendTo string field for SentTo, which holds successful send
addresses, and failures with a reason that isn't plain text. Will soon
add an interface for sending invites after their creation. For #444
(ha).
This commit is contained in:
Harvey Tindall
2025-12-05 12:03:21 +00:00
parent 3635a13682
commit 5fa528fd2d
19 changed files with 327 additions and 144 deletions
+38 -26
View File
@@ -48,7 +48,7 @@ declare interface GlobalWindow extends Window {
transitionEvent: string;
animationEvent: string;
tabs: Tabs;
invites: inviteList;
invites: InviteList;
notifications: NotificationBox;
language: string;
lang: Lang;
@@ -61,6 +61,42 @@ declare interface GlobalWindow extends Window {
loginAppearance: string;
}
declare interface InviteList {
empty: boolean;
invites: { [code: string]: Invite }
add: (invite: Invite) => void;
reload: (callback?: () => void) => void;
isInviteURL: () => boolean;
loadInviteURL: () => void;
}
declare interface Invite {
code?: string;
expiresIn?: string;
remainingUses?: string;
send_to?: string; // DEPRECATED: use sent_to instead.
sent_to?: SentToList;
usedBy?: { [name: string]: number };
created?: number;
notifyExpiry?: boolean;
notifyCreation?: boolean;
profile?: string;
label?: string;
user_label?: string;
userExpiry?: boolean;
userExpiryTime?: string;
}
declare interface SendFailure {
address: string;
reason: "CheckLogs" | "NoUser" | "MultiUser" | "InvalidAddress";
}
declare interface SentToList {
success: string[];
failed: SendFailure[];
}
declare interface Update {
version: string;
commit: string;
@@ -83,6 +119,7 @@ declare interface Lang {
strings: (key: string) => string;
notif: (key: string) => string;
var: (sect: string, key: string, ...subs: string[]) => string;
template: (sect: string, key: string, subs: { [key: string]: string }) => string;
quantity: (key: string, number: number) => string;
}
@@ -131,31 +168,6 @@ declare interface Modals {
backups?: Modal;
}
interface Invite {
code?: string;
expiresIn?: string;
remainingUses?: string;
send_to?: string;
usedBy?: { [name: string]: number };
created?: number;
notifyExpiry?: boolean;
notifyCreation?: boolean;
profile?: string;
label?: string;
user_label?: string;
userExpiry?: boolean;
userExpiryTime?: string;
}
interface inviteList {
empty: boolean;
invites: { [code: string]: Invite }
add: (invite: Invite) => void;
reload: (callback?: () => void) => void;
isInviteURL: () => boolean;
loadInviteURL: () => void;
}
interface paginatedDTO {
last_page: boolean;
}