From 2901b83b4645d0686bce797e9696b4fc6034761a Mon Sep 17 00:00:00 2001 From: kmanish527 Date: Wed, 29 Oct 2025 23:29:06 +0530 Subject: [PATCH 1/3] Page Not Found added --- frontend/src/App.jsx | 2 + frontend/src/Components/ui/NotFound.jsx | 58 +++++++++++++++---------- 2 files changed, 36 insertions(+), 24 deletions(-) diff --git a/frontend/src/App.jsx b/frontend/src/App.jsx index e5ae97d..87e32b9 100644 --- a/frontend/src/App.jsx +++ b/frontend/src/App.jsx @@ -32,6 +32,7 @@ import FeedbackReviewPage from "./Components/feedback/FeedbackReviewPage"; import 'react-toastify/dist/ReactToastify.css'; import { ToastContainer } from 'react-toastify'; +import NotFound from "./Components/ui/NotFound"; function Home() { const [showTop, setShowTop] = useState(false); @@ -141,6 +142,7 @@ function App() { } /> } /> } /> + }/> { +export default function NotFound() { const navigate = useNavigate(); - - // Check if user is logged in const isAuthenticated = !!localStorage.getItem("token"); const handleRedirect = () => { if (isAuthenticated) { - navigate("/dashboard"); // authenticated users go to dashboard + navigate("/dashboard"); } else { - navigate("/"); // unauthenticated users go to landing page + navigate("/"); } }; return ( - -

404

-

- Oops! The page you’re looking for doesn’t exist. +

+

+ • DevSync Error • +

+ +

+ 404 +

+ +

+ Oops! Page Not Found +

+ +

+ It looks like the page you're trying to reach doesn't exist or has been moved. + Don't worry, we'll help you get back on track.

- - +
); -}; - -export default NotFound; +} From bd3f99ba3aac0489881b357e951a702fe9c1b674 Mon Sep 17 00:00:00 2001 From: kmanish527 Date: Thu, 30 Oct 2025 22:57:48 +0530 Subject: [PATCH 2/3] timer on every tab --- extension/alarm.mp3 | Bin 0 -> 67709 bytes extension/background.js | 227 +++++++++++++++++++++----- extension/content.js | 108 ++++++++++++ extension/manifest.json | 32 +++- extension/offscreen.html | 6 + extension/offscreen.js | 7 + extension/timer.css | 53 ++++++ frontend/src/context/TimerContext.jsx | 219 ++++++++++++------------- 8 files changed, 493 insertions(+), 159 deletions(-) create mode 100644 extension/alarm.mp3 create mode 100644 extension/content.js create mode 100644 extension/offscreen.html create mode 100644 extension/offscreen.js create mode 100644 extension/timer.css diff --git a/extension/alarm.mp3 b/extension/alarm.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..e3cb67d2cffad19cf5ad1e8b653d8c421c2c5a67 GIT binary patch literal 67709 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 Vv*zfb05j&R@J?6gD4=2p004uKyxjl* literal 0 HcmV?d00001 diff --git a/extension/background.js b/extension/background.js index 072fbac..bb950d1 100644 --- a/extension/background.js +++ b/extension/background.js @@ -1,70 +1,213 @@ const ALLOWED_DOMAINS = [ - 'localhost', - 'your-devsync-domain.com', + 'localhost', + 'your-devsync-domain.com', 'stackoverflow.com', 'developer.mozilla.org', - - // --- Social Profiles --- 'github.com', 'gitlab.com', 'linkedin.com', - - // --- Competitive Coding --- 'leetcode.com', 'codechef.com', 'hackerrank.com', 'codeforces.com', 'hackerearth.com' - - // Add any other sites you need (e.G., 'vercel.app', 'aws.amazon.com') ]; +let creating; +async function setupOffscreenDocument(path) { + if (await chrome.offscreen.hasDocument()) return; + if (creating) { + await creating; + } else { + creating = chrome.offscreen.createDocument({ + url: path, + reasons: ['AUDIO_PLAYBACK'], + justification: 'To play alarm sound for Pomodoro timer', + }); + await creating; + creating = null; + } +} -chrome.runtime.onMessageExternal.addListener((request, sender, sendResponse) => { - if (request.command === "startFocus") { - console.log(`Focus session starting for ${request.duration} minutes.`); - chrome.storage.local.set({ isFocusActive: true }); - closeUnwantedTabs(); - if (request.duration && request.duration > 0) { - chrome.alarms.create("stopFocus", { delayInMinutes: request.duration }); +async function playSound() { + await setupOffscreenDocument('offscreen.html'); + await chrome.runtime.sendMessage({ action: "playSound" }); +} + +chrome.alarms.onAlarm.addListener(async (alarm) => { + if (alarm.name === "devsync-tick") { + + const data = await chrome.storage.local.get([ + 'timerEndTime', 'timerSessionType', 'timerSessionCount', + 'workTime', 'shortBreak', 'longBreak', 'SESSIONS_BEFORE_LONG_BREAK' + ]); + + if (!data.timerEndTime) { + stopTimerSession(false); + return; } - sendResponse({ status: "Focus started" }); + const now = Date.now(); + const remaining = data.timerEndTime - now; + const timeLeftInSeconds = Math.ceil(remaining / 1000); + + if (timeLeftInSeconds > 0) { + broadcastToAllTabs({ + action: "updateTime", + timeLeft: timeLeftInSeconds, + }); + chrome.alarms.create("devsync-tick", { delayInMinutes: 1/60 }); + } else { + handleSessionEnd(data); + } + } +}); + + +function handleSessionEnd(data) { + playSound(); + + let nextSessionType; + let nextTime; + let nextSessionCount = data.timerSessionCount; - } else if (request.command === "stopFocus") { - console.log("Focus session stopping by user request."); - stopFocusSession(); - sendResponse({ status: "Focus stopped" }); + if (data.timerSessionType === 'work') { + nextSessionCount = data.timerSessionCount + 1; + if (nextSessionCount % data.SESSIONS_BEFORE_LONG_BREAK === 0) { + nextSessionType = 'longBreak'; + nextTime = data.longBreak; + } else { + nextSessionType = 'shortBreak'; + nextTime = data.shortBreak; + } + } else { + if (data.timerSessionType === 'longBreak') { + chrome.notifications.create({ + type: 'basic', + iconUrl: 'icon128.png', + title: 'Cycle Complete!', + message: 'Great work! You finished all 4 sessions. Time for a well-deserved break.' + }); + + stopTimerSession(true); + return; + } else { + nextSessionType = 'work'; + nextTime = data.workTime; + } + } + + const newEndTime = Date.now() + nextTime * 1000; + startTimer(newEndTime, nextSessionType, nextSessionCount, data.workTime, data.shortBreak, data.longBreak, data.SESSIONS_BEFORE_LONG_BREAK); +} + +function startTimer(endTime, sessionType, sessionCount, workTime, shortBreak, longBreak, sessionsBeforeLongBreak) { + const isWorkSession = sessionType === 'work'; + + chrome.storage.local.set({ + isRunning: true, + isFocusActive: isWorkSession, + timerEndTime: endTime, + timerSessionType: sessionType, + timerSessionCount: sessionCount, + workTime: workTime, + shortBreak: shortBreak, + longBreak: longBreak, + SESSIONS_BEFORE_LONG_BREAK: sessionsBeforeLongBreak + }, () => { + + if (isWorkSession) { + closeUnwantedTabs(); + } + + broadcastToAllTabs({ + action: "startTimer", + endTime: endTime, + sessionType: sessionType, + sessionCount: sessionCount + }); + + chrome.alarms.create("devsync-tick", { delayInMinutes: 1/60 }); + }); +} + +chrome.runtime.onMessageExternal.addListener((request, sender, sendResponse) => { + if (request.command === "startTimer") { + console.log("BG: Received startTimer from React"); + startTimer( + request.endTime, + request.sessionType, + request.sessionCount, + request.settings.workTime, + request.settings.shortBreak, + request.settings.longBreak, + request.settings.SESSIONS_BEFORE_LONG_BREAK + ); + sendResponse({ status: "Timer started" }); + + } else if (request.command === "stopTimer") { + console.log("BG: Received stopTimer from React"); + stopTimerSession(true); + sendResponse({ status: "Timer stopped" }); + + } else if (request.command === "getState") { + console.log("BG: Received getState from React"); + chrome.storage.local.get([ + 'isRunning', 'timerEndTime', 'timerSessionType', 'timerSessionCount' + ], (data) => { + sendResponse(data); + }); + return true; } return true; }); -chrome.alarms.onAlarm.addListener((alarm) => { - if (alarm.name === "stopFocus") { - console.log("Alarm fired: Focus session stopping."); - stopFocusSession(); +function stopTimerSession(broadcastUpdate) { + chrome.alarms.clear("devsync-tick"); + + chrome.storage.local.set({ + isRunning: false, + isFocusActive: false, + timerEndTime: null, + timerSessionType: 'work', + timerSessionCount: 0 + }); + + if (broadcastUpdate) { + broadcastToAllTabs({ action: "stopTimer" }); } -}); + + console.log("Timer session deactivated. All sites unblocked."); +} -function stopFocusSession() { - chrome.storage.local.set({ isFocusActive: false }); - chrome.alarms.clear("stopFocus"); - console.log("Focus session deactivated. All sites unblocked."); +function broadcastToAllTabs(message) { + chrome.tabs.query({}, (tabs) => { + for (let tab of tabs) { + chrome.tabs.sendMessage(tab.id, message, (response) => { + if (chrome.runtime.lastError) { } + }); + } + }); } function closeUnwantedTabs() { chrome.tabs.query({}, (tabs) => { for (let tab of tabs) { if (!tab.url) continue; - try { const url = new URL(tab.url); - const domain = url.hostname.replace('www.', ''); - const isAllowed = ALLOWED_DOMAINS.some(allowedDomain => domain.endsWith(allowedDomain)); - + const domain = url.hostname; + const isAllowed = ALLOWED_DOMAINS.some(allowedDomain => + domain === allowedDomain || domain.endsWith('.' + allowedDomain) + ); if (!isAllowed) { if (!tab.pinned && !tab.url.startsWith('chrome://')) { - chrome.tabs.remove(tab.id); + console.log(`DevSync: Closing distraction tab: ${tab.url}`); + chrome.tabs.remove(tab.id, () => { + if (chrome.runtime.lastError) { + console.warn(`DevSync: Error closing tab (ignoring): ${chrome.runtime.lastError.message}`); + } + }); } } } catch (e) { @@ -75,21 +218,23 @@ function closeUnwantedTabs() { } chrome.webNavigation.onBeforeNavigate.addListener((details) => { - if (details.frameId !== 0) { return; } - chrome.storage.local.get("isFocusActive", (data) => { if (data.isFocusActive) { const url = new URL(details.url); - const domain = url.hostname.replace('www.', ''); - - const isAllowed = ALLOWED_DOMAINS.some(allowedDomain => domain.endsWith(allowedDomain)); - + const domain = url.hostname; + const isAllowed = ALLOWED_DOMAINS.some(allowedDomain => + domain === allowedDomain || domain.endsWith('.' + allowedDomain) + ); if (!isAllowed && !details.url.startsWith('chrome://')) { console.log(`Blocking navigation to: ${details.url}`); - chrome.tabs.remove(details.tabId); + chrome.tabs.remove(details.tabId, () => { + if (chrome.runtime.lastError) { + console.warn(`DevSync: Error blocking navigation (ignoring): ${chrome.runtime.lastError.message}`); + } + }); } } }); diff --git a/extension/content.js b/extension/content.js new file mode 100644 index 0000000..5c959db --- /dev/null +++ b/extension/content.js @@ -0,0 +1,108 @@ +let timerDiv = null; +let removalTimeout = null; +const TIMER_DIV_ID = 'devsync-floating-timer'; +let timeSpan = null; +let sessionSpan = null; + +chrome.runtime.onMessage.addListener((message, sender, sendResponse) => { + if (message.action === 'startTimer') { + createOrUpdateTimerUI(message.endTime, message.sessionType, message.sessionCount); + } + else if (message.action === 'updateTime') { + chrome.storage.local.get(['timerEndTime', 'timerSessionType', 'timerSessionCount'], (data) => { + if(data.timerEndTime) { + updateTimerText(data.timerEndTime, data.timerSessionType, data.timerSessionCount); + } + }); + } + else if (message.action === 'hideTimer' || message.action === 'stopTimer') { + removeTimerUI(); + } + + const isAppPage = window.location.host === "localhost:5173" || + window.location.host === "your-devsync-domain.com"; + if (isAppPage) { + window.postMessage({ type: "FROM_DEVSYNC_EXTENSION", payload: message }, "*"); + } + sendResponse(true); +}); + +chrome.storage.local.get(['isRunning', 'timerEndTime', 'timerSessionType', 'timerSessionCount'], (result) => { + if (result.isRunning && result.timerEndTime) { + if (result.timerEndTime > Date.now()) { + createOrUpdateTimerUI(result.timerEndTime, result.timerSessionType, result.timerSessionCount); + } + } +}); + +function createOrUpdateTimerUI(endTime, sessionType, sessionCount) { + if (removalTimeout) { + clearTimeout(removalTimeout); + removalTimeout = null; + } + + if (!timerDiv) { + timerDiv = document.createElement('div'); + timerDiv.id = TIMER_DIV_ID; + timeSpan = document.createElement('span'); + timeSpan.className = 'devsync-time'; + sessionSpan = document.createElement('span'); + sessionSpan.className = 'devsync-session'; + timerDiv.appendChild(timeSpan); + timerDiv.appendChild(sessionSpan); + document.body.appendChild(timerDiv); + } + + if (sessionType === 'work') { + timerDiv.classList.add('devsync-timer-work'); + timerDiv.classList.remove('devsync-timer-break'); + } else { + timerDiv.classList.add('devsync-timer-break'); + timerDiv.classList.remove('devsync-timer-work'); + } + timerDiv.classList.remove('devsync-timer-flashing'); + + updateTimerText(endTime, sessionType, sessionCount); +} + +function updateTimerText(endTime, sessionType, sessionCount) { + if (!timerDiv) return; + + const now = Date.now(); + const remaining = endTime - now; + const totalSeconds = Math.ceil(remaining / 1000); + + if (sessionType === 'work') { + sessionSpan.textContent = `Session ${sessionCount + 1}`; + } else { + sessionSpan.textContent = 'Break'; + } + + if (totalSeconds <= 0) { + timeSpan.textContent = '00:00'; + timerDiv.classList.add('devsync-timer-flashing'); + removalTimeout = setTimeout(removeTimerUI, 3000); + } else { + const minutes = Math.floor(totalSeconds / 60); + const seconds = Math.floor(totalSeconds % 60); + timeSpan.textContent = + `${String(minutes).padStart(2, '0')}:${String(seconds).padStart(2, '0')}`; + } +} + +function removeTimerUI() { + if (removalTimeout) { + clearTimeout(removalTimeout); + removalTimeout = null; + } + if (timerDiv) { + timerDiv.remove(); + timerDiv = null; + timeSpan = null; + sessionSpan = null; + } + const existingDiv = document.getElementById(TIMER_DIV_ID); + if (existingDiv) { + existingDiv.remove(); + } +} \ No newline at end of file diff --git a/extension/manifest.json b/extension/manifest.json index 0461473..c600528 100644 --- a/extension/manifest.json +++ b/extension/manifest.json @@ -1,13 +1,14 @@ { "manifest_version": 3, "name": "DevSync Enforcer", - "version": "1.0", + "version": "1.1", "description": "Companion extension for the DevSync Pomodoro app.", "permissions": [ "tabs", "storage", "webNavigation", - "alarms" + "offscreen", + "alarms" ], "background": { "service_worker": "background.js" @@ -15,10 +16,33 @@ "host_permissions": [ "" ], + "content_scripts": [ + { + "matches": [ + "" + ], + "js": [ + "content.js" + ], + "css": [ + "timer.css" + ] + } + ], "externally_connectable": { "matches": [ "*://localhost/*", - "*://your-devsync-domain.com/*" + "*://devsync-one.vercel.app/*" ] - } + }, + "web_accessible_resources": [ + { + "resources": [ + "alarm.mp3" + ], + "matches": [ + "" + ] + } + ] } \ No newline at end of file diff --git a/extension/offscreen.html b/extension/offscreen.html new file mode 100644 index 0000000..712e76f --- /dev/null +++ b/extension/offscreen.html @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/extension/offscreen.js b/extension/offscreen.js new file mode 100644 index 0000000..20adc71 --- /dev/null +++ b/extension/offscreen.js @@ -0,0 +1,7 @@ +chrome.runtime.onMessage.addListener((message) => { + if (message.action === "playSound") { + const sound = new Audio('alarm.mp3'); + sound.play() + .catch((e) => console.error("Offscreen Audio Error:", e)); + } +}); \ No newline at end of file diff --git a/extension/timer.css b/extension/timer.css new file mode 100644 index 0000000..55dbb6c --- /dev/null +++ b/extension/timer.css @@ -0,0 +1,53 @@ +#devsync-floating-timer { + position: fixed; + bottom: 20px; + right: 20px; + padding: 10px 18px; + border-radius: 8px; + font-family: 'Courier New', Courier, monospace; + z-index: 99999999; + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3); + user-select: none; + opacity: 0.9; + display: flex; + flex-direction: column; + align-items: flex-end; + line-height: 1.1; +} + +.devsync-time { + font-size: 1.5rem; + font-weight: 600; +} + +.devsync-session { + font-size: 0.9rem; + font-weight: 400; + opacity: 0.8; + margin-top: 2px; +} + +.devsync-timer-work { + background-color: #2a0a0a; + color: #ff4d4d; + border: 1px solid #ff4d4d; +} + +.devsync-timer-break { + background-color: #0a2a0a; + color: #00ff99; + border: 1px solid #00ff99; +} + +.devsync-timer-flashing { + animation: devsync-flash 0.5s infinite alternate; +} + +@keyframes devsync-flash { + from { + opacity: 1; + } + to { + opacity: 0.4; + } +} \ No newline at end of file diff --git a/frontend/src/context/TimerContext.jsx b/frontend/src/context/TimerContext.jsx index 15afac2..d36b0d6 100644 --- a/frontend/src/context/TimerContext.jsx +++ b/frontend/src/context/TimerContext.jsx @@ -11,33 +11,40 @@ export function useTimer() { const SESSIONS_BEFORE_LONG_BREAK = 4; -const sendStartFocusMessage = (durationInSeconds) => { - if (window.chrome && window.chrome.runtime) { - const durationInMinutes = Math.floor(durationInSeconds / 60); +const sendStartTimerMessage = (state) => { + if (window.chrome && window.chrome.runtime && EXTENSION_ID) { chrome.runtime.sendMessage(EXTENSION_ID, { - command: "startFocus", - duration: durationInMinutes + command: "startTimer", + endTime: Date.now() + state.timeLeft * 1000, + sessionType: state.sessionType, + sessionCount: state.sessions, + settings: { + workTime: state.workTime, + shortBreak: state.shortBreak, + longBreak: state.longBreak, + SESSIONS_BEFORE_LONG_BREAK: SESSIONS_BEFORE_LONG_BREAK + } }, (response) => { if (chrome.runtime.lastError) { - console.error("Could not connect to extension. Is it installed and is the ID correct?"); + console.error(`Could not start timer: ${chrome.runtime.lastError.message}`); } else { - console.log("Extension acknowledged start.", response); + console.log("Extension acknowledged timer start.", response); } }); } else { - console.warn("Chrome Extension API not found. Please install the DevSync companion extension."); + console.warn("Chrome Extension API not found."); } }; -const sendStopFocusMessage = () => { - if (window.chrome && window.chrome.runtime) { +const sendStopTimerMessage = () => { + if (window.chrome && window.chrome.runtime && EXTENSION_ID) { chrome.runtime.sendMessage(EXTENSION_ID, { - command: "stopFocus" + command: "stopTimer" }, (response) => { if (chrome.runtime.lastError) { - console.error("Error sending stop message to extension."); + console.error(`Could not stop timer: ${chrome.runtime.lastError.message}`); } else { - console.log("Extension acknowledged stop.", response); + console.log("Extension acknowledged timer stop.", response); } }); } @@ -45,126 +52,115 @@ const sendStopFocusMessage = () => { export function TimerProvider({ children }) { - // --- Timer Settings State --- - const [workTime, setWorkTime] = useState(25 * 60); - const [shortBreak, setShortBreak] = useState(5 * 60); - const [longBreak, setLongBreak] = useState(15 * 60); - - // --- Timer Operation State --- - const [isRunning, setIsRunning] = useState(false); - const [sessionType, setSessionType] = useState('work'); // 'work', 'shortBreak', 'longBreak' - const [sessions, setSessions] = useState(() => Number(localStorage.getItem("pomodoroSessions")) || 0); - - const [endTimestamp, setEndTimestamp] = useState(() => { - const saved = localStorage.getItem("pomodoroEndTimestamp"); - return saved ? Number(saved) : null; + const [workTime, setWorkTime] = useState(() => { + const saved = localStorage.getItem("devsync-workTime"); + return saved ? Number(saved) : 25 * 60; }); - - const [timeLeft, setTimeLeft] = useState(() => { - const saved = localStorage.getItem("pomodoroTimeLeft"); - return saved ? Number(saved) : workTime; + const [shortBreak, setShortBreak] = useState(() => { + const saved = localStorage.getItem("devsync-shortBreak"); + return saved ? Number(saved) : 5 * 60; + }); + const [longBreak, setLongBreak] = useState(() => { + const saved = localStorage.getItem("devsync-longBreak"); + return saved ? Number(saved) : 15 * 60; }); - // Re-sync timeLeft if workTime changes and timer is not running - useEffect(() => { - if (sessionType === 'work' && !isRunning) { - setTimeLeft(workTime); - } - }, [workTime]); + const [isRunning, setIsRunning] = useState(false); + const [sessionType, setSessionType] = useState('work'); + const [sessions, setSessions] = useState(0); + const [timeLeft, setTimeLeft] = useState(workTime); - // --- Timer Tick Logic (using requestAnimationFrame) --- useEffect(() => { - let raf; - const tick = () => { - if (isRunning && endTimestamp) { - const now = Date.now(); - const remaining = Math.max(Math.ceil((endTimestamp - now) / 1000), 0); - setTimeLeft(remaining); - - if (remaining <= 0) { - handleSessionEnd(); - } else { - raf = requestAnimationFrame(tick); + if (window.chrome && window.chrome.runtime && EXTENSION_ID) { + chrome.runtime.sendMessage(EXTENSION_ID, { command: "getState" }, (state) => { + if (chrome.runtime.lastError) { + console.warn(`Could not get state from extension: ${chrome.runtime.lastError.message}`); + } else if (state) { + console.log("Got initial state from extension:", state); + setIsRunning(state.isRunning || false); + setSessionType(state.timerSessionType || 'work'); + setSessions(state.timerSessionCount || 0); + + if (state.isRunning && state.timerEndTime) { + const remaining = Math.max(Math.ceil((state.timerEndTime - Date.now()) / 1000), 0); + setTimeLeft(remaining); + } else { + const currentWorkTime = Number(localStorage.getItem("devsync-workTime")) || 25 * 60; + setTimeLeft(currentWorkTime); + } } - } - }; - - if (isRunning) { - raf = requestAnimationFrame(tick); + }); } - return () => cancelAnimationFrame(raf); - }, [isRunning, endTimestamp]); + }, []); - // --- Persist Timer Info to localStorage --- - useEffect(() => localStorage.setItem("pomodoroTimeLeft", timeLeft), [timeLeft]); - useEffect(() => localStorage.setItem("pomodoroSessions", sessions), [sessions]); useEffect(() => { - if (endTimestamp) { - localStorage.setItem("pomodoroEndTimestamp", endTimestamp); - } else { - localStorage.removeItem("pomodoroEndTimestamp"); - } - }, [endTimestamp]); - - // --- Session End Logic --- - const handleSessionEnd = () => { - setIsRunning(false); - setEndTimestamp(null); - - let nextSessionType; - let nextTime; - - if (sessionType === 'work') { - sendStopFocusMessage(); - const nextSessionNum = sessions + 1; - setSessions(nextSessionNum); - - if (nextSessionNum % SESSIONS_BEFORE_LONG_BREAK === 0) { - nextSessionType = 'longBreak'; - nextTime = longBreak; - } else { - nextSessionType = 'shortBreak'; - nextTime = shortBreak; + const handleMessage = (event) => { + if (event.source !== window || !event.data || event.data.type !== "FROM_DEVSYNC_EXTENSION") { + return; } - } else { - nextSessionType = 'work'; - nextTime = workTime; - } - - setSessionType(nextSessionType); - setTimeLeft(nextTime); + + const message = event.data.payload; + + if (message.action === "updateTime") { + setTimeLeft(message.timeLeft); + } + else if (message.action === "startTimer") { + setIsRunning(true); + setSessionType(message.sessionType); + setSessions(message.sessionCount); + const remaining = Math.max(Math.ceil((message.endTime - Date.now()) / 1000), 0); + setTimeLeft(remaining); + } + else if (message.action === "stopTimer" || message.action === "hideTimer") { + setIsRunning(false); + setSessionType('work'); + setSessions(0); + setWorkTime(currentWorkTime => { + setTimeLeft(currentWorkTime); + return currentWorkTime; + }); + localStorage.removeItem("pomodoroTimeLeft"); + } + }; + + window.addEventListener("message", handleMessage); + return () => window.removeEventListener("message", handleMessage); + }, []); - // Notification - if ("Notification" in window && Notification.permission === "granted") { - new Notification( - sessionType === 'work' ? "Work session complete! Time for a break 🎉" : "Break over! Back to work 💻" - ); - } - }; + useEffect(() => localStorage.setItem("devsync-workTime", workTime), [workTime]); + useEffect(() => localStorage.setItem("devsync-shortBreak", shortBreak), [shortBreak]); + useEffect(() => localStorage.setItem("devsync-longBreak", longBreak), [longBreak]); const startTimer = () => { - setEndTimestamp(Date.now() + timeLeft * 1000); setIsRunning(true); - - if (sessionType === 'work') { - sendStartFocusMessage(timeLeft); - } + + const savedTimeLeft = localStorage.getItem("pomodoroTimeLeft"); + const timeToStart = savedTimeLeft ? Number(savedTimeLeft) : (timeLeft > 0 ? timeLeft : workTime); + localStorage.removeItem("pomodoroTimeLeft"); + + sendStartTimerMessage({ + timeLeft: timeToStart, + sessionType, + sessions, + workTime, + shortBreak, + longBreak + }); }; const pauseTimer = () => { setIsRunning(false); - localStorage.setItem("pomodoroTimeLeft", timeLeft); - setEndTimestamp(null); - sendStopFocusMessage(); + sendStopTimerMessage(); + localStorage.setItem("pomodoroTimeLeft", timeLeft); }; const resetTimer = () => { setIsRunning(false); setSessionType('work'); - setTimeLeft(workTime); + setTimeLeft(workTime); setSessions(0); - setEndTimestamp(null); - sendStopFocusMessage(); + sendStopTimerMessage(); + localStorage.removeItem("pomodoroTimeLeft"); }; const updateWorkTime = (minutes) => { @@ -172,7 +168,6 @@ export function TimerProvider({ children }) { setWorkTime(secs); if (sessionType === 'work' && !isRunning) { setTimeLeft(secs); - setEndTimestamp(null); } }; const updateShortBreak = (minutes) => { @@ -180,7 +175,6 @@ export function TimerProvider({ children }) { setShortBreak(secs); if (sessionType === 'shortBreak' && !isRunning) { setTimeLeft(secs); - setEndTimestamp(null); } }; const updateLongBreak = (minutes) => { @@ -188,18 +182,15 @@ export function TimerProvider({ children }) { setLongBreak(secs); if (sessionType === 'longBreak' && !isRunning) { setTimeLeft(secs); - setEndTimestamp(null); } }; - useEffect(() => { if ("Notification" in window && Notification.permission !== "granted") { Notification.requestPermission(); } }, []); - const isWork = sessionType === 'work'; return ( From 090d641fdafb139cf85570e1733a432ae21e8fac Mon Sep 17 00:00:00 2001 From: K MANISH <126870907+kmanish527@users.noreply.github.com> Date: Thu, 30 Oct 2025 23:25:45 +0530 Subject: [PATCH 3/3] Update allowed domains for extension --- extension/background.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/extension/background.js b/extension/background.js index bb950d1..dd167fc 100644 --- a/extension/background.js +++ b/extension/background.js @@ -1,6 +1,6 @@ const ALLOWED_DOMAINS = [ 'localhost', - 'your-devsync-domain.com', + 'devsync-one.vercel.app', 'stackoverflow.com', 'developer.mozilla.org', 'github.com', @@ -238,4 +238,4 @@ chrome.webNavigation.onBeforeNavigate.addListener((details) => { } } }); -}, { url: [{ hostContains: '.' }] }); \ No newline at end of file +}, { url: [{ hostContains: '.' }] });