🛂(frontend) blocked edition if multiple ancestors
With child documents we need to check the parent documents to know if the parent doc are collaborative or not.
This commit is contained in:
@@ -5,15 +5,20 @@ import { useIsOffline } from '@/features/service-worker';
|
||||
|
||||
import { KEY_CAN_EDIT, useDocCanEdit } from '../api/useDocCanEdit';
|
||||
import { useProviderStore } from '../stores';
|
||||
import { Doc, LinkReach } from '../types';
|
||||
import { Doc, LinkReach, LinkRole } from '../types';
|
||||
|
||||
export const useIsCollaborativeEditable = (doc: Doc) => {
|
||||
const { isConnected } = useProviderStore();
|
||||
const { data: conf } = useConfig();
|
||||
|
||||
const docIsPublic = doc.link_reach === LinkReach.PUBLIC;
|
||||
const docIsAuth = doc.link_reach === LinkReach.AUTHENTICATED;
|
||||
const docHasMember = doc.nb_accesses_direct > 1;
|
||||
const docIsPublic =
|
||||
doc.computed_link_reach === LinkReach.PUBLIC &&
|
||||
doc.computed_link_role === LinkRole.EDITOR;
|
||||
const docIsAuth =
|
||||
doc.computed_link_reach === LinkReach.AUTHENTICATED &&
|
||||
doc.computed_link_role === LinkRole.EDITOR;
|
||||
const docHasMember =
|
||||
doc.nb_accesses_direct > 1 || doc.nb_accesses_ancestors > 1;
|
||||
const isUserReader = !doc.abilities.partial_update;
|
||||
const isShared = docIsPublic || docIsAuth || docHasMember;
|
||||
const { isOffline } = useIsOffline();
|
||||
@@ -21,23 +26,23 @@ export const useIsCollaborativeEditable = (doc: Doc) => {
|
||||
const [isEditable, setIsEditable] = useState(true);
|
||||
const [isLoading, setIsLoading] = useState(!_isEditable);
|
||||
const timeout = useRef<NodeJS.Timeout | null>(null);
|
||||
const {
|
||||
data: { can_edit } = { can_edit: _isEditable },
|
||||
isLoading: isLoadingCanEdit,
|
||||
} = useDocCanEdit(doc.id, {
|
||||
enabled: !_isEditable,
|
||||
queryKey: [KEY_CAN_EDIT, doc.id],
|
||||
staleTime: 0,
|
||||
});
|
||||
const { data: editingRight, isLoading: isLoadingCanEdit } = useDocCanEdit(
|
||||
doc.id,
|
||||
{
|
||||
enabled: !_isEditable,
|
||||
queryKey: [KEY_CAN_EDIT, doc.id],
|
||||
staleTime: 0,
|
||||
},
|
||||
);
|
||||
|
||||
useEffect(() => {
|
||||
if (isLoadingCanEdit) {
|
||||
if (isLoadingCanEdit || _isEditable || !editingRight) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Connection to the WebSocket can take some time, so we set a timeout to ensure the loading state is cleared after a reasonable time.
|
||||
timeout.current = setTimeout(() => {
|
||||
setIsEditable(can_edit);
|
||||
setIsEditable(editingRight.can_edit);
|
||||
setIsLoading(false);
|
||||
}, 1500);
|
||||
|
||||
@@ -46,7 +51,7 @@ export const useIsCollaborativeEditable = (doc: Doc) => {
|
||||
clearTimeout(timeout.current);
|
||||
}
|
||||
};
|
||||
}, [can_edit, isLoadingCanEdit]);
|
||||
}, [editingRight, isLoadingCanEdit, _isEditable]);
|
||||
|
||||
useEffect(() => {
|
||||
if (!_isEditable) {
|
||||
@@ -59,7 +64,7 @@ export const useIsCollaborativeEditable = (doc: Doc) => {
|
||||
|
||||
setIsEditable(true);
|
||||
setIsLoading(false);
|
||||
}, [_isEditable, isLoading]);
|
||||
}, [_isEditable]);
|
||||
|
||||
if (!conf?.COLLABORATION_WS_NOT_CONNECTED_READY_ONLY) {
|
||||
return {
|
||||
|
||||
Reference in New Issue
Block a user