mirror of
https://github.com/rgrgogu/new_starr.git
synced 2026-09-27 00:12:54 +08:00
Adjusted
This commit is contained in:
@@ -10,11 +10,22 @@ export function useAssets() {
|
||||
return ctx;
|
||||
}
|
||||
|
||||
// ─── Initial States ────────────────────────────────────────────────────────────
|
||||
const PAGINATION_INIT = {
|
||||
page: 1,
|
||||
limit: 10,
|
||||
totalRecords: 0,
|
||||
totalPages: 0,
|
||||
hasPrevPage: false,
|
||||
hasNextPage: false,
|
||||
};
|
||||
|
||||
export function AssetsProvider({ children }) {
|
||||
const [assets, setAssets] = useState([]);
|
||||
const [pagination, setPagination] = useState(null);
|
||||
const [assets, setAssets] = useState([]);
|
||||
const [attributes, setAttributes] = useState([]);
|
||||
const [pagination, setPagination] = useState(PAGINATION_INIT);
|
||||
const [selectedAsset, setSelectedAsset] = useState(null);
|
||||
const [loading, setLoading] = useState(false);
|
||||
const [loading, setLoading] = useState(false);
|
||||
|
||||
const request = useCallback(async (fn) => {
|
||||
setLoading(true);
|
||||
@@ -31,12 +42,23 @@ export function AssetsProvider({ children }) {
|
||||
|
||||
// ─── GET /api/admin/assets ────────────────────────────────────────────────
|
||||
const fetchAssets = useCallback(
|
||||
(params = {}) =>
|
||||
({ page = 1, limit = 10, filters = [], sort = [] } = {}) =>
|
||||
request(async () => {
|
||||
const res = await api.get("/admin/assets", { params });
|
||||
setAssets(res.data?.result?.data ?? []);
|
||||
setPagination(res.data?.result?.pagination ?? null);
|
||||
return res.data;
|
||||
const { data } = await api.get("/admin/assets", {
|
||||
params: {
|
||||
page, limit,
|
||||
filters: filters.length ? JSON.stringify(filters) : undefined,
|
||||
sort: sort.length ? JSON.stringify(sort) : undefined,
|
||||
},
|
||||
});
|
||||
|
||||
const result = data?.data;
|
||||
|
||||
setAssets(result?.data ?? []);
|
||||
setPagination(result?.pagination ?? PAGINATION_INIT);
|
||||
setAttributes(result.attributes);
|
||||
|
||||
return data.data;
|
||||
}),
|
||||
[request]
|
||||
);
|
||||
@@ -46,16 +68,34 @@ export function AssetsProvider({ children }) {
|
||||
(assetId) =>
|
||||
request(async () => {
|
||||
const res = await api.get(`/admin/assets/${assetId}`);
|
||||
setSelectedAsset(res.data?.result?.data ?? null);
|
||||
setSelectedAsset(res.data?.data?.data ?? null);
|
||||
return res.data;
|
||||
}),
|
||||
[request]
|
||||
);
|
||||
|
||||
// ─── GET /api/admin/assets/archived ───────────────────────────────────────
|
||||
const fetchArchivedAssets = useCallback(
|
||||
({ page = 1, limit = 10, filters = [], sort = [] } = {}) =>
|
||||
request(async () => {
|
||||
const { data } = await api.get("/admin/assets/archived", {
|
||||
params: {
|
||||
page, limit,
|
||||
filters: filters.length ? JSON.stringify(filters) : undefined,
|
||||
sort: sort.length ? JSON.stringify(sort) : undefined,
|
||||
},
|
||||
});
|
||||
const final_data = data?.data;
|
||||
|
||||
setAssets(final_data?.data ?? []);
|
||||
setPagination(final_data?.pagination ?? PAGINATION_INIT);
|
||||
setAttributes(final_data.attributes);
|
||||
return data;
|
||||
}),
|
||||
[request]
|
||||
);
|
||||
|
||||
// ─── POST /api/admin/assets ───────────────────────────────────────────────
|
||||
// fields: { file (File), thumbnail? (File), uploadedBy, display_name,
|
||||
// description, owner_type, owner_id, is_public, access_level,
|
||||
// storage_provider, storage_bucket, storage_key }
|
||||
const uploadAsset = useCallback(
|
||||
({ file, thumbnail, ...rest }) =>
|
||||
request(async () => {
|
||||
@@ -66,56 +106,44 @@ export function AssetsProvider({ children }) {
|
||||
if (v !== undefined && v !== null) form.append(k, v);
|
||||
});
|
||||
|
||||
const res = await api.post("/admin/assets", form, {
|
||||
headers: { "Content-Type": "multipart/form-data" },
|
||||
});
|
||||
const asset = res.data?.result?.data ?? null;
|
||||
if (asset) setAssets((prev) => [asset, ...prev]);
|
||||
return res.data;
|
||||
}),
|
||||
[request]
|
||||
);
|
||||
|
||||
// ─── PATCH /api/admin/assets/:assetId/thumbnail ───────────────────────────
|
||||
const updateThumbnail = useCallback(
|
||||
(assetId, thumbnailFile) =>
|
||||
request(async () => {
|
||||
const form = new FormData();
|
||||
form.append("thumbnail", thumbnailFile);
|
||||
|
||||
const res = await api.patch(`/admin/assets/${assetId}/thumbnail`, form, {
|
||||
headers: { "Content-Type": "multipart/form-data" },
|
||||
});
|
||||
const asset = res.data?.result?.data ?? null;
|
||||
const res = await api.post("/admin/assets", form);
|
||||
const asset = res.data?.data?.data ?? null;
|
||||
if (asset) {
|
||||
setAssets((prev) => prev.map((a) => (a.asset_id === assetId ? asset : a)));
|
||||
setSelectedAsset((prev) => (prev?.asset_id === assetId ? asset : prev));
|
||||
setAssets((prev) => [asset, ...prev]);
|
||||
toast.success("Asset uploaded successfully.");
|
||||
}
|
||||
return res.data;
|
||||
}),
|
||||
[request]
|
||||
);
|
||||
|
||||
// ─── PUT /api/admin/assets/:assetId ───────────────────────────────────────
|
||||
// Allowed: display_name, description, owner_type, owner_id, is_public,
|
||||
// access_level, thumbnail_url, width, height, duration,
|
||||
// frame_rate, bitrate, video_codec, audio_codec
|
||||
// ─── PATCH /api/admin/assets/:assetId ────────────────────────────────────
|
||||
const updateAsset = useCallback(
|
||||
(assetId, fields) =>
|
||||
(assetId, fields, file = null) =>
|
||||
request(async () => {
|
||||
const res = await api.put(`/admin/assets/${assetId}`, fields);
|
||||
const asset = res.data?.result?.data ?? null;
|
||||
const formData = new FormData();
|
||||
Object.entries(fields).forEach(([key, value]) => {
|
||||
if (value !== undefined && value !== null) formData.append(key, value);
|
||||
});
|
||||
if (file) formData.append("file", file);
|
||||
|
||||
const res = await api.patch(`/admin/assets/${assetId}`, formData, {
|
||||
headers: { "Content-Type": "multipart/form-data" },
|
||||
});
|
||||
|
||||
const asset = res.data?.data?.data ?? null;
|
||||
if (asset) {
|
||||
setAssets((prev) => prev.map((a) => (a.asset_id === assetId ? asset : a)));
|
||||
setSelectedAsset((prev) => (prev?.asset_id === assetId ? asset : prev));
|
||||
setSelectedAsset(asset);
|
||||
toast.success("Asset updated successfully.");
|
||||
}
|
||||
return res.data;
|
||||
}),
|
||||
[request]
|
||||
);
|
||||
|
||||
// ─── DELETE /api/admin/assets/:assetId ────────────────────────────────────
|
||||
const deleteAsset = useCallback(
|
||||
// ─── DELETE /api/admin/assets/:assetId ───────────────────────────────────
|
||||
const archiveAsset = useCallback(
|
||||
(assetId, { deletedBy } = {}) =>
|
||||
request(async () => {
|
||||
const res = await api.delete(`/admin/assets/${assetId}`, {
|
||||
@@ -123,51 +151,82 @@ export function AssetsProvider({ children }) {
|
||||
});
|
||||
setAssets((prev) => prev.filter((a) => a.asset_id !== assetId));
|
||||
setSelectedAsset((prev) => (prev?.asset_id === assetId ? null : prev));
|
||||
toast.success("Asset archived.");
|
||||
return res.data;
|
||||
}),
|
||||
[request]
|
||||
);
|
||||
|
||||
// ─── DELETE /api/admin/assets (bulk) ──────────────────────────────────────
|
||||
const deleteAssets = useCallback(
|
||||
(ids = [], { deletedBy } = {}) =>
|
||||
// ─── DELETE /api/admin/assets/bulk ───────────────────────────────────────
|
||||
const archiveAssets = useCallback(
|
||||
({ ids }, { deletedBy } = {}) =>
|
||||
request(async () => {
|
||||
const res = await api.delete("/admin/assets", {
|
||||
const res = await api.delete("/admin/assets/bulk", {
|
||||
data: { ids, deletedBy },
|
||||
});
|
||||
setAssets((prev) => prev.filter((a) => !ids.includes(a.asset_id)));
|
||||
toast.success(`${ids.length} asset(s) archived.`);
|
||||
return res.data;
|
||||
}),
|
||||
[request]
|
||||
);
|
||||
|
||||
// ─── PATCH /api/admin/assets/:assetId/restore ─────────────────────────────
|
||||
// ─── PATCH /api/admin/assets/:assetId/restore ────────────────────────────
|
||||
const restoreAsset = useCallback(
|
||||
(assetId) =>
|
||||
request(async () => {
|
||||
const res = await api.patch(`/admin/assets/${assetId}/restore`);
|
||||
const asset = res.data?.result?.data ?? null;
|
||||
if (asset) setAssets((prev) => prev.map((a) => (a.asset_id === assetId ? asset : a)));
|
||||
const asset = res.data?.data?.data ?? null;
|
||||
if (asset) {
|
||||
setAssets((prev) => prev.filter((a) => a.asset_id !== assetId));
|
||||
toast.success("Asset restored.");
|
||||
}
|
||||
return res.data;
|
||||
}),
|
||||
[request]
|
||||
);
|
||||
|
||||
// ─── PATCH /api/admin/assets/bulk-restore ────────────────────────────────
|
||||
const restoreAssets = useCallback(
|
||||
({ ids }) =>
|
||||
request(async () => {
|
||||
const res = await api.patch("/admin/assets/bulk-restore", { ids });
|
||||
setAssets((prev) => prev.filter((a) => !ids.includes(a.asset_id)));
|
||||
toast.success(`${ids.length} asset(s) restored.`);
|
||||
return res.data;
|
||||
}),
|
||||
[request]
|
||||
);
|
||||
|
||||
// ─── GET /api/admin/assets/field-values ──────────────────────────────────────
|
||||
const fetchAssetFieldValues = useCallback(
|
||||
(field) =>
|
||||
request(async () => {
|
||||
const res = await api.get("/admin/assets/field-values", { params: { field } });
|
||||
return res.data?.data;
|
||||
}),
|
||||
[request]
|
||||
);
|
||||
|
||||
return (
|
||||
<AssetsContext.Provider value={{
|
||||
assets,
|
||||
attributes,
|
||||
pagination,
|
||||
selectedAsset,
|
||||
loading,
|
||||
setPagination,
|
||||
setSelectedAsset,
|
||||
fetchAssets,
|
||||
fetchAsset,
|
||||
fetchArchivedAssets,
|
||||
uploadAsset,
|
||||
updateThumbnail,
|
||||
updateAsset,
|
||||
deleteAsset,
|
||||
deleteAssets,
|
||||
archiveAsset,
|
||||
archiveAssets,
|
||||
restoreAsset,
|
||||
restoreAssets,
|
||||
fetchAssetFieldValues
|
||||
}}>
|
||||
{children}
|
||||
</AssetsContext.Provider>
|
||||
|
||||
Reference in New Issue
Block a user