aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/client/util/SharingManager.tsx92
1 files changed, 51 insertions, 41 deletions
diff --git a/src/client/util/SharingManager.tsx b/src/client/util/SharingManager.tsx
index 1cde2aa8e..b5e29d050 100644
--- a/src/client/util/SharingManager.tsx
+++ b/src/client/util/SharingManager.tsx
@@ -2,7 +2,7 @@ import { observable, runInAction, action, autorun } from "mobx";
import * as React from "react";
import MainViewModal from "../views/MainViewModal";
import { CurrentUserUtils } from "../../server/authentication/models/current_user_utils";
-import { Doc, Opt } from "../../new_fields/Doc";
+import { Doc, Opt, DocListCastAsync } from "../../new_fields/Doc";
import { DocServer } from "../DocServer";
import { Cast, StrCast } from "../../new_fields/Types";
import { listSpec } from "../../new_fields/Schema";
@@ -23,6 +23,7 @@ import { DocumentManager } from "./DocumentManager";
import { CollectionVideoView } from "../views/collections/CollectionVideoView";
import { CollectionPDFView } from "../views/collections/CollectionPDFView";
import { CollectionView } from "../views/collections/CollectionView";
+import { RefField } from "../../new_fields/RefField";
library.add(fa.faCopy);
@@ -49,11 +50,16 @@ const SharingKey = "sharingPermissions";
const PublicKey = "publicLinkPermissions";
const DefaultColor = "black";
+interface ValidatedUser {
+ user: User;
+ notificationDoc: Doc;
+}
+
@observer
export default class SharingManager extends React.Component<{}> {
public static Instance: SharingManager;
@observable private isOpen = false;
- @observable private users: User[] = [];
+ @observable private users: ValidatedUser[] = [];
@observable private targetDoc: Doc | undefined;
@observable private targetDocView: DocumentView | undefined;
@observable private copied = false;
@@ -101,52 +107,55 @@ export default class SharingManager extends React.Component<{}> {
populateUsers = async () => {
let userList = await RequestPromise.get(Utils.prepend(RouteStore.getUsers));
- runInAction(() => {
- this.users = (JSON.parse(userList) as User[]).filter(({ email }) => email !== Doc.CurrentUserEmail);
+ const raw = JSON.parse(userList) as User[];
+ const evaluating = raw.map(async user => {
+ let isCandidate = user.email !== Doc.CurrentUserEmail;
+ if (isCandidate) {
+ const userDocument = await DocServer.GetRefField(user.userDocumentId);
+ if (userDocument instanceof Doc) {
+ const notificationDoc = await Cast(userDocument.optionalRightCollection, Doc);
+ runInAction(() => {
+ if (notificationDoc instanceof Doc) {
+ this.users.push({ user, notificationDoc });
+ }
+ });
+ }
+ }
});
+ return Promise.all(evaluating);
}
- setInternalSharing = async (user: User, state: string) => {
+ setInternalSharing = async (validated: ValidatedUser, state: string) => {
if (!this.sharingDoc) {
- console.log("SHARING ABORTED!");
- return;
- }
- let sharingDoc = await this.sharingDoc;
- sharingDoc[user.userDocumentId] = state;
- const userDocument = await DocServer.GetRefField(user.userDocumentId);
- if (!(userDocument instanceof Doc)) {
- console.log(`Couldn't get user document of user ${user.email}`);
- return;
+ return console.log("SHARING ABORTED!");
}
+ const { user, notificationDoc } = validated;
+ this.sharingDoc[user.userDocumentId] = state;
let target = this.targetDoc;
if (!target) {
- console.log("SharingManager trying to share an undefined document!!");
+ return console.log("SharingManager trying to share an undefined document!!");
+ }
+ const data = await DocListCastAsync(notificationDoc.data);
+ if (!data) {
+ console.log("UNABLE TO ACCESS NOTIFICATION DATA");
return;
}
- const notifDoc = await Cast(userDocument.optionalRightCollection, Doc);
- if (notifDoc instanceof Doc) {
- const data = await Cast(notifDoc.data, listSpec(Doc));
- if (!data) {
- console.log("UNABLE TO ACCESS NOTIFICATION DATA");
- return;
+ console.log(`Attempting to set permissions to ${state} for the document ${target[Id]}`);
+ if (state !== SharingPermissions.None) {
+ const sharedDoc = Doc.MakeAlias(target);
+ if (data) {
+ data.push(sharedDoc);
+ } else {
+ notificationDoc.data = new List([sharedDoc]);
}
- console.log(`Attempting to set permissions to ${state} for the document ${target[Id]}`);
- if (state !== SharingPermissions.None) {
- const sharedDoc = Doc.MakeAlias(target);
- if (data) {
- data.push(sharedDoc);
- } else {
- notifDoc.data = new List([sharedDoc]);
- }
+ } else {
+ let dataDocs = (await Promise.all(data.map(doc => doc))).map(doc => Doc.GetProto(doc));
+ if (dataDocs.includes(target)) {
+ console.log("Searching in ", dataDocs, "for", target);
+ dataDocs.splice(dataDocs.indexOf(target), 1);
+ console.log("SUCCESSFULLY UNSHARED DOC");
} else {
- let dataDocs = (await Promise.all(data.map(doc => doc))).map(doc => Doc.GetProto(doc));
- if (dataDocs.includes(target)) {
- console.log("Searching in ", dataDocs, "for", target);
- dataDocs.splice(dataDocs.indexOf(target), 1);
- console.log("SUCCESSFULLY UNSHARED DOC");
- } else {
- console.log("DIDN'T THINK WE HAD IT, SO NOT SUCCESSFULLY UNSHARED");
- }
+ console.log("DIDN'T THINK WE HAD IT, SO NOT SUCCESSFULLY UNSHARED");
}
}
}
@@ -214,6 +223,7 @@ export default class SharingManager extends React.Component<{}> {
}
private get sharingInterface() {
+ const existOtherUsers = this.users.length > 0;
return (
<div className={"sharing-interface"}>
<p className={"share-link"}>Manage the public link to {this.focusOn("this document...")}</p>
@@ -247,9 +257,9 @@ export default class SharingManager extends React.Component<{}> {
</div>
<div className={"hr-substitute"} />
<p className={"share-individual"}>Privately share {this.focusOn("this document")} with an individual...</p>
- <div className={"users-list"} style={{ display: this.users.length ? "block" : "flex" }}>
- {!this.users.length ? "There are no other users in your database." :
- this.users.map(user => {
+ <div className={"users-list"} style={{ display: existOtherUsers ? "block" : "flex", minHeight: existOtherUsers ? undefined : 200 }}>
+ {!existOtherUsers ? "There are no other users in your database." :
+ this.users.map(({ user, notificationDoc }) => {
return (
<div
key={user.email}
@@ -262,7 +272,7 @@ export default class SharingManager extends React.Component<{}> {
color: this.sharingDoc ? ColorMapping.get(StrCast(this.sharingDoc[user.userDocumentId], SharingPermissions.None)) : DefaultColor,
borderColor: this.sharingDoc ? ColorMapping.get(StrCast(this.sharingDoc[user.userDocumentId], SharingPermissions.None)) : DefaultColor
}}
- onChange={e => this.setInternalSharing(user, e.currentTarget.value)}
+ onChange={e => this.setInternalSharing({ user, notificationDoc }, e.currentTarget.value)}
>
{this.sharingOptions}