strapi-plugin-preview-button
Version:
A plugin for Strapi CMS that adds a preview button and live view button to the content manager edit view.
159 lines (158 loc) • 5.36 kB
JavaScript
import { c as contentManagerApi, O as generateNKeysBetween } from "./index-DX9HaYlZ.mjs";
import { useRef, useEffect, useState } from "react";
const relationsApi = contentManagerApi.injectEndpoints({
endpoints: (build) => ({
getRelations: build.query({
query: ({ model, id, targetField, params }) => {
return {
url: `/content-manager/relations/${model}/${id}/${targetField}`,
method: "GET",
config: {
params
}
};
},
serializeQueryArgs: (args) => {
const { endpointName, queryArgs } = args;
return {
endpointName,
model: queryArgs.model,
id: queryArgs.id,
targetField: queryArgs.targetField,
locale: queryArgs.params?.locale,
status: queryArgs.params?.status
};
},
merge: (currentCache, newItems) => {
if (currentCache.pagination && newItems.pagination) {
if (currentCache.pagination.page < newItems.pagination.page) {
currentCache.results = [
...prepareTempKeys(newItems.results, currentCache.results),
...currentCache.results
];
currentCache.pagination = newItems.pagination;
} else if (newItems.pagination.page === 1) {
currentCache.results = prepareTempKeys(newItems.results);
currentCache.pagination = newItems.pagination;
}
}
},
forceRefetch({ currentArg, previousArg }) {
if (!currentArg?.params && !previousArg?.params) {
return false;
}
return currentArg?.params?.page !== previousArg?.params?.page || currentArg?.params?.pageSize !== previousArg?.params?.pageSize;
},
transformResponse: (response) => {
if ("results" in response && response.results) {
return {
...response,
results: prepareTempKeys(response.results.toReversed())
};
} else {
return response;
}
},
providesTags: ["Relations"]
}),
searchRelations: build.query({
query: ({ model, targetField, params }) => {
return {
url: `/content-manager/relations/${model}/${targetField}`,
method: "GET",
config: {
params
}
};
},
serializeQueryArgs: (args) => {
const { endpointName, queryArgs } = args;
return {
endpointName,
model: queryArgs.model,
targetField: queryArgs.targetField,
_q: queryArgs.params?._q,
idsToOmit: queryArgs.params?.idsToOmit,
idsToInclude: queryArgs.params?.idsToInclude
};
},
merge: (currentCache, newItems) => {
if (currentCache.pagination && newItems.pagination) {
if (currentCache.pagination.page < newItems.pagination.page) {
const existingIds = currentCache.results.map((item) => item.documentId);
const uniqueNewItems = newItems.results.filter(
(item) => !existingIds.includes(item.documentId)
);
currentCache.results.push(...uniqueNewItems);
currentCache.pagination = newItems.pagination;
} else if (newItems.pagination.page === 1) {
currentCache.results = newItems.results;
currentCache.pagination = newItems.pagination;
}
}
},
forceRefetch({ currentArg, previousArg }) {
if (!currentArg?.params && !previousArg?.params) {
return false;
}
return currentArg?.params?.page !== previousArg?.params?.page || currentArg?.params?.pageSize !== previousArg?.params?.pageSize;
},
transformResponse: (response) => {
if (response.results) {
return {
...response,
results: response.results
};
} else {
return response;
}
}
})
})
});
const prepareTempKeys = (relations, existingRelations = []) => {
const [firstItem] = existingRelations.slice(0);
const keys = generateNKeysBetween(null, firstItem?.__temp_key__ ?? null, relations.length);
return relations.map((datum, index) => ({
...datum,
__temp_key__: keys[index]
}));
};
const { useGetRelationsQuery, useLazySearchRelationsQuery } = relationsApi;
const getRelationLabel = (relation, mainField) => {
const label = mainField && relation[mainField.name] ? relation[mainField.name] : null;
if (typeof label === "string") {
return label;
}
return relation.documentId;
};
const prefixFileUrlWithBackendUrl = (fileURL) => {
return !!fileURL && fileURL.startsWith("/") ? `${window.strapi.backendURL}${fileURL}` : fileURL;
};
const usePrev = (value) => {
const ref = useRef();
useEffect(() => {
ref.current = value;
}, [value]);
return ref.current;
};
function useDebounce(value, delay) {
const [debouncedValue, setDebouncedValue] = useState(value);
useEffect(() => {
const handler = setTimeout(() => {
setDebouncedValue(value);
}, delay);
return () => {
clearTimeout(handler);
};
}, [value, delay]);
return debouncedValue;
}
export {
useLazySearchRelationsQuery as a,
useDebounce as b,
usePrev as c,
getRelationLabel as g,
prefixFileUrlWithBackendUrl as p,
useGetRelationsQuery as u
};