Create zap split manager hook
This commit is contained in:
parent
8354ad5d69
commit
4290af398b
|
@ -0,0 +1,86 @@
|
|||
import { useState, useEffect } from 'react';
|
||||
|
||||
import { useApi } from 'soapbox/hooks';
|
||||
import { baseZapAccountSchema, ZapSplitData } from 'soapbox/schemas/zap-split';
|
||||
|
||||
import { type INewAccount } from '../../../features/admin/manage-zap-split';
|
||||
|
||||
export const useManageZapSplit = () => {
|
||||
const api = useApi();
|
||||
const [formattedData, setFormattedData] = useState<ZapSplitData[]>([]);
|
||||
const [weights, setWeights] = useState<{ [id: string]: number }>({});
|
||||
|
||||
const fetchZapSplitData = async () => {
|
||||
try {
|
||||
const { data } = await api.get<ZapSplitData[]>('/api/v1/ditto/zap_splits');
|
||||
if (data) {
|
||||
const normalizedData = data.map((dataSplit) => baseZapAccountSchema.parse(dataSplit));
|
||||
setFormattedData(normalizedData);
|
||||
|
||||
const initialWeights = normalizedData.reduce((acc, item) => {
|
||||
acc[item.account.id] = item.weight;
|
||||
return acc;
|
||||
}, {} as { [id: string]: number });
|
||||
setWeights(initialWeights);
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('Erro ao buscar Zap Split data:', error);
|
||||
}
|
||||
};
|
||||
|
||||
useEffect(() => {
|
||||
fetchZapSplitData();
|
||||
}, []);
|
||||
|
||||
const handleWeightChange = (accountId: string, newWeight: number) => {
|
||||
setWeights((prevWeights) => ({
|
||||
...prevWeights,
|
||||
[accountId]: newWeight,
|
||||
}));
|
||||
};
|
||||
|
||||
const sendNewSplit = async (newAccount?: INewAccount) => {
|
||||
try {
|
||||
const updatedZapSplits = formattedData.reduce((acc: { [id: string]: { message: string; weight: number } }, zapData) => {
|
||||
acc[zapData.account.id] = {
|
||||
message: zapData.message,
|
||||
weight: weights[zapData.account.id] || zapData.weight,
|
||||
};
|
||||
return acc;
|
||||
}, {});
|
||||
|
||||
if (newAccount) {
|
||||
updatedZapSplits[newAccount.acc] = {
|
||||
message: newAccount.message,
|
||||
weight: newAccount.weight,
|
||||
};
|
||||
}
|
||||
|
||||
console.log('Enviando Zap Split data com nova conta (se houver):', updatedZapSplits);
|
||||
|
||||
await api.put('/api/v1/admin/ditto/zap_splits', updatedZapSplits);
|
||||
|
||||
console.log('Dados enviados com sucesso:', updatedZapSplits);
|
||||
|
||||
await fetchZapSplitData();
|
||||
} catch (error) {
|
||||
console.error('Erro ao enviar Zap Split data:', error);
|
||||
}
|
||||
};
|
||||
|
||||
const removeAccount = async (accountId: string) => {
|
||||
const isToDelete = [(formattedData.find(item => item.account.id === accountId))?.account.id];
|
||||
|
||||
await api.delete('/api/v1/admin/ditto/zap_splits/', { data: isToDelete });
|
||||
await fetchZapSplitData();
|
||||
};
|
||||
|
||||
|
||||
return {
|
||||
formattedData,
|
||||
weights,
|
||||
handleWeightChange,
|
||||
sendNewSplit,
|
||||
removeAccount,
|
||||
};
|
||||
};
|
Loading…
Reference in New Issue