Files
family_budget/frontend/src/hooks/useInviteLink.ts
2026-01-29 15:32:22 +03:00

84 lines
2.0 KiB
TypeScript

import { useState, useEffect, useCallback } from 'react';
import { inviteService } from '../services';
import type { InviteLinkResponse, CreateInviteLinkRequest } from '../types';
import { showToast } from '../utils/toast';
import { showErrorToast } from '../utils/errorHandler';
export function useInviteLink() {
const [links, setLinks] = useState<InviteLinkResponse[]>([]);
const [loading, setLoading] = useState(false);
const [error, setError] = useState<Error | null>(null);
const loadLinks = useCallback(async () => {
try {
setLoading(true);
setError(null);
const data = await inviteService.getMyLinks();
setLinks(data);
} catch (err) {
setError(err as Error);
showErrorToast(err);
} finally {
setLoading(false);
}
}, []);
useEffect(() => {
loadLinks();
}, [loadLinks]);
const createLink = useCallback(async (data: CreateInviteLinkRequest) => {
try {
const link = await inviteService.create(data);
showToast.success('Invite link created successfully');
await loadLinks();
return link;
} catch (err) {
showErrorToast(err);
throw err;
}
}, [loadLinks]);
const deleteLink = useCallback(async (token: string) => {
try {
await inviteService.delete(token);
showToast.success('Invite link deleted successfully');
await loadLinks();
} catch (err) {
showErrorToast(err);
throw err;
}
}, [loadLinks]);
const validateLink = useCallback(async (token: string) => {
try {
return await inviteService.validate(token);
} catch (err) {
showErrorToast(err);
throw err;
}
}, []);
const joinFamily = useCallback(async (token: string) => {
try {
const result = await inviteService.join(token);
showToast.success(result.message);
return result;
} catch (err) {
showErrorToast(err);
throw err;
}
}, []);
return {
links,
loading,
error,
loadLinks,
createLink,
deleteLink,
validateLink,
joinFamily,
};
}