💄Better UI
This commit is contained in:
1597
package-lock.json
generated
Normal file
1597
package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load Diff
@@ -565,19 +565,9 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
let rewardName = '';
|
let rewardName = '';
|
||||||
if (contributor.latest_project_order &&
|
if (contributor.reward) {
|
||||||
contributor.latest_project_order.items &&
|
rewardName = contributor.reward;
|
||||||
contributor.latest_project_order.items.length > 0) {
|
console.log(rewardName);
|
||||||
|
|
||||||
const items = contributor.latest_project_order.items;
|
|
||||||
|
|
||||||
items.forEach(item => {
|
|
||||||
if (item.reward &&
|
|
||||||
item.reward.title &&
|
|
||||||
item.reward.title.fr) {
|
|
||||||
rewardName += item.reward.title.fr + " & "
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const avatarUrl = contributor.avatar || 'https://s3-eu-west-1.amazonaws.com/com.ulule.assets/site/build/img/avatars/avatar-blue.png';
|
const avatarUrl = contributor.avatar || 'https://s3-eu-west-1.amazonaws.com/com.ulule.assets/site/build/img/avatars/avatar-blue.png';
|
||||||
|
|||||||
90
server.js
90
server.js
@@ -18,11 +18,11 @@ app.get('/api/ulule/:slug', async (req, res) => {
|
|||||||
try {
|
try {
|
||||||
const { slug } = req.params;
|
const { slug } = req.params;
|
||||||
console.log(`Récupération des données pour la campagne: ${slug}`);
|
console.log(`Récupération des données pour la campagne: ${slug}`);
|
||||||
|
|
||||||
// Utiliser directement l'API publique d'Ulule
|
// Utiliser directement l'API publique d'Ulule
|
||||||
const apiUrl = `https://api.ulule.com/v1/projects/${slug}`;
|
const apiUrl = `https://api.ulule.com/v1/projects/${slug}`;
|
||||||
console.log(`Tentative d'accès à l'API: ${apiUrl}`);
|
console.log(`Tentative d'accès à l'API: ${apiUrl}`);
|
||||||
|
|
||||||
const response = await axios.get(apiUrl, {
|
const response = await axios.get(apiUrl, {
|
||||||
headers: {
|
headers: {
|
||||||
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
|
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
|
||||||
@@ -31,18 +31,18 @@ app.get('/api/ulule/:slug', async (req, res) => {
|
|||||||
},
|
},
|
||||||
timeout: 10000
|
timeout: 10000
|
||||||
});
|
});
|
||||||
|
|
||||||
// Vérifier si la réponse est valide
|
// Vérifier si la réponse est valide
|
||||||
if (response.status === 200 && response.data) {
|
if (response.status === 200 && response.data) {
|
||||||
console.log("Données récupérées avec succès depuis l'API d'Ulule");
|
console.log("Données récupérées avec succès depuis l'API d'Ulule");
|
||||||
|
|
||||||
const projectData = response.data;
|
const projectData = response.data;
|
||||||
|
|
||||||
// Formater les données pour notre application
|
// Formater les données pour notre application
|
||||||
const formattedData = {
|
const formattedData = {
|
||||||
name: projectData.name ?
|
name: projectData.name ?
|
||||||
(projectData.name.fr || projectData.name.en || Object.values(projectData.name)[0]) :
|
(projectData.name.fr || projectData.name.en || Object.values(projectData.name)[0]) :
|
||||||
slug,
|
slug,
|
||||||
amount_raised: projectData.amount_raised || 0,
|
amount_raised: projectData.amount_raised || 0,
|
||||||
goal: projectData.goal || 0,
|
goal: projectData.goal || 0,
|
||||||
currency: projectData.currency || "EUR",
|
currency: projectData.currency || "EUR",
|
||||||
@@ -60,15 +60,15 @@ app.get('/api/ulule/:slug', async (req, res) => {
|
|||||||
const diffTime = endDate - now;
|
const diffTime = endDate - now;
|
||||||
formattedData.days_left = Math.ceil(diffTime / (1000 * 60 * 60 * 24));
|
formattedData.days_left = Math.ceil(diffTime / (1000 * 60 * 60 * 24));
|
||||||
}
|
}
|
||||||
|
|
||||||
return res.json(formattedData);
|
return res.json(formattedData);
|
||||||
} else {
|
} else {
|
||||||
throw new Error(`Réponse invalide de l'API: ${response.status}`);
|
throw new Error(`Réponse invalide de l'API: ${response.status}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('Erreur lors de la récupération des données:', error.message);
|
console.error('Erreur lors de la récupération des données:', error.message);
|
||||||
|
|
||||||
// En cas d'erreur, renvoyer des données de démonstration
|
// En cas d'erreur, renvoyer des données de démonstration
|
||||||
res.json({
|
res.json({
|
||||||
name: req.params.slug,
|
name: req.params.slug,
|
||||||
@@ -91,14 +91,14 @@ app.get('/api/ulule/:slug/rewards', async (req, res) => {
|
|||||||
try {
|
try {
|
||||||
const { slug } = req.params;
|
const { slug } = req.params;
|
||||||
console.log(`Récupération des récompenses pour la campagne: ${slug}`);
|
console.log(`Récupération des récompenses pour la campagne: ${slug}`);
|
||||||
|
|
||||||
// Utiliser l'API Ulule
|
// Utiliser l'API Ulule
|
||||||
const apiUrl = `https://api.ulule.com/v1/projects/${slug}`;
|
const apiUrl = `https://api.ulule.com/v1/projects/${slug}`;
|
||||||
const response = await axios.get(apiUrl);
|
const response = await axios.get(apiUrl);
|
||||||
|
|
||||||
if (response.status === 200 && response.data && response.data.rewards) {
|
if (response.status === 200 && response.data && response.data.rewards) {
|
||||||
console.log(`${response.data.rewards.length} récompenses récupérées`);
|
console.log(`${response.data.rewards.length} récompenses récupérées`);
|
||||||
|
|
||||||
// Simplifier les données des récompenses
|
// Simplifier les données des récompenses
|
||||||
const rewards = response.data.rewards.map(reward => ({
|
const rewards = response.data.rewards.map(reward => ({
|
||||||
id: reward.id,
|
id: reward.id,
|
||||||
@@ -110,12 +110,12 @@ app.get('/api/ulule/:slug/rewards', async (req, res) => {
|
|||||||
orders_count: reward.orders_count,
|
orders_count: reward.orders_count,
|
||||||
date_delivery: reward.date_delivery
|
date_delivery: reward.date_delivery
|
||||||
}));
|
}));
|
||||||
|
|
||||||
return res.json({ rewards });
|
return res.json({ rewards });
|
||||||
} else {
|
} else {
|
||||||
throw new Error(`Aucune récompense trouvée pour la campagne ${slug}`);
|
throw new Error(`Aucune récompense trouvée pour la campagne ${slug}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('Erreur lors de la récupération des récompenses:', error.message);
|
console.error('Erreur lors de la récupération des récompenses:', error.message);
|
||||||
return res.json({ rewards: [] });
|
return res.json({ rewards: [] });
|
||||||
@@ -127,11 +127,11 @@ app.get('/api/ulule/:slug/supporters', async (req, res) => {
|
|||||||
try {
|
try {
|
||||||
const { slug } = req.params;
|
const { slug } = req.params;
|
||||||
console.log(`Récupération des contributeurs pour la campagne: ${slug}`);
|
console.log(`Récupération des contributeurs pour la campagne: ${slug}`);
|
||||||
|
|
||||||
// Utiliser l'API Ulule pour récupérer les contributeurs avec des champs supplémentaires
|
// Utiliser l'API Ulule pour récupérer les contributeurs avec des champs supplémentaires
|
||||||
const apiUrl = `https://api.ulule.com/v1/projects/${slug}/supporters?extra_fields=latest_project_order,latest_project_comment`;
|
const apiUrl = `https://api.ulule.com/v1/projects/${slug}/supporters?extra_fields=latest_project_order,latest_project_comment`;
|
||||||
console.log(`Tentative d'accès à l'API des supporters: ${apiUrl}`);
|
console.log(`Tentative d'accès à l'API des supporters: ${apiUrl}`);
|
||||||
|
|
||||||
const response = await axios.get(apiUrl, {
|
const response = await axios.get(apiUrl, {
|
||||||
headers: {
|
headers: {
|
||||||
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
|
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
|
||||||
@@ -140,47 +140,59 @@ app.get('/api/ulule/:slug/supporters', async (req, res) => {
|
|||||||
},
|
},
|
||||||
timeout: 10000
|
timeout: 10000
|
||||||
});
|
});
|
||||||
|
|
||||||
if (response.status === 200 && response.data && response.data.supporters) {
|
if (response.status === 200 && response.data && response.data.supporters) {
|
||||||
console.log(`${response.data.supporters.length} contributeurs récupérés`);
|
console.log(`${response.data.supporters.length} contributeurs récupérés`);
|
||||||
|
|
||||||
// Formater les données des contributeurs
|
// Formater les données des contributeurs
|
||||||
const contributors = response.data.supporters.map(supporter => {
|
const contributors = response.data.supporters.map(supporter => {
|
||||||
// Récupérer le nom complet ou le nom d'utilisateur
|
// Récupérer le nom complet ou le nom d'utilisateur
|
||||||
let name = supporter.screenname || supporter.name || 'Contributeur anonyme';
|
let name = supporter.screenname || supporter.name || 'Contributeur anonyme';
|
||||||
|
|
||||||
// Extraire les informations de commande si disponibles
|
// Extraire les informations de commande si disponibles
|
||||||
let reward = '';
|
let reward = '';
|
||||||
|
let reward_desc = '';
|
||||||
let amount = 0;
|
let amount = 0;
|
||||||
let comment = '';
|
let comment = '';
|
||||||
|
|
||||||
if (supporter.latest_project_order && supporter.latest_project_order.items && supporter.latest_project_order.items.length > 0) {
|
if (supporter.latest_project_order && supporter.latest_project_order.items && supporter.latest_project_order.items.length > 0) {
|
||||||
// Récupérer la première récompense
|
// Récupérer la première récompense
|
||||||
const firstItem = supporter.latest_project_order.items[0];
|
const firstItem = supporter.latest_project_order.items[0];
|
||||||
amount = firstItem.line_total || firstItem.unit_price || 0;
|
amount = firstItem.line_subtotal || firstItem.unit_price || 0;
|
||||||
|
|
||||||
// Récupérer le titre de la récompense
|
if (firstItem.reward.parent && firstItem.reward.parent.delivery) {
|
||||||
if (firstItem.reward && firstItem.reward.parent && firstItem.reward.parent.title) {
|
if (firstItem.reward.parent.delivery.shipping_type == 'physical-delivery') {
|
||||||
const titles = firstItem.reward.parent.title;
|
amount = firstItem.line_subtotal || firstItem.unit_price || 0;
|
||||||
reward = titles.fr || titles.en || Object.values(titles)[0] || '';
|
|
||||||
|
|
||||||
// Si c'est une variante, ajouter sa description
|
|
||||||
if (firstItem.reward.description_fr) {
|
|
||||||
reward += ` (${firstItem.reward.description_fr})`;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Récupérer le titre de la récompense
|
||||||
|
if (firstItem.reward && firstItem.reward.title) {
|
||||||
|
const titles = firstItem.reward.title || firstItem.reward.parent.title;
|
||||||
|
reward = titles.fr || Object.values(titles)[0] || '';
|
||||||
|
reward_desc = firstItem.reward.description_fr;
|
||||||
|
|
||||||
|
reward = reward;
|
||||||
|
|
||||||
|
} else if (firstItem.reward.parent && firstItem.reward.parent.title) {
|
||||||
|
const titles = firstItem.reward.parent.title;
|
||||||
|
reward = titles.fr || firstItem.reward.description_fr || Object.values(titles)[0] || '';
|
||||||
|
reward_desc = firstItem.reward.description_fr;
|
||||||
|
|
||||||
|
reward = reward + ' - ' + reward_desc;
|
||||||
|
}
|
||||||
|
|
||||||
// Ajouter un pourboire si présent
|
// Ajouter un pourboire si présent
|
||||||
if (supporter.latest_project_order.tip && supporter.latest_project_order.tip > 0) {
|
if (supporter.latest_project_order.tip && supporter.latest_project_order.tip > 0) {
|
||||||
amount += supporter.latest_project_order.tip;
|
amount += supporter.latest_project_order.tip;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Récupérer le commentaire si disponible
|
// Récupérer le commentaire si disponible
|
||||||
if (supporter.latest_project_comment && supporter.latest_project_comment.comment) {
|
if (supporter.latest_project_comment && supporter.latest_project_comment.comment) {
|
||||||
comment = supporter.latest_project_comment.comment;
|
comment = supporter.latest_project_comment.comment;
|
||||||
}
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
id: supporter.id,
|
id: supporter.id,
|
||||||
name: name,
|
name: name,
|
||||||
@@ -192,17 +204,17 @@ app.get('/api/ulule/:slug/supporters', async (req, res) => {
|
|||||||
location: supporter.location || ''
|
location: supporter.location || ''
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|
||||||
return res.json({ contributors });
|
return res.json({ contributors });
|
||||||
} else {
|
} else {
|
||||||
throw new Error(`Erreur lors de la récupération des contributeurs: ${response.status}`);
|
throw new Error(`Erreur lors de la récupération des contributeurs: ${response.status}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('Erreur lors de la récupération des contributeurs:', error.message);
|
console.error('Erreur lors de la récupération des contributeurs:', error.message);
|
||||||
|
|
||||||
// En cas d'erreur, renvoyer des données de démonstration
|
// En cas d'erreur, renvoyer des données de démonstration
|
||||||
return res.json({
|
return res.json({
|
||||||
contributors: [
|
contributors: [
|
||||||
{ name: "Contributeur 1", reward: "Pack Tour", amount: 40, avatar: "", comment: "Super projet!" },
|
{ name: "Contributeur 1", reward: "Pack Tour", amount: 40, avatar: "", comment: "Super projet!" },
|
||||||
{ name: "Contributeur 2", reward: "Pack Cavalier", amount: 26, avatar: "", comment: "" },
|
{ name: "Contributeur 2", reward: "Pack Cavalier", amount: 26, avatar: "", comment: "" },
|
||||||
|
|||||||
Reference in New Issue
Block a user