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.
158 lines (157 loc) • 5.46 kB
JavaScript
const index = require("./index-CSWOFhNV.js");
const React = require("react");
const relationsApi = index.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 = index.generateNKeysBetween(null, firstItem?.__temp_key__ ?? null, relations.length);
return relations.map((datum, index2) => ({
...datum,
__temp_key__: keys[index2]
}));
};
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 = React.useRef();
React.useEffect(() => {
ref.current = value;
}, [value]);
return ref.current;
};
function useDebounce(value, delay) {
const [debouncedValue, setDebouncedValue] = React.useState(value);
React.useEffect(() => {
const handler = setTimeout(() => {
setDebouncedValue(value);
}, delay);
return () => {
clearTimeout(handler);
};
}, [value, delay]);
return debouncedValue;
}
exports.getRelationLabel = getRelationLabel;
exports.prefixFileUrlWithBackendUrl = prefixFileUrlWithBackendUrl;
exports.useDebounce = useDebounce;
exports.useGetRelationsQuery = useGetRelationsQuery;
exports.useLazySearchRelationsQuery = useLazySearchRelationsQuery;
exports.usePrev = usePrev;
;