All files / main/adapters notificationHelpers.ts

100% Statements 12/12
87.5% Branches 7/8
100% Functions 3/3
100% Lines 12/12

Press n or j to go to the next uncovered block, b, p or k for the previous block.

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 52 53 54 55 56 57 58 59    1x                             1x 2x   1x     3x 2x           1x           1x                     1x         1x 1x     1x    
import type { TimerPhase, TimerSnapshot } from '@shared/types'
 
export const WINDOWS_APP_USER_MODEL_ID = 'com.focusflow.timer'
 
export interface NotificationOptionsLike {
  title: string
  body: string
  icon?: string
}
 
export interface NotificationInstanceLike {
  show(): void
  on?(event: 'click', listener: () => void): unknown
}
 
export type NotificationFactoryLike = (options: NotificationOptionsLike) => NotificationInstanceLike
 
export const resolveWindowsAppUserModelId = (isPackaged: boolean, execPath: string): string =>
  isPackaged ? WINDOWS_APP_USER_MODEL_ID : execPath
 
export const buildTimerFinishedNotificationCopy = (
  phase: TimerPhase
): Pick<NotificationOptionsLike, 'title' | 'body'> => {
  if (phase === 'focus') {
    return {
      title: '专注结束',
      body: '该休息一下了。'
    }
  }
 
  return {
    title: '休息结束',
    body: '准备开始下一轮专注。'
  }
}
 
export const showTimerFinishedNotification = ({
  snapshot,
  iconPath,
  createNotification,
  onClick
}: {
  snapshot: Pick<TimerSnapshot, 'phase'>
  iconPath: string
  createNotification: NotificationFactoryLike
  onClick?: () => void
}): void => {
  const notification = createNotification({
    ...buildTimerFinishedNotificationCopy(snapshot.phase),
    icon: iconPath
  })
 
  Eif (onClick && typeof notification.on === 'function') {
    notification.on('click', onClick)
  }
 
  notification.show()
}