* configurable host overrides * base host overrides on name of service instead of key and hide the options by default * added unit tests * review changes * Refactor options * Refactor * Update Readme * Pump version and update Changelog Co-authored-by: Tobias Jacksteit <me@xtj7.de>
149 lines
4.2 KiB
JavaScript
149 lines
4.2 KiB
JavaScript
import ApiClient from "api/Client"
|
|
import {
|
|
ERROR_UNAUTHORIZED,
|
|
ERROR_UPGRADE_REQUIRED,
|
|
ERROR_UNKNOWN,
|
|
groupedProjectOptions,
|
|
getStartOfWeek,
|
|
getEndOfWeek,
|
|
} from "utils"
|
|
import { get, forEach, reject, isNil } from "lodash/fp"
|
|
import { createMatcher } from "utils/urlMatcher"
|
|
import remoteServices from "remoteServices"
|
|
import { queryTabs, isBrowserTab, getSettings, setStorage } from "utils/browser"
|
|
|
|
let matcher
|
|
|
|
const initMatcher = (settings) => {
|
|
matcher = createMatcher(remoteServices, settings.hostOverrides)
|
|
}
|
|
|
|
getSettings().then((settings) => {
|
|
initMatcher(settings)
|
|
})
|
|
|
|
export function tabUpdated(tab, { messenger, settings }) {
|
|
messenger.connectTab(tab)
|
|
|
|
const service = matcher(tab.url)
|
|
const apiClient = new ApiClient(settings)
|
|
|
|
if (service?.match?.id) {
|
|
messenger.postMessage(tab, { type: "requestService" })
|
|
|
|
messenger.once("newService", ({ payload: { service } }) => {
|
|
apiClient
|
|
.activitiesStatus(service)
|
|
.then(({ data }) => {
|
|
messenger.postMessage(tab, {
|
|
type: "showBubble",
|
|
payload: {
|
|
bookedSeconds: data.seconds,
|
|
settingTimeTrackingHHMM: settings.settingTimeTrackingHHMM,
|
|
timedActivity: data.timed_activity,
|
|
service,
|
|
},
|
|
})
|
|
})
|
|
.catch(() => {
|
|
messenger.postMessage(tab, {
|
|
type: "showBubble",
|
|
payload: {
|
|
bookedSeconds: 0,
|
|
settingTimeTrackingHHMM: settings.settingTimeTrackingHHMM,
|
|
service,
|
|
},
|
|
})
|
|
})
|
|
})
|
|
} else {
|
|
messenger.postMessage(tab, { type: "hideBubble" })
|
|
}
|
|
}
|
|
|
|
export function settingsChanged(settings, { messenger }) {
|
|
initMatcher(settings)
|
|
|
|
queryTabs({ currentWindow: true })
|
|
.then(reject(isBrowserTab))
|
|
.then(
|
|
forEach(tab => {
|
|
messenger.postMessage(tab, { type: "closePopup" })
|
|
tabUpdated(tab, { settings, messenger })
|
|
}),
|
|
)
|
|
}
|
|
|
|
export function togglePopup(tab, { messenger }) {
|
|
return function({ isOpen, service } = {}) {
|
|
if (isNil(isOpen)) {
|
|
return
|
|
}
|
|
|
|
if (isOpen) {
|
|
messenger.postMessage(tab, { type: "closePopup" })
|
|
} else {
|
|
openPopup(tab, { service, messenger })
|
|
}
|
|
}
|
|
}
|
|
|
|
export async function openPopup(tab, { service, messenger }) {
|
|
messenger.postMessage(tab, { type: "openPopup", payload: { loading: true } })
|
|
|
|
const fromDate = getStartOfWeek()
|
|
const toDate = getEndOfWeek()
|
|
const settings = await getSettings()
|
|
const apiClient = new ApiClient(settings)
|
|
const responses = []
|
|
try {
|
|
responses.push(await apiClient.login(service))
|
|
// we can forgo the following calls if a timed activity exists
|
|
if (!responses[0].data.timed_activity) {
|
|
responses.push(
|
|
...(await Promise.all([
|
|
apiClient.projects(),
|
|
apiClient.activities(fromDate, toDate),
|
|
apiClient.schedules(fromDate, toDate),
|
|
])),
|
|
)
|
|
}
|
|
|
|
const settingTimeTrackingHHMM = get("[0].data.setting_time_tracking_hh_mm", responses)
|
|
!isNil(settingTimeTrackingHHMM) && setStorage({ settingTimeTrackingHHMM })
|
|
|
|
const action = {
|
|
type: "openPopup",
|
|
payload: {
|
|
service,
|
|
subdomain: settings.subdomain,
|
|
timedActivity: get("[0].data.timed_activity", responses),
|
|
lastProjectId: get("[0].data.last_project_id", responses),
|
|
lastTaskId: get("[0].data.last_task_id", responses),
|
|
roundTimeEntries: get("[0].data.round_time_entries", responses),
|
|
projects: groupedProjectOptions(get("[1].data.projects", responses)),
|
|
activities: get("[2].data", responses),
|
|
schedules: get("[3].data", responses),
|
|
fromDate,
|
|
toDate,
|
|
loading: false,
|
|
},
|
|
}
|
|
messenger.postMessage(tab, action)
|
|
} catch (error) {
|
|
let errorType, errorMessage
|
|
if (error.response?.status === 401) {
|
|
errorType = ERROR_UNAUTHORIZED
|
|
} else if (error.response?.status === 426) {
|
|
errorType = ERROR_UPGRADE_REQUIRED
|
|
} else {
|
|
errorType = ERROR_UNKNOWN
|
|
errorMessage = error.message
|
|
}
|
|
messenger.postMessage(tab, {
|
|
type: "openPopup",
|
|
payload: { errorType, errorMessage },
|
|
})
|
|
}
|
|
}
|