59 lines
1.5 KiB
TypeScript
59 lines
1.5 KiB
TypeScript
|
|
import { useState, useCallback } from 'react';
|
||
|
|
import { useToast } from '@/components/feedback/ToastProvider';
|
||
|
|
import type { WebhookItem } from './types';
|
||
|
|
|
||
|
|
export function useConnectivityView() {
|
||
|
|
const { addToast } = useToast();
|
||
|
|
const [webdavPass, setWebdavPass] = useState('****');
|
||
|
|
const [webhooks, setWebhooks] = useState<WebhookItem[]>([
|
||
|
|
{
|
||
|
|
id: '1',
|
||
|
|
url: 'https://api.myapp.com/hooks/veza',
|
||
|
|
events: ['file.upload', 'file.delete'],
|
||
|
|
},
|
||
|
|
]);
|
||
|
|
const [newHookUrl, setNewHookUrl] = useState('');
|
||
|
|
|
||
|
|
const generateWebdavPass = useCallback(() => {
|
||
|
|
setWebdavPass(`wd-${Math.random().toString(36).substring(2, 12)}`);
|
||
|
|
addToast('New WebDAV password generated', 'success');
|
||
|
|
}, [addToast]);
|
||
|
|
|
||
|
|
const addWebhook = useCallback(() => {
|
||
|
|
if (!newHookUrl.trim()) return;
|
||
|
|
setWebhooks((prev) => [
|
||
|
|
...prev,
|
||
|
|
{
|
||
|
|
id: Date.now().toString(),
|
||
|
|
url: newHookUrl.trim(),
|
||
|
|
events: ['file.upload'],
|
||
|
|
},
|
||
|
|
]);
|
||
|
|
setNewHookUrl('');
|
||
|
|
addToast('Webhook endpoint added', 'success');
|
||
|
|
}, [newHookUrl, addToast]);
|
||
|
|
|
||
|
|
const removeWebhook = useCallback((id: string) => {
|
||
|
|
setWebhooks((prev) => prev.filter((h) => h.id !== id));
|
||
|
|
}, []);
|
||
|
|
|
||
|
|
const copyToClipboard = useCallback(
|
||
|
|
(text: string) => {
|
||
|
|
navigator.clipboard.writeText(text);
|
||
|
|
addToast('Copied to clipboard');
|
||
|
|
},
|
||
|
|
[addToast],
|
||
|
|
);
|
||
|
|
|
||
|
|
return {
|
||
|
|
webdavPass,
|
||
|
|
webhooks,
|
||
|
|
newHookUrl,
|
||
|
|
setNewHookUrl,
|
||
|
|
generateWebdavPass,
|
||
|
|
addWebhook,
|
||
|
|
removeWebhook,
|
||
|
|
copyToClipboard,
|
||
|
|
};
|
||
|
|
}
|