1 Commits

Author SHA1 Message Date
billisdead 0cf5800463 fix(mobile): restore images on repost, improve media library 404 error, null-safe stripHtml
Release APK / build (push) Has been cancelled
- Pass post.image[] as JSON prefillImages param when prefilling compose from an existing post (repost/edit/retry), replacing the broken single-image prefillImagePath/prefillImageId approach
- MediaLibraryModal now shows the attempted URL and a clear explanation on 404, making it easier to diagnose if the Postiz version does not expose GET /media
- stripHtml accepts null/undefined input and returns "" instead of throwing

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-16 08:31:34 +02:00
4 changed files with 38 additions and 18 deletions
+18 -8
View File
@@ -68,12 +68,11 @@ export default function ComposeScreen() {
const insets = useSafeAreaInsets();
const { workspaces, clients, isConfigured } = usePostiz();
const queryClient = useQueryClient();
const { prefillContent, prefillIntegrationIds, prefillImagePath, prefillImageId } =
const { prefillContent, prefillIntegrationIds, prefillImages } =
useLocalSearchParams<{
prefillContent?: string;
prefillIntegrationIds?: string;
prefillImagePath?: string;
prefillImageId?: string;
prefillImages?: string;
}>();
const [content, setContent] = useState("");
@@ -95,12 +94,23 @@ export default function ComposeScreen() {
if (prefillIntegrationIds) {
setSelectedChannels(String(prefillIntegrationIds).split(",").filter(Boolean));
}
if (prefillImagePath && prefillImageId) {
// Prefilled image has unknown workspace; associate with first workspace
const wsId = workspaces[0]?.id ?? "";
setMediaItems([{ type: "uploaded", id: String(prefillImageId), path: String(prefillImagePath), workspaceId: wsId }]);
if (prefillImages && workspaces.length > 0) {
try {
const images: Array<{ id: string; path: string }> = JSON.parse(String(prefillImages));
const wsId = workspaces[0]?.id ?? "";
setMediaItems(
images
.filter((img) => img?.id && img?.path)
.map((img): MediaItem => ({
type: "uploaded",
id: img.id,
path: img.path,
workspaceId: wsId,
}))
);
} catch {}
}
}, [prefillContent, prefillIntegrationIds, prefillImagePath, prefillImageId, workspaces]);
}, [prefillContent, prefillIntegrationIds, prefillImages, workspaces]);
useEffect(() => {
if (prefillContent) return;
+8 -7
View File
@@ -152,13 +152,14 @@ export default function PostsScreen() {
const handlePrefillCompose = (post: PostizPost) => {
const integrations = post.integrations ?? (post.integration ? [post.integration] : []);
router.push({
pathname: "/(tabs)/compose",
params: {
prefillContent: stripHtml(post.content),
prefillIntegrationIds: integrations.map((i) => i.id).join(","),
},
});
const params: Record<string, string> = {
prefillContent: stripHtml(post.content),
prefillIntegrationIds: integrations.map((i) => i.id).join(","),
};
if (post.image?.length) {
params.prefillImages = JSON.stringify(post.image);
}
router.push({ pathname: "/(tabs)/compose", params });
};
const startReschedule = (post: PostizPost) => {
@@ -66,12 +66,20 @@ export function MediaLibraryModal({ visible, workspaces, defaultWorkspaceId, max
if (!activeWorkspace) return;
setLoading(true);
setError(null);
const url = `${activeWorkspace.baseUrl}/media`;
try {
// eslint-disable-next-line no-undef
const res = await globalThis.fetch(`${activeWorkspace.baseUrl}/media`, {
const res = await globalThis.fetch(url, {
headers: { Authorization: activeWorkspace.apiKey },
});
if (!res.ok) throw new Error(`HTTP ${res.status}`);
if (!res.ok) {
if (res.status === 404) {
throw new Error(
`Media listing endpoint not found (404).\nURL tried: ${url}\n\nThis feature requires Postiz to expose GET /media in its public API. Your version may not support it yet.`
);
}
throw new Error(`HTTP ${res.status}${url}`);
}
const data = await res.json();
const list: RawMediaItem[] = Array.isArray(data)
? data
+2 -1
View File
@@ -1,4 +1,5 @@
export function stripHtml(html: string): string {
export function stripHtml(html: string | null | undefined): string {
if (!html) return "";
// Decode entities first so encoded tags like &lt;p&gt; are also stripped
let s = html
.replace(/&amp;/g, "&")