feat: integrate Cloudinary image upload, Instagram Feed, and fix Next.js warnings

This commit is contained in:
2026-06-09 21:28:45 +03:00
parent 2b3392dcb1
commit a4ad9344a0
52 changed files with 4300 additions and 263 deletions
+68
View File
@@ -0,0 +1,68 @@
"use server";
export async function getInstagramPosts() {
try {
const response = await fetch('https://instagram120.p.rapidapi.com/api/instagram/posts?v=1', {
method: 'POST',
headers: {
'x-rapidapi-key': process.env.RAPIDAPI_KEY || '762dc41c1dmshc120ecf29aa240ap11dc66jsn87f410b870f5',
'x-rapidapi-host': 'instagram120.p.rapidapi.com',
'Content-Type': 'application/json'
},
body: JSON.stringify({ username: 'kozmosbeach', maxId: '' }),
// CRITICAL ADIM: Veriyi 24 saat boyunca önbellekte tut (Saniye cinsinden: 24 * 60 * 60)
next: { revalidate: 86400 }
});
if (!response.ok) {
throw new Error("Instagram API request failed");
}
const data = await response.json();
// The RapidAPI endpoint usually returns an array of posts or { data: { items: [...] } }
// Based on standard Instagram120 response, it returns { result: { edges: [{node: {}}] } }
let posts = [];
if (data && data.result && data.result.edges && Array.isArray(data.result.edges)) {
posts = data.result.edges.map((edge: any) => edge.node);
} else if (data && Array.isArray(data)) {
posts = data;
} else if (data && data.data && Array.isArray(data.data)) {
posts = data.data;
} else if (data && data.items && Array.isArray(data.items)) {
posts = data.items;
}
// Map to a cleaner format and take first 4
const formattedPosts = posts.slice(0, 4).map((post: any) => {
// Instagram API has multiple variants for post schema
const id = post.id || post.pk;
const code = post.code;
// Try to find the highest res image
let imageUrl = "";
if (post.image_versions2 && post.image_versions2.candidates) {
imageUrl = post.image_versions2.candidates[0].url;
} else if (post.carousel_media && post.carousel_media.length > 0) {
imageUrl = post.carousel_media[0].image_versions2.candidates[0].url;
} else if (post.display_url) {
imageUrl = post.display_url;
}
const caption = post.caption?.text || post.caption || "";
const url = code ? `https://instagram.com/p/${code}` : `https://instagram.com/kozmosbeach`;
return {
id,
imageUrl,
url,
caption
};
});
return { success: true, data: formattedPosts };
} catch (error) {
console.error("Error fetching Instagram posts:", error);
return { success: false, error: "Instagram gönderileri alınamadı." };
}
}