react-native-ios-alarmkit
Version:
React Native wrapper for iOS AlarmKit framework
146 lines (128 loc) • 3.71 kB
text/typescript
import { AlarmKitManager } from './AlarmKitManager'
import type {
Alarm,
AuthorizationState,
Subscription,
SimpleTimerConfig,
SimpleAlarmConfig,
AlarmButton,
} from './types'
const createDefaultButton = (
text: string,
color: string,
icon: string
): AlarmButton => ({
text,
textColor: color,
systemImageName: icon,
})
export const AlarmKit = {
get isSupported(): boolean {
return AlarmKitManager.shared.isSupported
},
async getAuthorizationState(): Promise<AuthorizationState> {
return AlarmKitManager.shared.getAuthorizationState()
},
async requestAuthorization(): Promise<boolean> {
return AlarmKitManager.shared.requestAuthorization()
},
async scheduleTimer(
id: string,
config: SimpleTimerConfig
): Promise<Alarm | null> {
const stopButton = createDefaultButton('Stop', '#FFFFFF', 'stop.circle')
const secondaryButton = config.snoozeEnabled
? createDefaultButton('Snooze', '#FFFFFF', 'zzz')
: undefined
return AlarmKitManager.shared.scheduleOrReschedule(id, {
countdownDuration: {
preAlert: config.duration,
postAlert: config.snoozeDuration || 300,
},
presentation: {
alert: {
title: config.title,
stopButton,
secondaryButton,
secondaryButtonBehavior: config.snoozeEnabled
? 'countdown'
: undefined,
},
countdown: {
title: 'Time Remaining',
},
},
tintColor: config.tintColor,
soundName: config.sound,
})
},
async scheduleAlarm(
id: string,
config: SimpleAlarmConfig
): Promise<Alarm | null> {
const stopButton = createDefaultButton('Stop', '#FFFFFF', 'stop.circle')
const secondaryButton = config.snoozeEnabled
? createDefaultButton('Snooze', '#FFFFFF', 'zzz')
: undefined
return AlarmKitManager.shared.scheduleOrReschedule(id, {
countdownDuration: {
preAlert: 0,
postAlert: config.snoozeEnabled ? config.snoozeDuration || 0 : 0,
},
schedule: {
type: 'relative',
hour: config.hour,
minute: config.minute,
weekdays: config.weekdays,
},
presentation: {
alert: {
title: config.title,
stopButton,
secondaryButton,
secondaryButtonBehavior: config.snoozeEnabled
? 'countdown'
: undefined,
},
},
tintColor: config.tintColor,
soundName: config.sound,
})
},
async cancel(id: string): Promise<void> {
return AlarmKitManager.shared.cancel(id)
},
async stop(id: string): Promise<void> {
return AlarmKitManager.shared.stop(id)
},
async pause(id: string): Promise<void> {
return AlarmKitManager.shared.pause(id)
},
async resume(id: string): Promise<void> {
return AlarmKitManager.shared.resume(id)
},
async countdown(id: string): Promise<void> {
return AlarmKitManager.shared.countdown(id)
},
async getAlarms(): Promise<Alarm[]> {
return AlarmKitManager.shared.getAlarms()
},
addAlarmsListener(callback: (alarms: Alarm[]) => void): Subscription {
return AlarmKitManager.shared.addAlarmUpdatesListener(callback)
},
addAuthorizationListener(
callback: (state: AuthorizationState) => void
): Subscription {
return AlarmKitManager.shared.addAuthorizationUpdatesListener(callback)
},
}
export { AlarmKitManager } from './AlarmKitManager'
export { AlarmConfigurationFactory } from './AlarmConfiguration'
export {
useAlarms,
useAuthorizationState,
type UseAlarmsResult,
type UseAuthorizationResult,
} from './hooks'
export * from './types'
export default AlarmKit