Some checks failed
Build & Deploy / 🔍 Prepare (push) Successful in 20s
Build & Deploy / 🧪 QA (push) Failing after 34s
Build & Deploy / 🏗️ Build (push) Has started running
Build & Deploy / 🚀 Deploy (push) Has been cancelled
Build & Deploy / 🧪 Smoke Test (push) Has been cancelled
Build & Deploy / ⚡ Lighthouse (push) Has been cancelled
Build & Deploy / 🔔 Notify (push) Has been cancelled
192 lines
6.2 KiB
Plaintext
192 lines
6.2 KiB
Plaintext
'use client';
|
|
|
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
import { useModal } from '@faceless-ui/modal';
|
|
import { getTranslation } from '@payloadcms/translations';
|
|
import { formatAdminURL } from 'payload/shared';
|
|
import * as qs from 'qs-esm';
|
|
import React, { useCallback, useEffect, useState } from 'react';
|
|
import { toast } from 'sonner';
|
|
import { useForm } from '../../forms/Form/context.js';
|
|
import { useConfig } from '../../providers/Config/index.js';
|
|
import { useDocumentInfo } from '../../providers/DocumentInfo/index.js';
|
|
import { useLocale } from '../../providers/Locale/index.js';
|
|
import { useTranslation } from '../../providers/Translation/index.js';
|
|
import { requests } from '../../utilities/api.js';
|
|
import { traverseForLocalizedFields } from '../../utilities/traverseForLocalizedFields.js';
|
|
import { ConfirmationModal } from '../ConfirmationModal/index.js';
|
|
import { PopupList } from '../Popup/index.js';
|
|
export function UnpublishButton({
|
|
label: labelProp
|
|
} = {}) {
|
|
const {
|
|
id,
|
|
collectionSlug,
|
|
data: dataFromProps,
|
|
globalSlug,
|
|
hasPublishedDoc,
|
|
hasPublishPermission,
|
|
incrementVersionCount,
|
|
isTrashed,
|
|
setHasPublishedDoc,
|
|
setMostRecentVersionIsAutosaved,
|
|
setUnpublishedVersionCount
|
|
} = useDocumentInfo();
|
|
const {
|
|
toggleModal
|
|
} = useModal();
|
|
const {
|
|
config,
|
|
getEntityConfig
|
|
} = useConfig();
|
|
const {
|
|
reset: resetForm
|
|
} = useForm();
|
|
const {
|
|
code: localeCode,
|
|
label: localeLabel
|
|
} = useLocale();
|
|
const [unpublishAll, setUnpublishAll] = useState(false);
|
|
const [hasLocalizedFields, setHasLocalizedFields] = useState(false);
|
|
const unPublishModalSlug = `confirm-un-publish-${id}`;
|
|
const {
|
|
routes: {
|
|
api
|
|
},
|
|
serverURL
|
|
} = config;
|
|
const {
|
|
i18n,
|
|
t
|
|
} = useTranslation();
|
|
const entityConfig = React.useMemo(() => {
|
|
if (collectionSlug) {
|
|
return getEntityConfig({
|
|
collectionSlug
|
|
});
|
|
}
|
|
if (globalSlug) {
|
|
return getEntityConfig({
|
|
globalSlug
|
|
});
|
|
}
|
|
}, [collectionSlug, globalSlug, getEntityConfig]);
|
|
const unpublish = useCallback(unpublishAll_0 => {
|
|
void (async () => {
|
|
let url;
|
|
let method;
|
|
const queryString = qs.stringify({
|
|
depth: 0,
|
|
'fallback-locale': 'null',
|
|
locale: unpublishAll_0 ? undefined : localeCode,
|
|
unpublishAllLocales: unpublishAll_0
|
|
}, {
|
|
addQueryPrefix: true
|
|
});
|
|
if (collectionSlug) {
|
|
url = formatAdminURL({
|
|
apiRoute: api,
|
|
path: `/${collectionSlug}/${id}${queryString}`,
|
|
serverURL
|
|
});
|
|
method = 'patch';
|
|
}
|
|
if (globalSlug) {
|
|
url = formatAdminURL({
|
|
apiRoute: api,
|
|
path: `/globals/${globalSlug}${queryString}`,
|
|
serverURL
|
|
});
|
|
method = 'post';
|
|
}
|
|
try {
|
|
const res = await requests[method](url, {
|
|
body: JSON.stringify({
|
|
_status: 'draft'
|
|
}),
|
|
headers: {
|
|
'Accept-Language': i18n.language,
|
|
'Content-Type': 'application/json'
|
|
}
|
|
});
|
|
if (res.status === 200) {
|
|
void resetForm({
|
|
...(dataFromProps || {}),
|
|
_status: 'draft'
|
|
});
|
|
toast.success(t('version:unpublishedSuccessfully'));
|
|
incrementVersionCount();
|
|
setUnpublishedVersionCount(1);
|
|
setMostRecentVersionIsAutosaved(false);
|
|
setHasPublishedDoc(false);
|
|
} else {
|
|
try {
|
|
const json = await res.json();
|
|
if (json.errors?.[0]?.message) {
|
|
toast.error(json.errors[0].message);
|
|
} else if (json.error) {
|
|
toast.error(json.error);
|
|
} else {
|
|
toast.error(t('error:unPublishingDocument'));
|
|
}
|
|
} catch {
|
|
toast.error(t('error:unPublishingDocument'));
|
|
}
|
|
}
|
|
} catch {
|
|
toast.error(t('error:unPublishingDocument'));
|
|
}
|
|
})().catch(() => {
|
|
toast.error(t('error:unPublishingDocument'));
|
|
});
|
|
}, [dataFromProps, resetForm, collectionSlug, globalSlug, serverURL, api, localeCode, id, i18n.language, incrementVersionCount, setHasPublishedDoc, setMostRecentVersionIsAutosaved, setUnpublishedVersionCount, t]);
|
|
useEffect(() => {
|
|
const hasLocalizedField = traverseForLocalizedFields(entityConfig?.fields);
|
|
setHasLocalizedFields(hasLocalizedField);
|
|
}, [entityConfig?.fields]);
|
|
const drafts = entityConfig?.versions?.drafts;
|
|
const hasDraftsEnabled = typeof drafts === 'object' && drafts !== null;
|
|
const canUnpublish = React.useMemo(() => {
|
|
return hasDraftsEnabled && hasPublishPermission && hasPublishedDoc && !isTrashed;
|
|
}, [hasPublishPermission, hasPublishedDoc, isTrashed, hasDraftsEnabled]);
|
|
const canUnpublishCurrentLocale = React.useMemo(() => {
|
|
if (!canUnpublish || !hasLocalizedFields) {
|
|
return false;
|
|
}
|
|
const isLocalizeStatusEnabled = drafts && drafts.localizeStatus === true;
|
|
const isExperimentalEnabled = config.experimental?.localizeStatus === true;
|
|
return isLocalizeStatusEnabled && isExperimentalEnabled;
|
|
}, [canUnpublish, hasLocalizedFields, drafts, config.experimental?.localizeStatus]);
|
|
const label = getTranslation(localeLabel, i18n);
|
|
if (!canUnpublish) {
|
|
return null;
|
|
}
|
|
return /*#__PURE__*/_jsxs(React.Fragment, {
|
|
children: [/*#__PURE__*/_jsx(PopupList.Button, {
|
|
id: "action-unpublish",
|
|
onClick: () => {
|
|
setUnpublishAll(true);
|
|
toggleModal(unPublishModalSlug);
|
|
},
|
|
children: labelProp || t('version:unpublish')
|
|
}), canUnpublishCurrentLocale && /*#__PURE__*/_jsx(PopupList.Button, {
|
|
id: "action-unpublish-locale",
|
|
onClick: () => {
|
|
setUnpublishAll(false);
|
|
toggleModal(unPublishModalSlug);
|
|
},
|
|
children: labelProp ? `${labelProp} [${label}]` : t('version:unpublishIn', {
|
|
locale: label
|
|
})
|
|
}), /*#__PURE__*/_jsx(ConfirmationModal, {
|
|
body: !unpublishAll ? t('version:aboutToUnpublishIn', {
|
|
locale: label
|
|
}) : t('version:aboutToUnpublish'),
|
|
confirmingLabel: t('version:unpublishing'),
|
|
heading: t('version:confirmUnpublish'),
|
|
modalSlug: unPublishModalSlug,
|
|
onConfirm: () => unpublish(unpublishAll)
|
|
})]
|
|
});
|
|
}
|
|
//# sourceMappingURL=index.js.map |