File size: 1,930 Bytes
2c28af1
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
/**
 * SSE stream for /api/generate-sequences — usable from wizard or dashboard.
 */
export function buildGenerateSequencesUrl(fileId, { reset = false, preview = false, contactLimit = null } = {}) {
    const params = new URLSearchParams({
        file_id: fileId,
        reset: reset ? '1' : '0',
    });
    if (preview) params.set('preview', '1');
    if (contactLimit != null && contactLimit > 0) {
        params.set('contact_limit', String(contactLimit));
    }
    return `/api/generate-sequences?${params.toString()}`;
}

export function openCampaignGenerationStream(fileId, options, handlers = {}) {
    const url = buildGenerateSequencesUrl(fileId, options);
    const es = new EventSource(url);

    es.onmessage = (event) => {
        try {
            const data = JSON.parse(event.data);
            if (data.type === 'sequence' && handlers.onSequence) {
                handlers.onSequence(data.sequence);
            } else if (data.type === 'progress' && typeof data.progress === 'number' && handlers.onProgress) {
                handlers.onProgress(data.progress);
            } else if (data.type === 'phase' && handlers.onPhase) {
                handlers.onPhase(data.phase);
            } else if (data.type === 'preview_complete') {
                if (handlers.onPreviewComplete) handlers.onPreviewComplete();
                es.close();
            } else if (data.type === 'complete') {
                if (handlers.onComplete) handlers.onComplete();
                es.close();
            } else if (data.type === 'error') {
                if (handlers.onError) handlers.onError(data.error || 'Generation failed');
                es.close();
            }
        } catch (e) {
            if (handlers.onError) handlers.onError(String(e));
        }
    };

    es.onerror = () => {
        if (handlers.onError) handlers.onError('Connection lost');
        es.close();
    };

    return es;
}