From 0c02ad8a518ba4979d12e916727e36de67fbe2e5 Mon Sep 17 00:00:00 2001 From: phoenix Date: Mon, 29 Jun 2026 15:47:27 -0400 Subject: [PATCH 01/10] Adding code to create scheduled message --- src/api/scheduleApi.js | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 src/api/scheduleApi.js diff --git a/src/api/scheduleApi.js b/src/api/scheduleApi.js new file mode 100644 index 0000000..76927c2 --- /dev/null +++ b/src/api/scheduleApi.js @@ -0,0 +1,35 @@ +import { API_BASE_URL } from '../constants/api'; + +export const scheduleApi = { + scheduleMessage: async (s, authBearerToken) => { + console.log('Scheduling message'); + const reqBody = { + scheduled: s.scheduedTime.toISOString(), + status: s.status, + user_id: s.userId, + }; + + console.log(`Request body: ${reqBody}`); + const response = await fetch(`${API_BASE_URL}/api/v1/schedule/message`, + { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + Authorization: authBearerToken, + }, + body: JSON.stringify(reqBody) + }); + + if (!response.ok) { + throw new Error('Error scheduling message'); + } else { + return response.json(); + } + } +}; + +/* + * "scheduled": "{{scheduling_time}}", + "status": "{{status_pending}}", + "user_id": "{{user_id}}" +*/ -- 2.47.3 From 795a75697507dc5332a8ef8572dbab48a41bdf0a Mon Sep 17 00:00:00 2001 From: phoenix Date: Mon, 29 Jun 2026 15:50:55 -0400 Subject: [PATCH 02/10] Adding code to create scheduled message event --- src/api/scheduleEventApi.js | 39 +++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 src/api/scheduleEventApi.js diff --git a/src/api/scheduleEventApi.js b/src/api/scheduleEventApi.js new file mode 100644 index 0000000..7cfe8b8 --- /dev/null +++ b/src/api/scheduleEventApi.js @@ -0,0 +1,39 @@ +import { API_BASE_URL } from '../constants/api'; + +export const scheduleEventApi = { + scheduleMessageEvent: async (s, authBearerToken) => { + console.log('Scheduling message Event'); + const reqBody = { + contact_id: s.contactId, + message_id: s.messageId, + scheduled_message_id: s.scheduledMessageId, + }; + + console.log(`Request body: ${reqBody}`); + const response = await fetch(`${API_BASE_URL}/api/v1/schedule/message/event`, + { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + Authorization: authBearerToken, + }, + body: JSON.stringify(reqBody) + }); + + if (!response.ok) { + throw new Error('Error scheduling message event'); + } else { + return response.json(); + } + } +}; + +/* + + +{ + "contact_id": "{{contact_id}}", + "message_id": "{{message_id}}", + "scheduled_message_id": "{{scheduled_message_id}}" +} +*/ -- 2.47.3 From 53016512e08aec1cb985d42ff5bb424be7d30722 Mon Sep 17 00:00:00 2001 From: phoenix Date: Mon, 29 Jun 2026 15:51:26 -0400 Subject: [PATCH 03/10] Code formatting --- src/api/scheduleApi.js | 45 +++++++++++++++++----------------- src/api/scheduleEventApi.js | 48 +++++++++++++++++++------------------ 2 files changed, 47 insertions(+), 46 deletions(-) diff --git a/src/api/scheduleApi.js b/src/api/scheduleApi.js index 76927c2..140ae9c 100644 --- a/src/api/scheduleApi.js +++ b/src/api/scheduleApi.js @@ -1,31 +1,30 @@ import { API_BASE_URL } from '../constants/api'; export const scheduleApi = { - scheduleMessage: async (s, authBearerToken) => { - console.log('Scheduling message'); - const reqBody = { - scheduled: s.scheduedTime.toISOString(), - status: s.status, - user_id: s.userId, - }; + scheduleMessage: async (s, authBearerToken) => { + console.log('Scheduling message'); + const reqBody = { + scheduled: s.scheduedTime.toISOString(), + status: s.status, + user_id: s.userId, + }; - console.log(`Request body: ${reqBody}`); - const response = await fetch(`${API_BASE_URL}/api/v1/schedule/message`, - { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - Authorization: authBearerToken, - }, - body: JSON.stringify(reqBody) - }); + console.log(`Request body: ${reqBody}`); + const response = await fetch(`${API_BASE_URL}/api/v1/schedule/message`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + Authorization: authBearerToken, + }, + body: JSON.stringify(reqBody), + }); - if (!response.ok) { - throw new Error('Error scheduling message'); - } else { - return response.json(); - } - } + if (!response.ok) { + throw new Error('Error scheduling message'); + } else { + return response.json(); + } + }, }; /* diff --git a/src/api/scheduleEventApi.js b/src/api/scheduleEventApi.js index 7cfe8b8..06f9545 100644 --- a/src/api/scheduleEventApi.js +++ b/src/api/scheduleEventApi.js @@ -1,31 +1,33 @@ import { API_BASE_URL } from '../constants/api'; export const scheduleEventApi = { - scheduleMessageEvent: async (s, authBearerToken) => { - console.log('Scheduling message Event'); - const reqBody = { - contact_id: s.contactId, - message_id: s.messageId, - scheduled_message_id: s.scheduledMessageId, - }; + scheduleMessageEvent: async (s, authBearerToken) => { + console.log('Scheduling message Event'); + const reqBody = { + contact_id: s.contactId, + message_id: s.messageId, + scheduled_message_id: s.scheduledMessageId, + }; - console.log(`Request body: ${reqBody}`); - const response = await fetch(`${API_BASE_URL}/api/v1/schedule/message/event`, - { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - Authorization: authBearerToken, - }, - body: JSON.stringify(reqBody) - }); + console.log(`Request body: ${reqBody}`); + const response = await fetch( + `${API_BASE_URL}/api/v1/schedule/message/event`, + { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + Authorization: authBearerToken, + }, + body: JSON.stringify(reqBody), + } + ); - if (!response.ok) { - throw new Error('Error scheduling message event'); - } else { - return response.json(); - } - } + if (!response.ok) { + throw new Error('Error scheduling message event'); + } else { + return response.json(); + } + }, }; /* -- 2.47.3 From cea2d0cf42dbfd68f78d6b7b427e77ac85ae20a6 Mon Sep 17 00:00:00 2001 From: phoenix Date: Mon, 29 Jun 2026 15:57:40 -0400 Subject: [PATCH 04/10] Added code to update scheduled message status --- src/api/scheduleApi.js | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/src/api/scheduleApi.js b/src/api/scheduleApi.js index 140ae9c..5290b7a 100644 --- a/src/api/scheduleApi.js +++ b/src/api/scheduleApi.js @@ -25,6 +25,34 @@ export const scheduleApi = { return response.json(); } }, + + prepareMessage: async (req, authBearerToken) => { + console.log('Preparing Scheduled message'); + const reqBody = { + scheduled_message_id: req.scheduledMessageId, + status: req.status, + }; + + console.log(`Request body: ${reqBody}`); + + const response = await fetch( + `${API_BASE_URL}/api/v1/schedule/status/message/update`, + { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + Authorization: authBearerToken, + }, + body: JSON.stringify(reqBody), + } + ); + + if (!response.ok) { + throw new Error('Error updating status of scheduled message'); + } else { + return response.json(); + } + }, }; /* @@ -32,3 +60,13 @@ export const scheduleApi = { "status": "{{status_pending}}", "user_id": "{{user_id}}" */ + +/* + * + * + * { + "scheduled_message_id": "{{scheduled_message_id}}", + "status": "{{status_ready}}" +} + * + */ -- 2.47.3 From 55d54d3810495c02d2371530983e21715a2e3e20 Mon Sep 17 00:00:00 2001 From: phoenix Date: Mon, 29 Jun 2026 16:53:39 -0400 Subject: [PATCH 05/10] Added checkbox to trigger scheduling form --- .../SendMessageWizard/MessageForm.jsx | 20 +++++++++++++++++- .../SendMessageWizardModal.jsx | 1 + .../SendMessageWizard/useSendMessageWizard.js | 21 +++++++++++++++++++ 3 files changed, 41 insertions(+), 1 deletion(-) diff --git a/src/components/SendMessageWizard/MessageForm.jsx b/src/components/SendMessageWizard/MessageForm.jsx index 8e81591..cfa8e52 100644 --- a/src/components/SendMessageWizard/MessageForm.jsx +++ b/src/components/SendMessageWizard/MessageForm.jsx @@ -3,9 +3,10 @@ import styles from './SendMessageWizard.module.css'; import { tokenService } from '../../services/TokenService'; import { messageApi, CreateMessageRequest } from '../../api/messageApi'; -function MessageForm({ message, onMessageChange, onMessageCreated }) { +function MessageForm({ message, onMessageChange, onMessageCreated, onToggleScheduled }) { const [characterCount, setCharacterCount] = useState(message.length); const [isCreatingMessage, setIsCreatingMessage] = useState(false); + const [isScheduledChecked, setIsScheduledChecked] = useState(false); const [createdMessage, setCreatedMessage] = useState(null); const handleMessageChange = (e) => { @@ -14,6 +15,12 @@ function MessageForm({ message, onMessageChange, onMessageCreated }) { setCharacterCount(newMessage.length); }; + const handleIsScheduledCheckbox = (event) => { + console.log('Doing something to the checkbox'); + setIsScheduledChecked(event.target.checked); + onToggleScheduled(event.target.checked); + }; + const createMessage = async () => { if (!message.trim()) { return; @@ -97,6 +104,17 @@ function MessageForm({ message, onMessageChange, onMessageCreated }) {
  • Check spelling and grammar
  • +
    + +
    ); } diff --git a/src/components/SendMessageWizard/SendMessageWizardModal.jsx b/src/components/SendMessageWizard/SendMessageWizardModal.jsx index 01551e1..1f40c06 100644 --- a/src/components/SendMessageWizard/SendMessageWizardModal.jsx +++ b/src/components/SendMessageWizard/SendMessageWizardModal.jsx @@ -26,6 +26,7 @@ function SendMessageWizardModal({ isOpen, onClose, onComplete }) { message={wizard.message} onMessageChange={wizard.setMessage} onMessageCreated={wizard.setCreatedMessage} + onToggleScheduled={wizard.toggleScheduled} /> ); case 'confirm': diff --git a/src/components/SendMessageWizard/useSendMessageWizard.js b/src/components/SendMessageWizard/useSendMessageWizard.js index a717f38..d086b91 100644 --- a/src/components/SendMessageWizard/useSendMessageWizard.js +++ b/src/components/SendMessageWizard/useSendMessageWizard.js @@ -13,6 +13,7 @@ const useSendMessageWizard = () => { message: '', createdMessage: null, isSubmitting: false, + isScheduled: false, submissionError: null, }); @@ -44,6 +45,14 @@ const useSendMessageWizard = () => { })); }; + const toggleScheduled = (scheduled) => { + console.log('Yup'); + setState((prev) => ({ + ...prev, + isScheduled: scheduled + })); + }; + const setMessage = (message) => { setState((prev) => ({ ...prev, message })); }; @@ -56,6 +65,13 @@ const useSendMessageWizard = () => { const nextStep = () => { if (!canProceedToNextStep()) return; + console.log('Going to next step'); + console.log(state.isScheduled); + + if (state.isScheduled) { + console.log('Scheduled Checked'); + } + const stepOrder = ['select', 'message', 'confirm', 'result']; const currentIndex = stepOrder.indexOf(state.step); if (currentIndex < stepOrder.length - 1) { @@ -109,6 +125,7 @@ const useSendMessageWizard = () => { ...prev, step: 'result', isSubmitting: false, + isScheduled: false, })); } } catch (error) { @@ -121,6 +138,7 @@ const useSendMessageWizard = () => { ...prev, submissionError: error.message || 'Failed to send messages', isSubmitting: false, + isScheduled: false, })); } }; @@ -133,6 +151,7 @@ const useSendMessageWizard = () => { message: '', createdMessage: null, isSubmitting: false, + isScheduled: false, submissionError: null, }); }; @@ -149,12 +168,14 @@ const useSendMessageWizard = () => { message: state.message, createdMessage: state.createdMessage, isSubmitting: state.isSubmitting, + isScheduled: state.isScheduled, submissionError: state.submissionError, canProceedToNextStep: canProceedToNextStep(), canGoBack, // Actions toggleContact, + toggleScheduled, setMessage, setCreatedMessage, nextStep, -- 2.47.3 From 46f96fc4235f18eacea69d6c1ae3b02707e114a7 Mon Sep 17 00:00:00 2001 From: phoenix Date: Mon, 29 Jun 2026 17:01:52 -0400 Subject: [PATCH 06/10] Added schedule step. Need to add form --- .../SendMessageWizard/MessageForm.jsx | 9 +++++++-- .../SendMessageWizardModal.jsx | 3 +++ .../SendMessageWizard/StepNavigation.jsx | 19 +++++++++++++++++++ .../SendMessageWizard/useSendMessageWizard.js | 12 +++++++++--- 4 files changed, 38 insertions(+), 5 deletions(-) diff --git a/src/components/SendMessageWizard/MessageForm.jsx b/src/components/SendMessageWizard/MessageForm.jsx index cfa8e52..ff1c036 100644 --- a/src/components/SendMessageWizard/MessageForm.jsx +++ b/src/components/SendMessageWizard/MessageForm.jsx @@ -3,7 +3,12 @@ import styles from './SendMessageWizard.module.css'; import { tokenService } from '../../services/TokenService'; import { messageApi, CreateMessageRequest } from '../../api/messageApi'; -function MessageForm({ message, onMessageChange, onMessageCreated, onToggleScheduled }) { +function MessageForm({ + message, + onMessageChange, + onMessageCreated, + onToggleScheduled, +}) { const [characterCount, setCharacterCount] = useState(message.length); const [isCreatingMessage, setIsCreatingMessage] = useState(false); const [isScheduledChecked, setIsScheduledChecked] = useState(false); @@ -106,7 +111,7 @@ function MessageForm({ message, onMessageChange, onMessageCreated, onToggleSched
    + { /* Scheduled time Section */} +
    + Scheduled time: {scheduledTime ? scheduledTime.toISOString() : 'No schedule date'} +
    + {/* Summary Section */}
    diff --git a/src/components/SendMessageWizard/FutureTimeForm.jsx b/src/components/SendMessageWizard/FutureTimeForm.jsx new file mode 100644 index 0000000..b6068a0 --- /dev/null +++ b/src/components/SendMessageWizard/FutureTimeForm.jsx @@ -0,0 +1,89 @@ +import React, { useState } from 'react'; + +function FutureTimeForm({scheduledTime, setScheduledTime}) { + const [selectedTime, setSelectedTime] = useState(new Date()); + const [error, setError] = useState(''); + const [success, setSuccess] = useState(''); + + const handleTimeChange = (e) => { + setSelectedTime(e.target.value); + setScheduledTime(new Date(e.target.value)); + // Clear errors when user starts typing again + console.log(`Scheduled Time: ${scheduledTime}`) + console.log(`Selected Time: ${selectedTime}`) + setError(''); + setSuccess(''); + }; + + const validateAndSubmit = (e) => { + e.preventDefault(); + + if (!selectedTime) { + setError('Please select a date and time.'); + return; + } + + console.log(`Time: ${selectedTime}`) + + const now = new Date(); + const inputDate = new Date(selectedTime); + + // Calculate the minimum allowed time (Now + 10 minutes) + const minAllowedTime = new Date(now.getTime() + 10 * 60000); + + if (inputDate < minAllowedTime) { + setError('The time must be at least 10 minutes in the future.'); + setSuccess(''); + setScheduledTime(null); + } else { + setError(''); + setSuccess('Time validated successfully!'); + setScheduledTime(inputDate); + console.log('Form submitted with time (selected):', selectedTime); + console.log('Form submitted with time (scheduled):', scheduledTime); + } + }; + + return ( +
    +

    Schedule Event

    +
    +
    + + +
    + + {error &&

    {error}

    } + {success &&

    {success}

    } + + +
    +
    + ); +}; + +export default FutureTimeForm; diff --git a/src/components/SendMessageWizard/SendMessageWizardModal.jsx b/src/components/SendMessageWizard/SendMessageWizardModal.jsx index d7d39fc..dfdedd0 100644 --- a/src/components/SendMessageWizard/SendMessageWizardModal.jsx +++ b/src/components/SendMessageWizard/SendMessageWizardModal.jsx @@ -1,5 +1,6 @@ import React from 'react'; import ContactSelection from './ContactSelection'; +import FutureTimeForm from './FutureTimeForm'; import MessageForm from './MessageForm'; import ConfirmationStep from './ConfirmationStep'; import StepNavigation from './StepNavigation'; @@ -31,12 +32,19 @@ function SendMessageWizardModal({ isOpen, onClose, onComplete }) { ); case 'schedule': // TODO: Add form for schedule step + return ( + + ); case 'confirm': return ( ); diff --git a/src/components/SendMessageWizard/StepNavigation.jsx b/src/components/SendMessageWizard/StepNavigation.jsx index a961417..d81a148 100644 --- a/src/components/SendMessageWizard/StepNavigation.jsx +++ b/src/components/SendMessageWizard/StepNavigation.jsx @@ -49,7 +49,7 @@ function StepNavigation({ disabled={!canProceed} className={`${styles.navButton} ${styles.nextButton}`} > - {currentStep === 'select' ? 'Next' : 'Review'} + {currentStep === 'schedule' ? 'Next' : 'Review'} ); diff --git a/src/components/SendMessageWizard/useSendMessageWizard.js b/src/components/SendMessageWizard/useSendMessageWizard.js index 5785bf5..d1b02cc 100644 --- a/src/components/SendMessageWizard/useSendMessageWizard.js +++ b/src/components/SendMessageWizard/useSendMessageWizard.js @@ -10,6 +10,7 @@ const useSendMessageWizard = () => { const [state, setState] = useState({ step: 'select', selectedContacts: [], + scheduledTime: null, message: '', createdMessage: null, isSubmitting: false, @@ -28,13 +29,26 @@ const useSendMessageWizard = () => { return state.message.trim().length > 0; case 'schedule': // TODO: Handle this - return false; + // return state.scheduledTime != null; + console.log('Checking to see if schedule can go to the next step'); + console.log(state.scheduledTime); + console.log(state.message); + // const result = state.scheduledTime instanceof Date && isNaN(state.scheduledTime.getTime()); + if (state.scheduledTime == null) { + return false; + } + console.log('Scheduled time is not null'); + // const result = isNaN(state.scheduledTime.getTime()); + const result = state.scheduledTime instanceof Date && isNaN(state.scheduledTime.getTime()); + console.log(result); + console.log(state.scheduledTime); + return !result; case 'confirm': return true; default: return false; } - }, [state.step, state.selectedContacts.length, state.message]); + }, [state.step, state.selectedContacts.length, state.message, state.scheduledTime]); const canGoBack = state.step !== 'select'; @@ -65,6 +79,11 @@ const useSendMessageWizard = () => { setState((prev) => ({ ...prev, createdMessage: message })); }; + const setScheduledTime = (selectedTime) => { + console.log('Setting scheduled time'); + setState((prev) => ({ ...prev, scheduledTime: selectedTime })); + }; + const nextStep = () => { if (!canProceedToNextStep()) return; @@ -75,16 +94,34 @@ const useSendMessageWizard = () => { console.log('Scheduled Checked'); } + console.log(`Step: ${state.step}`); + // TODO: Handle navigation for schedule form const stepOrder = ['select', 'message', 'schedule', 'confirm', 'result']; const currentIndex = stepOrder.indexOf(state.step); if (currentIndex < stepOrder.length - 1) { - setState((prev) => ({ - ...prev, - step: stepOrder[currentIndex + 1], - submissionError: null, - })); + if (state.step === 'message') { + if (state.isScheduled) { + setState((prev) => ({ + ...prev, + step: stepOrder[currentIndex + 1], + submissionError: null, + })); + } else { + setState((prev) => ({ + ...prev, + step: stepOrder[currentIndex + 2], + submissionError: null, + })); + } + } else { + setState((prev) => ({ + ...prev, + step: stepOrder[currentIndex + 1], + submissionError: null, + })); + } } }; @@ -92,12 +129,30 @@ const useSendMessageWizard = () => { // TODO: Handle navigation for schedule form const stepOrder = ['select', 'message', 'schedule', 'confirm', 'result']; const currentIndex = stepOrder.indexOf(state.step); + console.log(`Stepping back: ${state.step} isSheduled: ${state.isScheduled}`); + if (currentIndex > 0) { - setState((prev) => ({ - ...prev, - step: stepOrder[currentIndex - 1], - submissionError: null, - })); + if (state.step === 'confirm') { + if (state.isScheduled) { + setState((prev) => ({ + ...prev, + step: stepOrder[currentIndex - 1], + submissionError: null, + })); + } else { + setState((prev) => ({ + ...prev, + step: stepOrder[currentIndex - 2], + submissionError: null, + })); + } + } else { + setState((prev) => ({ + ...prev, + step: stepOrder[currentIndex - 1], + submissionError: null, + })); + } } }; @@ -132,6 +187,7 @@ const useSendMessageWizard = () => { step: 'result', isSubmitting: false, isScheduled: false, + scheduledTime: null, })); } } catch (error) { @@ -145,6 +201,7 @@ const useSendMessageWizard = () => { submissionError: error.message || 'Failed to send messages', isSubmitting: false, isScheduled: false, + scheduledTime: null, })); } }; @@ -154,6 +211,7 @@ const useSendMessageWizard = () => { setState({ step: 'select', selectedContacts: [], + scheduledTime: null, message: '', createdMessage: null, isSubmitting: false, @@ -171,6 +229,7 @@ const useSendMessageWizard = () => { // Getters currentStep: state.step, selectedContacts: state.selectedContacts, + scheduledTime: state.scheduledTime, message: state.message, createdMessage: state.createdMessage, isSubmitting: state.isSubmitting, @@ -184,6 +243,7 @@ const useSendMessageWizard = () => { toggleScheduled, setMessage, setCreatedMessage, + setScheduledTime, nextStep, prevStep, submit, -- 2.47.3 From edbae3ffdf3fbb00214ab4788bd2c2ce6ec02b35 Mon Sep 17 00:00:00 2001 From: phoenix Date: Tue, 30 Jun 2026 11:44:23 -0400 Subject: [PATCH 08/10] Got the message scheduling working --- src/api/scheduleApi.js | 20 +--- src/api/scheduleEventApi.js | 7 +- .../SendMessageWizard/useSendMessageWizard.js | 93 +++++++++++++++---- 3 files changed, 79 insertions(+), 41 deletions(-) diff --git a/src/api/scheduleApi.js b/src/api/scheduleApi.js index 5290b7a..cb8b27a 100644 --- a/src/api/scheduleApi.js +++ b/src/api/scheduleApi.js @@ -1,15 +1,10 @@ import { API_BASE_URL } from '../constants/api'; export const scheduleApi = { - scheduleMessage: async (s, authBearerToken) => { + scheduleMessage: async (reqBody, authBearerToken) => { console.log('Scheduling message'); - const reqBody = { - scheduled: s.scheduedTime.toISOString(), - status: s.status, - user_id: s.userId, - }; - console.log(`Request body: ${reqBody}`); + const response = await fetch(`${API_BASE_URL}/api/v1/schedule/message`, { method: 'POST', headers: { @@ -26,19 +21,14 @@ export const scheduleApi = { } }, - prepareMessage: async (req, authBearerToken) => { + prepareMessage: async (reqBody, authBearerToken) => { console.log('Preparing Scheduled message'); - const reqBody = { - scheduled_message_id: req.scheduledMessageId, - status: req.status, - }; - console.log(`Request body: ${reqBody}`); const response = await fetch( - `${API_BASE_URL}/api/v1/schedule/status/message/update`, + `${API_BASE_URL}/api/v1/schedule/message/status/update`, { - method: 'POST', + method: 'PATCH', headers: { 'Content-Type': 'application/json', Authorization: authBearerToken, diff --git a/src/api/scheduleEventApi.js b/src/api/scheduleEventApi.js index 06f9545..434962a 100644 --- a/src/api/scheduleEventApi.js +++ b/src/api/scheduleEventApi.js @@ -1,13 +1,8 @@ import { API_BASE_URL } from '../constants/api'; export const scheduleEventApi = { - scheduleMessageEvent: async (s, authBearerToken) => { + scheduleMessageEvent: async (reqBody, authBearerToken) => { console.log('Scheduling message Event'); - const reqBody = { - contact_id: s.contactId, - message_id: s.messageId, - scheduled_message_id: s.scheduledMessageId, - }; console.log(`Request body: ${reqBody}`); const response = await fetch( diff --git a/src/components/SendMessageWizard/useSendMessageWizard.js b/src/components/SendMessageWizard/useSendMessageWizard.js index d1b02cc..da27c83 100644 --- a/src/components/SendMessageWizard/useSendMessageWizard.js +++ b/src/components/SendMessageWizard/useSendMessageWizard.js @@ -5,6 +5,8 @@ import { sendMessageApi, SendInstantMessageRequest, } from '../../api/sendMessageApi'; +import { scheduleApi } from '../../api/scheduleApi.js'; +import { scheduleEventApi } from '../../api/scheduleEventApi.js'; const useSendMessageWizard = () => { const [state, setState] = useState({ @@ -168,27 +170,78 @@ const useSendMessageWizard = () => { })); try { - console.log('Sending message'); - let reqBod = new SendInstantMessageRequest(); - reqBod.user_id = tokenService.getUserId(); - reqBod.message_id = state.createdMessage.id; - state.selectedContacts.forEach((selectedContact) => { - reqBod.contact_ids.push(selectedContact); - }); - const response = await sendMessageApi.sendInstantMessage( - reqBod, - tokenService.bearerToken() - ); + if (state.scheduledTime != null) { + console.log('Going to schedule message'); + // TODO: Put code here to schedule message + const schMsgReq = { + scheduled: state.scheduledTime.toISOString(), + status: 'PENDING', + user_id: tokenService.getUserId() + }; - if (response) { - // Success - move to result step - setState((prev) => ({ - ...prev, - step: 'result', - isSubmitting: false, - isScheduled: false, - scheduledTime: null, - })); + console.log(schMsgReq); + + const token = tokenService.bearerToken(); + + const schMsgResponse = await scheduleApi.scheduleMessage(schMsgReq, token); + console.log(schMsgResponse); + + if (schMsgResponse) { + console.log('Message scheduled'); + + const scheduledMessageId = schMsgResponse.data[0].id; + for (let contact of state.selectedContacts) { + let schMsgEvtReq = { + contact_id: contact, + message_id:state.createdMessage.id, + scheduled_message_id: scheduledMessageId, + }; + console.log(schMsgEvtReq); + const schMsgEvtResponse = await scheduleEventApi.scheduleMessageEvent(schMsgEvtReq, token); + console.log(schMsgEvtResponse); + } + + console.log('Updating message status'); + const req = { + scheduled_message_id: scheduledMessageId, + status: 'READY' + }; + console.log(req); + const response = await scheduleApi.prepareMessage(req, token); + if (response) { + console.log('Message scheduled'); + setState((prev) => ({ + ...prev, + step: 'result', + isSubmitting: false, + isScheduled: false, + scheduledTime: null, + })); + } + } + } else { + console.log('Sending message'); + let reqBod = new SendInstantMessageRequest(); + reqBod.user_id = tokenService.getUserId(); + reqBod.message_id = state.createdMessage.id; + state.selectedContacts.forEach((selectedContact) => { + reqBod.contact_ids.push(selectedContact); + }); + const response = await sendMessageApi.sendInstantMessage( + reqBod, + tokenService.bearerToken() + ); + + if (response) { + // Success - move to result step + setState((prev) => ({ + ...prev, + step: 'result', + isSubmitting: false, + isScheduled: false, + scheduledTime: null, + })); + } } } catch (error) { if (error.name === 'AbortError') { -- 2.47.3 From a12dc77e128832e747732f3993c404284a6ab7d6 Mon Sep 17 00:00:00 2001 From: phoenix Date: Tue, 30 Jun 2026 12:11:53 -0400 Subject: [PATCH 09/10] Code cleanup --- src/api/scheduleApi.js | 18 ------ src/api/scheduleEventApi.js | 11 ---- .../SendMessageWizard/ConfirmationStep.jsx | 5 +- .../SendMessageWizard/FutureTimeForm.jsx | 62 +++++++++---------- .../SendMessageWizard/MessageForm.jsx | 3 - .../SendMessageWizardModal.jsx | 5 +- .../SendMessageWizard/useSendMessageWizard.js | 58 +++++++---------- 7 files changed, 58 insertions(+), 104 deletions(-) diff --git a/src/api/scheduleApi.js b/src/api/scheduleApi.js index cb8b27a..dd6630e 100644 --- a/src/api/scheduleApi.js +++ b/src/api/scheduleApi.js @@ -3,7 +3,6 @@ import { API_BASE_URL } from '../constants/api'; export const scheduleApi = { scheduleMessage: async (reqBody, authBearerToken) => { console.log('Scheduling message'); - console.log(`Request body: ${reqBody}`); const response = await fetch(`${API_BASE_URL}/api/v1/schedule/message`, { method: 'POST', @@ -23,7 +22,6 @@ export const scheduleApi = { prepareMessage: async (reqBody, authBearerToken) => { console.log('Preparing Scheduled message'); - console.log(`Request body: ${reqBody}`); const response = await fetch( `${API_BASE_URL}/api/v1/schedule/message/status/update`, @@ -44,19 +42,3 @@ export const scheduleApi = { } }, }; - -/* - * "scheduled": "{{scheduling_time}}", - "status": "{{status_pending}}", - "user_id": "{{user_id}}" -*/ - -/* - * - * - * { - "scheduled_message_id": "{{scheduled_message_id}}", - "status": "{{status_ready}}" -} - * - */ diff --git a/src/api/scheduleEventApi.js b/src/api/scheduleEventApi.js index 434962a..662f6b0 100644 --- a/src/api/scheduleEventApi.js +++ b/src/api/scheduleEventApi.js @@ -4,7 +4,6 @@ export const scheduleEventApi = { scheduleMessageEvent: async (reqBody, authBearerToken) => { console.log('Scheduling message Event'); - console.log(`Request body: ${reqBody}`); const response = await fetch( `${API_BASE_URL}/api/v1/schedule/message/event`, { @@ -24,13 +23,3 @@ export const scheduleEventApi = { } }, }; - -/* - - -{ - "contact_id": "{{contact_id}}", - "message_id": "{{message_id}}", - "scheduled_message_id": "{{scheduled_message_id}}" -} -*/ diff --git a/src/components/SendMessageWizard/ConfirmationStep.jsx b/src/components/SendMessageWizard/ConfirmationStep.jsx index 9122f94..6b6873b 100644 --- a/src/components/SendMessageWizard/ConfirmationStep.jsx +++ b/src/components/SendMessageWizard/ConfirmationStep.jsx @@ -89,9 +89,10 @@ function ConfirmationStep({
    - { /* Scheduled time Section */} + {/* Scheduled time Section */}
    - Scheduled time: {scheduledTime ? scheduledTime.toISOString() : 'No schedule date'} + Scheduled time:{' '} + {scheduledTime ? scheduledTime.toISOString() : 'No schedule date'}
    {/* Summary Section */} diff --git a/src/components/SendMessageWizard/FutureTimeForm.jsx b/src/components/SendMessageWizard/FutureTimeForm.jsx index b6068a0..914ec90 100644 --- a/src/components/SendMessageWizard/FutureTimeForm.jsx +++ b/src/components/SendMessageWizard/FutureTimeForm.jsx @@ -1,6 +1,6 @@ import React, { useState } from 'react'; -function FutureTimeForm({scheduledTime, setScheduledTime}) { +function FutureTimeForm({ scheduledTime, setScheduledTime }) { const [selectedTime, setSelectedTime] = useState(new Date()); const [error, setError] = useState(''); const [success, setSuccess] = useState(''); @@ -8,9 +8,6 @@ function FutureTimeForm({scheduledTime, setScheduledTime}) { const handleTimeChange = (e) => { setSelectedTime(e.target.value); setScheduledTime(new Date(e.target.value)); - // Clear errors when user starts typing again - console.log(`Scheduled Time: ${scheduledTime}`) - console.log(`Selected Time: ${selectedTime}`) setError(''); setSuccess(''); }; @@ -23,11 +20,9 @@ function FutureTimeForm({scheduledTime, setScheduledTime}) { return; } - console.log(`Time: ${selectedTime}`) - const now = new Date(); const inputDate = new Date(selectedTime); - + // Calculate the minimum allowed time (Now + 10 minutes) const minAllowedTime = new Date(now.getTime() + 10 * 60000); @@ -39,44 +34,49 @@ function FutureTimeForm({scheduledTime, setScheduledTime}) { setError(''); setSuccess('Time validated successfully!'); setScheduledTime(inputDate); - console.log('Form submitted with time (selected):', selectedTime); - console.log('Form submitted with time (scheduled):', scheduledTime); } }; return ( -
    +

    Schedule Event

    -
    {error &&

    {error}

    } - {success &&

    {success}

    } + {success && ( +

    {success}

    + )} -
    ); -}; +} export default FutureTimeForm; diff --git a/src/components/SendMessageWizard/MessageForm.jsx b/src/components/SendMessageWizard/MessageForm.jsx index ff1c036..da69864 100644 --- a/src/components/SendMessageWizard/MessageForm.jsx +++ b/src/components/SendMessageWizard/MessageForm.jsx @@ -21,7 +21,6 @@ function MessageForm({ }; const handleIsScheduledCheckbox = (event) => { - console.log('Doing something to the checkbox'); setIsScheduledChecked(event.target.checked); onToggleScheduled(event.target.checked); }; @@ -50,10 +49,8 @@ function MessageForm({ const createdMessage = response.data[0]; setCreatedMessage(createdMessage); if (onMessageCreated) { - console.log('Setting createdMessage'); onMessageCreated(createdMessage); } - console.log('Created message: ', createdMessage); } } catch (error) { console.error(error); diff --git a/src/components/SendMessageWizard/SendMessageWizardModal.jsx b/src/components/SendMessageWizard/SendMessageWizardModal.jsx index dfdedd0..2a0bddb 100644 --- a/src/components/SendMessageWizard/SendMessageWizardModal.jsx +++ b/src/components/SendMessageWizard/SendMessageWizardModal.jsx @@ -31,12 +31,11 @@ function SendMessageWizardModal({ isOpen, onClose, onComplete }) { /> ); case 'schedule': - // TODO: Add form for schedule step return ( - + /> ); case 'confirm': return ( diff --git a/src/components/SendMessageWizard/useSendMessageWizard.js b/src/components/SendMessageWizard/useSendMessageWizard.js index da27c83..abc137a 100644 --- a/src/components/SendMessageWizard/useSendMessageWizard.js +++ b/src/components/SendMessageWizard/useSendMessageWizard.js @@ -30,27 +30,27 @@ const useSendMessageWizard = () => { case 'message': return state.message.trim().length > 0; case 'schedule': - // TODO: Handle this - // return state.scheduledTime != null; console.log('Checking to see if schedule can go to the next step'); - console.log(state.scheduledTime); - console.log(state.message); - // const result = state.scheduledTime instanceof Date && isNaN(state.scheduledTime.getTime()); if (state.scheduledTime == null) { return false; } console.log('Scheduled time is not null'); - // const result = isNaN(state.scheduledTime.getTime()); - const result = state.scheduledTime instanceof Date && isNaN(state.scheduledTime.getTime()); - console.log(result); - console.log(state.scheduledTime); + const result = + state.scheduledTime instanceof Date && + isNaN(state.scheduledTime.getTime()); + return !result; case 'confirm': return true; default: return false; } - }, [state.step, state.selectedContacts.length, state.message, state.scheduledTime]); + }, [ + state.step, + state.selectedContacts.length, + state.message, + state.scheduledTime, + ]); const canGoBack = state.step !== 'select'; @@ -89,17 +89,6 @@ const useSendMessageWizard = () => { const nextStep = () => { if (!canProceedToNextStep()) return; - console.log('Going to next step'); - console.log(state.isScheduled); - - if (state.isScheduled) { - console.log('Scheduled Checked'); - } - - console.log(`Step: ${state.step}`); - - // TODO: Handle navigation for schedule form - const stepOrder = ['select', 'message', 'schedule', 'confirm', 'result']; const currentIndex = stepOrder.indexOf(state.step); if (currentIndex < stepOrder.length - 1) { @@ -128,10 +117,8 @@ const useSendMessageWizard = () => { }; const prevStep = () => { - // TODO: Handle navigation for schedule form const stepOrder = ['select', 'message', 'schedule', 'confirm', 'result']; const currentIndex = stepOrder.indexOf(state.step); - console.log(`Stepping back: ${state.step} isSheduled: ${state.isScheduled}`); if (currentIndex > 0) { if (state.step === 'confirm') { @@ -172,19 +159,18 @@ const useSendMessageWizard = () => { try { if (state.scheduledTime != null) { console.log('Going to schedule message'); - // TODO: Put code here to schedule message + const schMsgReq = { scheduled: state.scheduledTime.toISOString(), status: 'PENDING', - user_id: tokenService.getUserId() + user_id: tokenService.getUserId(), }; - console.log(schMsgReq); - const token = tokenService.bearerToken(); - - const schMsgResponse = await scheduleApi.scheduleMessage(schMsgReq, token); - console.log(schMsgResponse); + const schMsgResponse = await scheduleApi.scheduleMessage( + schMsgReq, + token + ); if (schMsgResponse) { console.log('Message scheduled'); @@ -193,18 +179,18 @@ const useSendMessageWizard = () => { for (let contact of state.selectedContacts) { let schMsgEvtReq = { contact_id: contact, - message_id:state.createdMessage.id, + message_id: state.createdMessage.id, scheduled_message_id: scheduledMessageId, }; - console.log(schMsgEvtReq); - const schMsgEvtResponse = await scheduleEventApi.scheduleMessageEvent(schMsgEvtReq, token); - console.log(schMsgEvtResponse); + + const schMsgEvtResponse = + await scheduleEventApi.scheduleMessageEvent(schMsgEvtReq, token); } console.log('Updating message status'); const req = { scheduled_message_id: scheduledMessageId, - status: 'READY' + status: 'READY', }; console.log(req); const response = await scheduleApi.prepareMessage(req, token); @@ -254,7 +240,7 @@ const useSendMessageWizard = () => { submissionError: error.message || 'Failed to send messages', isSubmitting: false, isScheduled: false, - scheduledTime: null, + scheduledTime: null, })); } }; -- 2.47.3 From daaaeccbd6fd67bee574c52f1d2dfe41106ff472 Mon Sep 17 00:00:00 2001 From: phoenix Date: Tue, 30 Jun 2026 12:13:25 -0400 Subject: [PATCH 10/10] bump: textsender --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5732850..d3141ec 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "textsender", - "version": "0.0.5", + "version": "0.0.6", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "textsender", - "version": "0.0.5", + "version": "0.0.6", "dependencies": { "react": "^19.2.7", "react-dom": "^19.2.7", diff --git a/package.json b/package.json index 05a64f1..bd1e976 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "textsender", "private": true, - "version": "0.0.5", + "version": "0.0.6", "type": "module", "scripts": { "dev": "vite", -- 2.47.3